Ubuntu Server 20.04.1 Autoinstall with USB boot

## Summary
実家にあるUbuntu PCサーバが停電でおかしくなって、OSの再セットアップが必要に。DataはNASにあるので、データの取り出しはしない。リモートで色々とやってもらうのは難しいので、Autoinstall を利用。

- USBブートでインストールを開始
- 設定はローカルにあるウェブサーバから取ってくるので、設定を変えるたびにUSBを作り直す必要はない
- IPアドレスは固定
- 準備は、ローカルのLinux
- USBを焼く作業は、実家のWindowsPC

## ローカルのWebサーバに、user-data と meta-data を配置
meta-data は空ファイル。
user-data の Ethernet I/F は、DHCP ではなく、固定IP。I/F名を事前に分かっていないと駄目な感じがします。いくつかの候補を設定して match を使ってもいいのかもしれないです。
encrypted-password は、以下で作りました。mkpasswd のために、ローカル Linux Mint に whois を入れました。

```
 mkpasswd -m sha-512 <password>
```

```yaml:user-data
#cloud-config
autoinstall:
  version: 1
  locale: en_US
  keyboard:
    layout: us
    variant: ''
  identity:
    hostname: <hostname>
    username: <usrname>
    password: "<encrypted-password>"
    realname: <username>
  storage:
    layout:
      name: lvm
  network:
    network:
      version: 2
      ethernets:
        enp1s0:
          addresses:
            - <ip-address>/24
          gateway4: <gw-ip-address>
          nameservers:
            addresses: [<dns-ip-address>]
  ssh:
    install-server: true
    authorized-keys:
      - "ssh-rsa <local-pc-public-key>"
  packages:
    - build-essential
    - net-tools
    - lm-sensors
  user-data:
    timezone: Asia/Tokyo
```

## ローカルの Linux Mint にて ISOイメージを作成
### Ubuntu Server 20.04.1 Live ISO イメージをマウントして、作業フォルダ(iso_root)にコピー
```
sudo mount -o ro,loop ~/Downloads/ubuntu-20.04.1-live-server-amd64.iso /cdrom/
mkdir iso_root
cd iso_root/
sudo rsync -av /cdrom/. .
sudo chown -R $(id -un) .
```

### UEFI用: boot/grub/grub.cfg を書き換え
vi で wq! を使うと、書き込めてしまうので、chmod は必要ないですが。。。

```
chmod 744 iso_root/boot/grub/grub.cfg
vi iso_root/boot/grub/grub.cfg
chmod 444 iso_root/boot/grub/grub.cfg
```

http://\<web-server-ip\>/path/to/ 配下に user-data と meta-data があります。
もし、間違ったPCでUSB起動してしまった時に困るので、timeout = -1 にて、自動で Autoinstall が走らないようにしています。
セミコロンで切れてしまうみたいなので、コマンドオプションを"で囲っています。

```
diff -u /cdrom/boot/grub/grub.cfg iso_root/boot/grub/grub.cfg 
--- /cdrom/boot/grub/grub.cfg	2020-08-01 03:35:16.000000000 +1000
+++ iso_root/boot/grub/grub.cfg	2021-01-16 20:49:10.272872571 +1100
@@ -10,7 +10,12 @@
 set menu_color_normal=white/black
 set menu_color_highlight=black/light-gray
 
-set timeout=5
+set timeout=-1
+menuentry "Auto Install Ubuntu Server" {
+	set gfxpayload=keep
+	linux	/casper/vmlinuz   autoinstall "ds=nocloud-net;s=http://<web-server-ip>/path/to/" quiet  ---
+	initrd	/casper/initrd
+}
 menuentry "Install Ubuntu Server" {
 	set gfxpayload=keep
 	linux	/casper/vmlinuz   quiet  ---
```
### MBR用: isolinux/txt.cfg を書き換え
vi で wq! を使うと、書き込めてしまうので、chmod は必要ないですが。。。

```
chmod 744 iso_root/isolinux/txt.cfg 
vi iso_root/isolinux/txt.cfg 
chmod 444 iso_root/isolinux/txt.cfg
```

http://\<web-server-ip\>/path/to/ 配下に user-data と meta-data があります。
こちらも、もし、間違ったPCでUSB起動してしまった時に困るので、自動で Autoinstall が走らないようにしたかったのですが、下記の通り、default live としていても、auto-install が自動で走ってしまいます。
デフォルトでは、メニューが表示されないで、勝手に、最初の label が実行されるのでしょうか。。。
とりあえず、autoinstall をコマンドオプションから削除したので、"label auto-install" が自動実行されますが、いざ autoinstall をしようとする直前に、Yes/No の質問で聞いてきます。

```
diff -u /cdrom/isolinux/txt.cfg iso_root/isolinux/txt.cfg 
--- /cdrom/isolinux/txt.cfg	2020-08-01 03:35:16.000000000 +1000
+++ iso_root/isolinux/txt.cfg	2021-01-17 18:16:50.052299812 +1100
@@ -1,4 +1,8 @@
 default live
+label auto-install
+  menu label ^Auto Install Ubuntu Server
+  kernel /casper/vmlinuz
+  append   initrd=/casper/initrd ds=nocloud-net;s=http://<web-server-ip>/path/to/ quiet  ---
 label live
   menu label ^Install Ubuntu Server
   kernel /casper/vmlinuz
```

### ISO イメージを作成
必要なパッケージをローカル Linux Mint にインストール。

```
sudo apt install isolinux xorriso
```

以下のコマンドで ISO イメージを作成。

```
xorriso -as mkisofs -o u20.04_autoinstall.iso -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
 -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot \
 -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat iso_root
```

### 起動用USBメモリの作成
実家にある Windows PC にリモートデスクトップして、Etcher を使って作成。

### Autoinstall
対象の PC に 作成した USB メモリをさしてもらって、USB Boot をしてもらう。Autoinstall 終了後、SSHにて、user-data に指定したユーザーでログインできることを確認。

以上。

### おまけ
とりあえず、ローカルの Ansible を使って、Docker/Docker-compose をインストール。
https://github.com/skwsk/docker_playbook

このあと、その他もろもろ、必要なものを、Ansible を使って入れようかと思います。

## 参考にしたページ
https://ubuntu.com/server/docs/install/autoinstall
https://ubuntu.com/server/docs/install/autoinstall-quickstart
https://ubuntu.com/server/docs/install/autoinstall-reference
https://netplan.io/reference/
https://wiki.syslinux.org/wiki/index.php?title=Isohybrid
https://qiita.com/sakai00kou/items/7ce4a8a410251b98b2ac
https://qiita.com/YasuhiroABE/items/637f1046a15938f9d3e9