Ubuntuの無人インストールをautoinstallで書いて実行する方法
オペレーティングシステムのプロビジョニングと再現可能なインストールを作成できることは、特に企業環境において重要です。無人インストールを実行するために、UbuntuはかつてDebianのpreseedおよびKickstartファイルをサポートしていました。しかし、Ubuntuサーバー20.04以降、またUbuntuデスクトップの23.04バージョンから、これらのインストール方法は非推奨となり、ディストリビューションはcloud-initを活用した新しいautoinstallフォーマットを採用しました。
このチュートリアルでは、Ubuntuの自動インストールファイルの作成方法と、それを使用して未監視で再現可能なインストールを行う方法を学びます。
このチュートリアルでは、あなたは学びます:
- オートインストールファイルの書き方と、Ubuntuインストールのすべての側面を定義する方法
- Ubuntuデスクトップおよびサーバーインストーラーに自動インストールファイルを渡す方法
自動インストールファイルの紹介
Debian派生ディストリビューションであるUbuntuは、元々無人で複製可能なインストールを行う方法としてpreseedファイルをサポートしていました。その後、互換性の一環としてKickstartインストール構文のサポートが追加されましたが、すべてのKickstartコマンドが実装されたわけではありません。Ubuntuサーバー20.04以降、及びUbuntuデスクトップ23.04以降は、UbuntuはYAML構文に基づく独自の自動インストール方法であるautoinstallを採用しました。
自動インストールファイルで最初に見ることが多いのは「#cloud-config」コメントです。これは、cloud-initによってファイルを処理させる必要がある場合に必要です(この後詳しく説明します)。設定ファイルで使用される主なキーはautoinstallであり、ファイルシンタックスのバージョンはversionキーで指定されます。現在記述している時点ではバージョン1のみが利用可能です。
#cloud-config
autoinstall:
version: 1ソースを選択する
インストールしたい「環境」を指定するために、source キーを使用し、その値としてマッピングを取ることができます。このマッピングの中で、インストールしたい環境の名前を id キーの値として渡します。たとえば、Ubuntuデスクトップをインストールする場合、ubuntu-minimal-desktop とフル機能の ubuntu-desktop の間から選択できます。キーが省略された場合は、最初の利用可能なソースが使用されます。
#cloud-config
autoinstall:
source:
id: ubuntu-desktop-minimal
システムロケール、タイムゾーン、およびキーボードレイアウトの設定
システムのロケールを設定するには、localeキーを使用します。一方、キーボードの設定はkeyboardキーを介して指定されます。このキーはマッピングを値として受け取ります。以下の例では、使用したいレイアウト(us)を指定するだけです。他のパラメータ、たとえばレイアウトのバリアントを指定することも可能です。最後に、システムのタイムゾーンを設定するには、timezoneキーを使用します。
#cloud-config
autoinstall:
locale: en_US.UTF-8
keyboard:
layout: us
timezone: Europe/Rome
ネットワークインターフェースの設定
システムネットワークを構成するために、netplan構文を使用してnetworkキーを使用します。以下の例では、enp1s0 Ethernetインターフェースをdhcp4を介して自動的に構成したいことを指定しています。
#cloud-config
autoinstall:
network:
version: 2
ethernets:
enp1s0:
dhcp4: true
ホスト名とシステム初期ユーザーの設定
私たちのシステムを安全に使用するためには、少なくとも1人の権限のないユーザーを作成する必要があります。また、システムのホスト名を設定する必要があります。これらの2つの側面は、identityキーを通じて管理されています。このキーは、値としてマッピングを取ります;私たちはそれぞれのキーを持つusername、password、およびhostnameを定義します。
#cloud-config
autoinstall:
identity:
username: egidio
hostname: linuxconfig
password: '$6$mzOdSSVUfhWRNhcX$mkm.drDfOLfpZRX/58ouJqMvitV2O0147VgKzKGYE6Qx4adJ8TXqMHs2dh2L7kT4TW5e97FCRDkGK1J.LouyV.'
例に示すように、提供するパスワードはすでにsha512アルゴリズムを使用してハッシュ化されている必要があります。
SSHサーバーの設定
自動インストールファイルでは、SSHサーバーをインストールおよび構成するかどうかを指定する機会があります。パスワード認証を有効または無効にすることができ、最終的には初期ユーザーのauthorized_keysファイルに追加される認証済み公開鍵のリストを渡すことができます。
#cloud-config
autoinstall:
ssh:
install-server: true
allow-pw: true
authorized-keys: []
追加パッケージのインストール
システムインストールの一部として、apt-get パッケージマネージャによって追加で取り込むパッケージのリストを指定するには、packages キーを使用します。以下はその例です:
#cloud-config
autoinstall:
packages:
- git
- python3-pip
スナップパッケージをインストールするには、代わりに snaps キーワードを使用します。このキーワードは、値としてマッピングのリストを受け入れます。各マッピングでは、name、channel、および classic のキーを使用して、それぞれインストールするスナップパッケージの名前、スナップがインストールされるべきチャネル(デフォルトは「stable」)、およびスナップパッケージをクラシックモードでインストールする必要があるかどうか(デフォルトは「false」)を指定します。
#cloud-config
autoinstall:
snaps:
- name: pycharm-community
channel: stable
classic: trueインストール後のアクションを定義する
インストール後のアクションを定義するために、shutdown キーを使用します。このキーは「poweroff」と「reboot」の2つの可能な値を受け入れます。
#cloud-config
autoinstall:
shutdown: reboot
ストレージセットアップの定義
システムのインストールで最も重要な側面の一つは、パーティショニングの設定です。Ubuntuをインタラクティブにインストールするとき、いくつかの事前定義されたレイアウトの中から選択するか、カスタム設定を作成することができます。自動インストールを行うときも同じことができます。利用可能な事前定義されたレイアウトは、lvm、direct、およびzfsです。
lvmレイアウトはデフォルトであり、EFI(最新のUEFIシステムの場合)とブート標準パーティションを作成し、システムの残りをLVM論理ボリュームにインストールします。ルート論理ボリュームのサイズはポリシーに基づいて決定され、"スケール"(デフォルト)の設定にした場合、論理ボリュームに割り当てられるスペースの量はボリュームグループのサイズによって異なります。可能であれば、一部のスペースは未使用のまま残され、スナップショットの作成を可能にします。
| VGサイズ | ルートLVサイズ |
|---|---|
| 10 GiB未満 | 利用可能なスペースの100% |
| 10 GiBから20 GiBの間 | 10ギガバイト |
| 20GiBから200GiBの間 | 利用可能なスペースの50% |
| 200 GiBを超える | 100 GiB |
ポリシーが「すべて」に設定されている場合、代わりに利用可能なすべてのスペースがルート論理ボリュームに割り当てられます。この文脈では、password キーを使用してLUKS暗号化を有効にし、暗号化パスワードを提供することができます。
#cloud-config
autoinstall:
storage:
layout:
name: lvm
policy: all
password: mysecretpassword
直接レイアウトは、標準のパーティションにUbuntuをインストールします。UEFIシステムでは、1GiBのサイズのEFIパーティションを作成し、残りのスペースをルートパーティションに割り当てます。
最後に、zfsレイアウトは、ZFSプールにシステムをインストールし、いくつかのボリュームを作成します。以下に、Ubuntuの新規インストール後のzfs設定のスクリーンショットを示します。
インストール用のディスクを選択する
パーティションレイアウトに加えて、インストールに使用するディスクを明示的に指定することもできます。これは match キーを通じて行います。ディスクはパス、ベンダー、モデル、シリアルなどに基づいて選択できます。キーワードが省略された場合、インストールは最も大きな利用可能なディスクに行われます。下の例では、パス (/dev/vda) によってディスクを選択します:
#cloud-config
autoinstall:
storage:
layout:
name: lvm
match:
path: /dev/vda
カスタムレイアウトの作成
カスタムパーティションレイアウトを定義するには、configキーワードを使用します。このキーワードは、値としてマッピングのリストを受け入れ、それぞれがcurtinインストーラーのコマンドを説明します。例を見てみましょう。LVM上のLUKSセットアップにUbuntuをインストールし、次のパーティションを作成したいとしましょう。
- 600 MiBの小さなEFIパーティションをfat32でフォーマットし、/boot/efiにマウントします。
- 1 GiBのブートパーティション、/bootにマウントするためにext4形式でフォーマットされます。
- 残りのスペースにまたがる3つ目のパーティションは、LUKSで暗号化され、LVM物理ボリュームとしてフォーマットされています。
- 45 GiBのLVM論理ボリュームを/にマウントする
- 50 GiBのLVM論理ボリュームを/homeにマウントします
ここでの進め方は以下の通りです。最初に行うべきことは、disk コマンドを使用することです。このコマンドはディスクを設定し、パーティションテーブルを作成するために使用されます。
#cloud-config
autoinstall:
storage:
config:
- id: disk-vda
type: disk
ptable: gpt
path: /dev/vda
wipe: superblock-recursive
id キーワードを使用することで、セクションとコマンドの識別子を提供します。これにより、他のコマンドを使用する際にディスクを参照することができます。一方、type キーワードを使用して、実行したいコマンドを指定します。ここでのコマンドは「disk」です。
「ptable」キーが存在する場合、指定されたタイプのパーティションテーブルがディスクに作成されます。この場合、「gpt」を値として使用しました。pathキーワードは、そのパス(/dev/vda)によってディスクを特定するために使用されます。
wipeキーワードは非常に重要です。使用すると、ディスクやパーティションの内容が消去されます。「wipe」には多くのタイプがあります:superblock、superblock-recursive、zero、random、およびpvremoveです。ディスクのスーパーブロックだけを消去したいときはsuperblockを使用し、LVMを使用している場合など、埋め込まれたスーパーブロックも消去したいときはsuperblock-recursiveを使用します。zeroまたはrandomのウォイプを使用すると、それぞれディスクをゼロまたはランダムなデータで上書きすることができます。最後に、pvremoveは、ディスクがLVMセットアップの一部でないことを確認するために、LVMメタデータを特に消去します。上の例では、ほとんどの場合に十分なsuperblock-recursiveを使用しました。
「partition」コマンドを使用して標準パーティションを作成する
私たちは現在、ディスク上に3つの「標準」パーティションを作成する必要があります。最初のものはEFIパーティション、2番目のものは/bootにマウントされるパーティション、3番目のものはLUKSで暗号化され、LVMの物理ボリュームとして使用されるパーティションです。パーティションを作成するには、partitionコマンドを使用します。以下の例では、明確にするために、以前に使用したコマンドは省略し、現在のコマンドに焦点を当てます。
#cloud-config
autoinstall:
storage:
config:
# [...]
- id: efipart
type: partition
device: disk-vda
offset: 1048576
size: 600M
flag: boot
grub_device: true
- id: bootpart
type: partition
device: disk-vda
size: 1G
- id: pvpart
type: partition
device: disk-vda
size: -1
「efipart」パーティションが最初のものであるため、offsetキーワードを使用して、ディスクの開始から1MiBの位置に作成されることを保証しました(値はバイトで提供されます:1048576)。次に、flagキーワードを使用して、パーティションに設定されるフラグ、今回は「boot」を指定しました。最後に、grub_deviceキーワードを使用して、GRUBがパーティションにインストールされることを保証しました。
すべての定義において、私たちは device キーを使用して、パーティションを作成する必要があるディスクを参照し、 size キーを使用してパーティションのサイズを指定しました。「pvpart」パーティションの場合、値として「-1」を使用します。これにより、パーティションはディスク上の残りのすべてのスペースを占有します。
dm_cryptコマンドを使用して暗号化されたLUKSボリュームを作成する
次のステップとして、LUKSを使用して「pvpart」パーティションを暗号化したいと考えています。これを行うには、dm_cryptコマンドを使用します:
#cloud-config
autoinstall:
storage:
config:
# [...]
- id: pvpart-crypt
type: dm_crypt
volume: pvpart
key: mysecretpassword
dm_cryptコマンドを使用する際、暗号化したいパーティションの識別子をvolumeキーの値として渡し、keyを使用して暗号化のパスフレーズを指定します。
LVMボリュームグループと論理ボリュームの作成
LVMボリュームグループを作成するには、lvm_volgroupコマンドを使用し、devicesキーワードを使ってグループに追加したい物理ボリュームのリストを表示します:
#cloud-config
autoinstall:
storage:
config:
# [...]
- id: vg0
type: lvm_volgroup
name: vg0
devices:
- pvpart-crypt
論理ボリュームを作成するために、lvm_partitionコマンドを使用します。LV名はnameキーで指定し、LVを作成すべきボリュームグループはvolgroupの値として指定し、そのサイズはsizeキーで指定します。
#cloud-config
autoinstall:
storage:
config:
# [...]
- id: root_lv
type: lvm_partition
name: root_lv
volgroup: vg0
size: 45G
- id: home_lv
type: lvm_partition
name: home_lv
volgroup: vg0
size: 50G
パーティションのフォーマット
定義したパーティションにファイルシステムを作成し、それらのマウントポイントを設定するために、format コマンドを使用します。volume キーワードを使用してパーティションのIDを参照し、fstype キーワードを使用して作成するファイルシステムを指定します:
#cloud-config
autoinstall:
storage:
config:
# [...]
- id: efipart_fs
type: format
volume: efipart
fstype: fat32
- id: bootpart_fs
type: format
volume: bootpart
fstype: ext4
- id: root_lv_fs
type: format
volume: root_lv
fstype: ext4
- id: home_lv_fs
type: format
volume: home_lv
fstype: ext4
最後に、ファイルシステムをどこにマウントするかを指定するために、mountコマンドを使用します。deviceキーでファイルシステムIDを指定し、pathでそのマウントポイントを指定します:
#cloud-config
autoinstall:
storage:
config:
# [...]
- id: efipart-mount
type: mount
device: efipart_fs
path: /boot/efi
- id: bootpart-mount
type: mount
device: bootpart_fs
path: /boot
- id: root_lv_mount
type: mount
device: root_lv_fs
path: /
- id: home_lv_mount
type: mount
device: home_lv_fs
path: /home
Ubuntu インストーラーに設定を渡す
これは、私たちの自動インストール構成ファイル全体の見た目です:
#cloud-config
autoinstall:
version: 1
source:
id: ubuntu-server-minimal
locale: en_US.UTF-8
keyboard:
layout: us
timezone: Europe/Rome
network:
version: 2
ethernets:
enp1s0:
dhcp4: true
identity:
username: egidio
hostname: linuxconfig
password: '$6$mzOdSSVUfhWRNhcX$mkm.drDfOLfpZRX/58ouJqMvitV2O0147VgKzKGYE6Qx4adJ8TXqMHs2dh2L7kT4TW5e97FCRDkGK1J.LouyV.'
ssh:
install-server: true
allow-pw: true
authorized-keys: []
packages:
- git
- python3-pip
snaps:
- name: pycharm-community
channel: stable
classic: true
shutdown: reboot
storage:
config:
- id: disk-vda
type: disk
ptable: gpt
path: /dev/vda
wipe: superblock-recursive
- id: efipart
type: partition
device: disk-vda
offset: 1048576
size: 600M
flag: boot
grub_device: true
- id: bootpart
type: partition
device: disk-vda
size: 1G
- id: pvpart
type: partition
device: disk-vda
size: -1
- id: pvpart-crypt
type: dm_crypt
volume: pvpart
key: mysecretpassword
- id: vg0
type: lvm_volgroup
name: vg0
devices:
- pvpart-crypt
- id: root_lv
type: lvm_partition
name: root_lv
volgroup: vg0
size: 45G
- id: home_lv
type: lvm_partition
name: home_lv
volgroup: vg0
size: 50G
- id: efipart_fs
type: format
volume: efipart
fstype: fat32
- id: bootpart_fs
type: format
volume: bootpart
fstype: ext4
- id: root_lv_fs
type: format
volume: root_lv
fstype: ext4
- id: home_lv_fs
type: format
volume: home_lv
fstype: ext4
- id: efipart-mount
type: mount
device: efipart_fs
path: /boot/efi
- id: bootpart-mount
type: mount
device: bootpart_fs
path: /boot
- id: root_lv_mount
type: mount
device: root_lv_fs
path: /
- id: home_lv_mount
type: mount
device: home_lv_fs
path: /homeUbuntuインストーラーに設定をパスするにはどうすればよいですか?Ubuntuのデスクトップバージョンをインストールする際、最も簡単で便利な方法は、設定ファイルをHTTPまたはFTP経由で利用可能にし、そのURLをグラフィカルインストーラーの適切なセクションに渡すことです。
Ubuntuのインストール後、インタラクティブに行われたものでさえ、自動インストールの構成ファイルが自動的に作成されます。このファイルは/var/log/installer/autoinstall-user-dataとして保存されます。このファイルを使用して、インストールを再現することができます。
完全に自動化されたインストールを実行したり、Ubuntuサーバーをインストールする際にautoinstall設定を使用する場合は、cloud-initを利用し、cloud-configデータファイルとして設定を使用する必要があります。これは、autoinstallファイルの最初にある「#cloud-config」コメントの目的です。
cloud-initが起動時にファイルを読み取るためには、ファイルの名前をuser-dataに変更し、同じディレクトリにmeta-dataという名前の空のファイルを作成する必要があります。私たちはライブISO GRUBメニューの最初のエントリを修正するために「e」を押します:
次に、“linux”で始まる行を修正し、3つのハイフンの前に次の文字列を追加します(セミコロンをエスケープすることが重要です!):
autoinstall ds=nocloud-net\;s=<directory-URL>ここで <ディレクトリ-URL> はユーザーデータとメタデータファイルを含むディレクトリのURLです。
インストールを開始するためには、ここで単にCtrl-xを押します。
締めくくりの考え
Ubuntuサーバー20.04およびUbuntuデスクトップ23.04以降、ネイティブなautoinstallフォーマットを使用して、自動化され再現可能なシステムインストールを実行することが可能です。このチュートリアルでは、autoinstallファイルの記述方法と、その中で使用できるいくつかのキーについて説明しました。最後に、ファイルをUbuntuデスクトップおよびサーバーインストーラーに渡す方法を見ました。完全なUbuntu autoinstallリファレンスについては、公式ドキュメントをご覧ください。




