KickstartによるBondingの設定(CentOS 7)
Follow @venividivici830
ボンディング(Network bonding)は、複数のネットワークインターフェイスを、1つの仮想的なNICとして扱う機能。
ネットワークの冗長性やスループット向上に寄与する。
第4章 ネットワークボンディングの設定
5.4 ネットワーク・ボンディング
ボンディングにより作成された仮想的なデバイスはマスター(master)、統合される物理デバイスはスレーブ(slave)と呼ばれる。
CentOS7で作るネットワークサーバ構築ガイド1804対応第2版
本投稿では、Kickstartにより、自動的にBondingを設定して、CentOS 7をインストールした。
PXEサーバー、PXEクライアントは、ともにVirtualBox Version 5.2.20 r125813 (Qt5.6.3)の仮想マシンで、OSはCentOS Linux release 7.6.1810 (Core)とした。
ネットワーク構成は下記のとおり。
PXEサーバーは、既に構築されていることを前提とする。
PXEにより、VirtualBoxでCentOS 7のインストーラーを起動した(図で解説あり)
また、キックスタートファイルの配置場所は、PXEサーバーの/var/share/kickstart_filesで、NFSでexportされていることを前提とする。
VirtualBoxにおけるPXEとKickstartによるCentOS 7の自動インストール
それぞれの仮想マシンの設定で、下記を実施。
後の作業で必要になるため、それぞれの仮想マシンのアダプター1のMACアドレスを控えた。
CentOS Client1 - 08:00:27:A3:01:03
CentOS Client2 - 08:00:27:DC:DB:1B
MACアドレスごとにIPアドレスを固定する機能を利用した。
dhcpd.confは下記のとおり。
赤字は、本投稿で追記、修正した部分。黒字の部分は、前の投稿を参照。
MACアドレスは、上の「PXEクライアントの作成」で控えたもの。
192.168.11.100、192.168.11.200は、最終的にはボンドしたインターフェイスに割り当てるため、08:00:27:A3:01:03、08:00:27:DC:DB:1Bのアドレスではなくなるが、08:00:27:A3:01:03、08:00:27:DC:DB:1Bはインストール後にdownさせるので、問題ないと判断した。
設定後、下記コマンドでdhcpdを再起動した。
systemctl restart dhcpd
このキックスタートファイルは、デフォルトの設定でMinimalインストールしたマシンの/root/anaconda-ks.cfgなので、特別な設定はしていない。
client1.cfg、client2.cfgという名前でコピーし、それぞれに対して下記の設定を追記。
client1.cfg
client2.cfg
下記に、client1.cfgのみ、キックスタートファイルの内容すべてを示す。
赤字のは追記、修正した部分、黒字はコピー元の/root/anaconda-ks.cfgをそのまま流用。
ただし、このanaconda-ks.cfgの設定をそのまま流用しただけでは、なぜか[OK] Started pre-anaconda logging service.の前後でインストールがハングした。
このanaconda-ks.cfgの設定には、--activateオプションが記載されており、かつ、下記のenp0s3、enp0s8の設定がなかった。
--activateオプションを除去し、加えて下記のenp0s3、enp0s8の設定を含めることで、ハングする現象がなくなった。 原因はよくわからない。
上ではPXEクライアントごとにKickstartファイルを作成したが、PXE設定ファイルは、現在の設定では/var/lib/tftpboot/pxelinux/pxelinux.cfg/defaultのみしかない。
このため、PXEクライアントごとのPXE設定ファイルを作成し、PXEクライアントごとに読み込むPXE設定ファイルを振り分け、対応するKickstartファイルを読み込めるようにする仕組みが必要になる。
下記のオラクルやSYSLINUXのドキュメントによれば、ブート・イメージは、pxelinux.cfgディレクトリー下の「ブートされるマシンのIPアドレスに対応する名前(大文字の16進数)」を検索する仕様とのこと。
D PXEブートおよびKickstartテクノロジについて
PXELINUX
よって、上の「DHCPの設定」でClient1とClient2に割り当てた、192.168.11.100、192.168.11.200を大文字16進数に変換した名前のファイルを、/var/lib/tftpboot/pxelinux/pxelinux.cfg下に作成した。
具体的には、下記の2つのファイルを作成し、それぞれ対応するキックスタートファイルを指定した。
/var/lib/tftpboot/pxelinux/pxelinux.cfg/C0A80B64 /var/lib/tftpboot/pxelinux/pxelinux.cfg/C0A80BC8
下記は、C0A80B64の設定。 C0A80BC8では、赤字の部分をclient2.cfgにする。
1.3.6 UEFIベースのPXEクライアントのブート・ローダー構成
(例えば、MACアドレスが88:99:AA:BB:CC:DDの場合は、01-88-99-aa-bb-cc-ddというファイルを検索)
しかし、筆者の環境では、PXEがMACアドレスに対応する名前のブート構成ファイルを認識しなかったため、大文字16進数のIPアドレスのブート構成ファイルを用い、IPアドレスはDHCPの機能でMACアドレスごとに固定する方針をとった。
再起動後、ボンディングされていること、IPアドレスが設定通りに設定されていることを確認した。
下図は、Client2の例。
また、内部ネットワークのホストから、sshでClient1とClient2に接続できることを確認した。
さらに、片方のネットワークアダプターを無効にしても通信できることを確認した。(Client1のアダプター2、Client2のアダプター1を無効にして試した)
最後に、アダプター1とアダプター2の両方を無効にすると、通信できなくなることを確認した。
試せていないが、下記でインストール中にログを確認できそう。
6.2 Debug and Log Information
TTY switch for Ctrl-Alt F1 and Alt-F1…F6 in Mac OS X
dracut-initqueue Waning: dracut-initqueue timeout - starting script
DHCPで動的に割り当てるIPアドレスの範囲を広げたところ、エラーが出なくなった。
ボンディング(Network bonding)は、複数のネットワークインターフェイスを、1つの仮想的なNICとして扱う機能。
ネットワークの冗長性やスループット向上に寄与する。
第4章 ネットワークボンディングの設定
5.4 ネットワーク・ボンディング
ボンディングにより作成された仮想的なデバイスはマスター(master)、統合される物理デバイスはスレーブ(slave)と呼ばれる。
CentOS7で作るネットワークサーバ構築ガイド1804対応第2版
本投稿では、Kickstartにより、自動的にBondingを設定して、CentOS 7をインストールした。
PXEサーバー、PXEクライアントは、ともにVirtualBox Version 5.2.20 r125813 (Qt5.6.3)の仮想マシンで、OSはCentOS Linux release 7.6.1810 (Core)とした。
ネットワーク構成は下記のとおり。
PXEサーバーは、既に構築されていることを前提とする。
PXEにより、VirtualBoxでCentOS 7のインストーラーを起動した(図で解説あり)
また、キックスタートファイルの配置場所は、PXEサーバーの/var/share/kickstart_filesで、NFSでexportされていることを前提とする。
VirtualBoxにおけるPXEとKickstartによるCentOS 7の自動インストール
PXEクライアントの作成
VirtualBoxの仮想マシンとして、CentOS Client1、CentOS Client2の2つを作成した。それぞれの仮想マシンの設定で、下記を実施。
- システム > マザーボードから、起動順序の「ネットワーク」にチェック(PXEブートを行うため)
- ネットワークから、アダプター1とアダプター2を、割り当て「内部ネットワーク」として作成(PXEサーバーとの通信、及びBondingのスレーブとするため)
後の作業で必要になるため、それぞれの仮想マシンのアダプター1のMACアドレスを控えた。
CentOS Client1 - 08:00:27:A3:01:03
CentOS Client2 - 08:00:27:DC:DB:1B
DHCPの設定
後の作業で、IPアドレスを利用して、PXEクライアントごとに、読み込む設定を振り分けるため、Client1とClient2に固定のIPアドレスを割り当てた。MACアドレスごとにIPアドレスを固定する機能を利用した。
dhcpd.confは下記のとおり。
option space pxelinux; option pxelinux.magic code 208 = string; option pxelinux.configfile code 209 = text; option pxelinux.pathprefix code 210 = text; option pxelinux.reboottime code 211 = unsigned integer 32; option architecture-type code 93 = unsigned integer 16; subnet 192.168.11.0 netmask 255.255.255.0 { option routers 192.168.11.77; # 不要なので削除 # range 192.168.11.10 192.168.11.49; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.168.11.77; if option architecture-type = 00:07 { filename "uefi/shim.efi"; } else { filename "pxelinux/pxelinux.0"; } } } host client1 { hardware ethernet 08:00:27:A3:01:03; fixed-address 192.168.11.100; option host-name "client1"; } host client2 { hardware ethernet 08:00:27:DC:DB:1B; fixed-address 192.168.11.200; option host-name "client2"; }
赤字は、本投稿で追記、修正した部分。黒字の部分は、前の投稿を参照。
MACアドレスは、上の「PXEクライアントの作成」で控えたもの。
192.168.11.100、192.168.11.200は、最終的にはボンドしたインターフェイスに割り当てるため、08:00:27:A3:01:03、08:00:27:DC:DB:1Bのアドレスではなくなるが、08:00:27:A3:01:03、08:00:27:DC:DB:1Bはインストール後にdownさせるので、問題ないと判断した。
設定後、下記コマンドでdhcpdを再起動した。
systemctl restart dhcpd
参考
1.3.3 PXEクライアントをサポートするためのDHCPおよびTFTPサービスの構成キックスタートファイルの作成
前の投稿で使ったキックスタートファイルをコピーして流用した。このキックスタートファイルは、デフォルトの設定でMinimalインストールしたマシンの/root/anaconda-ks.cfgなので、特別な設定はしていない。
client1.cfg、client2.cfgという名前でコピーし、それぞれに対して下記の設定を追記。
client1.cfg
network --bootproto=static --device=bond0 --gateway=192.168.11.77 --ip=192.168.11.100 --netmask=255.255.255.0 --ipv6=auto --bondslaves=enp0s3,enp0s8 --bondopts=downdelay=0,miimon=1,mode=balance-rr,updelay=0 network --hostname=client1
client2.cfg
network --bootproto=static --device=bond0 --gateway=192.168.11.77 --ip=192.168.11.200 --netmask=255.255.255.0 --ipv6=auto --bondslaves=enp0s3,enp0s8 --bondopts=downdelay=0,miimon=1,mode=balance-rr,updelay=0 network --hostname=client2
下記に、client1.cfgのみ、キックスタートファイルの内容すべてを示す。
赤字のは追記、修正した部分、黒字はコピー元の/root/anaconda-ks.cfgをそのまま流用。
#version=DEVEL # System authorization information auth --enableshadow --passalgo=sha512 # Use CDROM installation media cdrom # Use graphical install graphical # Run the Setup Agent on first boot firstboot --enable ignoredisk --only-use=sda # Keyboard layouts keyboard --vckeymap=jp --xlayouts='jp' # System language lang ja_JP.UTF-8 # Network information network --bootproto=dhcp --device=enp0s3 --onboot=off --ipv6=auto --no-activate network --bootproto=dhcp --device=enp0s8 --onboot=off --ipv6=auto #network --hostname=localhost.localdomain network --bootproto=static --device=bond0 --gateway=192.168.11.77 --ip=192.168.11.100 --netmask=255.255.255.0 --ipv6=auto --bondslaves=enp0s3,enp0s8 --bondopts=downdelay=0,miimon=1,mode=balance-rr,updelay=0 network --hostname=client1 # Root password rootpw --iscrypted $6$DE.Vj6z2FYKbqyI0$JO4LRaz22pIvyddaAC0irq/ZuXM7nsFvTolD4mEzrahFZCFSA5rnh3y/PbAZ.G/XDVep.6/MNRlsRDNUKS/xw. # System services services --enabled="chronyd" # System timezone timezone Asia/Tokyo --isUtc # System bootloader configuration bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda autopart --type=lvm # Partition clearing information clearpart --none --initlabel %packages @^minimal @core chrony kexec-tools %end %addon com_redhat_kdump --enable --reserve-mb='auto' %end %anaconda pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty %end
補足
上で追記した設定は、手動インストール時にボンド設定したマシンの/root/anaconda-ks.cfgを参考にした。(上述の/root/anaconda-ks.cfgとは別物)ただし、このanaconda-ks.cfgの設定をそのまま流用しただけでは、なぜか[OK] Started pre-anaconda logging service.の前後でインストールがハングした。
このanaconda-ks.cfgの設定には、--activateオプションが記載されており、かつ、下記のenp0s3、enp0s8の設定がなかった。
--activateオプションを除去し、加えて下記のenp0s3、enp0s8の設定を含めることで、ハングする現象がなくなった。 原因はよくわからない。
network --bootproto=dhcp --device=enp0s3 --onboot=off --ipv6=auto --no-activate network --bootproto=dhcp --device=enp0s8 --onboot=off --ipv6=auto
クライアントごとのPXE設定ファイルの作成
Kickstartファイルの場所は、PXE設定ファイルで指定される。上ではPXEクライアントごとにKickstartファイルを作成したが、PXE設定ファイルは、現在の設定では/var/lib/tftpboot/pxelinux/pxelinux.cfg/defaultのみしかない。
このため、PXEクライアントごとのPXE設定ファイルを作成し、PXEクライアントごとに読み込むPXE設定ファイルを振り分け、対応するKickstartファイルを読み込めるようにする仕組みが必要になる。
下記のオラクルやSYSLINUXのドキュメントによれば、ブート・イメージは、pxelinux.cfgディレクトリー下の「ブートされるマシンのIPアドレスに対応する名前(大文字の16進数)」を検索する仕様とのこと。
D PXEブートおよびKickstartテクノロジについて
PXELINUX
よって、上の「DHCPの設定」でClient1とClient2に割り当てた、192.168.11.100、192.168.11.200を大文字16進数に変換した名前のファイルを、/var/lib/tftpboot/pxelinux/pxelinux.cfg下に作成した。
具体的には、下記の2つのファイルを作成し、それぞれ対応するキックスタートファイルを指定した。
/var/lib/tftpboot/pxelinux/pxelinux.cfg/C0A80B64 /var/lib/tftpboot/pxelinux/pxelinux.cfg/C0A80BC8
下記は、C0A80B64の設定。 C0A80BC8では、赤字の部分をclient2.cfgにする。
default centos7.6.1810
prompt 0
timeout 600
display boot.msg
label centos7.6.1810
menu label ^Install system
menu default
kernel images/CentOS7.6.1810/vmlinuz
append inst.ks=nfs:192.168.11.77:/var/share/kickstart_files/client1.cfg initrd=images/CentOS7.6.1810/initrd.img ip=dhcp inst.repo=nfs:192.168.11.77:/var/share/installation_source
補足
下記のページに「様々なタイプのクライアントをサポートするために、grub2.cfg-client-IDという名前の構成ファイルを作成できます。」とあるので、UEFIでも同様に、PXEクライアントごとに設定を振り分けられそう。1.3.6 UEFIベースのPXEクライアントのブート・ローダー構成
補足2
上に示したオラクルやSYSLINUXのドキュメントには、ブート・イメージは、TFTPサーバーのpxelinux.cfgディレクトリで、MACアドレスに対応する名前(16進数が小文字で表記されハイフンで区切られたもの)のブート構成ファイルを、大文字16進数のIPアドレスのファイルやdefaultより優先的に検索する仕様と書かれていた。(例えば、MACアドレスが88:99:AA:BB:CC:DDの場合は、01-88-99-aa-bb-cc-ddというファイルを検索)
しかし、筆者の環境では、PXEがMACアドレスに対応する名前のブート構成ファイルを認識しなかったため、大文字16進数のIPアドレスのブート構成ファイルを用い、IPアドレスはDHCPの機能でMACアドレスごとに固定する方針をとった。
参考
下記は、IPアドレスを第一引数として受け取り、大文字16進数を出力する簡単なPythonスクリプト。import sys args = sys.argv ip_address = args[1] octet = ip_address.split('.') hexes = [hex(int(x))[2:].upper().zfill(2) for x in octet] print(''.join(hexes))
インストールの実行
Client1とClient2を起動させると、インストールが自動的に進み、完了した。再起動後、ボンディングされていること、IPアドレスが設定通りに設定されていることを確認した。
下図は、Client2の例。
また、内部ネットワークのホストから、sshでClient1とClient2に接続できることを確認した。
さらに、片方のネットワークアダプターを無効にしても通信できることを確認した。(Client1のアダプター2、Client2のアダプター1を無効にして試した)
最後に、アダプター1とアダプター2の両方を無効にすると、通信できなくなることを確認した。
その他
上述の内容と直接関係ないが、作業中に調査、遭遇したTipsを以下に記録した。試せていないが、下記でインストール中にログを確認できそう。
6.2 Debug and Log Information
TTY switch for Ctrl-Alt F1 and Alt-F1…F6 in Mac OS X
最初、PXEクライアントのIPアドレスは、DHCPで動的に割り振っていたが、DHCPで割り当てられるIPアドレスが枯渇すると、下記のエラーが出た。
DHCPで動的に割り当てるIPアドレスの範囲を広げたところ、エラーが出なくなった。
コメント
コメントを投稿