ウェブサイト検索

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をインストールし、次のパーティションを作成したいとしましょう。

  1. 600 MiBの小さなEFIパーティションをfat32でフォーマットし、/boot/efiにマウントします。
  2. 1 GiBのブートパーティション、/bootにマウントするためにext4形式でフォーマットされます。
  3. 残りのスペースにまたがる3つ目のパーティションは、LUKSで暗号化され、LVM物理ボリュームとしてフォーマットされています。
  4. 45 GiBのLVM論理ボリュームを/にマウントする
  5. 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: /home

Ubuntuインストーラーに設定をパスするにはどうすればよいですか?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リファレンスについては、公式ドキュメントをご覧ください。

関連記事: