KickstartによるBondingの設定(CentOS 7)



ボンディング(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アドレスが枯渇すると、下記のエラーが出た。

dracut-initqueue Waning: dracut-initqueue timeout - starting script

DHCPで動的に割り当てるIPアドレスの範囲を広げたところ、エラーが出なくなった。

コメント

このブログの人気の投稿

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

Windowsで、特定のユーザーに特定のサービスの再起動を許可する

PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする