zaki work log

作業ログやら生活ログやらなんやら

Ubuntu 22.04をDVDブートしてAutoinstallで自動インストール (TFTP/PXEブート無し)

ググるPXEブートしてネットワークインストールの情報はたくさんあるけど、DVDブートからAutoinstallする情報はみあたらなかったのでお試し(というか自動インストールというとkickstartしか知らずDebian/Ubuntu系ってどうするんだろう、という状態でしたw)。
PXEブートするためのTFTPサーバーの設定とかその辺不要なので、簡易的に自動インストールしたい場合に構成を小さくできる。
PXE/TFTPのかわりにAutoinstallを使うためのオプション指定を起動時に手入力する、というもの。
ただし、Autoinstallするためのuser-dataファイルを配布するためのwebサーバーは別途用意する。

kickstartインストールでDVDブートして起動オプションでinst.ks=http://kickstart.example.org/path/to/install.cfgを追加してインストールするのと同じ要領。

構成図

こんな感じ。あとwebサーバーへ疎通の際のIP割り当てのためのDHCPも必要(ブロードバンドルータとかのやつでOK)

今回の環境はESXi上のVMでAutoinstallをお試し。インストールメディアをドライブにセットし、普通に起動する方式。

user-dataファイルの用意

Autoinstallにおいて、kickstartインストールにおけるcfgファイルに相当するのがuser-dataファイル。
このファイルの一番簡単(当社比)な入手方法は「手動で一度OSインストールを行い、その時のインストールパラメタが記録されたファイルを使う」で、一度Ubuntuをインストールすると/var/log/installer/autoinstall-user-dataにファイルが作成される。RHEL系の/root/anaconda-ks.cfgと似たような感じだと思う。多分。

このファイルをuser-dataというファイル名で用意する。

ホスト名と初期アカウント

autoinstall:
  identity:
    hostname: ホスト名
    password: ハッシュ化されたパスワード
    realname: 本名
    username: ユーザー名

パスワードは手動インストールした時のものと同じであれば変更不要。
再設定する場合、パスワードはmkpasswdなどを使って生成可能。

[zaki@cloud-dev2 ~]$ mkpasswd -m sha512crypt
パスワード:   # ここにパスワード入力
$6$XUQvm3zdFpKdbqjw$nhFPnzTKbdq2IMV1eAyL9edKpNUcaKjn3RxcX/z3FUicMPnJ6iDto.VGELgrM8k/NY8IZIAEAyykpI42Sn7.p0

ストレージ設定

ここは正直ちょっとよくわからなかった…ので、ひたすらトライアンドエラー
BIOSの場合とUEFIの場合で微妙に異なるみたい。(/boot/boot/efiとか)

以下は、ディスクは1つで、BIOS使用・/bootに2GB・/に残り全てのパーティションを割り当てる設定(size: -1)。/はLVMを使用する。
/boot/以外にbios_grubフラグが設定されたブート領域(GRUBをインストールする領域)も必要。
(以下は1GB割り当ててるけど、多分そんなに要らない…気がする)

手動インストールしたときのuser-dataはその時のディスクサイズの数値が入っているので、そこを修正してしまえばほぼ良さそう。

構文としては、まず定義した内容のidを、次の定義でdevicevolumeで参照してるように見える。あとパーティションは順番にnumber: Nで1から連番振ってある。
インストールがうまくいったときの内容は以下の通り。

  storage:
    config:
    - ptable: gpt
      path: /dev/sda
      wipe: superblock
      preserve: false
      name: ''
      grub_device: true
      type: disk
      id: disk-sda
      # disk

    - device: disk-sda
      size: 1G
      flag: bios_grub
      number: 1
      preserve: false
      grub_device: false
      type: partition
      id: partition-0
      # ここまでgrub領域 #1

    - device: disk-sda
      size: 2G
      wipe: superblock
      flag: boot
      number: 2
      preserve: false
      grub_device: false
      type: partition
      id: partition-1
    - fstype: ext4
      volume: partition-1
      preserve: false
      type: format
      id: format-0
      ## ここまで/boot用 #2

    - device: disk-sda
      size: -1
      wipe: superblock
      flag: ''
      number: 3
      preserve: false
      grub_device: false
      type: partition
      id: partition-2
    - name: ubuntu-vg
      devices:
      - partition-2
      preserve: false
      type: lvm_volgroup
      id: lvm_volgroup-0
    - name: ubuntu-lv
      volgroup: lvm_volgroup-0
      size: -1
      wipe: superblock
      preserve: false
      type: lvm_partition
      id: lvm_partition-0
    - fstype: ext4
      volume: lvm_partition-0
      preserve: false
      type: format
      id: format-1
      ## ここまで/(ルート)用・LVM設定 #3

「残り全ての領域を割り当てる」ためのsize: -1指定は、最後のパーティションにしか設定できないので注意(インストール時に以下エラーで失敗する)

subiquity/Filesystem/apply_autoinstall_config: Partition(device=..., size=-1, wipe=..., ...) has negative size but is not final partition of Disk ...

meta-dataとvendor-dataファイル

user-dataと同じディレクトリに、meta-datavendor-dataファイルを作成しておく。
中身は不要で、空ファイルで良い。

meta-dataは無いとインストールに失敗する。
vendor-dataは無くても大丈夫だったが、リクエストがきて404になるログが何度も来て時間と処理が無駄なので、これも空ファイルを作っておく。

touch meta-data vendor-data

webで公開

ここは適当なwebサーバーで。なければコンテナなどで。
Dockerのhttpdコンテナであれば、user-data, meta-data, vendor-dataの3ファイルのあるディレクトリで以下実行。

docker run -d -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs httpd

3つのファイルにリモートからHTTPアクセスできればOK
(3ファイルを同じディレクトリに配置する)

DVDブートと自動インストール

PXEブート(ネットワークブート)を使って起動パラメタを渡さない方法を使うので、DVDからブートするところは手動インストールと同じ。

Autoinstallの指定を入力するため、この画面でeを押下し、コマンドの編集モードを開く。

ここで以下のように入力。
(実はここも相当トライアルアンドエラーした結果…笑)

linux  /casper/vmlinuz  ---

となっている個所の---の手前に次の内容を入力する。

autoinstall ip=dhcp ds=nocloud-net\;s=http://<user-dataファイルを公開しているURL>

ちなみにURLは別にドキュメントルートである必要はなく、http://192.168.0.250/path/to/ubuntu/autoinstall/ とか、ファイルのある場所を指定する。(この場合、http://192.168.0.250/path/to/ubuntu/autoinstall/meta-datahttp://192.168.0.250/path/to/ubuntu/autoinstall/user-dataにアクセスできればOK)

これでCtrl-xを押下すれば指定のパラメタで起動し、user-dataの内容に従ってAutoinstallが始まる。

あとはしばらく放置しておけばインストールが完了し、コンソールはログイン画面に遷移する。手元の環境だと15minくらい。
初回のみコンソール画面でロケールSSH公開鍵設定が行われるのでそのログが表示される。

(Appendix) user-dataファイル例

今回インストールに使ったuser-dataファイル全文(一部マスク済み)は以下。
あとで気付いたけどロケールがJPじゃなかったw

#cloud-config
autoinstall:
  apt:
    disable_components: []
    geoip: true
    preserve_sources_list: false
    primary:
    - arches:
      - amd64
      - i386
      uri: http://jp.archive.ubuntu.com/ubuntu
    - arches:
      - default
      uri: http://ports.ubuntu.com/ubuntu-ports
  drivers:
    install: false
  identity:
    hostname: cloud-dev3
    password: ...
    realname: zaki
    username: zaki
  kernel:
    package: linux-generic
  keyboard:
    layout: jp
    toggle: null
    variant: ''
  locale: en_US.UTF-8
  network:
    ethernets:
      ens192:
        addresses:
        - 192.168.0.132/24
        gateway4: 192.168.0.1
        nameservers:
          addresses:
          - 192.168.0.19
          search: []
    version: 2
  ssh:
    allow-pw: true
    authorized-keys:
    - 'ssh-rsa ...'
    - 'ssh-rsa ...'
    install-server: true
  storage:
    config:
    - ptable: gpt
      path: /dev/sda
      wipe: superblock
      preserve: false
      name: ''
      grub_device: true
      type: disk
      id: disk-sda

    - device: disk-sda
      # .. 前述の通りなので以下省略 ..

  updates: security
  version: 1

参考サイト

PXE使う構成は2003年頃に自分で書いたページもあったり。。当時は外付けCD-ROMドライブを購入する余裕がなかった(笑)
[ネットワークインストール・マルチブート] Libretto L5 / Debian