BOOTP를 이용한 원격부팅
- 작성자
- 고친과정
2010년 8월 10일 : 처음씀
1.1. 시작하기전에
필자는 서버와 넷북을 이용하는데 넷북에는 ODD장치가 없습니다. 이 경우 넷북에 OS한번 설치하려면 매우 복잡해집니다. 서버는 있으니 서버로부터 원격 부팅을 할수 있으면 좋겠다는 생각을 많이 했었는데 그 해답이 있었습니다. 바로 BOOTP가 되겠습니다. 이제 PXE를 지원하는 BIOS를 가진 컴퓨터는 모두 원격부팅할수 있게 환경을 구축해보려고 합니다.
1.2. Gentoo Linux환경에서 Gentoo LiveCD를 이용한 원격 부팅구축
설명의 편의를 위해서 다음과 같은 환경변수를 사용하겠습니다.
export PATH_LIVECD="/mnt/cdrom" export PATH_TEMP="/tftpboot/tmp" export PATH_TFTPROOT="/tftpboot"
- 작업에 필요한 (임시)디렉토리들을 만듭니다.
mkdir -p ${PATH_LIVECD} mkdir -p ${PATH_TEMP} mkdir -p ${PATH_TEMP}/gentoo.init.dir mkdir -p ${PATH_TFTPROOT} mkdir -p ${PATH_TFTPROOT}/netboot mkdir -p ${PATH_TFTPROOT}/netboot/pxelinux.cfg mkdir -p ${PATH_TFTPROOT}/netboot/gentoo
- DHCP server를 설치합니다.
emerge net-misc/dhcp
option domain-name "example.com"; option domain-name-servers 168.126.63.1, 168.126.63.2, 210.94.0.7, 164.124.101.2, 203.248.252.2, 210.181.1.24, 203.255.112.34; default-lease-time 600; max-lease-time 7200; # <<< 이 부분 추가 >>> allow booting; allow bootp; ddns-update-style none; log-facility local7; subnet 10.0.0.0 netmask 255.0.0.0 { option broadcast-address 10.255.255.255; option routers 10.0.0.1; # <<< Booting 에 이용할 pxelinux.0의 위치 및 TFTP server IP주소 설정 >>> filename "netboot/pxelinux.0"; next-server 10.0.0.1; pool { range 10.0.0.100 10.0.0.200; allow unknown-clients; } # group { # host bootp_client { # hardware ethernet XX:XX:XX:XX:XX:XX; # fixed-address 10.0.0.200; # } # } }
- TFTP server를 설치합니다. 이때 주의할것이 netkit-tftp package는 제대로 지원하지 못하므로 tftp-hpa package를 설치하셔야 합니다. 그리고 방화벽이 있는 경우 "/etc/conf.d/in.tftpd"에서 적절한 port대역을 설정해주고 방화벽에서 해당 port대역을 udp에 대하여 허용하도록 해주셔야 합니다.
emerge net-ftp/tftp-hpa
- syslinux package를 설치하고 필요한 파일들만 "${PATH_TFTPROOT}/netboot" 하위에 복사합니다.
emerge sys-boot/syslinux cp /usr/share/syslinux/pxelinux.0 ${PATH_TFTPROOT}/netboot cp /usr/share/syslinux/memdisk ${PATH_TFTPROOT}/netboot
- Gentoo minimal install CD image를 다운로드 받습니다.
- 다운로드 받은 Gentoo minimal install CD image를 "${PATH_LIVECD}"에 mount 합니다.
mount -o loop install-XX-minimal-XXXXXXXX.iso ${PATH_LIVECD}
- "${PATH_LIVECD}/isolinux/gentoo" 커널파일을 "${PATH_TFTPROOT}/netboot/gentoo"에 복사합니다.
cp ${PATH_LIVECD}/isolinux/gentoo ${PATH_TFTPROOT}/netboot/gentoo
- gentoo.igz 파일을 임시디렉토리 "${PATH_TEMP}/gentoo.init.dir"에 압축해제합니다.
cd ${PATH_TEMP}/gentoo.init.dir gunzip -c ${PATH_LIVECD}/isolinux/gentoo.igz | cpio -idv
- "${PATH_TEMP}/gentoo.init.dir/mnt/cdrom"디렉토리를 만들고 그 밑에 "image.squashfs"파일을 복사합니다.
mkdir -p ${PATH_TEMP}/gentoo.init.dir/mnt/cdrom cp ${PATH_LIVECD}/isolinux/image.squashfs ${PATH_TEMP}/gentoo.init.dir/mnt/cdrom
- "${PATH_TEMP}/gentoo.init.dir/init" 파일을 "${PATH_TEMP}/gentoo.init.dir/init.org"로 백업합니다.
cp ${PATH_TEMP}/gentoo.init.dir/init ${PATH_TEMP}/gentoo.init.dir/init.org
- "${PATH_TEMP}/gentoo.init.dir/init" 파일에서 다음부분을 찾아서 수정합니다.
-- if [ "${REAL_ROOT}" != "/dev/nfs" ] && [ "${LOOPTYPE}" != "sgimips" ] ++ if [ "${REAL_ROOT}" != "/dev/nfs" ] && [ "${LOOPTYPE}" != "sgimips" ] && [ "${REAL_ROOT}" != "/" ] -- elif [ -b "${REAL_ROOT}" ] || [ "${REAL_ROOT}" = "/dev/nfs" ] ++ elif [ -b "${REAL_ROOT}" ] || [ "${REAL_ROOT}" = "/dev/nfs" ] || [ "${REAL_ROOT}" = "/" ] -- cache_cd_contents -- mount -t squashfs -o loop,ro ${NEW_ROOT}/mnt/cdrom/${LOOPEXT}${LOOP} ${NEW_ROOT}/mnt/livecd ++ mount -t squashfs -o loop,ro /mnt/cdrom/${LOOPEXT}${LOOP} ${NEW_ROOT}/mnt/livecd
- "${PATH_TEMP}/gentoo.init.dir"을 다시 압축하고 "${PATH_TFTPROOT}/netboot/gentoo"로 복사합니다.
cd ${PATH_TEMP}/gentoo.init.dir find . -print | cpio -o -H newc |gzip -9 -c - > ${PATH_TFTPROOT}/netboot/gentoo/initrd.gz
- "${TFTPROOT}/netboot/pxelinux.cfg/default"으로 다음의 내용을 편집하여 만듭니다.
default gentoo_x86 prompt 1 timeout 600 label gentoo_x86 kernel gentoo/gentoo append initrd=gentoo/initrd.gz ip=dhcp root=/dev/ram0 init=/linuxrc loop=/image.squashfs looptype=squashfs cdroot=1 real_root=/ vga=normal dokeymap label local LOCALBOOT 0