PXELINUX를 이용해서 슬랙웨어와 윈도를 네트워크 부팅으로 설치하기
1 개요
슬랙웨어와 윈도를 네트워크 부팅으로 설치할 수 있게 준비해 보자. 우선 전체적인 시스템의 작동원리를 이해해야 한다.
- 하드웨어적으로 OS를 설치할 PXE 클라이언트는 유선 이더넷 카드가 필요하다.
- PXE 클라이언트에서 네트워크 부팅을 선택하면 로컬 네트워크에 PXE를 원한다고 알린다.
- 이때 사용할 수 있는 프로토콜로 BOOTP와 DHCP가 있다. DHCP가 BOOTP의 기능을 확장했다.
- PXE 서버에서 이 요청을 받으면 TFTP를 이용해서 부팅에 필요한 파일을 PXE 클라이언트에게 보낸다.
- TFTP는 소용량 파일의 전송에만 적합하다. 그래서 이후에 OS 설치 파일을 전송할 때는 다른 프로토콜을 쓴다.
- gPXE와 iPXE는 이 한계를 극복하기 위해 TFTP로는 부팅에 필요한 파일을 전송받을 수 있는 부트로더만 TFTP로 전송하고 부팅 파일은 다른 프로토콜로 전송한다.
- PXE 클라이언트는 PXE 서버로부터 받은 파일을 이용해서 부팅한다.
- OS를 설치할 수 있는 환경이 준비되면 OS 설치에 필요한 파일에 접근하기 위해 FTP, HTTP, SMB 등의 다양한 대용량 파일 전송에 알맞은 프로토콜을 이용한다.
- OS를 설치하고 재부팅한다.
여기서 질문이 생긴다. BOOTP 또는 이의 확장인 DHCP가 필요하다면 라우터에서 이미 쓰고 있는 DHCP와 충돌하지 않을까? 일반적인 구성은 PXE 서버에 필요한 모든 서비스는 같은 물리적인 서버에서 돌아간다. 하지만 용량의 한계 때문에 DHCP 서버인 라우터에 PXE 서버를 구축하고 싶지는 않다. 이런 경우 다음과 같이 시스템을 구성할 수 있다.
- 라우터에게 PXE 서버의 정보를 알려 주고 PXE 서버에는 BOOTP 또는 DHCP 없이 TFTP만 설정한다. 여기를 참고하자. OpenWrt의 경우
/etc/config/dhcp
에 다음을 추가하고 dnsmasq를 재시작하면 된다.config boot option filename 'pxelinux.0' option serveraddress '192.168.1.1' option servername 'pxe'
PXE 서버에서는/etc/init.d/dnsmasq restart
/etc/inetd.conf
에서 TFTP 서비스를 활성화한 후 inetd를 재시작한다.
in.tftpd는 chroot를 이용하기 때문에 tftpboot 디렉토리 바깥의 파일을 심볼릭 링크할 수는 없다./etc/rc.d/rc.inetd restart
- 라우터 설정을 건드리지 말고 IP 주소는 할당하지 않고 PXE 부팅에 필요한 정보만 건내는 프락시 DHCP를 PXE 서버에 설정한다. PXE 서버에서 모든 설정이 가능하기 때문에 이 방법에 대해 알아보자.
2 Dnsmasq를 이용해서 proxyDHCP와 TFTP 설정하기
/etc/dnsmasq.conf
에 다음을 추가하고 dnsmasq를 시작한다.
# proxyDHCP를 설정한다. dhcp-range=192.168.1.1,proxy # TFTP를 활성한다. enable-tftp # 부팅에 필요한 파일들을 저장할 디렉토리를 설정한다. tftp-root=/tftpboot # x86 CPU 아키텍쳐를 위한 부팅 레이블과 PXE 부트로더를 설정한다. pxe-service=x86PC, "Network Boot", pxelinux.0
chmod a+x /etc/rc.d/rc.dnsmasq
/etc/rc.d/rc.dnsmasq start
3 TFTP 디렉토리 구성하기
PXELINUX의 부트로더인 pxelinux.0는 위에서 설정한 TFTP 부트 디렉토리 /tftpboot
안에 있는 파일들을 이용해서 PXE 클라이언트의 부팅을 돕는다. 다음은 이 디렉토리의 구조이다.
/tftpboot/memdisk /tftpboot/memtest /tftpboot/menu.c32 /tftpboot/pxelinux.0 /tftpboot/pxelinux.cfg/default /tftpboot/slackware-15.0/bzImage /tftpboot/slackware-15.0/initrd.img /tftpboot/slackware-current/bzImage /tftpboot/slackware-current/initrd.img /tftpboot/windows-10/install.cmd /tftpboot/windows-10/mkimg.sh /tftpboot/windows-10/winpe.img
설정 파일은 /tftpboot/pxelinux.cfg/default
이다. 이 파일의 설정에 대한 자세한 사항은 여기를 참고하자. 다음은 내가 사용하는 설정 파일이다.
ui menu.c32 menu title Network Boot label localboot localboot 0 label slackware-15.0 kernel slackware-15.0/bzImage append initrd=slackware-15.0/initrd.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 nomodeset SLACK_KERNEL=huge.s label slackware-current kernel slackware-current/bzImage append initrd=slackware-current/initrd.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 nomodeset SLACK_KERNEL=huge.s label windows-10 kernel memdisk append initrd=windows-10/winpe.img label memtest kernel memtest
슬랙웨어의 경우 날마다 파일들을 갱신하기 때문에 심볼릭 링크로 구성했다. 다른 시스템 파일들도 심볼링 링크를 만들었다. in.tftpd와는 다르게 dnsmasq는 심볼링 링크를 지원한다.
memdisk -> /usr/share/syslinux/memdisk memtest -> /home/slackware64-15.0/kernels/memtest/memtest menu.c32 -> /usr/share/syslinux/menu.c32 pxelinux.0 -> /usr/share/syslinux/pxelinux.0 slackware-15.0/bzImage -> /slackware64-15.0/kernels/huge.s/bzImage slackware-15.0/initrd.img -> /slackware64-15.0/isolinux/initrd.img slackware-current/bzImage -> /slackware64-current/kernels/huge.s/bzImage slackware-current/initrd.img -> /slackware64-current/isolinux/initrd.img
4 슬랙웨어 배포본 HTTP 서버 설정하기
아파치의 설정 파일인 /etc/httpd/httpd.conf
에 다음을 추가한다.
<VirtualHost 192.168.1.1:80>
ServerName mirrors.your.domain
DocumentRoot /www/mirrors
</VirtualHost>
물론 PXE와 무관한 다른 설정도 필요하다. httpd를 시작한다.
/etc/rc.d/rc.httpd restart
이제 /www/mirrors
디렉토리에 slackware64-15.0
과 slackware64-current
디렉토리를 미러링하면 된다.
슬랙웨어의 설치 프로그램은 BusyBox에서 돌기 때문에 HTTPS를 지원하지 않는다. 따라서 외부에서 미러링 사이트에 접근할 수 없게 다음의 .htaccess
파일을 /www/mirrors
디렉토리에 생성한다.
Options +Indexes
Order Deny,Allow
Deny from all
Allow from 192.168.1.0/24
# 상위 디렉토리에서 *.txt를 접근 제한한 경우
<Files ~ "\.txt$">
Allow from 192.168.1.0/24
</Files>
슬랙웨어 설치시 URL에 http://192.168.1.1
를 입력하고 설치본 경로에는 /slackware64-15.0/slackware64
를 입력하면 된다.
5 winpe.img 생성하기
이제 /tftpboot/windows-10
디렉토리 안에 있는 파일들을 살펴보자. mkimg.sh
스크립트는 MSDN에서 내려받은 윈도 ISO 파일에서 winpe.img
파일을 생성한다.
#!/bin/sh
rm -f winpe.img
mkwinpeimg --start-script=install.cmd --windows-dir=/shared/windows-10 winpe.img
mkwinpeimg
는 wimlib
패키지에 포함된 툴이다. install.cmd
파일은 윈도가 부팅되면서 자동으로 실행된다.
wpeinit
net use w: \\192.168.1.1\windows-10
w:\setup.exe
여기서 주의할 점은 \\192.168.1.1\windows-10
를 마운트하는 드라이브를 c:
, d:
, 또는 e:
로 설정하지 않는 것이 좋다. 처음 d:
로 설정을 했었는데 wpeinit
이 마치자마자 재부팅해 버렸다. install.cmd
를 다음과 바꾼 후 다시 테스트해 봤다.
cmd.exe
pause
net use d: \\192.168.1.1\windows-10
를 실행하니 d:
드라이브가 이미 있다면서 오류가 났다. 정말 있었다. 그래서 w:
로 바꿨다.
윈도 ISO 파일을 /shared/windows-10
에 마운트한 다음 mkimg.sh
를 실행한다.
mkdir /shared/windows-10
mount -o loop,ro /downloads/en-us_windows_10.iso /shared/windows-10
cd /tftpboot/windows-10
./mkimg.sh
서버를 재부팅할 때마다 마운트를 다시 하지 않기 위해 /etc/fstab
에 다음을 추가한다.
/downloads/en-us_windows_10.iso /shared/windows-10 auto loop 0 0
6 윈도 ISO 공유하기
이제 윈도의 셋업이 SMB 프로토콜을 이용해서 설치 파일에 접근할 수 있게 삼바 서버를 설정한다. /etc/samba/smb.conf
파일의 일부이다. PXE와 무관한 설정도 당연히 필요하다.
[windows10] path = /shared/windows-10 public = yes only guest = yes writable = no printable = no wide links = yes
삼바를 재실행한다.
/etc/rc.d/rc.samba restart
참고문헌
- PXE: Installing Slackware over the network
- Preboot Execution Environment
- FAQ ::: Network Boot
- PXELINUX
- Config
- TFTP
- tftp: file not found
- PXE on OpenWrt with a different TFTP server
- proxyDHCP
- Multiple PXE server separate from DHCP
- ProxyDHCP with dnsmasq
- TLS certificate not implemented
- mkwinpeimg
- Wpeinit and Startnet.cmd: Using WinPE Startup Scripts