DHCP 서버없이 ArchLinux를 iPXE 부팅에 도전

이 기사는 Arch Linux Advent Calender 2015의 10일째입니다.
  • DHCP 서버 없이 ArchLinux를 iPXE로 부팅할 수 없는 것 같고, 이 벽을 극복한다!

  • 참고



  • ipxe.iso DHCP 서버가 있는 경우, 공식 이미지 사용하면 된다.
  • iPXE - open source boot firmware [buildcfg:ping_cmd]
  • GitHub - antonym/netboot.xyz: Multiple Operating System iPXE Installer

  • ipxe 빌드


  • 공식 ipxe가 안된다면 빌드하면 좋지 않아.
  • git clone git://git.ipxe.org/ipxe.git
    cd ipxe/src
    

    패키지가 부족한 경우 다음을 넣어
    apt-get install -y liblzma-dev genisoimage syslinux isolinux
    

    make
    make
    
  • Ping을 유효하게 하는 경우 핑 명령 를 참고로 config/general.h 를 수정한다.

  • config/general.h
    - //#define PING_CMD              /* Ping command */
    + #define PING_CMD              /* Ping command */
    

    bin/ipxe.usb에 myscript.ipxe를 포함하여 생성
    make bin/ipxe.lkrn EMBED=myscript.ipxe
    make bin/ipxe.usb EMBED=myscript.ipxe
    make bin/ipxe.iso EMBED=myscript.ipxe
    

    myscript.ipxe


  • GRUB에 건네받는 파라미터는 이하 파일
  • h tp : / / Reten g. 아 rch ㅃ x. rg / p ぇ 보오 t / 보오 t / cfg / 아 rch64. cfg


  • myscript.ipxe
    #!ipxe
    
    #################
    #network settings
    #################
    set dns 8.8.8.8
    set net0/netmask 255.255.255.0
    echo -n IP address: && read net0/ip
    echo -n Default gateway: && read net0/gateway
    
    #################
    :boot_menu
    #################
    menu
        item arch_jp      ArchLinux x86_64 jp mirror
        item arch_us      ArchLinux x86_64 us mirror
        item ipxe_dhcp    DHCP
        item ipxe_ifopen  ifopen net0 (for static ip.)
        item ipxe_config  Enter iPXE config
        item ipxe_shell   Enter iPXE shell
    
    choose --default config --timeout 30000 target && goto ${target}
    
    #################
    # menu
    #################
    :ipxe_dhcp
        dhcp
        goto boot_menu
    
    :ipxe_ifopen
        ifopen net0
        goto boot_menu
    
    :ipxe_config
        config
        goto boot_menu
    
    :ipxe_shell
        shell
        goto boot_menu
    
    :arch_jp
        echo ip=${net0/ip}::${net0/gateway}:${net0/netmask}
        # ftp.jaist.ac.jp => 150.65.7.130
        set source http://150.65.7.130/pub/Linux/ArchLinux/iso/latest
        kernel ${source}/arch/boot/x86_64/vmlinuz archiso_http_srv=${source}/ archisobasedir=arch ip=${net0/ip}::${net0/gateway}:${net0/netmask}
        initrd ${source}/arch/boot/x86_64/archiso.img
        boot
    
    :arch_us
        echo ip=${net0/ip}::${net0/gateway}:${net0/netmask}
        # mirrors.abscission.net => 107.191.116.135
        set source http://107.191.116.135/archlinux/iso/latest
        kernel ${source}/arch/boot/x86_64/vmlinuz archiso_http_srv=${source}/ archisobasedir=arch ip=${net0/ip}::${net0/gateway}:${net0/netmask}
        initrd ${source}/arch/boot/x86_64/archiso.img
        boot
    

    인터넷에 접속할 수 없는 경우는 ifopen net0이 필요.
    iPXE - open source boot firmware [cmd:ifopen]

    initrd.img를 해독하는 방법


  • archiso/README.bootparams at master · djgera/archiso
  • [arch-releng] [RFC] [PATCH] [archiso] Add DNS resolver support to archiso_pxe_common

  • archiso.img 다운로드
    wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/arch/boot/x86_64/archiso.img
    

    archiso.img 배포
    mv archiso.img archiso.cpio.gz
    xz -d archiso.cpio.gz
    mkdir tmp && cd tmp
    cpio -id < ../archiso.cpio
    
  • Archiso (Nederlands) - ArchWiki

  • archiso.git - The official archiso scripts repo
  • grub에 dns 인수 추가하는 패치가 필요하지 않을까


  • Grub2에서 시작 확인


  • Arch Linux - Netboot Live System

  • /etc/grub.d/40_custom
    #!/bin/sh
    exec tail -n +3 $0
    # This file provides an easy way to add custom menu entries. Simply type the
    # menu entries you want to add after this comment. Be careful not to change
    # the 'exec tail' line above.
    
    menuentry 'Arch Linux Netboot Environment' {
      set root='(hd0,1)'
      linux16 /ipxe.lkrn
    }
    
    update-grub
    

    Qemu에서 동작 확인



    ipxe.lkrn에서 부팅하는 경우
    qemu-system-x86_64 -m 1G -kernel bin/ipxe.lkrn \
      -net nic -net user
    

    ISO 이미지에서 부팅하는 경우
    qemu-system-x86_64 -boot d -cdrom bin/ipxe.iso \
     -net nic -net user
    








  • dns가 0.0.0.0이됩니다 ...


  • boot 완료

  • 부팅이 완료되면 resolv.conf를 만든다.
    echo nameserver 8.8.8.8 > /etc/resolv.conf
    

    요약


  • iPXE 이미지는 단지 1MB .
  • ipxe.usb 이미지를/dev/sda에 dd하면 부팅하는 간편함.
  • 좋은 웹페이지 즐겨찾기