| 검색 | ?

BOOTP를 이용한 원격부팅

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"
  1. 작업에 필요한 (임시)디렉토리들을 만듭니다.
    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
    
  2. 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;
    #        }
    #    }
    }
    
  3. TFTP server를 설치합니다. 이때 주의할것이 netkit-tftp package는 제대로 지원하지 못하므로 tftp-hpa package를 설치하셔야 합니다. 그리고 방화벽이 있는 경우 "/etc/conf.d/in.tftpd"에서 적절한 port대역을 설정해주고 방화벽에서 해당 port대역을 udp에 대하여 허용하도록 해주셔야 합니다.
    emerge net-ftp/tftp-hpa
    
  4. 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
    
  5. Gentoo minimal install CD image를 다운로드 받습니다.
  6. 다운로드 받은 Gentoo minimal install CD image를 "${PATH_LIVECD}"에 mount 합니다.
    mount -o loop install-XX-minimal-XXXXXXXX.iso ${PATH_LIVECD}
    
  7. "${PATH_LIVECD}/isolinux/gentoo" 커널파일을 "${PATH_TFTPROOT}/netboot/gentoo"에 복사합니다.
    cp ${PATH_LIVECD}/isolinux/gentoo ${PATH_TFTPROOT}/netboot/gentoo
    
  8. gentoo.igz 파일을 임시디렉토리 "${PATH_TEMP}/gentoo.init.dir"에 압축해제합니다.
    cd ${PATH_TEMP}/gentoo.init.dir
    gunzip -c ${PATH_LIVECD}/isolinux/gentoo.igz | cpio -idv
    
  9. "${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
    
  10. "${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
    
  11. "${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
    
  12. "${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
    
  13. "${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
    




Copyright ⓒ MINZKN.COM
All Rights Reserved.