IBM Cloud: Bare Metal Server for VPCでNetwork Boot(iPXEブート）を試してみた

# 1. はじめに
IBM Cloudでは、事前に用意されているOSイメージを利用するだけでなく、iPXEによるNetwork Bootを利用して任意のOSをインストールすることも可能である。
https://cloud.ibm.com/docs/vpc?topic=vpc-network-boot-bare-metal-servers&interface=ui&locale=en

特に、IBM CloudのBare Metal Server for VPC(BM for VPC)においては、iPXEをロードするためにDHCPサーバーを構成したりTFTPサーバーを構成する必要はないことは非常に利用の敷居を下げてくれている。OS注文画面やOS再構成画面で`Network Boot`を選択するだけで、IBM Cloudが提供するiPXEを起動可能なイメージが展開され、そこで指定したiPXEスクリプトを実行することが可能である。つまり、利用者はiPXEスクリプトとダウンロード可能なイメージを用意するだけで容易にNetwork Bootを利用することができる。本稿では、BM for VPCでNetwork Bootを試してみる。

なお、事前にpublic gateway経由でインターネットアクセス可能なようにVPCを構成しているものとする。



# 2. ipxeスクリプトの例

iPXEのコマンドについては、以下に解説がある。

- [iPXEのCommand Reference](https://ipxe.org/cmd)

以下では、シンプルなiPXEスクリプトと、メニュー表示可能なiPXEスクリプトを用意した。


```txt:ipxeスクリプト例1: CentOS9の導入
#!ipxe

:retry_dhcp
  dhcp || goto retry_dhcp
  sleep 2
ntp mirrors.adn.networklayer.com

set repo http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os
kernel ${repo}/images/pxeboot/vmlinuz initrd=initrd.img inst.repo=${repo}
initrd ${repo}/images/pxeboot/initrd.img
boot

```


```txt:ipxeスクリプト例2: メニュー選択が可能
#!ipxe

:retry_dhcp
  dhcp || goto retry_dhcp
  sleep 2

ntp mirrors.adn.networklayer.com

# menu
:menu
set menu-timeout 300000
menu Please choose OS you want to install
item --gap -- -------------------------- OS menu -------------------------
item centos9     Install CentOS 9
item fedora40    Install Fedora 40
item fedora39    Install Fedora 39
item --gap -- -------------------------- Advanced Option ------------------
item shell       Go to iPXE shell
item reboot      Reboot Computer
choose --timeout ${menu-timeout}  selected || goto exit
goto ${selected}

:centos9
set repo http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os
kernel ${repo}/images/pxeboot/vmlinuz initrd=initrd.img inst.repo=${repo}
initrd ${repo}/images/pxeboot/initrd.img
boot

:fedora40
set mirror http://download.fedoraproject.org/pub/fedora/linux/releases/40
set repo ${mirror}/Everything/x86_64/os
kernel ${repo}/images/pxeboot/vmlinuz initrd=initrd.img inst.repo=${repo}
initrd ${repo}/images/pxeboot/initrd.img
boot

:fedora39
set mirror http://download.fedoraproject.org/pub/fedora/linux/releases/39
set repo ${mirror}/Everything/x86_64/os
kernel ${repo}/images/pxeboot/vmlinuz initrd=initrd.img inst.repo=${repo}
initrd ${repo}/images/pxeboot/initrd.img
boot

:shell
echo Type 'exit' to get the back to the menu
shell
goto menu

:reboot
reboot

:exit
exit
```

:::note warn
IBM Cloud docsに既知の情報として、NWアダプターが構成中のタイミングでDHCP取得にエラーになる可能性があるため、retryをすることを推奨している。今回はその指示に従ってDHCP取得時には以下のコードに変更している。
https://cloud.ibm.com/docs/vpc?topic=vpc-known-issues#ipxe-network-boot-known-issue

```
:retry_dhcp
  dhcp || goto retry_dhcp
  sleep 2
```
:::

:::note warn
iPXEで`item`文を使ってメニューを作成する際に、 "----"を付け加える際には、それがオプション引数であると見なされないように、注意する必要がある。https://ipxe.org/cmd/item

> If you want your separator text to start with dashes, then you must use -- to prevent iPXE from attempting to interpret your separator text as an option. For example:

`item --gap -- ---------------- Advanced configuration ----------------`

:::



# 3. 注文画面

以下は、Bare Metal Server for VPCの注文画面。

- ロケーションやサーバー名やリソースグループを選択することは通常の注文と同じである。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ff2ea57a-7987-f901-63bc-63f242ebae90.png)
- Image and profileの箇所で、`Network boot`を選択し、そこにiPXEスクリプトを記述する。ここでは、メニュー選択が可能な`ipxeスクリプト例2`を入力する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4806a184-49be-216e-a401-867ea6b30d36.png)
- あとは通常時の注文と同じであり、適切なプロファイルやNW設定を行う。（なお、東京DCには本稿執筆時点で`bx2-metal-96x384`プロファイルのサーバーは存在しなかったため、`bx2d-metal-96x384`を利用している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0b47752f-11d3-a707-538d-e9010f6a4248.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/073a4797-298c-9c4e-d8a3-438193136d13.png)


# 4. 注文後のiPXEブートを眺めてみる

- サーバーの状態が、`Pending`の時はVNC Consoleアクセスは利用できないが、`Starting`/`Running`状態になるとVNC Consoleアクセスが可能になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/33cac18f-e14c-529f-e604-43a69fdba7fb.png)
- サーバー起動からiPXEスクリプトが呼び出されるまで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d98df0fc-1700-10fc-3648-79069f475652.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/628ce739-df9f-3ff1-f27b-c64164198f85.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/05013091-2d9e-c254-868a-fd05d7157913.png)
- iPXEスクリプトで作成したメニューが表示されるようになった。`Install CentOS 9`を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a30aa284-5305-cdd3-ac45-06e73c9790ec.png)
- CentOS9のインストーラーが起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5e485436-fba9-a072-2e29-26740665c670.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0e78e20c-dd4b-2c6c-930e-b434ef6a03ea.png)
- インストールウィザードが表示された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/57165fa7-b83c-e729-0376-67a4aead5134.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c2483c61-e409-f8c4-e584-5f306f24ada6.png)

以下では、ほとんどデフォルトのまま作業を実施するが、特に注視しておくべき箇所について取り上げる。

- `Time & Date`におけるNTPは、ipxeスクリプトで指定したURIが構成されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/aaab250c-d8df-f9b3-d4af-b896e46fc62b.png)
- `Installation Destination`では、`Local disk(1 x 960GB)`をインストール先として選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0aa1e122-9ad2-f6e3-66ae-8a2db31040b1.png)
- `Root Password`ではNetworkアクセスできるように初期パスワードを入力する。また、SSHアクセス可能にする（この辺りはインストール後に細かく設定すれば良いと思う）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f70f171c-6a61-52e4-2d30-bb4f62843942.png)
- `Network & Host Name`では、DHCPでIPアドレスが取得できていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ebd1444b-2871-12c5-d6d4-b596dce5d4ab.png)

以下、インストールを実施

- Begin Installation
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/593de0dc-fb91-b275-7111-739b88e6b05f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b1cb5951-8259-a8f6-94d7-9bedfa0d7dee.png)
- Rebootを実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d9957e35-704d-8d6b-fbb3-14a13b22099a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/05c1b9a6-1a45-2793-c43f-f2dca91f3f46.png)
- インストールの完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/73d0cc31-91bb-6826-306d-a0c540e0e7dd.png)


# 5. SSHでアクセスしてみる


```
syasuda@MacBook-Pro ~ % ssh root@10.50.4.28
The authenticity of host '10.50.4.28 (10.50.4.28)' can't be established.
ED25519 key fingerprint is SHA256:A19VEgeKZI8d0OEuzWllgHktPHV1ipnOjGjHgvuB1Og.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.50.4.28' (ED25519) to the list of known hosts.
root@10.50.4.28's password:
Permission denied, please try again.
root@10.50.4.28's password:
Activate the web console with: systemctl enable --now cockpit.socket

Last failed login: Tue Oct 15 03:09:15 CDT 2024 from 192.168.100.5 on ssh:notty
There was 1 failed login attempt since the last successful login.

[root@localhost ~]# cat /etc/redhat-release
CentOS Stream release 9

[root@localhost ~]# date
Tue Oct 15 03:11:08 AM CDT 2024
```


# 6. OS再構成（Reinitialize）でもNetwork Bootが選択できることの確認

サーバーを停止させた後、ReinitializeでNetwork Bootを選択することも可能。よって、何度でもOSを再導入することが可能である。また、もしプロビジョニング済みのipxeスクリプトを再修正したい場合は、Reinitializeで再度新しいipxeスクリプトを指定することができる。

- サーバーを停止した後、Reinitializeを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d228314a-e757-fcae-2bb5-1dead531e42f.png)
- Network Bootを選択。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3e0272e4-02f4-3b07-090e-862de09fc7bf.png)