iPXE経由でAPU/APU2にUbuntu 22.04をインストールする

# はじめに

[PC Engines社製のAPU, APU2](http://pcengines.ch/apu.htm)はVGA出力がなく、通常はルーター・サーバーなどの用途で使用するためキーボード・マウスも接続せず、必要な場合はシリアルコンソール(RS-232C, D-sub 9pin)経由でアクセスしています。

APU/APU2はPassmark値では1000前後の性能ですが、2GB or 4GBのメモリがあり、自作ルーター・スイッチとしては十分です。

いろいろ試す都度、OSを再インストールするのは大変なので、APU/APU2のiPXE機能を利用して作業を半自動化しています。
またメモリの制限があり、2GB版のAPU/APU2では利用できなかったので、USBメモリ経由での自動インストールにも対応しました。

これまでUbuntu 18.04を導入してから20.04にアップグレードして利用していましたが、22.04がリリースされてしばらく経つので、構成を変更して、22.04が導入できるようにします。

Ubuntu 20.04がリリースされた時点でも検討しましたが、AutoInstallの挙動にあやしい点があったので見送っていました。20.04.4では十分に安定していると思われたので、今回変更に挑戦することにしました。

USBメモリからOSを自動インストールできるのであれば、iPXEは不要な気もしますが、昔から利用していた経緯があるので、実験も兼てiPXE機能を利用していきます。

## 2GB版 APU/APU2 への対応

2GB版のAPU/APU2にUbuntu 22.04を導入する場合には、USBメモリを利用してOSを導入してください。

* [Ubuntu 20.04をAutoInstallで自動インストールしてみた](https://qiita.com/YasuhiroABE/items/637f1046a15938f9d3e9)

# References

* [ubuntu.com - Netbooting the server installer on amd64](https://ubuntu.com/server/docs/install/netboot-amd64)
* https://www.molnar-peter.hu/en/ubuntu-jammy-netinstall-pxe.html

# 成果物

iPXEホストとなるAPUを構成するためのプロジェクトファイルをGitHubで公開しています。

* [YasuhiroABE/myansible-apu-ipxhost](https://github.com/YasuhiroABE/myansible-apu-ipxhost)

使い方自体は、GitHub上のREADME.mdファイルを参照してください。


iPXEホストとなるAPUは2GBメモリ版を想定していますが、iPXE経由でOSを導入する対象のAPU/APU2は4GB版である必要があります。

# 機器の構成

## iPXEホスト側

今回構築するインストールイメージを提供するiPXEサーバーは以下のような構成です。

* Hardware: APU (CPU: AMD G-T40E, Memory: 2GB, Disk: 128GB, NIC: 1Gbps x3)
* OS: Ubuntu 22.04 LTS amd64版 (18.04からのバージョンアップ)
* Software:
  * TFTP, DHCPサーバー (dnsmasq)
  * Webサーバー (nginx)

ホストはOSが導入済みで、ネットワークに接続していることを前提としています。

以前は同じくPC Engines社製のALIXを利用していましたが、256MBのメモリではDebian 11の最低要件を満たすことができません。Debian 10までは256MBメモリもサポートしているのでALIXを引き続き使う事は可能ですが、今後のことを考えて2GBメモリ版のAPUに引っ越すことにしました。

* [Ubuntu Server 22.04 - Basic Installation](https://ubuntu.com/server/docs/installation)
* [Debian 10 - Meeting Minimum Hardware Requirements](https://www.debian.org/releases/buster/amd64/ch03s04.en.html)

![20181002_apu_installer_alix.png](https://qiita-image-store.s3.amazonaws.com/0/78296/94d660ea-e746-cef7-7ad8-26e266acb7c5.png)


## 導入対象(APU/APU2)の基本的な構成

SDカードは使用せずに、mSATA接続でSSDを使用しています。

また firmware は現時点の最新にしています。PXE bootの機能が充実しているので、製品購入時のままにすることはおすすめしません。

APU/APU2のFirmwareの更新については下記の記事を参照してください。

* [APU/APU2のfirmware(coreboot)をv.4.16.xに更新する](https://qiita.com/YasuhiroABE/items/421b3893c99ccca0df00)

# 基本的な構成

dnsmasqにより、TFTPとDHCPサーバーを構成し、nginxがWebサーバーとして必要なファイルを提供します。

## Nginxが提供するファイルについて

数が少ないので、読み込み順は後になりますが、Webサーバーが提供するファイルについて説明します。

* /app/www/ubuntu-22.04-live-server-amd64.iso
* /app/www/user-data
* /app/www/meta-data
* 
ubuntu-22.04-live-server-amd64.iso ファイルはAPU/APU2からダウンロードされ、OSの導入に利用されます。

user-data ファイルは自動インストールに必要な全ての設定が含まれています。

meta-data ファイルは、空ファイルですが、必ず存在する必要があります。

## dnsmasqが提供するファイルについて

dnsmasqのTFTP機能はAPU/APU2の起動に必要なカーネルイメージのダウンロードに利用されます。

* /app/ub2204/pxelinux.0
* /app/usb2204/ldlinux.c32
* /app/ub2204/pxelinux.cfg/default
* /app/ub2204/casper/vmlinuz
* /app/ub2204/casper/initrd

pxelinux.0 と ldlinux.c32 ファイルはホストの起動に必要なファイルです。

defaultファイルはpxelinux.0が自動的に読み込みます。カーネルを起動するために必要な設定が記述されています。

vmlinuzとinitrdファイルはISOファイルに含まれているファイルを/mnt/iso経由でコピーしています。

## dnsmasqの機能について

OS導入対象のAPU/APU2のiPXE機能はfirmwareを最新にしておくと、自動的にDHCP経由でネットワーク接続に必要な情報を取得します。

/etc/dnsmasq.d/ipxe.conf ファイルには、TFTPとDHCPの両方の設定が含まれています。

dnsmasqが持つもう一つの機能であるDNSサーバーが53番ポートを利用しますが、systemd-resolved.service とバッティングするので、dnsmasqを起動する前に削除する必要があります。

## Ansibleによる構成

makeコマンドを実行すると、``$ ansible-playbook site.yaml`` が呼び出され、playbooks/ping.yml と playbooks/default.yaml が実行されます。

roles/YasuhiroABE.myfavorite-setting は、自作のファイル配置などもろもろのサーバー設定を自動化するためのタスクを含んでいます。

enp1s0にはインターネットに接続しているネットワークを接続し、OS導入対象のAPU/APU2はenp3s0のNICとスイッチを経由して接続します。

スイッチを利用しない場合、enp3s0はDOWNステートになってしまいます。

このAnsible Playbookにより、追加のファイル配置と、cron-aptによるパッケージの自動更新、locale/timezoneの設定、などの様々な(余計な)設定が構成されます。

# APU/APU2にUbuntu 22.04を導入する

まずネットワークケーブルで、enp1s0(シリアル端末側のNIC)とiPXEホストのens3s0に接続されているスイッチを接続します。

Firmwareが最新版になっただけでは、iPXE機能は無効化されているので、電源を投入後、F10キーを押下することでBIOSメニューに入り、"Setup"を選択します。'n'を選択するとネットワークブートが有効になるので、's'を押下し保存して再起動します。

次に、F10キーか 'N' キーを押下するようにメッセージがでるので、'n'か'N'を押下しiPXEモードに入ります。

そこからは自動的にpxelinux.cfg/defaultの内容がロードされインストールが進みます。

以上