複数台の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
[root@c ~]# systemctl start dhcpd tftp

tftp設計

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

[root@c ~]# /usr/lib/systemd/system/tftp.service
[Unit]
Description=Tftp Server
Requires=tftp.socket
Documentation=man:in.tftpd
 
[Service]
ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot  # -vvvを付けて詳細確認も可
StandardInput=socket
 
[Install]
Also=tftp.socket
[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/os/x86_64/images/pxeboot/initrd.img
[root@c pxeboot]# curl -O ftp://ftp.riken.jp/Linux/centos/7/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向けのブートローダ(BOOTX64.EFI)を用意して、これをdhcpd.confの「filename」に差し替えます

[root@c ~]# cd /var/lib/tftpboot/pxeboot
[root@c pxeboot]# curl -O ftp://ftp.riken.jp/Linux/centos/7/os/x86_64/EFI/BOOT/grubx64.efi
[root@c pxeboot]# ls -l
合計 59052
-rw-r--r-- 1 root root  1090976  2月 16 05:08 grubx64.efi
-rw-r--r-- 1 root root 52584760  2月 12 23:45 initrd.img
-rw-r--r-- 1 root root    26759  2月 12 23:45 pxelinux.0
drwxr-xr-x 2 root root       60  2月 16 03:49 pxelinux.cfg
-rw-r--r-- 1 root root  6639904  2月 12 23:46 vmlinuz
[root@c pxeboot]#

次に、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

そしてUEFI向けの定義ファイルgrub.cfgを作成します
BIOS向けの 定義ファイルdefault と同じ

*MACアドレス毎にgrub.cfgを定めたい場合は、先頭に「01」を付けMACアドレスを付与したファイルにする「grub.cfg-01-00-0c-29-09-73-55
*IPアドレスの幅で定義したいのなら「grub.cfg-C0A80065」(大文字)とかにする。
この辺は「pxelinux.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://c.sybyl.local/export/CentOS7/ks.cfg
 initrdefi /pxeboot/initrd.img
}
[root@c ~]#

これでブートすればネットワーク経由で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 ~]#

インストール先が複数のnicを持ってたら

上記は全てnicが一枚ならのお話。複数だと上手く動かないみたい。
回避方法だが、定義ファイル([pxelinux.cfg/default],[grub.cfg])に
「ip=eth0:dhcp」
もしくは
「net.ifnames=0 ip=eth0:dhcp」
を加える。
*「net.ifnames」はCentOS7でnic名をCentOS6同様のeth0とかにしてくれる
そして、どのnicを使うかを定義します。
「rd.neednet=1 bootdev=eth0」

実機でのBIOS調整

手元にASRock Rackの板がある。これでUEFI PXEブートするには、BIOS画面で「Boot」->「Boot From Onboard LAN」から「Onboard LAN UEFI PXE」を選ぶ
2019y02m16d_060403971.png
設定を保存して、また再度BIOS画面を開くと、下記のようにLAN経由でUEFIブートが選べるようになる。
2019y02m16d_060640455.png
ここで、IP4を優先させて保存する必要がある。

InfiniBandカードが付いていたら

CetnOS6にてインストーラーを使うと下記の様にInfiniBandカードを認識してipのアサインが可能であった
2019y02m16d_121832343.png
だがCentOS7では、InfiniBandカードは認識せず、OSインストール時点でInfiniBandにipのアサインができないみたい。

PXEboot+Kickstartなら
UEFI定義ファイルgrub.cfgにて

 :
linuxefi  /pxeboot/vmlinuz ip=dhcp inst.repo=nfs://c.sybyl.local/export/CentOS7/ ks=nfs://c.sybyl.local/export/CentOS7/ks.cfg \
 net.ifnames=0 ip=eth0:dhcp rd.neednet=1 bootdev=eth0 selinux=0 rd.driver.pre=mlx5_ib,mlx4_ib,ib_ipoib \
 ip=192.168.100.101:::255.255.255.0::ib0:none
initrdefi /pxeboot/initrd.img

*linuxefi行は一行で書いてください
とib0を付けておいて、Kickstartのインストールパッケージに「@Infiniband Support」を追加すれば一応いける

メモ

PXEbootのきっかけになるnicに静的ipは付けられないみたい。
指定したらanacondaが起動しなかった(centos7.6)


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2019-02-24 (日) 01:43:43 (61d)