複数台のLinuxマシンを構築することになった
一台一台USB-bootで作るのもいいのだが、dhcpkickstartを合わせてPXEブートで自動構築させてみた

PXE bootを認識して情報を提供する dhcp サーバと ブートに必要なファイルを提供する tftp サーバを構築する
*同一マシンに収めても構わない

dhcp・tftpサーバ構築

[root@c ~]# yum install dhcp
[root@c ~]# yum install tftp-server
 
[root@c ~]# systemctl enable dhcpd tftp

tftp設計

tftpで公開される場所は、tftpの設定ファイルから /var/lib/tftpboot である

[root@c ~]# 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 /var/lib/tftpboot
        disable                 = yes
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
[root@c ~]#

なので、PXEで起動したマシンはここ/var/lib/tftpbootを基点(/)にブートローダを見に来る
ここではルート(/)にブートローダを置かず、pxebootなるフォルダを作り、そこにブートローダらを置いた

[root@c ~]# yum install syslinux
[root@c ~]# mkdir /var/lib/tftpboot/pxeboot
 
[root@c ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxeboot/
[root@c ~]# ls -l /var/lib/tftpboot/pxeboot/
合計 28
-rw-r--r-- 1 root root 26764  1月 24 18:12 pxelinux.0
[root@c ~]#

*ブートローダのありかは、dhcp経由で渡される

dhcp設計

dhcpはMACアドレス毎に事前にipとマシン名を明記しておく

[root@c ~]# vi /etc/dhcp/dhcpd.conf
 :
host c101 {
   hardware ethernet 00:0c:29:09:73:55;
   fixed-address     192.168.0.101;
   option host-name  "c101.sybyl.local";
   filename          "/pxeboot/pxelinux.0";
   next-server       192.168.0.3;
}
 :
[root@c ~]#
  • hardware ethernet
    構築対象のMACアドレス
  • fixed-address
    宛がうIPアドレス
  • option host-name
    ホスト名
  • filename
    ブートローダの場所( /var/lib/tftpboot を起点にして )
  • next-server
    tftpサーバの場所

起動イメージの設置

次に、PXE経由でブートローダを取得してたマシンが読み込む起動イメージを用意します。
場所は同じ場所で

[root@c ~]# cd /var/lib/tftpboot/pxeboot/
 
[root@c pxeboot]# curl -O ftp://ftp.riken.jp/Linux/centos/7.3.1611/os/x86_64/images/pxeboot/initrd.img
[root@c pxeboot]# curl -O ftp://ftp.riken.jp/Linux/centos/7.3.1611/os/x86_64/images/pxeboot/vmlinuz
 
[root@c pxeboot]# ls -l /var/lib/tftpboot/pxeboot/
合計 47656
-rw-r--r-- 1 root root 43372552  1月 24 18:27 initrd.img
-rw-r--r-- 1 root root    26764  1月 24 18:12 pxelinux.0
-rw-r--r-- 1 root root  5392080  1月 24 18:28 vmlinuz
[root@c pxeboot]#

ブートローダがどの起動イメージを読み込むかを定義するファイルを用意します。
対象マシンのIPアドレスごとに用意できますが、既定のみを用意します。

[root@c pxeboot]# mkdir pxelinux.cfg
[root@c pxeboot]# vi pxelinux.cfg/default
default kickstart
timeout 5
label kickstart
kernel vmlinuz
append initrd=initrd.img inst.repo=nfs://c.sybyl.local/export/CentOS7/ ks=nfs://c.sybyl.local/export/CentOS7/ks.cfg
[root@c pxeboot]#

留意 定義ファイルdefaultは、全てのネットブート由来マシンに適用される。特定のマシンにのみ適用させるならMACアドレスの先頭に01を付けたファイルを(01-00-0c-29-09-73-55)を用意するか、IPアドレスを16進数に変換したファイルを用意する(「192.168.0.101」なら「C0A80065」(大文字へ))

append行の「inst.repo=」は、OSイメージファイルCentOS-7-x86_64-DVD-1611.isoを展開した場所をNFSで公開した場所です
下記のようにして作成します.

[root@c ~]# cd /export
[root@c export]# curl -O ftp://ftp.riken.jp/Linux/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
[root@c export]# mkdir _CentOS7 && mount -t iso9660 -o loop,ro CentOS-7-x86_64-DVD-1611.iso ./_CentOS7
[root@c export]# rsync -a ./_CentOS7/ ./CentOS7/  && umount ./_CentOS7 && rmdir ./_CentOS7

そして、この場所をnfs exportさせます

[root@c ~]# cat /etc/exports
/export  192.168.0.0/255.255.255.0(ro)
 
[root@c ~]# exportfs -a

また、「ks=」はkickstart/netinstall/ks.cfgのファイルを指定した
*nfsサーバ宛を変更して「nfs --server=c.sybyl.local --dir=/export/CentOS7」にする必要があります
*このファイルを「/var/lib/tftpboot/pxeboot」に配置したかったが、無理だった

UEFIでは?

BIOSなマシンは上記で行けるのですが、UEFIなマシンでは動きません。

UEFI向けのブートローダ(grubx64.efi)を用意して、これをdhcpd.confの「filename」に差し替えます

[root@c ~]# cp -p /export/CentOS7/EFI/BOOT/grubx64.efi /var/lib/tftpboot/pxeboot/grubx64.efi
 
[root@c ~]# ls -l /var/lib/tftpboot/pxeboot/
合計 48660
-rwxr-xr-x 1 root root  1025920 11月 23  2016 grubx64.efi
-rw-r--r-- 1 root root 43372552  1月 24  2017 initrd.img
-rw-r--r-- 1 root root    26764  1月 24  2017 pxelinux.0
drwxr-xr-x 2 root root       20  8月  1 13:19 pxelinux.cfg
-rw-r--r-- 1 root root  5392080  1月 24  2017 vmlinuz
[root@c ~]#

dhcpd.confを修正します

[root@c ~]# vi /etc/dhcp/dhcpd.conf
 :
host c101 {
   hardware ethernet 00:0c:29:09:73:55;
   fixed-address     192.168.0.101;
   option host-name "c101.sybyl.local";
   #filename         "/pxeboot/pxelinux.0";  # <-- BIOS用ブートローラー
   filename         "/pxeboot/grubx64.efi";  # <-- UEFI用ブートローラー
   next-server       192.168.0.3;
}
 :
[root@c ~]# systemctl restart dhcpd

そしてgrub.cfgを作成します

[root@c ~]# vi /var/lib/tftpboot/pxeboot/grub.cfg
set timeout=60
menuentry 'CentOS 7' {
 echo 'Network status:'
 net_ls_cards
 net_ls_addr
 
 linuxefi /pxeboot/vmlinuz ip=dhcp inst.repo=nfs://c.sybyl.local/export/CentOS7/ ks=nfs://q.sybyl.local/export/CentOS7/ks.cfg
 initrdefi /pxeboot/initrd.img
}
[root@c ~]#

*MACアドレス毎にgrub.cfgを定めたい場合は、先頭に「01」を付けMACアドレスを付与したファイルにする「grub.cfg-01-00-0c-29-09-73-55
*IPアドレスの幅で定義したいのなら「grub.cfg-C0A80065」(大文字)とかにする。この辺は「pxelinux.cfg/」と同じ

これでブートすればネットワーク経由でOSはインストールされます

ファイル構成

BIOS向け、UEFI向け、OS毎とかにフォルダを分けて用意するのも宜しいかもしれないが、ここでは1つのディレクトリに置いて見た

[root@c ~]# ls -l /var/lib/tftpboot/pxeboot/
合計 48664
-rw-r--r-- 1 root root      196  8月  1 17:55 grub.cfg            <--- UEFI向け
-rwxr-xr-x 1 root root  1025920 11月 23  2016 grubx64.efi         <--- UEFI向けブートローダー
-rw-r--r-- 1 root root 43372552  1月 24  2017 initrd.img
-rw-r--r-- 1 root root    26764  1月 24  2017 pxelinux.0          <--- BIOS向けブートローダー
drwxr-xr-x 2 root root       20  8月  1 15:40 pxelinux.cfg        <--- BIOS向け
-rw-r--r-- 1 root root  5392080  1月 24  2017 vmlinuz
[root@c ~]#

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2017-08-02 (水) 15:39:40 (15d)