えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、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環境であれば、mkisofsコマンドによって、Kickstartファイルだけを格納した専用のKickstartトリガー用ファイルをISO形式で簡単に作成できます。
(※) 本ブログでは、このKickstartトリガー用ファイルを「Kickstartイメージファイル」と呼びます

Windows環境でKickstartイメージファイルを作成するには、恐らくフリーソフトに頼る必要があります。
Macの場合はわかりません。

環境構築

Kickstartファイルの作成

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

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

tree tmp
# tmp
# └── ks.cfg

Kickstart用ディスクの作成

mkisofsのインストール

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

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

sudo dnf install xorriso

Kickstartイメージファイルの作成

Kickstartイメージファイルの要件は以下のとおりです。

では、Kickstartイメージファイルを作成します。

まず、事前にks.cfgという名前のKickstartファイルをディレクトリに配置します。
サブディレクトリなどに含めず、必ずディレクトリ直下に配置するようにしてください。

ls tmp/
# ks.cfg

続いて、tmp/ディレクトリを引数にmkisofsによってISOファイルを作成します。

mkisofs -V OEMDRV -o ks_centos_stream9.iso tmp/

今回使用したmkisofsコマンドラインオプション、及び引数を下表に示します。

オプション / 引数 意味
-V OEMDRV
-o ks_centos_stream9.iso 出力ファイルパスをks_centos_stream9.isoと指定
tmp/ tmp/ディレクトリの中身をISOファイルシステムに含める

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

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

ln -s ks_centos_stream9.iso ks_centos_stream.iso

Kickstartの実行

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

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

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

(参考) Cockpitの場合

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

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

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

cockpit_ksfile1

続いて作成したVMの詳細画面へ移動し、DisksセクションのAdd disksを選択します。
続いて、下図のようにCustom pathからISOファイルへのフルパスを指定します (※)

cockpit_ksfile2

(※) ちょっとした小技ですが、"Use existing"からPool名とKickstartイメージファイル名のみを指定することで、ISOファイルの指定をすることができます。この方法で指定するためには、事前にKickstartイメージファイルを格納するフォルダと紐づくPoolを作成する必要があります。Poolの作成手順は、KVMの基本操作集 - ストレージプールの作成を参照してください。このやり方は癖が強いので、やるとしたら商用環境ではなくご自身の個人環境で行うようにしましょう。

(参考) virt-installの場合

以下のコマンドを実行することで、Kickstartイメージファイルを搭載したVMを作成・起動できます。
基本的には前回記事と同じコマンドですが、以下の部分が差分です。

  • 末尾に--diskを追加指定することでKickstartイメージファイルを追加している
  • Kickstartイメージファイルの追加時、readonly=onを指定することでドライブを読み取り専用にしている (※)
  • --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.iso \
--check path_in_use=off &

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

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

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

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

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

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

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

(参考) ISO以外の形式でKickstartイメージファイルを作成する

本セクションで紹介する手順は非推奨です。
KickstartイメージファイルはISOファイルで作成するべきです。

Kickstartイメージファイルは、ISO以外のファイルシステムでも作成できます。
例えば、軽量なファイルシステムであるFATやEXT2でフォーマットすることも技術的には可能です。

例えば、以下のような手順でFATファイルシステムでフォーマットされたqcow2形式のディスクファイルを作成できます。

sudo dnf install guestfs-tools
virt-make-fs -t fat -F qcow2 --label OEMDRV tmp/ ks_centos_stream9.qcow2

しかしqcow2でKickstartイメージファイルを作成すると、紐づくVMを削除するときに巻き添えでKickstartイメージファイルも誤って削除するリスクが上がります。
したがって、冒頭のとおりKickstartイメージファイルをqcow2で作成することは推奨しません。

具体的なメカニズムを以下に補足します。

  • qcow2ディスクファイルは、デフォルトで読み書き可能ディスクとして/dev/vdXにマウントされる
    • (一方で、ISOファイルはデフォルトで読み取り専用かつ/dev/sdXにマウントされる)
  • CockpitでVMを削除するとき、読み取り専用ではないディスクはデフォルトで削除対象のチェックボックスにチェックが入る
  • virsh undefine --storage vdaを指定したとき、Kickstartイメージファイルが読み書き可能ディスクだった場合一緒に削除されてしまう
  • Cockpitやvirshによる誤削除を防止するには、qcow2形式のKickstartイメージファイル追加時に、明示的に読み取り専用オプションを指定する必要がある
    • Cockpit画面では、VMの詳細画面で追加済みのディスクをEditすることで読み取り専用に変更できる
    • virt-installVMを作成する際は、--disks path=xxx,readonly=onのように読み取り専用オプションを追加できる

ISO形式でKickstartイメージファイルを作成すれば、上記一連の面倒な仕様すべてから開放されます。

上述の理由から、KickstartイメージファイルはISOイメージファイルで作成すべきです。

参考URL

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

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のトリガーが自動化されたことで更に便利になりました。
しかし、mkisofsコマンドが使えるLinux環境にアクセスできない場合はKickstart用ディスクの作成・変更が少々面倒かもしれません。

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

関連記事