えんでぃの技術ブログ

えんでぃの技術ブログ

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

KickstartによるLinuxインストール自動化 (自動トリガー・ローカルディスク接続)

featured_image

Kickstartシリーズ

Kickstartとは、Linuxのインストールを自動化する機能です。
本シリーズではRHEL, Fedora, CentOS Streamをモデルに紹介します。

一連の記事でKickstartの構成を3パターン紹介します。
今回の記事では、2つ目の構成を紹介します。

私が普段Linuxをインストールするとき、この方法を使うことが一番多いです。

  1. KickstartによるLinuxインストール自動化 (手動トリガー・HTTP連携)
  2. KickstartによるLinuxインストール自動化 (自動トリガー・ローカルディスク接続) ← 今ココ
  3. KickstartによるLinuxインストール自動化 (自動トリガー・PXEブート連携)

構成概要

今回の構成は、Kickstartファイルを格納した専用の記憶デバイスをセットするだけでインストールを自動化します。

前回記事の構成と比較すると、初回起動時にinst.ks=...KickstartファイルのURLを手動入力しなくて良い点がメリットとして挙げられます。
一方でKickstart用ディスクを最初に接続し、インストール完了後に必要に応じて接続解除するという一手間が発生する点はデメリットとも言えます。

しかしながらコンソール上の文字入力が不要となるため、シェルスクリプトやAnsibleなどの外部ツールと連携して完全自動化したい場合は、今回の構成の方が実現が容易になります。

kickstart2

環境構築は以下の手順で行います。
詳細は#環境構築にて説明します。

  1. ファイルシステムOEMDRVとラベル付けする
  2. 上記ファイルシステムKickstartファイルを/ks.cfgというファイルパスで保存する

Kickstartは以下の手順で開始します。
詳細は#Kickstartの実行にて説明します。

  1. ISOファイル、インストール先ディスク、上記のキックスタート用ディスクをセットする
  2. ISOファイルから起動する
  3. 自動的にインストールが完了する

この構成は、特にLinuxを扱える環境においては採用しやすいと思います。
Linux環境であれば、virt-make-fsコマンドによって、Kickstartファイルだけを格納した専用の記憶デバイスをrawやqcow2といった形式で簡単に作成できます。

逆に上記のようなコマンドが使えない環境では、記憶デバイスの準備が少々面倒かもしれません。

環境構築

Kickstartファイルの作成

前回記事で作成したファイルをそのまま使います。

ファイル名をks.cfgにリネームし、作業用ディレクトリに格納しておきます。

tree tmp
# tmp
# └── ks.cfg

Kickstart用ディスクの作成

virt-make-fsのインストール

Kickstart用ディスクの作成にはvirt-make-fsコマンドを使います。

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

sudo dnf install guestfs-tools

ディスク作成

Kickstart用のディスクファイルを作成します。

ディスクファイルの要件は以下のとおりです。

上記を満たすようなディスクファイルを以下のコマンドで作成します。

virt-make-fs -t fat -F qcow2 --label OEMDRV tmp/ ks_centos_stream9.qcow2

ls -lh ks_centos_stream9.qcow2 
# -rw-r--r--. 1 endy endy 640K Mar 26 20:58 ks_centos_stream9.qcow2

virt-make-fsとは、指定したディレクトリを元にディスクファイルを作成するコマンドです。
今回使用したオプションは、下表のとおりです。

オプション 意味
-t fat
-F qcow2
  • qcow2形式のディスクファイルを出力する
  • デフォルトはraw形式
--label OEMDRV ファイルシステムOEMDRVラベルを付与する
tmp/
(第一引数)
tmp/ディレクトリ配下をディスクファイルに格納する
ks_centos_stream9.qcow2
(第二引数)
  • 出力ファイル名の指定
  • 出力先に第一引数のディレクトリ配下を指定するとエラーになる

最後に、Kickstart用ディスクファイルをお好みの場所に格納します。
今回の例では、/home/shared/libvirt/images/kickstarts/ks_centos_stream9.qcow2に格納しました。

前回記事と同様に、お好みでシンボリックリンクを作っておくとCentOS Streamのバージョン差異を抽象化できて便利になります。
よろしければ、以下のコマンドでks_centos_stream.qcow2というファイル名のシンボリックリンクを作成しておきましょう。

ln -s ks_centos_stream9.qcow2 ks_centos_stream.qcow2

Kickstartの実行

ここまでの作業で準備は整いました。
いよいよ初期状態の仮想マシンを用意してKickstartを開始します。

(参考) 仮想マシンの作成

KVM配下に仮想マシンを作成する場合を例に、パラメータの例を示します。
詳細はKVMの基本操作集 - #VMの作成をご覧ください。
VM作成時、Kickstart用ディスクファイルもセットするのがポイントです。

(参考) Cockpitの場合

CockpitでVMを作成する場合、以下の手順で行います。

まずはKickstartファイルを含むディレクトリにStorage Poolが紐付いていない場合は、作成しておきます。
プールを作成する理由は後ほど説明します。
作成手順はKVMの基本操作集 - #ストレージプールの作成が参考になります。

続いて、VMを作成します。
VM作成はKVMの基本操作集 - #VMの作成を参考にしてください。
VM作成時のパラメータは以下を指定します。
ポイントは下図の(3)にあるとおり、「VMの起動」を一旦OFFにすることです。

cockpit_ksfile1

続いて作成したVMの詳細画面へ移動し、DisksセクションのAdd disksを選択します。
ディスク追加画面で、Use existingを選択の上Poolを指定して Kickstart用ディスクを追加します。
(※) 私のCockpit環境では、Custom pathからKickstart用ディスクのフルパスを指定して追加すると、Kickstartが開始されませんでした。virsh dumpxml testVMの定義情報を確認すると、Custom pathから追加したときはqcow2形式のディスクであってもraw形式と認識されてしまっていたので、これが原因と思われます。2022/3時点で最新のcockpit-machines 264で、これは予測された動作とのことでした。Issue #639で問い合わせたところ、Pull Request #646にて今後対応いただけそうです。感謝!

cockpit_ksfile2

Kickstart用ディスクを追加後、再びこのディスクを編集するためにEditボタンをクリックします。
ここでRead-onlyを選択しておくことをおすすめします。

cockpit_ksfile3

Read-onlyを選択することは必須ではありません。
しかしRead-onlyにしておくことで、VMを削除するときにディスク削除オプションのチェックボックスがデフォルトでOFFになります (下図を参照)
これによって、Kickstart用ディスクを誤って削除するリスクを多少なりとも下げることができます。

cockpit_ksfile4

(参考) virt-installの場合

以下のコマンドを実行することで、Kickstart用ディスク付きのVMを作成・起動できます。
基本的には前回記事と同じコマンドですが、以下の部分が差分です。

  • 末尾に--diskを追加指定することでKickstart用ディスクを追加している
  • --check path_in_use=offにより、Kickstart用ディスクを搭載したVMが他に存在してもエラーにならないようにする
virt-install \
--name test \
--memory 2048 \
--vcpus 2 \
--disk size=10 \
--graphics vnc \
--graphics spice \
--os-variant centos-stream9 \
--cdrom /home/shared/libvirt/images/isos/centos/CentOS-Stream-9-latest-x86_64-dvd1.iso \
--disk path=/home/shared/libvirt/images/kickstarts/ks_centos_stream9.qcow2,readonly=on \
--check path_in_use=off &

VMを強制終了して削除するには、以下のコマンドを実行します。
--storage vdaを指定しているので、間違えてKickstart用ディスクを一緒に消すことはありません。

virsh destroy test ; virsh undefine test --storage vda --snapshots-metadata --managed-save

もし--storage vdaの指定で本当に正しいか不安であれば、以下のコマンドで事前に確認することも可能です。

virsh domblklist test
 Target   Source
# ------------------------------------------------------------------
#  vda  /home/shared/libvirt/images/test.qcow2
#  vdb  /home/shared/libvirt/images/kickstarts/ks_centos_stream9.qcow2
#  sda  -

Kickstartによる自動インストール

VMを起動し、インストールを開始すれば自動的にKickstartが始まります。

前回記事とは異なり、コンソール画面からinst.ks=...を指定する必要はありません。
これはOEMDRVラベルのついたファイルシステム/ks.cfgファイルがあるとき、ks.cfgファイルを自動的にKickstartファイルとして読み込む仕様があるためです1

(参考) Kickstartでエラーが発生したときの対処法

1つ目の記事で紹介した(参考) Kickstartでエラーが発生したときの対処法を参照してください。

参考URL

本記事に関連する参考URLをまとめて掲載します。

virt-make-fsによるKickstart用ディスクの作成方法については、man virt-make-fsをご確認ください。

Kickstart用ディスクによるKickstartの自動開始については、Red Hat社のマニュアルが参考になります。
RHEL8 - Performing an advanced RHEL installation - 7.3. Starting a Kickstart installation automatically using a local volume

その他、Kickstart自体の概要やKickstartファイルの書き方については、前回記事で紹介した内容を前提としております。

まとめ

Kickstart用ディスクをセットしたマシンを起動するだけで、Kickstartを自動トリガーしてLinuxのインストールを自動化する方法を紹介しました。

前回記事と比較して、Kickstartのトリガーが自動化されたことで更に便利になりました。
しかし、virt-make-fsコマンドが使えるLinux環境にアクセスできない場合はKickstart用ディスクの作成・変更が少々面倒かもしれません。

KVMでローカル検証環境を組んでいる方は、この構成を便利に扱えると思います。
Linuxのインストールが面倒になったら、ぜひご活用ください。

関連記事