정보공유

PXE Linux Server for Distribute of Multiple OS (windows and linux)

CheekyKite 2017. 1. 31.

Dasandata_PXE Linux Server for Distribute of Multiple OS

 

안녕하세요.

다산데이타 입니다.

 

여러가지 운영체제를 네트워크를 통해 배포하는

PXE Server를 구성한 후 관련정보를 모아 정리하였습니다.


(구글문서도구에서 먼저 작성하고 옮기다 보니 깔끔하지 않네요 ㅠ.ㅠ 아래 링크에서 원본을 보실 수 있습니다.

https://docs.google.com/document/d/1VxVdVOZJjq78GGPb1o8tQ3lK3OqY4XOPb_9OkQD6y78/edit?usp=sharing)

 


개요


PXE란?

랜카드에 내장된 기능

네트워크를 통해 부트로더 와 커널을 로딩

CD롬 이나 USB메모리 없이 운영체제를 설치

iSCSI를 이용할 경우 Diskless 시스템도 구성 가능

한 대의 서버로 동시에 여러대의 운영제제를 배포할 수 있음


필요성

사용자들이 요구하는 다양한 운영체제를 간편하게 설치

Clonezilla 및 Winpe 도 네트워크를 통해 불러와서 사용가능 (USB메모리 불필요)

차후 - iSCSI를 활용하여 한대의 하드웨어에 여러 운영체제 테스트 가능


목표

Multiple Linux 와 Multiple Windows 를 배포할 수 있는 서버 구축.

UEFI 와 BIOS 에 영향을 받지 않는 배포 서버 구축.

(불특정 다수의 하드웨어의 BIOS 설정에 상관없이 배포될 수 있도록 하기 위해 UEFI 와 BIOS 동시 지원이 필요함.)




용어 및 배경지식

BIOS & UEFI : http://texit.tistory.com/31


하드디스크 이해 : http://webdir.tistory.com/160

MBR 과 GPT : http://cappleblog.co.kr/131


부팅프로세스 : http://0x200.tistory.com/entry/리눅스-부팅-프로세스

부트로더  :

http://diginuri.tistory.com/7

http://egloos.zum.com/shadowxx/v/2333450


커널 : http://egloos.zum.com/dstein/v/2172464

initrd , ramdisk :

http://www.ylabs.co.kr/index.php?document_srl=1493&mid=board_centos

http://croky.tistory.com/entry/초기-RAM-디스크-사용하기-initrd


PXE 개념설명 : http://www.sauru.so/blog/setup-pxe-master/

PXE 서버 구축후기 : http://www.2cpu.co.kr/nas/10339?&page=3

PXE 를 통한 OS설치 자동화 : http://blog.pages.kr/156

처음부터 시작하는 pxe 부팅 : http://egloos.zum.com/dukuduku/v/6442770

PXE를 활용한 윈도우 설치하기 : http://subini.tistory.com/35


처음부터 시작하는 pxe 부팅 : http://egloos.zum.com/dukuduku/v/6442770


어디선가 구한 pptx (프리젠테이션) 파일

CREATING A [LEGACY & EFI] PXE SERVER USING PXELINUX

https://drive.google.com/open?id=0B7n3uYHX-nJwMDFzZGRDckF3VWc


변화된 윈도우의 설치 구조와 Install.wim 이미지 파일 이해하기

http://cappleblog.co.kr/456

자신만의 윈도우 7 설치 DVD 만들기 (VMware + Sysprep + ImageX + 윈도우 DVD 원본 ISO)

http://shinb.tistory.com/161

ImageX 를 통한 Sysprep 봉인 윈도우(만능 고스트) 만들기

http://shinb.tistory.com/302

GimageX 이용하여 윈도우 버전별 통합 설치파일 만들기 (install.wim)

http://ooppa.tistory.com/entry/윈도우-GimageX-이용한-버전별-10817-OS-통합하기




테스트 환경 (vmware vsphere esxi hypervisor)

Linux Server - 망#1 (192.168.0.10) 용 1ea

Linux Server - 망#2 (10.0.0.10) 용 1ea

BIOS Test Client (esxi 5.5) 1ea

UEFI Test Client (esxi 5.5) 1ea





PXE 서버 와 망을 2개로 분리한 이유 :


부트로더 및 커널에 따라 UEFI 지원 여부가 다름


Windows 커널을 로드할 수 있으면서 메뉴 기능을 지원하는 UEFI용 부트로더가

리눅스 UEFI 커널 로딩을 원활하기 지원하지 않아


Windows UEFI 배포서버를 망을 분리하여 따로 구성함

(bootx64.efi 에서 ipex 가 로딩되지 않음, old kernel error 발생)


망#1 - 192.168.0.10 / BIOS - Linux+Windows / UEFI - Linux only

망#2 - 10.0.0.10 / BIOS - Linux+Windows / UEFI - Windows only




구성도

구성도 #1



구성도 #2



폴더 구조 & 파일명


tftp root path 에 의한 상대경로 고려.

http document root path 에 의한 상대경로 고려.

BIOS 와 UEFI 용 커널 빛 부트로더 디렉토리 분리.

심볼릭 링크(ln -s) 를 사용한 Source File 경로 리 매핑 (Source File 통합관리)

dnsmasq를 사용할 경우 dhcp 에서 호출 하는 기본 kernel 파일명 리 매핑. (pxelinux --> pxelinux.0)




Tree - Linux Server - 망#1 (192.168.0.10)


[root@dasanpxe:tftp]#
[root@dasanpxe:tftp]# pwd
/pub/tftp
[root@dasanpxe:tftp]#
[root@dasanpxe:tftp]# tree -L 3
.
├── bios
│   ├── boot -> ../boot/
│   ├── ldlinux.c32
│   ├── libcom32.c32
│   ├── libutil.c32
│   ├── pxelinux.0
│   ├── pxelinux.cfg
│   │   └── default
│   ├── SplashP.png
│   └── vesamenu.c32
├── boot
│   ├── centos
│   │   ├── 6.8
│   │   └── 7.3.1611
│   ├── clonzilla
│   │   ├── boot
│   │   ├── Clonezilla-Live-Version
│   │   ├── EFI
│   │   ├── GPL
│   │   ├── live
│   │   ├── syslinux
│   │   └── utils
│   ├── ipxe
│   │   ├── ipxe.iso
│   │   └── ipxe.krn
│   ├── memdisk
│   ├── ubuntu
│   │   ├── 12.04
│   │   ├── 14.04
│   │   └── 16.04
│   ├── winmltinst
│   │   ├── autorun.inf
│   │   ├── boot
│   │   ├── bootmgr
│   │   ├── bootmgr.efi
│   │   ├── efi
│   │   ├── setup.exe
│   │   ├── sources
│   │   ├── support
│   │   ├── wimboot
│   │   └── wimboot.ipxe
│   └── winpe
│       ├── winpeamd64.iso.bak
│       └── winpe.iso
├── default -> ./bios/pxelinux.cfg/default
├── efi.x64
│   ├── bootx64
│   ├── bootx64.0 -> bootx64
│   └── grub.cfg
└── grub.cfg -> efi.x64/grub.cfg

25 directories, 25 files
[root@dasanpxe:tftp]#
[root@dasanpxe:tftp]#




Tree - Linux Server - 망#2 (10.0.0.10)


[root@dasanpxe tftp]#

[root@dasanpxe tftp]# pwd

/pub/tftp

[root@dasanpxe tftp]#

[root@dasanpxe tftp]# tree -L 3

.

├── bios

│   ├── boot -> ../boot/

│   ├── ldlinux.c32

│   ├── libcom32.c32

│   ├── libutil.c32

│   ├── pxelinux.0

│   ├── pxelinux.cfg

│   │   └── default

│   ├── SplashP.png

│   └── vesamenu.c32

├── boot

│   ├── centos

│   │   ├── 6.8

│   │   └── 7.3.1611

│   ├── clonzilla

│   │   ├── boot

│   │   ├── Clonezilla-Live-Version

│   │   ├── EFI

│   │   ├── GPL

│   │   ├── live

│   │   ├── syslinux

│   │   └── utils

│   ├── ipxe

│   │   ├── install.ipxe

│   │   ├── ipxe.efi

│   │   ├── ipxe.iso

│   │   └── ipxe.krn

│   ├── memdisk

│   ├── ubuntu

│   │   ├── 12.04

│   │   ├── 14.04

│   │   └── 16.04

│   ├── winmltinst

│   │   ├── autorun.inf

│   │   ├── boot

│   │   ├── bootmgr

│   │   ├── bootmgr.efi

│   │   ├── efi

│   │   ├── setup.exe

│   │   ├── sources

│   │   ├── support

│   │   ├── wimboot

│   │   └── wimboot.ipxe

│   └── winpe

│       └── winpe.iso

├── default -> ./bios/pxelinux.cfg/default

├── efi.x64

│   └── ipxe.efi -> ../boot/ipxe/ipxe.efi

└── install.ipxe -> ./boot/ipxe/install.ipxe


25 directories, 24 files

[root@dasanpxe tftp]#

[root@dasanpxe tftp]#




준비


[Service]


isc-dhcp-server

공유기를 사용하고 있다면 충돌을 피하기 위해 dhcp 기능을 off

아키텍쳐 (BIOS / UEFI) 에 따라 다른 커널 과 부트로더를 지정할 수 있음 (3가지 방법)


tftp (xinetd)

커널 & 부트로더 전송


(선택사항) dnsmasq

dhcp 와 tftp 를 동시에 지원함


httpd

centos 설치에 필요한 파일을 local network 를 통해 전송하는데 사용

ipxe를 이용하여 booting sccript 를 전송하는데 필요함


samba(smb)

Windows 설치파일을 전송하는데 사용

winpe 에서 인증오류가 발생하는 경우 sambapasswd -a 로 접속 사용자 지정필요.




[Boot Loader Files]


pxelinux

syslinux 에서 추출

bios kernel loading

다양한 kernel 을 지원하나 uefi 는 안됨.


memdisk

syslinux 에서 추출

booting to iso file (bios만 지원됨)


bootx64.efi

Linux 설치파일 EFI 디렉토리 에서 추출

uefi kernel loading

load 하지 못 하는 kernel이 많음.

syslinux 에서 제공되는 uefi 부트로더 - syslinux.efi - 가 있으나

이번 구성에서 제대로 동작하지 않아서 제외 함.


ipxe

ipxe.org 에서 다운로드

windows 부팅에 필요한 wimboot kernel loading

uefi 의 경우 bootx64.efi를 통하면 오류 발생하여

boot script 의 path를 embed 하여 make 한 ipxe kernel 을 dhcp 에서 직접 호출해야함.

bios 에서는 sanboot를 통해 iso 파일으로도 부팅 할 수 있음.


(중요!) ipxe chain embed

[root@dasanpxe:~]#
[root@dasanpxe:~]# pwd
/root/
[root@dasanpxe:~]# git clone git://git.ipxe.org/ipxe.git
[root@dasanpxe:~]# cd ipxe/src
[root@dasanpxe:src]# pwd
/root/ipxe/src
[root@dasanpxe:src]#
[root@dasanpxe:src]# vi chain.ipxe
[root@dasanpxe:src]# cat /root/ipxe/src/chain.ipxe
#!ipxe

dhcp
chain http://10.0.0.10/install.ipxe

[root@dasanpxe:src]#
[root@dasanpxe:src]# make bin-x86_64-efi/ipxe.efi EMBED=chain.ipxe
rm -f  bin-x86_64-efi/*.*  bin-x86_64-efi/.certificate.* bin-x86_64-efi/.certificates.* bin-x86_64-efi/.private_key.* bin-x86_64-efi/errors bin-x86_64-efi/NIC ./util/zbin ./util/elf2efi32 ./util/elf2efi64 ./util/efirom ./util/efifatbin ./util/iccfix ./util/einfo TAGS bin-x86_64-efi/symtab
 [PARSEROM]
 [DEPS] arch/x86/transitions/libkir.S

<<중략>>

 [BUILD] bin-x86_64-efi/uhci.ids.o
 [BUILD] bin-x86_64-efi/ehci.ids.o
 [BUILD] bin-x86_64-efi/hvm.ids.o
 [AR] bin-x86_64-efi/blib.a
ar: creating bin-x86_64-efi/blib.a
 [HOSTCC] util/elf2efi64
 [VERSION] bin-x86_64-efi/version.ipxe.efi.o
 [LD] bin-x86_64-efi/ipxe.efi.tmp
 [FINISH] bin-x86_64-efi/ipxe.efi
rm bin-x86_64-efi/version.ipxe.efi.o
[root@dasanpxe:src]#
[root@dasanpxe:src]# ls -al
total 244K
-rw-r--r--  1 root root  42K Jan  9 19:07 Makefile.housekeeping

<<중략>>

-rw-r--r--  1 root root   53 Jan 18 15:50 chain.ipxe
drwxr-xr-x 20 root root 4.0K Jan 18 15:50 .
drwxr-xr-x  3 root root 4.0K Jan 18 15:53 util
drwxr-xr-x  3 root root  24K Jan 18 15:53 bin-x86_64-efi
[root@dasanpxe:src]#
[root@dasanpxe:src]# cd bin-x86_64-efi/
[root@dasanpxe:bin-x86_64-efi]# file ipxe.efi
ipxe.efi: MS-DOS executable
[root@dasanpxe:bin-x86_64-efi]#
[root@dasanpxe:bin-x86_64-efi]# cp ./ipxe.efi /pub/tftp/boot/ipxe/ipxe.efi
[root@dasanpxe:bin-x86_64-efi]#


wimboot

ipxe.org 에서 다운로드

windows kernel loading

bootx64.efi 부트로더에서 old kernel error 발생하여 ipxe를 이용하여 로딩해야 함.




[Source Files]


CentOS

local network 를 통한 http, nfs, ftp 방식을 모두 지원하므로

설치파일 전체를 iso 에서 추출하여 저장

web을 통한 net install 도 지원하지만 이 문서에서는 다루지 않았습니다.

centos 7은 uefi가 지원되지만 6.8미만은 지원되지 않습니다. (old kernel error)


Ubunut

local network 를 통한 설치방식을 지원하지 않음.

net install 만 지원 되므로 server iso 의 netboot 디렉토리에서 kernel 과 ramdisk 추출 (\install\netboot\ubuntu-installer\amd64\linux & initrd.gz)

14.04 및 16.04 모두 uefi 지원 (12.04는 테스트 되지 않음)



Clonezilla

BIOS 와 UEFI  모두 지원됨.

memdisk 로 iso로 파일 로딩 & 자체 커널을 통해 부팅 가능.


WinPE.ISO

memdisk 로 iso 파일 로딩

UEFI 에서는 memdisk 가 old kernel error 오류가 발생되어 BIOS에서만 사용가능

ipxe 에서 sanboot를 이용해서 iso 파일로 부팅하는 방법도 있음.




Multi Windows (리눅스 보다 어려움.. ㅋ)

Microsoft에서 배포하는 DISM (Deployment Image Servicing and Management)

를 사용하여 여러버젼의 윈도우를 통합할 수 있음.

cmd 방식의 DISM 대신 보통 GimageX 를 사용함.

http://ooppa.tistory.com/entry/윈도우-GimageX-이용한-버전별-10817-OS-통합하기


설치파일의 전송은 배포 서버에서 smaba 를 통해 설치파일 디렉토리를 공유하고

winpe를 통해 net use 로 공유폴더에 접근하여 setup을 실행.


net use 를 사용할 수 있는 winpe 부팅 파일인 boot.wim는

Windows ADK(Windows Assessment and Deployment Kit) 를 사용하여 추출합니다.

https://developer.microsoft.com/ko-kr/windows/hardware/windows-assessment-deployment-kit


boot.wim 은 wimboot 부트로더를 사용하여 로드할 수 있으며

wimboot 를 로드하기 위해 ipxe 의 chain 을 사용합니다.


단, uefi 클라이언트 의 경우 bootx64.efi 에서 wimboot를 지원하지 않아

wimboot 파일이 있는 위치를 삽입(embed) 한 ipxe kernel을 dhcp에서 직접 호출합니다.


[중요!] dism 으로 startnet.cmd 편집

(adk 설치 / winpe 에서 boot.wim을 복사한 후 작업합니다.)


C:\>
C:\>dir
C 드라이브의 볼륨: Win10
볼륨 일련 번호: 0246-9FF7

C:\ 디렉터리

2017-01-18  오후 06:58       225,133,601 boot.wim
2017-01-19  오후 01:02    <DIR>          Intel
2015-07-10  오후 08:04    <DIR>          PerfLogs
2017-01-26  오전 05:38    <DIR>          Program Files
2017-01-31  오후 04:05    <DIR>          Program Files (x86)
2017-01-19  오후 01:15    <DIR>          Users
2017-01-31  오전 08:38    <DIR>          Windows
              1개 파일         225,133,601 바이트
             13개 디렉터리  25,431,404,544 바이트 남음

C:\>dir boot.wim
C 드라이브의 볼륨: Win10
볼륨 일련 번호: 0246-9FF7

C:\ 디렉터리

2017-01-18  오후 06:58       225,133,601 boot.wim
              1개 파일         225,133,601 바이트
              0개 디렉터리  25,431,404,544 바이트 남음

C:\>
C:\>
C:\>mkdir mount

C:\>
C:\>dism /mount-image /imagefile:"c:\boot.wim" /index:1 /mountdir:"c:\mount"

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지를 탑재하는 중
[==========================100.0%=====================]
작업을 완료했습니다.

C:\>
C:\>
C:\>
C:\>copy c:\mount\windows\system32\startnet.cmd c:\mount\windows\system32\startnet.cmd.bak
       1개 파일이 복사되었습니다.

C:\>notepad c:\mount\windows\system32\startnet.cmd

C:\>
C:\>type c:\mount\windows\system32\startnet.cmd
wpeinit
net use z: \\10.0.0.10\install /user:dasan dasan
net use z: \\192.168.0.10\install /user:dasan dasan

net use z: \\10.0.0.10\install /user:dasan dasan
net use z: \\192.168.0.10\install /user:dasan dasan
z:
setup

C:\>dism /unmount-image /mountdir:"c:\mount" /commit

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지를 저장하는 중
[==========================100.0%=====================]
이미지를 탑재 해제하는 중
[==========================100.0%=====================]
작업을 완료했습니다.

C:\>
C:\>
C:\>end



설정파일


Service


[Service] dhcpd.conf


[root@dasanpxe:/]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
authoritative;

### ens224 conf start ###
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.50 192.168.0.149;
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
option domain-name-servers 8.8.8.8;
default-lease-time 6000;
max-lease-time 72000;
### PXE Server IP ###
next-server 192.168.0.10;
}
#### ens225 conf end ####

#### 192.168.0.10 UEFI & BIOS ###
class "pxeclient" {
   match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";

   if substring (option vendor-class-identifier, 15, 5) = "00000" {
   # BIOS client
   filename "bios/pxelinux.0";
   }
   else {
   # default to UEFI 64 bit
   filename   "efi.x64/bootx64";
   }
}
[root@dasanpxe:/]#

<!---  10.0.0.10 의 경우 아래 참조 --->

#### 10.0.0.10 UEFI & BIOS ###

class "pxeclient" {

   match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";


   if substring (option vendor-class-identifier, 15, 5) = "00000" {

   # BIOS client

   filename "bios/pxelinux.0";

   }

   else {

   # default to UEFI 64 bit

   filename "efi.x64/ipxe.efi";

   }




[Service] tftp.con


[root@dasanpxe:/]# cat /etc/xinetd.d/tftp

# default: off

# description: The tftp server serves files using the trivial file transfer \

#       protocol.  The tftp protocol is often used to boot diskless \

#       workstations, download configuration files to network-aware printers, \

#       and to start the installation process for some operating systems.

service tftp

{

       socket_type             = dgram

       protocol                = udp

       wait                    = yes

       user                    = root

       server                  = /usr/sbin/in.tftpd

       server_args             = -s /pub/tftp

       disable                 = no

       per_source              = 11

       cps                     = 100 2

       flags                   = IPv4

}

[root@dasanpxe:/]#

[root@dasanpxe:/]#




[Service] httpd.conf


[root@dasanpxe:/]# cat /etc/httpd/conf/httpd.conf

#DocumentRoot "/var/www/html"
DocumentRoot "/pub/tftp/boot"

#
# Relax access to content within /var/www.
#
<Directory "/pub/tftp/boot">
   AllowOverride None
   # Allow open access:
   Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/pub/tftp/boot">
   Options Indexes FollowSymLinks
   AllowOverride None
   Require all granted
</Directory>





[Service] samba.conf + smbpasswd -a


# samba 접근시 사용할 사용자 이름과 아이디 생성 및 smbpasswd 지정

[root@dasanpxe:/]# adduser dasan
[root@dasanpxe:/]# passwd dasan
Changing password for user dasan.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@dasanpxe:/]#
[root@dasanpxe:/]#

[root@dasanpxe:/]#
[root@dasanpxe:/]#
[root@dasanpxe:/]# cat /etc/samba/smb.conf
workgroup = WORKGROUP
interfaces = ens224
security = user
passdb backend = tdbsam
map to guest = Bad User

[install]
   comment = windows install distro
   path = /pub/tftp/boot/winmltinst
   public = yes
   writable = yes
   write list = dasan
   create mask = 0777
   directory mask = 0777

[root@dasanpxe:/]#
[root@dasanpxe:/]# smbpasswd -a dasan
New SMB password:
Retype new SMB password:
[root@dasanpxe:/]#
[root@dasanpxe:/]#



(옵션) [Service] dnsmasq.conf or pxe.conf


[root@dasanpxe:/]# cat /etc/dnsmasq.conf
# We only want this running on the interface facing the dedicated PXE network
interface=ensxxx


# PXE Subnet
dhcp-range=xx.x.x.50,xx.x.x.150,4h
dhcp-option=option:router,xx.x.x.1
server=8.8.8.8

# PXE Boot Options

# 프롬프트의 경우 BIOS Only 로만 사용할때는 잘 되지만 UEFI 와 함께 사용하면 잘 안됨
#pxe-prompt="Choose: "
#pxe-prompt="What system shall I netboot?", timeout before first available
#pxe-prompt="Press F8 for the Select Menu.... time out", 10

##### PXEClient:Arch:00000
pxe-service=X86PC, "Boot from local disk", 64
pxe-service=X86PC, "Boot BIOS PXE", bios/pxelinux

##### PXEClient:Arch:00007
pxe-service=BC_EFI, "Boot from local disk", 64
pxe-service=BC_EFI, "Boot UEFI PXE-BC", efi.x64/bootx64

##### PXEClient:Arch:00009
pxe-service=X86-64_EFI, "Boot UEFI PXE-64", efi.x64/bootx64

#or

#pxe-service=X86-64_EFI, "Boot UEFI PXE-64", boot/ipxe/ipxe.efi

# TFTP Configuration
enable-tftp
tftp-root=/pub/tftp

[root@dasanpxe:/]#



Boot Menu


[Boot Menu] pxelinux.cfg/default


[root@dasanpxe:/]# cat /pub/tftp/bios/pxelinux.cfg/default

UI vesamenu.c32
#default vesamenu.c32

#PROMPT 0
timeout 300

MENU TITLE Dasandata Legacy(BIOS) PXE Boot Menu (192.168.0.10)
MENU RESOLUTION 640 480
MENU BACKGROUND SplashP.png
MENU INCLUDE graphics.conf

label 1
 menu label ^Boot from local drive
 menu default
 localboot 0

label blank
menu label -------------------------------------------------------------------

label 2
 menu label ^Windows Multi Install via ipxe.krn + wimboot
 kernel boot/ipxe/ipxe.krn dhcp && chain boot/winmltinst/wimboot.ipxe

label 3
 menu label Win^PE ISO via memdisk
 root (hd0,0)
 kernel boot/memdisk
 append iso initrd=boot/winpe/winpe.iso raw

label 4
 menu label Clone^zilla live via tftp (192.168.0.10)
 kernel boot/clonzilla/live/vmlinuz fetch=tftp://192.168.0.10/pub/tftp/boot/clonzilla/live/filesystem.squashfs boot=live union=overlay keyboard-layouts=NONE locales=en_US.UTF-8
 append initrd=boot/clonzilla/live/initrd.img

label 6
 menu label ^iPXE (iso) via memdisk
 kernel boot/memdisk
 append iso initrd=boot/ipxe/ipxe.iso


label blank
menu label -------------------------------------------------------------------

label 10
 menu label ^Centos 7.3 1611 Minimal via local http (192.168.0.10)
 kernel boot/centos/7.3.1611/vmlinuz
 append initrd=boot/centos/7.3.1611/initrd.img ip=dhcp inst.repo=http://192.168.0.10/centos/7.3.1611/

label 11
 menu label ^Centos 6.8 Minimal via local http (192.168.0.10)
 kernel boot/centos/6.8/images/pxeboot/vmlinuz
 append initrd=boot/centos/6.8/images/pxeboot/initrd.img method=http://192.168.0.10/centos/6.8/ devfs=nomount

label 12
 menu label ^Ubuntu 16.04 Server via Web
 kernel boot/ubuntu/16.04/linux
 append initrd=boot/ubuntu/16.04/initrd.gz

label 13
 menu label ^Ubuntu 14.04 Server via Web
 kernel boot/ubuntu/14.04/linux
 append initrd=boot/ubuntu/14.04/initrd.gz

label blank
menu label -end---------------------------------------------------------------

[root@dasanpxe:/]#



[Boot Menu] grup.cfg


[root@dasanpxe:/]# cat /pub/tftp/efi.x64/grub.cfg

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
set timeout=30
insmod png

#### Menu Start

menuentry 'Boot from Local Drive' {
       exit
}

menuentry 'Clonzilla Live via tftp (192.168.0.10)' {
       linuxefi  boot/clonzilla/live/vmlinuz fetch=tftp://192.168.0.10/pub/tftp/boot/clonzilla/live/filesystem.squashfs boot=live union=overlay keyboard-layouts=NONE locales=en_US.UTF-8
       initrdefi boot/clonzilla/live/initrd.img
}

menuentry 'Centos 7.3 1611 Minimal via http (192.168.0.10)' {
       linuxefi boot/centos/7.3.1611/vmlinuz ip=dhcp inst.repo=http://192.168.0.10/centos/7.3.1611/
       initrdefi boot/centos/7.3.1611/initrd.img
}

menuentry 'Ubuntu 16.04 Server via Web' {
       linuxefi boot/ubuntu/16.04/linux
       initrdefi boot/ubuntu/16.04/initrd.gz
}

menuentry 'Ubuntu 14.04 Server via Web' {
       linuxefi boot/ubuntu/14.04/linux
       initrdefi boot/ubuntu/14.04/initrd.gz
}

[root@dasanpxe:/]#





[Boot Menu] wimboot.ipxe


[root@dasanpxe:/]# cat /pub/tftp/boot/winmltinst/wimboot.ipxe
#!ipxe

 kernel wimboot
 initrd boot/bcd         BCD
 initrd boot/boot.sdi    boot.sdi
 initrd sources/boot.wim    boot.wim
 boot

[root@dasanpxe:/]#





[Boot Menu] install.ipxe


[root@dasanpxe:/]# cat /pub/tftp/boot/ipxe/install.ipxe
#!ipxe
#install.ipxe

:start
menu Please choose an operating system to install

item --gap                      Windows UEFI & BIOS ------------------------
item windows                    Windows Install via ipxe-wimboot-boot.wim

#item --gap                     ETC ------------------------------
item shell                      iPXE shell
item --gap                      exit ---------------------------------------
item exit                       Exit

choose --default exit --timeout 20000 target && goto ${target}

:windows
 kernel boot/winmltinst/wimboot
 initrd boot/winmltinst/boot/bcd         BCD
 initrd boot/winmltinst/boot/boot.sdi    boot.sdi
 initrd boot/winmltinst/sources/boot.wim    boot.wim
 boot


:failed
echo Booting failed, dropping to shell
goto shell

:shell
echo Type 'exit' to get the back to the menu
shell
set menu-timeout 0
set submenu-timeout 0
goto start

:exit
 kernel
 boot

[root@dasanpxe:/]#





(기타, 참조용) ipxe menu example


#!ipxe
#/pub/tftp/install.ipxe

:start
menu Please choose an operating system to install

item --gap                      Linux --------------------------------------
item centos7.3.1611.http        Centos 7.3.1611 via Local http
item centos6.8                  Centos 6.8 via Local http
item ubuntu12.04                Ubuntu 12.04 via Web
item ubuntu14.04                Ubuntu 14.04 via Web
item ubuntu16.04                Ubuntu 16.04 via Web

item --gap                      Windows ------------------------------------
item windows                    Windows Install via wimboot-boot.wim

item --gap                      ETC ----------------------------------------
item clonezilla                 Clonezilla
item winpe.iso.bios             Windows PE ISO via sanboot-iso [BIOS]
item winpe.iso.memdisk          Windows PE ISO via memdisk
item shell                      iPXE shell
item --gap                      exit ---------------------------------------
item exit                       Exit

choose --default exit --timeout 20000 target && goto ${target}

:centos7.3.1611.http
 kernel centos/7.3.1611/vmlinuz inst.repo=http://10.0.0.2/centos/7.3.1611/ initrd=initrd
 initrd centos/7.3.1611/initrd.img
 boot

#:centos7.3.1611.http
#  kernel centos/7.3.1611/vmlinuz initrd=centos/7.3.1611/initrd.img repo=http://10.0.0.2/centos/7.3.1611/
#  initrd centos/7.3.1611/initrd.img
#  boot

:centos6.8
 kernel centos/6.8/vmlinuz initrd=centos/6.8/initrd.img repo=http://10.0.0.2/centos/6.8/
 initrd centos/6.8/initrd.img
 boot

:ubuntu12.04
 kernel ubuntu/12.04/linux
 initrd ubuntu/12.04/initrd.gz
 boot

:ubuntu14.04
 kernel ubuntu/14.04/linux
 initrd ubuntu/14.04/initrd.gz
 boot

:ubuntu16.04
 kernel ubuntu/16.04/linux
 initrd ubuntu/16.04/initrd.gz
 boot

:windows
 kernel winboot/wimboot
 initrd winboot/boot/bcd         BCD
 initrd winboot/boot/boot.sdi    boot.sdi
 initrd winboot/boot/boot.wim    boot.wim
 boot
:winpe.iso.bios
 sanboot http://10.0.0.2/winpe/winpeamd64.iso || goto failed
 goto start

:winpe.iso.memdisk
 kernel memdisk
 initrd winpe/winpeamd64.iso || goto failed
 goto start

:clonezilla
 kernel clonzilla/live/vmlinuz fetch=tftp://10.0.0.2/pub/tftp/clonzilla/live/filesystem.squashfs boot=live union=overlay keyboard-layouts=NONE locales=en_US.UTF-8
 initrd clonzilla/live/initrd.img
 boot

:failed
echo Booting failed, dropping to shell
goto shell

:shell
echo Type 'exit' to get the back to the menu
shell
set menu-timeout 0
set submenu-timeout 0
goto start

:exit
 kernel pxelinux.0
 boot




시연화면


UEFI LInux

https://www.youtube.com/watch?v=cg3VcF61TUk





UEFI Windows

https://www.youtube.com/watch?v=FUNPbetmypk







향후 과제


기가비트 and 10GbE 네트워크로 업그레이드 후 배포 속도 비교

dnsmasq 와 isc-dhcp + tftp (xinetd) 의 배포 속도 비교

Windows UEFI & BIOS 배포서버 통합, 하나의 서버에서 모두 배포

iSCSI 를 통한 DiskLess 시스템 구축 (PC방, 대형 강의실 등 활용)

kickstart 를 이용한 리눅스 자동설치




차세대 기술 - Goodbye PXE, Hello HTTP Boot


UEFI 에서 http를 통한 kernel loading 자체 지원


youtube - https://www.youtube.com/watch?v=EjJUBxM7pNM


ipxe -

http://ipxe.org/appnote/uefihttp

https://firmwaresecurity.com/2015/05/09/new-uefi-http-boot-support-in-uefi-2-5/


23.7 HTTP Boot - http://www.uefi.org/sites/default/files/resources/UEFI%202_5.pdf


http://manualzz.com/doc/12137633/goodbye-pxe--hello-http-boot

http://www.slideshare.net/eurolinux/uefi-presentation




후기


끝날것 같지 않던 삽질을 드디어 마쳤습니다. ^^;

도움이 될만한 정보였기를 바랍니다.




<끝>

댓글