RHEL(RedHat Enterprise Linux) を使っている人は珍しくないと思いますが、RHCOS(RedHat CoreOS、以下 "RHCOS") は名前を聞いたことはあっても使っている人はあまり多くないのではないかと思っています。 そんな RedHat CoreOS 4.15.0 を手元の VirtualBox 仮想環境にインストールし、かつ使いやすいように少しカスタマイズしてみました。その手順を紹介します(VirtualBox に依存した部分はないつもりなので、他の仮想環境や物理環境でも同様に実施できると思っています)。


【RHCOS とは?】
RedHat が提供する Linux カーネルを中心とした軽量な Linux 環境であり、自動化やリモートアップデートの機能があります。現在は RedHat OCP(OpenShift Container Platform) のコンポーネントとしてのみサポートされています。
2024050400



【RHCOS のインストールに必要なもの】
他の Linux にない、CoreOS の特徴の1つでもあるのが「インストーラーがない」です。インストーラーはコア機能の一部ではない(言われてみればまあその通りかも・・)ということなんでしょうかね。 他の Linux の多くはインストール DVD(ISO) が用意されていて、その DVD で起動するとインストーラーが立ち上がって・・・という方法でインストールするものばかりですが、CoreOS ではこの方法は提供されていません。つまりインストーラー無しでインストールする必要があります。

ただこの辺りが全く考慮されていないわけでもありません。インストール用の ISO はダウンロード可能な形で提供されています。ただインストール時に指定する必要のあるホスト名やユーザー名、そのユーザーの公開鍵情報を入力する UI は用意されていません。ではこれらの情報をどのように指定するかというと「HTTP でアクセス可能な外部ファイル(Ignition ファイルといいます)として用意し、インストール時にその URL を指定して取得する」ことになります。したがってインストール時にはインストール先となるサーバー以外に HTTP サーバーが必要になります。

更にはこの「HTTP でアクセス可能な外部ファイル」も用意する必要があるのですが、その作業自体は同 HTTP サーバー上で実行できます。したがって「インストール前の準備作業を行い、インストール時の HTTP サーバーとして稼働するサーバーが同一ネットワーク上に1台必要」ということになります。

今回、このサーバーを CentOS 7(Minimal) で用意しました。他のディストリビューションでも同様に可能だと思いますが、適宜読み替えてください。


【HTTP サーバーと Ignition ファイルの準備】
まず HTTP サーバーとなる CentOS に root 権限でログインし、後述の作業を実行する上で必要になるツールをあらかじめインストールしておきます(HTTP サーバーとして Apache HTTPD を使う前提で以下を説明しています):
# yum install -y httpd wget

この後外部からこの HTTP サーバーへのアクセスがあるので、ファイアウォールを無効にするか、80 番ポートを解放します(以下では CentOS7 のファイアウォールを無効にしています):
# systemctl stop firewalld



また Ignition ファイルは JSON 形式なのですが、編集時には YAML で編集します。編集後に YAML -> JSON の変換を行うのですが、Ignition ファイルとしての変換を実行してくれる butane(以前の名称は fcct)というツールもインストールしておきます:
# cd
# wget https://github.com/coreos/butane/releases/download/v0.20.0/butane-x86_64-unknown-linux-gnu
# mv butane-x86_64-unknown-linux-gnu butane
# chmod +x butane

また RHCOS は、インストール直後はコンソールからのログインができず、外部サーバーからの SSH 接続のみが可能です。その際に利用する鍵ファイルを用意します(既にある鍵ペアを使うことも可能ですが、ここでは新規に作成する前提で紹介します):
# ssh-keygen

"ssh-keygen" というコマンドを入力すると色々パラメータの入力を求められますが、全てそのまま Enter でも構いません(その場合は秘密鍵が ~/.ssh/id_rsa に、公開鍵が ~/.ssh/id_rsa.pub にそれぞれ作成されます):
2024050401


鍵ペアが用意できたら Ignition ファイルを作ります。まずは ignition.yaml というファイル名で以下のような YAML フォーマットのテキストファイルを作ります(赤字はコメントなので、実際には不要です):
variant: fcos
version: 1.0.0
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: rhcos (ホスト名)
passwd:
  users:
    - name: core (ログインユーザー名)
      groups:
        - sudo (sudo 権限を与える)
      ssh_authorized_keys:
        - ssh-rsa XXXXXXXXXXXXX(公開鍵ファイル ~/.ssh/id_rsa.pub の内容)XXXXXXXXXXXXXXXX...

RHCOS の特徴でもあるのですが、この Ignition ファイルの中で /etc/hostname の内容を直接書き込む形でホスト名を指定します。またログインユーザー名やその権限(所属グループ)もこの Ignition ファイルの中で指定します。 ssh_authorized_keys の値は(先ほど作成した)鍵ペアの公開鍵ファイルの中身をそのまま1行で記載します。

ignition.yaml ファイルが完成するとこんな↓感じになります:
2024050402


そして butane を使ってこの ignition.yaml ファイルを JSON 形式に変更します:
# ./butane ignition.yaml --pretty --output ignition.json

2024050404


できあがった ignition.json は以下のような内容でした:
2024050405


この ignition.json を HTTP アクセス可能なファイルとしてコピーします:
# cp ignition.json /var/www/html/
# systemctl restart httpd

これで Ignition ファイルは "http://(このサーバーの IP アドレス)/ignition.json" という URL で外部からアクセスできるようになり、RHCOS のインストール時に指定可能なファイルとしての準備が整いました。

なおこのサーバーの IP アドレスは "ip a" というコマンドで調べることができます(下図の例だと "192.168.0.102" であることがわかります):
2024050412


【RHCOS のインストール】
RHCOS をインストールするための ISO ファイルを取得します。RedHat Developer Subscription に(個人または企業アカウントで)登録した上で、RedHat CoreOS のダウンロードサイトから最新版の ISO ファイルをダウンロードします(2024-05-04 時点では 4.15.0 というバージョンが最新で、ファイル名は rhcos-4.15.0-x86_64-live.x86_64.iso でした)。物理サーバーにインストールする場合は DVD などブート可能なメディアに変換しておきます:
2024050406


RHCOS をインストールしたいサーバーにダウンロードした ISO(または DVD)をセットします(図は VirtualBox で ISO を DVD にセットした時の様子):
2024050407


そしてサーバーの電源を ON にします。ISO(DVD) から起動します:
2024050409


起動すると以下のような一般ユーザー(core)のプロンプトが表示される画面になります。これは ISO の Live 環境が起動している状態です:
2024050410


ここでプロンプトに以下のように入力します。"/dev/sda" はインストール先ディスクのデバイス名です(US キーボードレイアウトになっているので注意):
$ sudo coreos-installer install /dev/sda --ignition-url (ignition.json のURL) --insecure-ignition
※最後の "--insecure-ignition" は ignition.json の URL が https ではなく http の場合に必要です。

2024050413


Ignition ファイルへのアクセスができていればインストールが開始されます:
2024050414


インストールはすぐに完了してプロンプトに戻ります:
2024050415


"sudo shutdown -h now" でシャットダウンし、ISO(DVD) を取り除いてから再度起動します:

すると今度はこのような画面で起動します。これは Live DVD で起動した画面ではなく、ディスクにインストールされた RHCOS が起動していることを意味しています(画面内に IP アドレスが表示されていることも確認してください)。RHCOS のインストール自体はこれで完了です:
2024050416


ただし、この時点ではこの画面からログインすることはできません。Ignition ファイル内で作成するユーザー名は指定(上の例では "core")していましたが、パスワードは指定していません。この作成方法だと RHCOS にログインするには鍵ファイルを持つ他のサーバーから SSH 経由でのみログインできます。

試しに CentOS サーバーからログインしてみます。ユーザー名(core)と IP アドレスを指定して ssh でログインしてみます:
# ssh core@(RHCOS の IP アドレス)

2024050417


上図のようになると RHCOS に SSH で接続できています。core ユーザーには sudo 権限があるので、事実上の管理者権限を持って作業することはできます。シャットダウンもこの状態からであれば行うことができます。


というわけで、一応 RHCOS のインストールは完了し、SSH ログインによって OS を操作することも可能になりました。慣れていないと不思議に感じるかもしれませんが、一般的な RHCOS は(あくまでコンテナクラスタの OS としてしか使わないので)このように使います。

ただコンソールからログインできない(秘密鍵を持つサーバーからの SSH でないとログインできない)のはちょっと不便なので、最後にコンソールログインもできるように設定を変更します。


【RHCOS インストール後の設定変更】
RHCOS に直接ログインできるようにするにはパスワードを設定してあげるだけです。上の続きで SSH ログイン後に以下のコマンドを実行してパスワードを設定します:
$ sudo -i
# passwd core

パスワード設定後に exit して SSH 接続も切断します。ここまでの手順が成功していれば、CentOS 環境はもう不要なのでシャットダウンしてしまっても構いません。

最後に RHCOS のコンソールからパスワードでログインできるようになったことを確認します:
2024050418


これで CentOS に依存しない、単体で動作可能な RHCOS 環境ができあがりました。


まあ「どんな時に単体の RHCOS が必要か?」と聞かれると、(あまりオススメしませんが)アンチウィルスソフトの動作確認をしたいとか、コンテナに特殊なストレージデバイスを接続して使うような場合の手順や動作の確認時とか、かなり偏った用途くらいしか思いつかないのですが、レアな環境を手に入れることに興味を持つエンジニアにはウケるんじゃないかと思っています。