OpenPOWERサーバーのネットワークインストール(PXEBOOT+Kickstart)

### OpenPOWER
OpenPOWERサーバーは、IBM社のPOWER プロセッサを搭載したサーバーです。
ミッドレンジに区分されるPOWERサーバーはプロセッサだけでなく仮想化の管理機構を含め独自の仕様を持ちます。
一方OpenPOWERサーバーはより一般的なスキル（要するにベアメタルで利用できたり、Linux専用だったり、KVMで仮想化できたり）で管理するようにデザインされています。
ちなみに、OpenPOWER FoundationというIBM外の団体を中心にこの辺りの仕様固めを行いIBM社以外からもOpenPOWERサーバーは提供されています。

### 趣旨

このため、ネットワークインストールの方法については、大枠で一般的なx86サーバーと違いがありません。
以下に記載するような微差や、用途上の特性（GPUサーバーやソフトウェア定義型ストレージの基盤、Dockerホストだったり）から今更ながら「ベアメタル」で「複数台をまとめて」インストールしたい機会が増えたので改めて情報をまとめておきたいと思います。

・システムの電源投入時は、Petitbootloaderが動作し起動可能なデバイスをHDDやネットワーク上からスキャンする。 (BIOSやEFIの挙動に類似）
・BMC（ベースボード管理プロセッサ）からリモート管理する。IPMItoolが前提になっており、ものによっては、遠隔操作もSoL （Serial over LAN）前提。
・（これは用途上）ソフトウェアRAIDを利用するケースが多くRAIDの構成をOSのインストーラ上で行う。


### 手順の概要
ここでは、以下の構成のインストールをネットワークブートとkickstartファイルを用いて自動化します。この文章はAC922のクイックインストールガイド[^1]を元に記載しています。

[^1]: Power9クイックインストールガイド, [Link] (https://www.ibm.com/support/knowledgecenter/linuxonibm/liabw/rhel_guide_Power9_network.pdf?view=kc).


-HW:AC922 (8335-GTH)/ OS:RHEL 7.5



手順は大まかに以下の通りです。この記事では特にOpenPOWER固有の点に絞って情報をまとめていきたいと思います。

1. ブートイメージの保持と配信用のサーバー(PXEサーバー）を立てる
2. kickstartファイルを準備する
3. OSインストール



ネットワークインストール自体は、以下のステップで進行していきます。

![PXEシークエンス.png](https://qiita-image-store.s3.amazonaws.com/0/242827/1f4d21b1-a327-fce1-8d2d-02f4d2569419.png)

ここでは、「起動イメージのリクエスト」の際に、メニューから複数のアーキテクチャ(x86/Power)やOSの種類を選べるように設定を行なっていきます。

制約として、x86でのUEFIモード、PowerでのPowerVMモードでのインストールを行う場合はこの手順ではできません。この方法は、RHELのインストールガイド[^2]に記載があります。

[^2]: RHEL 7 インストールガイド　第23章 ネットワークからのインストールの準備, [Link] (https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/chap-installation-server-setup).



### ブートイメージの保持と配信用のサーバーを立てる

ネットワークインストールに必要なサーバーコンポーネントは以下の通りです。

| コンポーネント名               | 役割                                                  |
| ------------------------------ | ----------------------------------------------------- |
| DHCPサーバー                   | ・IPアドレスの配布とイメージ配布先の支持              |
| tftpサーバー                   | ・vmlinuz/initrd.imgの配信                             |
| NFS/FTP/HTTPサーバーのいずれか | ・kickstartファイルとインストールイメージのリポジトリ |

複数のコンポーネントがありますが、兼用で構わないのでインストール作業用のPCにvirtualBOXなどを使ってlinuxVMを一つ用意しておけばことたります。
サーバーコンポーネントを用意するのが難しいようであればkickstartの構成情報を埋め込んだisoファイルを作成することもできます。

ネットワークインストール処理の流れは以下の通りでそれぞれ必要な設定を各サーバーコンポーネントに実施します。各コンポーネント自体のセットアップの方法は、ここでは記述しません。
より体系的なネットワークインストールの構成方法は、上述のRHELのインストールガイド[^2]を参照してください。

#### DHCPサーバーでの設定

DHCPサーバーでは、インストール対象のサーバーへのIPアドレスの配布と、インストールイメージ配布がネットワーク上のどこで配布されるかを記述します。

1. dhcpの設定ファイルの修正

/etc/dhcp.d.confファイルに以下のエントリを追記します。ここでは、10.7.20.0/16のサブネットに対する設定欄に追記しています。

```bash
subnet 10.7.0.0 netmask 255.255.255.0 {
	option routers 10.7.0.254;
	range 10.7.0.2 10.7.0.253;
：
next-server tftpサーバーのIPアドレス;　
filename "pxelinux.0"; 
#後述するネットワークインストールの起動イメージ。ここではtftpサーバーの<tftproot>ディレクトリに保管します：
}
```

next-server エントリは、単一サーバーでPXEサーバを構成する場合は不要です。
#### tftpサーバーでの設定

tftpサーバーでは、インストール対象にネットワークブート用のイメージを引き渡します。

ここではtftpのrootディレクトリ（ここでは、/tfptpbootとします。）以下に配置します。配置するものは以下のとおりです。

**pxelinux.0関連ファイル**

インストーラーに含まれるネットワークインストールの構成情報を含むファイルです。インストールメディアのsysllinuxパッケージから、展開して利用するのが簡単です。ただし、<u>ppc64le版のRHELインストールメディアには含まれませんの</u>で、CentOSなどx86版のlinuxインストールイメージから展開してtftpサーバー上に配置します。

続けて、pxelinux.0を配置したディレクトリ上にpxelinux.cfgという名称でサブディレクトリを作成します。

```
# mount CentOS-7-x86_64-DVD-1511.iso tmp -o loop
# rpm2cpio ../tmp/Packages/syslinux-4.05-12.el7.x86_64.rpm | cpio -dmiv
# cp ./usr/share/syslinux/pxelinux.0 /tftpboot/pxelinux/
# cp ./usr/share/syslinux/vesamenu.c32 /tftpboot/pxelinux/
# mkdir /tftpboot/pxelinux/pxelinux.cfg
```



**初期ディスクイメージ**

インストールメディアに含まれる、vmlinuzとinitrd.imgファイルを、tftpサーバー上に配置します。

```
# mount -o loop ./RedHat/RHEL7/rhel-alt-server-7.5-ppc64le-dvd.iso ./tmp/
# cd ./tmp/
# cp ./ppc/ppc64/vmlinuz /tftpboot/os/RHEL/PPC/S75alt_le/ppc/ppc64/
# cp ./ppc/ppc64/initrd.img /tftpboot/os/RHEL/PPC/S75alt_le/ppc/ppc64/
# ls /tftpboot/os/RHEL/PPC/S75alt_le/ppc/ppc64/
initrd.img  vmlinuz
```



上で作成したサブディレクトリ上にdefaultという名前で設定ファイルを作成します。

ここでは、RHEL7.5 for POWER9, x86_64を選択的にネットワークインストールできるメニューとしています。

```
# vim /tftpboot/pxelinux/pxelinux.cfg/default
ファイル内の記載例）----
PROMPT 0
ui vesamenu.c32
menu PXE Boot Menu

label RHEL7.5alt ppc64_le
menu RHEL7.5alt ppc64_le
  kernel os/RHEL/PPC/S75alt_le/ppc/ppc64/vmlinuz
  append load initrd=os/RHEL/PPC/S75alt_le/ppc/ppc64/initrd.img  devfs=nomount ks=ftp://10.7.0.1/pub/ks/rhel75altppc64le-ks.cfg console=ttyS0

label RHEL7.5 x86_64
menu RHEL7.5 x86_64
  kernel os/RHEL/X86-64/S75/images/pxeboot/vmlinuz
  append load initrd=os/RHEL/X86-64/S75/images/pxeboot/initrd.img devfs=nomount　ks=ftp://10.7.0.1/pub/ks/rhel75-ks.cfg
```

**記載内容の解説**

このメニューでは、labelで指定された RHEL7.5alt ppc64_leおよび、RHEL 7.5 x86_64を選択可能です。

例として、RHEL7.5alt ppc64_leを選択した場合は下記の設定でインストーラがネットワーク上からロードされます。ks=はキックスタートの構成ファイルですが、この時点ではまだ作成していません。次の章にサンプルを記載します。

| **項目名** | 役割                                                         |
| ---------- | ------------------------------------------------------------ |
| kernel 行  | vmlinuzのパスを指定します。                                  |
| append行   | initrd.imgおよびそのブートパラメータを指定します。ks=は、キックスタートの構成ファイルのネットワーク上のパス名（ここでは、ftp)を、console=ttyS0は、インストール時にシリアルコンソールに画面出力を行います。 |

<u>SoLでリモートコントロールするタイプのOpenPOWERサーバー(AC922など）ではインストール時の画面出力</u>をttyS0にすることで、インストーラの対話的インストールの画面出力を遠隔から確認ができます。

#### インストールリポジトリの作成

インストールイメージはファイルサイズが大きいため、tftpサーバーでの配布に適しません。
このため、インストールメディアをNFS/FTP/HTTPいずれかのサーバー上に展開しネットワークインストール時に参照できるようにしておきます。使用するプロトコルに応じてエクスポートディレクトリ上に展開します。ここでは、httpでエクスポートする前提で/var/www/html/boot/ppc64le/rhel/7_5alt/以下に展開します。

/var/www/htmlがドキュメントルートです。

```
# mount -o loop ./RedHat/RHEL7/rhel-alt-server-7.5-ppc64le-dvd.iso 
/var/www/html/boot/ppc64le/rhel/7_5alt/
# ls /var/www/html/boot/ppc64le/rhel/7_5alt/
EULA  GPL  LiveOS  Packages  RPM-GPG-KEY-redhat-beta  RPM-GPG-KEY-redhat-release  TRANS.TBL  boot  extra_files.json  images  media.repo  ppc  repodata
```



#### kickstartファイルの構成

kickstart構成ファイルをネットワークインストール時に指定することで、対話的な設定を省いてインストールの自動化を行うことができます。

指定可能なパラメータの詳細は、以下の文書に詳細な記載があります。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-howto

ここでは、１台を手動でインストールした後に構成される/root/anaconda-ks.cfgを参考に以下のようにAC922で内蔵ディスクをミラーリングするkickstartファイルを作成しています。

urlコマンドでインストールディレクトリを指定します。ここでは先に展開したインストールリポジトリを指定します。（/var/www/htmlがドキュメントルート）その他の記述は、anaconda-ks.cfgの記述をほぼそのまま利用しています。インストール後のpost処理(%postセクション)で、インストール時に指定したconsole=ttyS0のパラメータを削除しています。



作成したkickstartファイルは、先のdefaultファイルに記載のks=で指定されるファイルパスに作成します。

サンプル）

```bash
# vim /var/ftp/pub/ks/rhel75altppc64le-ks.cfg
#ファイルの記載
install
url --url http://10.7.0.1/boot/ppc64le/rhel/7_5alt/
text
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda,sdb
# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang ja_JP.UTF-8
# Network information
network  --bootproto=dhcp --device=enP48p1s0f0 --onboot=off --ipv6=auto
network  --hostname=ac922-1.localdomain

# Root password
rootpw --iscrypted <暗号化されたパスワード>
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Tokyo --isUtc
user --name=user1 --password=<暗号化されたパスワード>　--iscrypted --gecos="user1"
# X Window System configuration information
xconfig  --startxonboot
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda,sdb
# Disk partitioning information
part raid.1251 --fstype="mdmember" --ondisk=sdb --size=20496
part prepboot --fstype="prepboot" --size=4
part raid.1245 --fstype="mdmember" --ondisk=sda --size=20496
part raid.613 --fstype="mdmember" --ondisk=sda --size=513
part raid.619 --fstype="mdmember" --ondisk=sdb --size=513
part raid.900 --fstype="mdmember" --ondisk=sda --size=1 --grow
part raid.906 --fstype="mdmember" --ondisk=sdb --size=1 --grow
raid / --device=root --fstype="xfs" --level=RAID1 raid.900 raid.906
raid swap --device=swap --fstype="swap" --level=RAID1 raid.1245 raid.1251
raid /boot --device=boot --fstype="xfs" --level=RAID1 raid.613 raid.619

%packages
@^graphical-server-environment
@base
@core
@desktop-debugging
@development
@dial-up
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@hardware-monitoring
@input-methods
@internet-browser
@multimedia
@print-client
@system-admin-tools
@x11
chrony

%end

%addon com_redhat_kdump --disable --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

%post
grubby --remove-args="console=ttyS0" --update-kernel=ALL
%end
```



カスタマイズを行う場合、pykickstartファイルに含まれるksvalidatorコマンドで構文エラーの確認が可能です。

```
# yum install pykickstart
# ksvalidator ks.cfg
以下の問題が kickstart ファイルの 22 行目で発生しました。

Unknown command: --iscrypted
```



ここまでの作業でtftpサーバーのディレクトリ構造は以下のようになっているはずです。

```
*tftpのドキュメントルート
# ls -R /tftpboot/
/tftpboot/:
os  pxelinux.0  pxelinux.cfg  vesamenu.c32

/tftpboot/os:
RHEL
:
/tftpboot/os/RHEL/PPC/S75alt_le/ppc/ppc64:
initrd.img  vmlinuz

/tftpboot/pxelinux.cfg:
default 
```



### ネットワークインストールの実行

以上で準備が整ったので、ネットワークインストールを進めていきます。

サーバーの電源を投入すると、Petitbootのメニューに作成したdefaultファイルのメニューが一覧で表示されます。(キャプチャを撮り忘れてしまったので後日添付します。)
インストールしたいイメージを選択すると自動的にインストールが進みます。