Ubuntu Weekly Recipe

第818回Ubuntuデスクトップのインストールを半自動化しよう!

OSのインストールというのは面倒なものです。いや、そもそも普通の人はOSのインストールなんて一生に一度あるかないかのビッグイベントですが、今これを読んでいる時点で「OSに関する普通」の道を踏み外していますので、安心して「OSのインストールは面倒」だと思ってください。それは「インストールが簡単」と言われるUbuntuでも同じで、インストール設定を少し凝るようにすればするほど手順は複雑になりますし、さらにインストール後の環境のセットアップも必要です。

今回はそんな面倒さを少しでも和らげられるようUbuntu 24.04 LTSのデスクトップ版で正式に搭載された、自動インストール機能について紹介しましょう。

図1 Ubuntu 24.04 LTSで追加された自動インストール機能

サーバー版の自動インストール機能を用いた自動化方法

自動インストール機能そのものは、第810回のUbuntu 24.04 LTSの変更点でも軽く触れています。そこでも説明されているように今回の自動インストール機能は、サーバー版Ubuntuで使われているSubiquityの自動インストール機能をデスクトップ版でも使えるようにしたものです。

Ubuntuの新インストーラーであるUbuntu Desktop Provisionはその名の通り、これまでの「OSをインストールする」からさらに踏み込んで、⁠Ubuntuを用いたシステムを構築する」ことを目的として作り直されました。これにはストレージの暗号化やActive Directoryなどの対応、インストールの自動化なども含まれており、その先にはImmutable Desktopを実現するためのUbuntu Core Desktopが控えています[1]

新インストーラーのフロントエンドはFlutterで作られており、バックエンドはUbuntuサーバーのインストーラーであるSubiquityが採用されています。Subiquityがバックエンドとして動いているために、これまでサーバー版で使えていた自動インストール機能がそのままデスクトップでも使えるようになったのです[2]

サーバー版のインストールの自動化については、次の記事で紹介しています。

「インストール設定を書いたYAMLファイルを作る」という点では、デスクトップ版もサーバー版も違いはありません。多少記述内容に変動はありますが、これまでの知識を流用できます。ただし、サーバー版と異なりデスクトップ版では完全な自動インストールはできない点に注意が必要です。インストールUSBを接続し、起動したあとに何度かUIの操作が必要になります。どうしても完全に自動化したい場合は、サーバー版のインストーラーを使ってubuntu-desktopパッケージをインストールするような対応が必要になるでしょう。

インストーラーなどのデプロイ関連のツールが起動したあとに、そのシステムに対して何も操作しなくてもインストールやデプロイ、初期設定が完了する仕組みを「Zero Touch Provisioning」と呼びます。Ubuntuのデスクトップも、将来的には「Zero Touch Provisioning」の実現を目指す可能性はありますが、今のところ「ゼロ」には程遠い状況です。あくまで「半自動化」となります。

さらに自動化できる範囲にも限りがあるため、本格的な利用を考えるのであれば、Ansibleなどの構成管理ツールと組み合わせて使うことになるでしょう。

自動インストール用のYAMLファイルを作る

さっそく自動インストール用のファイルを作ってみましょう。書き方や書式は、サーバー版のそれと同じであるため、Subiquityのドキュメントが参考になります。接続されているストレージが1台だけのときの比較的シンプルな設定は次のようになります。

autoinstall:
  version: 1
  locale: ja_JP.UTF-8
  keyboard:
    layout: jp
  timezone: Asia/Tokyo
  identity:
    hostname: autoinstall
    realname: 'Mitsuya Shbiata'
    username: shibata
    password: "$6$uw0WAWIWz0FfXEGI$zf3nqtEHqKJfiW7gp7nk4l7BIFXe7029wqwLbIWlPBm/YQPeJ0yXh4W1xcbsOINL1DEyHdyxSXao.n9vDSwK5."
  packages:
    - vim
    - neovim
    - byobu
    - git

実は現在のデスクトップ版インストーラーでは、自動インストールに入る前に「locale」⁠keyboard」⁠timezone」の設定をUIで行うため、これらは書かなくても問題ありません。最低限必要になるのは「identity」だけです。⁠identity」ではホスト名(hostname⁠⁠・GECOS(realname⁠⁠、ユーザー名(username⁠⁠、パスワード(password)をそれぞれ入力します。パスワードについては次のように生成すると良いでしょう。

$ openssl passwd -6 パスワード
$6$uw0WAWIWz0FfXEGI$zf3nqtEHqKJfiW7gp7nk4l7BIFXe7029wqwLbIWlPBm/YQPeJ0yXh4W1xcbsOINL1DEyHdyxSXao.n9vDSwK5.

上記の例ではさらに追加でパッケージもインストールしています。これでYAMLファイル自体は完成です[3]

インストーラーを起動し自動インストールを実行する

次に先ほど作成したYAMLファイルを用いて自動インストールを行います。Ubuntu Desktop ProvisionがYAMLファイルを取得する方法は次の2種類です。

  • HTTPなどのネットワーク越しに取得する
  • ローカルのLive環境に配置したものを取得する

ちなみにUbuntu 24.04 LTSのリリース直後は後者のローカルファイルに対応していませんでしたが、6月リリース以降のUbuntu Desktop Provisionではローカルファイルに対応済みです。ローカルファイルを使いたければ、インストール途中でインストーラーを更新してください。

図2 インストーラーの途中でインストーラーを更新すればローカルファイルにも対応できる

インストーラーを更新した場合は、一度インストーラーを再起動します。具体的には「インストーラーを閉じる」ボタンを押したらLive環境に移行するため、その状態でデスクトップの右下にあるインストーラーをダブルクリックして再起動するだけです。

あとは画面の指示に従ってインストール作業を行っていけば、ネットワーク設定のあとに「Ubuntuをインストールしますか?」の画面が登場します。

図3 ここで「自動インストール」を選択すると、URLの入力欄が表示される

HTTP経由で取得するならhttp://と入力しましょう。ローカルファイルにアクセスしたい場合はfile:///home/ubuntu/autoinstall.yamlのように入力します。file://は省略できません。他のURLスキーム利用やURLにパラメーターを埋め込むことも可能なはずですが未確認です。

Live環境にダウンロードするのが面倒であれば、近場にあるUbuntuマシンで次のようにHTTPサーバーを立ち上げてしまえば良いでしょう。

お手軽にHTTPサーバーを立ち上げる方法:
  autoinstall.yamlがある場所で実行すると、インストーラーでは
  「http://IPアドレス:8080/autoinstall.yaml」と記述できる

$ python3 -m http.server 8080

「確認」ボタンを押して問題なくファイルを取得できれば、次のように自動インストールの内容が表示されます。

図4 インストール内容の確認。この図は前述の設定ファイルとは異なるケース

YAMLファイルのパースに失敗すると、次のようにエラーになります。現時点ではどこでエラーになっているかわかりません。⁠ログを表示」ボタンを押して、ログの内容から判断することになります。

図5 パースエラー時の画面

しかしながらこの状態で「閉じる」ボタンを押すと、インストーラーが起動できなくなる問題が存在します。回避策はないため、うまく動かないようなら、PC自体を再起動してインストールをやり直しましょう。

あとは放っておけば残りの手順は自動化され、自動的にシステムの再起動まで行われます。インストールメディアの削除確認もスキップされますので、次回起動時に再びインストーラーが起動してしまうようなら、一度シャットダウンしてメディアを取り外してください。

図6 このインストール完了画面が表示された場合は、自動インストールの処理のどこかでエラーが発生したことを意味する。再起動せずに/var/log/installer以下のログを確認しよう

無事に自動インストールが完了してシステムが立ち上がったあとは、期待通りの設定になっているか確認してください。ちなみに通常のデスクトップ版のインストールと異なり、LVMを用いてストレージが構築されます。これはサーバーと同じ設定です。またストレージの構成には次のようなルールが適用されます。

  • ストレージが10GiB以下なら、すべての領域がルートファイルシステムに使われる
  • ストレージが10GiBから20GiBなら、ルートファイルシステムのサイズは10GiB
  • ストレージが20GiBから200GiBなら、ルートファイルシステムのサイズはストレージの半分
  • ストレージが200GiBを超えると、ルートファイルシステムのサイズは100GiB固定

サーバーの場合、すべてのルートファイルシステムをひとつにまとめたりせず、用途に応じてパーティションをわけたり複数のストレージをLVMでひとつのストレージとして管理することがあるため、このような設定になっています。デスクトップの場合は、全部まとめてひとつのルートファイルシステムにすることも多いでしょう。このあたりの設定方法は後ほど解説します。

インストール時のログは再起動後も/var/log/installerに保存されています。何かうまく動かない場合はまずはこちらを参考にすることになるでしょう。特に/var/log/installer/autoinstall-user-dataについては、autoinstall.yamlを元に、足りない設定をインストーラーが追加して実際に使われるファイルとなります。未指定時の値がどうなるのか、設定の書き方はどうするのが正しいのかを確認する際に参考になります。

いくつかの設定例

最後によくある設定例をいくつか紹介しましょう。

ストレージをすべて利用する

先ほど説明したように、自動インストールでは200GiB以上のストレージにインストールしようとすると、ルートファイルシステムのサイズを100GiB固定に設定してしまいます。これを細かく設定するのが「storage」フィールドです。

  storage:
    layout:
      name: lvm
      sizing-policy: all
      password: storagepassword

「sizing-policy」「all」を指定してやれば、ストレージの領域すべてをルートファイルシステムに割り当てます[4]。さらに「password」を指定するとストレージの暗号化も行います。

またストレージが複数台繋がっているマシンであれば、storageの設定は必須になります。matchなどを使ってどのストレージデバイスに何を設定するかを個別に指定することになります。

  storage:
    layout:
      name: lvm
      match:
        path: /dev/nvme0n1

上記の例はデバイスファイルパスを指定していますが、他にもラベルやシリアル番号、モデル名、SSDであるかどうか、サイズが大きいかどうかなどでも選択可能です。

ストレージの設定はインストールの肝でもありますので、より細かい設定も可能です。まずはドキュメントのstorageに関する項目を一通り読んでみることをおすすめします。さらにcurtinの設定を使って細かく指定できます。また実際にGUIから設定・インストール後に生成された/var/log/installer/autoinstall-user-dataを確認するのもひとつの手でしょう。

最小インストールから拡張インストールに変更する

第810回でも説明されているように、Ubuntu 24.04 LTSではインストールの初期設定が最小インストール(既定の選択)になり、LibreOfficeやThunderbirdなどがインストールされなくなりました。従来のソフトウェアセットと同じような形でインストールするには「拡張選択」を選ぶ必要があります。これを自動インストールで対応するのが「source」フィールドです。

  source:
    id: ubuntu-desktop

これで拡張選択相当の挙動になります。ちなみに明示的に最小インストール構成にしたい場合は「ubuntu-desktop-minimal」を選んでください。

なおこの選択肢はインストーラーイメージファイルの/casper/install-sources.yamlにあるidから選択できるようです。デスクトップ版のイメージの場合は「ubuntu-desktop」「ubuntu-desktop-minimal」の2択です。

snapパッケージをインストールする

よく使うsnapパッケージをインストールしたい場合は、次のように記述します。

  snaps:
    - name: slack
      channel: stable
      classic: false

「channnel」「classic」は省略するとそれぞれ「stable」⁠false」が選択されます。ただしsnapパッケージは、インストール完了後の初回起動時にインストール処理が動くようです。そのため、初回起動が完了するまでの時間が少し長くなります。

debファイルをダウンロードしてインストールする

「late-commands」を使うと、インストール処理完了後、再起動する前に追加のスクリプトを実行できます。たとえばサードパーティのリポジトリを追加したり、リポジトリにないdebファイルやFlatpakパッケージをインストールする場合に便利でしょう。以下はChromeをインストールする方法です。

  late-commands:
    - curtin in-target -- wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    - curtin in-target -- apt install -U -y ./google-chrome-stable_current_amd64.deb
    - curtin in-target -- rm -f ./google-chrome-stable_current_amd64.deb

curtin in-target --とすることで、インストール先のファイルシステムで任意のコマンドを実行できます。たとえば上記のコマンドの場合、インストール後の/にダウンロードしたファイルが保存されることになります。

このように自動インストール機能を使えば、普段Ubuntuデスクトップをインストールする際の手順を、ある程度省力化できます。⁠ある程度」というのがポイントで、全部自動化できるわけではありません。それでもたとえばUbuntuではLTSからLTSのアップグレードもサポートしているもののせっかくだしLTS更新時はクリーンインストールしようと考えている人や、複数のミニPCや仮想マシンに同じようにUbuntuを入れておきたいと考えている人にとっては、役に立つ機能となることでしょう。

おすすめ記事

記事・ニュース一覧