RHEL9.xをVagrant + VirtualBoxでデプロイ

## 【RHEL9.x対応】Packerで自作するVagrant VirtualBoxイメージ

### はじめに

Red Hat社のライセンスポリシー変更により、Vagrant Cloudで提供されていたRHELの公式・準公式Boxの更新が停止し、RHEL 9.4のような新しいバージョンのBoxが利用できなくなりました。

しかし、Red Hat Developer Programを利用すれば、開発用途のRHEL ISOイメージは引き続き無料で入手可能です。

そこで本記事では、このISOイメージと**Packer**を使い、**サブスクリプション未登録のクリーンな状態**のRHEL 9.4 Vagrant Box for VirtualBoxを自分自身でビルドする手順を詳しく解説します。

### 前提/検証条件

*   **ホストOS**: Fedora 41 (x86_64アーキテクチャ)
*   **仮想化ソフトウェア**: VirtualBox (7.1.6r167084)
*   **Boxビルドツール**: Packer (v1.13.0)
*   **仮想環境管理ツール**: Vagrant (2.4.6)
*   **入手済みファイル**: Red Hat DeveloperサイトからダウンロードしたRHEL 9.xのインストール用ISOイメージ (`rhel-9.4-x86_64-dvd.iso` など)
*   **利用させていただいたPacker定義のベース**: https://github.com/alvistack/vagrant-rhel/blob/master/packer/rhel-9-virtualbox/ におけるks.cfgおよびpacker.json

### 手順1: 必要なツールのインストール

ホストOSに必要なツールをインストールします。

1.  **VirtualBoxとVagrantのインストール**
    ```bash
    sudo dnf install -y VirtualBox vagrant
    ```

2.  **Packerのインストール**
    ```bash
    sudo dnf install -y dnf-plugins-core
    sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo
    sudo dnf install -y packer
    ```

3.  **インストールの確認**
    ```bash
    vboxmanage --version
    vagrant --version
    packer --version
    ```

4.  **その他の必要なツールを事前にインストール**
    ```
    sudo dnf install -y libguestfs-tools qemu-img
    ```

### 手順2: RHEL ISOイメージの準備

1.  **ISOイメージのダウンロード**
    [Red Hat Developer Portal](https://developers.redhat.com/products/rhel/download)から、RHELのDVD ISOイメージをダウンロードします。

2.  **チェックサムの計算**
    ダウンロードしたISOファイルの整合性を確認するため、`cksum`コマンドでチェックサムを計算します。

    ```bash
    # 例: ダウンロードしたISOファイルが ~/Downloads にある場合
    $ cd ~/Downloads
    $ sha256sum ./rhel-9.4-x86_64-dvd.iso 
    398561d7b66f1a4bf23664f4aa8f2cfbb3641aa2f01a320068e86bd1fc0e9076  ./rhel-9.4-x86_64-dvd.iso
    ```
    実行結果の**チェックサム値**（398561d7b66f1a4bf23664f4aa8f2cfbb3641aa2f01a320068e86bd1fc0e9076）をメモしておきましょう。

### 手順3: Packer設定ファイルの準備と修正

Packerでのビルドに必要な設定ファイル（`packer.json`と`ks.cfg`）を準備し、カスタマイズします。

1.  **作業ディレクトリの作成とファイルのダウンロード**
    ```bash
    mkdir ~/rhel94-packer && cd ~/rhel94-packer
    wget https://raw.githubusercontent.com/alvistack/vagrant-rhel/master/packer/rhel-9-virtualbox/packer.json
    wget https://raw.githubusercontent.com/alvistack/vagrant-rhel/master/packer/rhel-9-virtualbox/ks.cfg
    ```
    もしくは
    ```bash
    git clone https://github.com/alvistack/vagrant-rhel.git
    cd ~/vagrant-rhel/packer/rhel-9-virtualbox
    ```
    

2.  **ks.cfgの編集: 日本語環境へのカスタマイズ**
    必要であれば、`ks.cfg`ファイル内で言語、キーボード、タイムゾーンの設定を日本語環境向けに変更できます。
    ```cfg:ks.cfg
    ...
    lang en_US.UTF-8                        # ->  lang ja_JP.UTF-8
    keyboard --vckeymap=us --xlayouts='us'  # ->  keyboard --vckeymap=jp106 --xlayouts=jp
    timezone America/New_York --isUtc       # -> timezone Asia/Tokyo --isUtc
    ```
3.  **ks.cfgの編集: ディスクパーティションのカスタマイズ**
    オリジナルでは役割ごとにサイズを指定してパーティションを割り振っている。
    ```
    clearpart --all --initlabel --disklabel=gpt
    part biosboot --size=1 --fstype=biosboot
    part /boot --size=8192 --fstype=ext4
    part swap --size=8192 --fstype=swap
    part / --grow --fstype=ext4
    ```
    例えば自動的に割り振らせるのであれば、以下の様に編集する。
    ```
    clearpart --all --initlabel --disklabel=gpt --drives=sda
    autopart --type=plain --nohome --fstype=ext4
    ```

4.  **`packer.json` の修正**
    `packer.json`を編集し、ISOパス、チェックサム、プロビジョナ、出力先を修正します。

    *   **`builders:` `headless:`** falseに変更した場合、packer実行時にvirtualboxのpopupが開き、途中経過を確認できる。
    *   **`builders:` `iso_url:`**: ローカルのISOファイルを指定。
    *   **`builders:` `iso_checksum:`**: 手順2で計算した値に書き換え。
    *   **`post-processors`**: `vagrantfile_template`の項を追加し、Vagrantfile.tplを指定
    *   **`provisioners:`**: サブスクリプション登録処理を無効化しRed Hatアカウントに紐付けないクリーンなBoxを作成するため、空 `[]` とします。ただし、その結果、VirtualBox Guest Additionsのビルドに必要な`dkms`等がインストールされなくなり、ディスクのシェアなどが利用できないことになります。(制約)

    以下は修正後の`packer.json`の例です。
    ```json
    {
      "builders": [
        {
          ....
          "headless": false,2.4.6
          ....
          "iso_checksum": "398561d7b66f1a4bf23664f4aa8f2cfbb3641aa2f01a320068e86bd1fc0e9076",
          "iso_url": "file:///home/user/Downloads/rhel-9.4-x86_64-dvd.iso",
      ....
      "post-processors": [
        ....
        {
          ....
          "type": "vagrant",
          "vagrantfile_template": "Vagrantfile.tpl"
        }
      ],
      "provisioners": []
    }
    ```
    **【修正のポイント】**
    *   `"iso_url"`と`"iso_checksum"`はご自身の環境に合わせてください。

5.  **`Vagrantfile.tpl` の用意**
    デフォルトの属性を定義するVagrantfileのテンプレートファイルとして./Vagrantfile.tplを用意し、synced_folderの無効化などを指定。
    ```
    Vagrant.configure("2") do |config|
      config.vm.box = "{{ .BoxName }}"
      config.vm.synced_folder ".", "/vagrant", disabled: true
      config.vm.provider "virtualbox" do |vb|
        vb.memory = 2048
        vb.cpus   = 2
        vb.customize ["modifyvm", :id, "--ioapic", "on"]
      end
    end
    ```
    もしくは、都度 `Vagrantfile` に `config.vm.synced_folder ".", "/vagrant", disabled: true` を追記する。

### 手順4: PackerによるBoxイメージのビルド

設定が完了したら、PackerでBoxイメージをビルドします。

1.  **Packerビルドの実行**
    `packer.json`があるディレクトリで、以下のコマンドを実行します。

    ```bash
    packer build packer.json
    ```
    PackerがVirtualBoxを起動し、Kickstartの設定に基づいてRHEL 9.4の自動インストールを開始します。

2.  **ビルド結果の確認**
    ビルドが成功すると、作業ディレクトリ内に`output-vagrant`というディレクトリが作成され、その中に`package.box`というファイルが生成されています。

### 手順5: ビルドしたBoxをVagrantで利用する

最後に、完成したBoxイメージをVagrantに追加し、仮想マシンを起動します。

1.  **VagrantにBoxを追加**
    生成された `package.box` ファイルを、Vagrantに `rhel94-custom` という名前で登録します。

    ```bash
    vagrant box add rhel94-custom ./output-vagrant/package.box
    ```

2.  **Vagrantfileの準備と修正**
    テスト用のVagrantプロジェクトディレクトリを作成し、`Vagrantfile`を初期化します。
    ```bash
    mkdir ~/vagrant-rhel94 && cd ~/vagrant-rhel94
    vagrant init rhel94-custom
    ```

3.  **仮想マシンの起動と確認**
    `vagrant up`で仮想マシンを起動します。

    ```bash
    vagrant up
    ```
    起動が完了したら、SSHで接続してOSのバージョンを確認しましょう。

    ```bash
    vagrant ssh
    [vagrant@localhost ~]$ cat /etc/redhat-release
    Red Hat Enterprise Linux release 9.4 (Plow)
    ```
    無事にRHEL 9.4が起動すれば成功です。

### まとめ

本記事では、Packerを用いてサブスクリプション未登録のクリーンなRHEL 9.4 Vagrant Boxを自作する方法を紹介しました。

この手順により、`dkms`やGuest Additionsを含まない最小限のBoxが作成され、Vagrant実行時に共有フォルダの無効化が必要になりますが、外部アカウントに依存しない、よりポータブルな開発環境の元イメージとして活用できます。

これをベースに、`Vagrantfile`のプロビジョニング機能を使って必要なパッケージを導入したり、`packer.json`の`provisioners`をカスタマイズして独自のツール入りBoxを作成したりと、様々な応用が可能です。ぜひお試しください。