自動インストールを使用して Ubuntu 無人インストールを作成して実行する方法
オペレーティング システムの複製可能なインストールをプロビジョニングおよび作成できることは、特に企業環境では非常に重要です。無人インストールを実行するために、Ubuntu は Debian のプリシード ファイルとキックスタート ファイルをサポートしていました。 Ubuntu サーバー 20.04 および Ubuntu デスクトップのバージョン 23.04 以降、これらのインストール方法は非推奨となり、ディストリビューションでは、cloud-init を利用する新しい自動インストール形式が採用されました。
このチュートリアルでは、Ubuntu 自動インストール ファイルを作成する方法と、それを使用して無人で複製可能なインストールを実行する方法を学びます。
このチュートリアルでは次のことを学びます:
- 自動インストール ファイルを作成し、あらゆる側面で Ubuntu インストールを定義する方法
- 自動インストール ファイルを Ubuntu デスクトップおよびサーバーのインストーラーに渡す方法
自動インストールファイルの紹介
Debian の派生ディストリビューションである Ubuntu は、当初、無人で複製可能なインストールを実行する方法としてプリシード ファイルをサポートしていました。キックスタート インストール構文のサポートは互換性レイヤーとして後に追加されましたが、すべてのキックスタート コマンドが実装されたわけではありません。 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 イーサネット インターフェイスを dhcp4 経由で自動的に設定するように指定しています。
#cloud-config
autoinstall:
network:
version: 2
ethernets:
enp1s0:
dhcp4: true
ホスト名とシステムの初期ユーザーの構成
システムを安全に使用するには、少なくとも 1 人の非特権ユーザーを作成する必要があります。システムのホスト名も設定する必要があります。これらの両方の側面は、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
ストレージ設定の定義
システムのインストールで最も重要な側面の 1 つは、パーティショニングのセットアップです。 Ubuntu を対話的にインストールする場合、事前定義されたレイアウトから選択するか、カスタム セットアップを作成できます。自動インストールを実行するときにも同じことができます。利用可能な事前定義レイアウトは、lvm、direct、および zfs です。
lvm レイアウトはデフォルトです。EFI (最新の UEFI システムの場合) とブート標準パーティションを作成し、システムの残りの部分を LVM 論理ボリュームにインストールします。ルート論理ボリュームのサイズはポリシーに従って決定されます。「拡張」(デフォルト) に設定されている場合、論理ボリュームに割り当てられるスペースの量はボリューム グループのサイズによって異なります。可能な場合は、スナップショットを作成できるように、一部のスペースが未使用のまま残されます。
- Less than 10 GiB
利用可能なスペースの 100%
- Between 10 GiB and 20 GiB
10 GiB
- Between 20GiB and 200 GiB
利用可能なスペースの 50%
- Greater than 200 GiB
100 GiB
ポリシーが「all」に設定されている場合、代わりに、使用可能なすべてのスペースがルート論理ボリュームに割り当てられます。このコンテキストでは、password
キーを使用して LUKS 暗号化を有効にし、暗号化パスワードを指定できます。
#cloud-config
autoinstall:
storage:
layout:
name: lvm
policy: all
password: mysecretpassword
直接レイアウトでは、Ubuntu が標準パーティションにインストールされます。 UEFI システムでは、サイズ 1 GiB の EFI パーティションが作成され、残りのスペースがルート パーティションに割り当てられます。
最後に、zfs レイアウトはシステムを ZFS プールにインストールし、いくつかのボリュームを作成します。以下は、Ubuntu の新規インストール後の zfs セットアップのスクリーンショットです。
インストール用のディスクの選択
パーティションのレイアウトに加えて、インストールにどのディスクを使用するかを明示的に設定できます。これは、match
キーを使用して行います。パス、ベンダー、モデル、シリアルなどによってディスクを選択できます。キーワードを省略した場合、インストールは使用可能な最大のディスクに実行されます。以下の例では、パス (/dev/vda) によってディスクを選択します。
#cloud-config
autoinstall:
storage:
layout:
name: lvm
match:
path: /dev/vda
カスタムレイアウトの作成
カスタム パーティション レイアウトを定義するには、config
キーワードを使用します。このキーワードは値としてマッピングのリストを受け入れます。各マッピングは curtin インストーラーのコマンドを記述します。例を見てみましょう。 LUKS セットアップ上の LVM に Ubuntu をインストールし、次のパーティションを作成するとします。
- fat32 でフォーマットされた 600 MiB の小さな EFI パーティションが /boot/efi にマウントされます
- /boot にマウントされるように ext4 でフォーマットされた 1 GiB のブート パーティション
- 残りのスペースにまたがる 3 番目のパーティションは、LUKS で暗号化され、LVM 物理ボリュームとしてフォーマットされます。
- / にマウントされる 45 GiB の 1 つの LVM 論理ボリューム
- /home にマウントされる 50 GiB の 1 つの LVM 論理ボリューム
ここではどのように進めていきますか。最初に行う必要があるのは、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
キーワードは非常に重要です。使用すると、ディスクまたはパーティションの内容が破壊されます。使用できる「ワイプ」にはさまざまなタイプがあります: スーパーブロック、スーパーブロック再帰、ゼロ、ランダム、そしてpvremove。ディスクのスーパーブロックだけをワイプしたい場合はスーパーブロックを使用し、最終的な埋め込みスーパーブロックもワイプしたい場合はスーパーブロック再帰的を使用します(LVMを使用する場合に存在する可能性があります)。 、 例えば)。 zero または random ワイプを使用すると、それぞれゼロまたはランダム データでディスクを上書きできます。最後に、pvremove は、ディスクが LVM セットアップの一部でないことを確認するために、LVM メタデータを明確に消去します。上の例ではスーパーブロック再帰的を使用しましたが、ほとんどの場合これで十分です。
「partition」コマンドによる標準パーティションの作成
次に、ディスク上に 3 つの「標準」パーティションを作成する必要があります。 1 つ目は 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 コマンドを使用します。 name
キーで LV 名を指定し、volgroup
の値として LV を作成するボリューム グループと、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: /home
設定を Ubuntu インストーラーに渡すにはどうすればよいですか? Ubuntu のデスクトップ バージョンをインストールする場合、最も簡単で便利な方法は、HTTP または FTP 経由で構成ファイルを利用できるようにし、その URL をグラフィカル インストーラーの適切なセクションに渡すことです。
自動インストール構成ファイルは、対話的に実行された場合でも、Ubuntu をインストールするたびに自動的に作成されます。ファイルは /var/log/installer/autoinstall-user-data
として保存されています。このファイルは、インストールを複製するために使用できます。
完全に自動化されたインストールを実行したい場合、または Ubuntu サーバーのインストール時に自動インストール構成を使用したい場合は、cloud-init を利用し、その構成を Cloud-config データ ファイルとして使用する必要があります。これが「#cloud-config」です。自動インストールファイルの一番最初にあるコメントが対象です。
Cloud-init が起動時にファイルを読み取るためには、そのファイルの名前を user-data
に変更し、同じディレクトリに meta-data
という名前の空のファイルを作成する必要があります。 「e」を押して、ライブ ISO GRUB メニューの最初のエントリを変更します。
次に、「linux」で始まる行を変更し、3 つのハイフンの前に次の文字列を追加します (セミコロンのエスケープが重要です)。
autoinstall ds=nocloud-net\;s=<directory-URL>
この時点で、Ctrl-x を押すだけでインストールが開始されます。
最後に
Ubuntu サーバー 20.04 および Ubuntu デスクトップ 23.04 以降、ネイティブ自動インストール形式を使用して、無人で再現可能なシステム インストールを実行できるようになりました。このチュートリアルでは、自動インストール ファイルの作成方法と、そこで使用できるいくつかのキーについて説明しました。最後に、ファイルを Ubuntu デスクトップおよびサーバーのインストーラーに渡す方法を確認しました。 Ubuntu 自動インストールの完全なリファレンスについては、公式ドキュメントを参照してください。