えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

virt-builderによるLinuxインストールの「省略」

virt-builder-image
The cloud icon is created by Freepik - flaticon.com

お伝えしたいこと

今回はvirt-builderというLinuxコマンドの紹介です。
LinuxをMinimal構成でインストール済みのディスクファイルを簡単に生成するコマンドです。

Linuxインストールを自動化するのではなく、Linuxインストール済みのテンプレートから仮想ディスクを作成します。

KVM仮想マシンを構成している場合に相性が良いです。
コマンド1行で、なおかつ短時間でLinuxマシンが手に入ります。

前回お伝えしたKickstartファイルと比較すると、得意/不得意があります。
詳細は次のセクションで紹介します。

virt-builderとは

virt-builderとは、libguestfsというツール群に含まれるコマンドの1つです。
Linux環境であれば、OS標準のパッケージマネージャで手軽にインストールして使い始めることができます。

このコマンドによって、LinuxをMinimal構成でインストールしたデータを格納した仮想ディスクファイル (raw, またはqcow2形式) を手軽に生成できます。
具体的な動作は、下図のとおりです。

virt-builder

virt-builderコマンドを実行したときの動作は2工程です。

  1. オンラインリポジトリからxz圧縮されたテンプレートを~/.cache/virt-builder/配下にダウンロードする
  2. テンプレートを加工し、Linuxインストール済みのディスクファイルを生成する

virt-builder実行時のコマンドラインオプションによって、2の工程における加工の内容を制御できます。
具体的にはディスクサイズや、ログインパスワードの変更などが挙げられます。

virt-builderコマンドは、Linuxのインストール処理を行いません。
そのため、テンプレートをダウンロード済みであれば高速に動作します。

一方で、Linuxを手動/自動インストールする場合と比較して細かなカスタマイズは効きません。
virt-builderはMinimal構成の検証用VMを手軽に作成する方法と割り切り、より細かな制御が必要な場合はKickstartファイルによる自動インストールなど自力でインストールすることをおすすめします。

virt-builderの使い方

インストール

virt-builderは、guestfs-tools RPMパッケージに含まれます。

RHEL系のディストリビューションであれば、以下のコマンドでインストールできます。

sudo dnf install guestfs-tools

virt-builderの実行

virt-builderのSyntaxは非常にシンプルです。

virt-builder os-version [options...]

最小限のコマンド例は、以下のとおりです。
以下のコマンドにより、6 GiBのディスク容量を持つCentOS Stream9をインストール済みの仮想ディスクファイルが生成します。
rootのパスワードはランダム文字列が生成され、標準出力に表示されます。
今回はrFdQIE0WFI8AHTRyでした。

virt-builder centosstream-9

# (一部抜粋)
#   Output file: centosstream-9.img
#   Output size: 6.0G
# Output format: raw

今回の例では、os-versioncentosstream-9を指定しました。
指定可能なOSバージョンの一覧は、virt-builder -lで確認できます。

virt-builder -l

# (一部のみ抜粋)
# centosstream-9  x86_64  CentOS Stream 9

実際に使う際は、以下のように複数のオプションを指定するのが一般的です。

virt-builder centosstream-9 \
-o /home/shared/libvirt/images/test.qcow2 \
--size 10G \
--format qcow2 \
--hostname test \
--root-password 'password:mypassword' \
--ssh-inject root \
--selinux-relabel

# (一部抜粋)
#   Output file: /home/shared/libvirt/images/test.qcow2
#   Output size: 10.0G
# Output format: qcow2

今回使用したコマンドラインオプションの意味は、下表のとおりです。
完全なリストはman virt-builderを参照してください。

--selinux-relabelSELinuxが有効なディストリビューションをビルドする場合のみ指定します (FedoraCentOS Streamなど)
他のオプションは、どのディストリビューションにおいても指定することをおすすめします。

オプション 意味
-o
--output
  • 出力する仮想ディスクファイルパスを指定
  • デフォルト:
    • raw形式の場合: OSイメージ名.img
    • qcow2形式の場合: OSイメージ名.qcow2
--size
  • 仮想ディスクのサイズを指定する
  • 単位のいずれかの指定が必須
    • b: Bytes
    • K: KiB
    • M: MiB
    • G: GiB
    • (※) Tという単位は認識されなかった
  • 最低でも6.0G以上を指定する必要がある
  • デフォルト: テンプレートのサイズを変更せず使う
    (※) デフォルト値は6.0Gのことが多い
--format
  • ディスクファイルのフォーマットを指定する
  • rawqcow2のいずれかを指定可能
  • (※) ディスク容量の効率が良いqcow2がおすすめ
  • デフォルト: raw
--hostname
  • ホスト名を指定する
  • デフォルト: テンプレートファイルの構成に従う
--root-password
  • rootユーザーのログインパスワードを指定する
  • password:PASSWORD: 指定した文字列を設定する
  • file:FILENAME: 指定したファイルの1行目の文字列を設定する
  • random: ランダム文字列を設定し、標準出力に表示する
  • disabled: パスワードを無効化する
  • locked: rootユーザーをロックする
  • 詳細はman virt-builderを参照
  • デフォルト: random
--ssh-inject (※1)
  • SSH公開鍵を指定したユーザーの~/.ssh/authorized_keysに登録する
  • ユーザー名のみ指定した場合、~/.ssh/から自動選択される
  • SELinuxが有効なVMをビルドする場合、--selinux-relabelも指定するべき (※2)
  • 詳細はman virt-builderを参照
--selinux-relabel
  • ビルドの最終工程でSELinuxのrelabelを行う
  • 以下の2つの条件を両方満たす場合は指定必須 (※3)
    • RHELCentOS StreamなどSELinuxが有効なOSをビルドするとき
    • virt-builderのオプションでファイル生成するとき

(※1) sshdはデフォルトでrootユーザーによるパスワード認証を拒否する設定になっているので、--ssh-injectによってSSH鍵をアップロードすることをおすすめします

(※2) --ssh-injectオプションによって、~/.ssh/authorized_keysファイルを生成します。このファイル生成はSELinuxが起動していない状態で行われるため、生成されるファイルはラベル無し (no label) になります

(※3) SELinuxが起動している時にファイルを生成すると、SELinuxは全てのファイルにラベル付けし、ファイルシステムメタデータとして記録します。その後、SELinuxはラベルに基づいてアクセス制御を行います。--ssh-injectオプションを利用すると、マシンが起動しておらずSELinuxも動作していないところに~/.ssh/authorized_keysを生成します。このとき当然ラベル付けされないので、そのままだとSELinuxの制御が正しく行われません。具体的にはsshdauthorized_keysを読み取れず、公開鍵認証に失敗します。この問題を回避するには、--selinux-relabelをセットで指定することで、SELinuxのラベル付けを行います。この対応はRHEL, CentOS, CentOS Stream, Fedoraなど、SELinuxが有効なディストリビューション全てに必要です。SELinuxについてもっと知りたい方は、Linuxプロセスアクセス制御の概要を始めとするSELinuxシリーズもぜひお読みください

(参考) 生成したディスクイメージファイルでVMを起動する

virt-builderで生成したディスクファイルをセットしてVMを起動すれば、インストール済みのLinuxを直ちに使うことができます。

例えば、KVM環境の場合は、以下のようなvirt-installコマンドでVMを作成・起動します。
今回はLinuxのインストールを行わないので--cdromのような起動順位を変更するオプションを指定せず、代わりに--importを指定します。

virt-install \
--name test \
--memory 1024 \
--vcpus 2 \
--os-variant centos-stream9 \
--disk path=/home/shared/libvirt/images/test.qcow2 \
--import
--noautoconsole

作成したVMを強制終了して削除するには、以下のコマンドを実行します。

virsh destroy test ; virsh undefine test --storage vda

詳細はKVMの基本操作集にあるVMの作成VMの削除を参考にしてください。

(参考) オンラインリポジトリのURL

virt-builderコマンドが参照するオンラインリポジトリのURLは、デフォルトで以下のとおりです。

  1. https://builder.libguestfs.org
  2. http://archive.libguestfs.org/builder
  3. https://download.opensuse.org/repositories/Virtualization:/virt-builder-images/images/

リポジトリのURLは、/etc/virt-builder/repos.d/*.confにて管理されています。

(参考) virt-builderに対応しているディストリビューション

2022/4現在で以下のとおりです。

virt-builderの引数に指定できるディストリビューション名は、virt-builder -lで確認できます。

virt-builder -l
# (一部のみ抜粋)

# opensuse-13.1        x86_64     openSUSE 13.1
# opensuse-42.1        x86_64     openSUSE Leap 42.1
# opensuse-tumbleweed  x86_64     openSUSE Tumbleweed
# alma-8.5             x86_64     AlmaLinux 8.5
# centos-6             x86_64     CentOS 6.6
# centos-7.0           x86_64     CentOS 7.0
# centos-8.2           x86_64     CentOS 8.2
# centosstream-8       x86_64     CentOS Stream 8
# centosstream-9       x86_64     CentOS Stream 9
# cirros-0.3.5         x86_64     CirrOS 0.3.5
# debian-6             x86_64     Debian 6 (Squeeze)
# debian-11            x86_64     Debian 11 (bullseye)
# fedora-33            x86_64     Fedora® 33 Server
# fedora-35            x86_64     Fedora® 35 Server
# fedora-35            aarch64    Fedora® 35 Server (aarch64)
# freebsd-11.1         x86_64     FreeBSD 11.1
# scientificlinux-6    x86_64     Scientific Linux 6.5
# ubuntu-10.04         x86_64     Ubuntu 10.04 (Lucid)
# ubuntu-20.04         x86_64     Ubuntu 20.04 (focal)

まとめ

Minimal構成でLinuxをインストール済みの仮想ディスクファイルをお手軽に入手する方法としてvirt-builderを紹介しました。
Kickstartよりも更に簡単に検証用マシンを作成することができます。

virt-builderで作成したLinuxは、構成がほぼ固定されます。
デフォルトの構成をカスタマイズしたい場合は、やはり自分でLinuxをインストールする必要があります。
Linuxインストールを自動化したいときは、Kickstartが便利です。

virt-builderVMクローン、Kickstart、またはその他の自動化をうまく使い分け、効率よくLinux検証環境を整備しましょう。