Preseedで自動インストールするカスタムISOイメージを作成する

> UbuntuではPreseedは18.04までの提供で、20.04からはUbuntuが提供するAutoInstallを利用しなければなりません。
今後インストールする場合は最新のLTS版(22.04)の導入とAutoInstallの利用を検討してください。

* [Qiita - Ubuntu 22.04をAutoInstallでインストールしてみた (UEFI&MBR両対応)](https://qiita.com/YasuhiroABE/items/063a442b7e45633e7cb0)

# はじめに
以前、[iPXE経由でAPUにUbuntu 18.04をインストールする](https://qiita.com/YasuhiroABE/items/cb8dd5141281a24613b6)の記事でPreseedを使っての自動インストールについて書きました。

その露払いとして、k8sクラスタを構成するため、単にDVDドライブを搭載しているIAサーバーにUbuntu 16.04.4を自動インストールするISOイメージを作成した時のメモが残っていたので残しておきます。

内容は少し古いですが、多くのサーバーをセットアップしなければいけない状況ではDVDと単純な手順書を配布するだけでキーボードがなくてもセットアップが完了するので、状況によっては便利だと思います。

今となってはこの記事では比較的古いシステムを対象としています。現在ではUEFIを搭載しているサーバーが一般的になってきた点に注意してください。UEFIを搭載しているTX1310 M3用のPreseedイメージを作成する手順は別に作成しています。 → https://qiita.com/YasuhiroABE/items/20962ed33ed57af45076

# 作業の流れ
元になるISOイメージをコピーした後で、ファイルを編集し、genisoimageコマンドでpreseedを有効化した危険なISOイメージを作成します。
ちゃんとDVDに自動インストーラーと書いてドライブから抜いておかないと、予想しないタイミングでサーバーを初期化してくれるので注意が必要です。

# 対象のIAサーバー

* Fujitsu TX120 S3P

デフォルトから設定を変更したか記録がないのですが、DVDドライブを内蔵しており、優先的にブートするようになっています。

# ISOイメージを作成する作業環境

Ubuntu 16.04 LTS 64bit版 を使用しています。

# 参考資料

* [前掲] https://qiita.com/YasuhiroABE/items/cb8dd5141281a24613b6
* http://sig9.hatenablog.com/entry/2016/09/10/120000
* https://gist.github.com/wnoguchi/6577937

# 作業履歴

作業ディレクトリに移動している前提でコマンドを書いています。

## カスタマイズの内容

ansibleを使用してkubesprayからk8sクラスターを構成するために、あらかじめsshでのログインやパスワードなしでのログインを可能とするような設定を行なっています。

* ディスク装置: 2台(sda,sdb)で、ソフトウェアRAID1
* ファイルシステム: ext4 without swap-space
* ファイルの配置（上書き）
  * /etc/sudoers
  * ~/.ssh/authorized_keys
  * /etc/apt/sources.list.d/ubuntu1604.list
* その他の主な構成
  * sshdはパスワードでのログインを不可とする
  * NTPサーバーは ntp.nict.jp に設定

keymapなどはUS設定としているので日本語環境を使っている場合は適宜変更する必要があるので、特にパスワードなどについて、preseed.cfgをチェックして適宜上書きしてください。

## 基本的な準備作業

ubuntu-16.04.4-server-amd64.iso ファイルがカレントディレクトリにある前提です。

```bash
$ sudo mkdir -p /mnt/iso
$ sudo mount -o ro,loop ubuntu-16.04.4-server-amd64.iso /mnt/iso
$ mkdir iso_root
$ rsync -av /mnt/iso/. iso_root/.
```

さらに追加で配布するファイルの雛形としてlocalhostのファイルをコピーする。

```bash
$ sudo cp -ip /etc/sudoers iso_root/preseed/
$ sudo cp ~/.ssh/authorized_keys iso_root/preseed/
```

この他に iso_root/preseed ディレクトリには、preseed.cfg ファイルを後から配置します。

## iso_root/isolinux/isolinux.cfg を書き換える

timeout値を1に設定する。

```bash
$ sudo vi iso_root/isolinux/isolinux.cfg
```

> timeout: 1


## iso_root/isolinux/txt.cfg を書き換える

古くはisolinux.cfgで多くの設定が行なわれていましたが、Ubuntu 16.04ではtxt.cfgを中心に書き換えることになります。
内容全体を次のように置き換えました。

```text
default install
label install
  menu label ^Install Ubuntu Server
  kernel /install/vmlinuz
  append file=/cdrom/preseed/preseed.cfg vga=normal initrd=/install/initrd.gz auto=true locale=en_US.UTF-8 console-setup/charmap=UTF-8 console-setup/layoutcode=us console-setup/ask_detect=false pkgsel/language-pack-patterns=pkgsel/install-language-support=false quiet --
``````

設定に記述されている /cdrom/preseed/preseed.cfg のようなパスは、作成するISOイメージがインストーラーでは /media にマウントされている前提で記述しています。

## iso_root/preseed/preseed.cfg を準備する

```bash
$ sudo vi iso_root/preseed/preseed.cfg
```

APU用の設定をコピーした上で、参考資料などを参考に編集しました。
次のような内容で書き換えています。
追加で配布するauthorized_keysやsudoersなどのファイルは最後の方でコピーしています。

```text
d-i debian-installer/locale string en_US

d-i debian-installer/keymap string us
d-i keyboard-configuration/xkb-keymap select us
d-i keyboard-configuration/toggle select No toggling

d-i netcfg/choose_interface select auto

d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string localdomain

d-i mirror/http/mirror select jp.archive.ubuntu.com

d-i apt-setup/restricted boolean true
d-i apt-setup/universe boolean true
d-i apt-setup/backports boolean true
d-i apt-setup/services-select multiselect security
d-i apt-setup/security_host string security.ubuntu.com
d-i apt-setup/security_path string /ubuntu

d-i mirror/suite string xenial

d-i passwd/user-fullname string Admin User01
d-i passwd/username string ubuntu
d-i passwd/user-password password temppwd
d-i passwd/user-password-again password temppwd

d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false

d-i clock-setup/utc boolean false

d-i time/zone string Asia/Tokyo

d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string ntp.nict.jp

d-i partman-md/device_remove_md boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman/confirm_nooverwrite boolean true
 
d-i     partman-auto/disk string /dev/sda /dev/sdb
d-i     partman-auto/method string raid
d-i     partman-md/confirm boolean true
d-i     partman-lvm/confirm boolean true

d-i     partman-auto-lvm/guided_size string max
 
d-i     partman-auto/choose_recipe select boot-root
 
d-i     partman-auto-lvm/new_vg_name string rootvg
 
d-i     partman-auto/expert_recipe string  \
           boot-root ::                    \
             512 10 512 raid             \
                $lvmignore{ }              \
                $primary{ }                \
                $bootable{ }               \
                method{ raid }             \
                format{ }                  \
             .                             \
             51200 20 -1 raid              \
                $lvmignore{ }              \
                $primary{ }                \
                method{ raid }             \
             .                             \
             51200 200 -1 ext4            \
                $defaultignore{ }          \
                $lvmok{ }                  \
                lv_name{ rootlv }            \
                method{ format }           \
                format{ }                  \
                use_filesystem{ }          \
                filesystem{ ext4 }         \
                mountpoint{ / }            \
            .                              

d-i partman-auto-raid/recipe string \
    1 2 0 ext2 /boot                \
          /dev/sda1#/dev/sdb1       \
    .                               \
    1 2 0 lvm -                     \
          /dev/sda2#/dev/sdb2       \
    .                               
d-i     mdadm/boot_degraded boolean false
d-i     partman-md/confirm boolean true
d-i     partman-partitioning/confirm_write_new_label boolean true
d-i     partman/choose_partition select Finish partitioning and write changes to disk
d-i     partman/confirm boolean true
d-i     partman-md/confirm_nooverwrite  boolean true
d-i     partman/confirm_nooverwrite boolean true

d-i	partman-basicfilesystems/no_swap boolean false
d-i	partman/unmount_active boolean true
##d-i	preseed/early_command string umount /media
d-i	partman/mount_style select uuid

d-i base-installer/install-recommends boolean true

d-i base-installer/kernel/image string linux-server

d-i apt-setup/use_mirror boolean false

d-i apt-setup/restricted boolean true
d-i apt-setup/universe boolean true
d-i apt-setup/backports boolean true
d-i apt-setup/services-select multiselect security
d-i apt-setup/security_host string security.ubuntu.com
d-i apt-setup/security_path string /ubuntu

d-i debian-installer/allow_unauthenticated boolean true
tasksel tasksel/first multiselect none

d-i pkgsel/include string openssh-server python2.7-minimal
d-i pkgsel/upgrade select full-upgrade
popularity-contest popularity-contest/participate boolean false
d-i pkgsel/update-policy select none
d-i pkgsel/install-language-support boolean true

d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev  string /dev/sda

d-i finish-install/reboot_in_progress note

d-i preseed/late_command string \
 in-target mkdir -p /home/ubuntu/.ssh ; \
 in-target cp /media/cdrom/preseed/authorized_keys /home/ubuntu/.ssh/authorized_keys ; \
 in-target chmod 750 /home/ubuntu/.ssh ; \
 in-target chown -R ubuntu:ubuntu /home/ubuntu/.ssh ; \
 in-target cp /media/cdrom/preseed/sudoers /etc/sudoers ; \
 in-target sed -i -e 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
```

# isoイメージを作成する。

iso_rootの準備が終ったら、次のようなコマンドでISOイメージを作成します。
ファイル名に日付をいれることで上書きしないようにしています。

```bash
$ sudo genisoimage -N -J -R -D -V "PRESEED.UB1604" -o ubuntu-16.04.4-server-amd64-preseed."$(date +%Y%m%d.%H%M%S)".iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table iso_root/
```

以上