PXEbootを用いてUbuntuをautoinstallする

# PXEbootを用いてUbuntuをautoinstallする

## nyahahahnoha

前提 \
routerIP: 172.17.0.1 \
serverIP: 172.17.0.2 \
clientIP: 172.17.0.101 \
clientMAC: BC:24:11:D2:53:08

パッケージのインストール
```shell
$ sudo apt install dnsmasq pxelinux syslinux nginx
```

dnsmasqの設定
```
$ sudo mkdir /tftpboot # tftpのrootディレクトリ

$ sudo tee -a /etc/dnsmasq.conf << 'EOF'
interface=ens18 # dhcpを吐くinterface
tftp-root=/tftpboot # rootディレクトリの指定

dhcp-leasefile=/var/lib/misc/dnsmasq.leases # leaseファイル
dhcp-option=option:router,172.17.0.1 # routerのIP
dhcp-option=option:netmask,255.255.0.0 # サブネットマスク
dhcp-option=option:dns-server,8.8.8.8 # DNSserverのIP
pxe-service=x86PC, "PXELINUX (BIOS)", "pxelinux.0" # pxeブートのoption

dhcp-range=172.17.0.101,172.17.0.199,12h # dhcpの範囲
dhcp-host=BC:24:11:D2:53:08,172.17.0.101,ubuntu-server # 特定のMACaddressに対してIPを指定する.
#dhcp-host=MACaddress,IPaddress,HostName
EOF
```


nginxの設定
```
$ sudo mkdir /var/www/{autoinstall,iso}
$ sudo vim /etc/nginx/sites-available/default
```
```json
server {

...

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        location /autoinstall {
                root /var/www/;
                autoindex on;
        }

        location /iso {
                root /var/www/;
                autoindex on;
        }

...

}
```

Bootに必要なファイルをtftpdに置く
- pxelinux.0はpxeの設定ファイルを取得する
- ldlinux.c32はbootloaderの補助を行う
- initrdはbootloader
- vmlinuzはkernel
pxelinux.0がpxelinux.confの先の設定ファイルをmacアドレスに従って見つけ、clientがpxebootの設定を確認する \
pxelinux.confの先のファイルのappendの意味は
- initrdでinitrdの場所を示す
- autoinstallはautoinstallでsetupすることを示す
- ipはdhcpで一時的なipアドレスを割り当てることを示す
- urlはisoファイルの場所を示す
- dsはcloud-config(autoinstallの設定ファイル)を示す
```
$ sudo cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /tftpboot/
$ sudo cp /usr/lib/PXELINUX/pxelinux.0 /tftpboot/
$ sudo mkdir /tftpboot/pxelinux.conf
$ sudo tee /tftpboot/pxelinux/01-bc-24-11-d2-53-08 << 'EOF'
default linux
prompt 0
timeout 30
label linux
        kernel /images/jammy/vmlinuz
        ipappend 2
        append initrd=/images/jammy/initrd autoinstall ip=dhcp url=http://172.17.0.2/iso/ubuntu-22.04.2-live-server-amd64.iso ds=nocloud-net;s=http://172.17.0.2/autoinstall/bc:24:11:d2:53:08/
EOF

$ wget https://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso
$ sudo mount -o loop,ro ubuntu-22.04.2-live-server-amd64.iso /mnt # isoファイルを/mntに展開
$ sudo mkdir -p /tftpboot/images/jammy
$ sudo cp /mnt/casper/{initrd,vmlinuz} /tftpboot/images/jammy/
$ sudo umount /mnt # 展開を解除
$ sudo mv ubuntu-22.04.2-live-server-amd64.iso /var/www/iso/
```

cloud-configを記述する \
cloud-configの書き方は下記url参照 \
https://ubuntu.com/server/docs/install/autoinstall \
パスワード生成は`openssl passwd -6 password`コマンドで`password`を各自のパスワードに変更して出力してください
```
$ sudo mkdir /var/www/autoinstall/bc:24:11:d2:53:08
$ sudo touch /var/www/autoinstall/bc:24:11:d2:53:08/{user-data,meta-data}
$ sudo tee /var/www/autoinstall/08:00:27:84:bd:fe/user-data <<'EOF'
autoinstall:
  version: 1
  locale: ja_JP.UTF-8
  keyboard:
    layout: "jp"
  user-data:
    timezone: Asia/Tokyo
  identity:
    hostname: ubuntu-server
    username: ubuntu
    password: "$6$~~~~~~~~~~~~~~~~~~~~~~~~"
  ssh:
    install-server: yes
EOF
```

サービスを開始
```
$ sudo systemctl restart dnsmasq
$ sudo systemctl reload nginx
```

## 参考文献
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0787