Fedora CoreOSを自宅サーバにインストールする

OptiPlex 7010 USFFをひょんなことで入手したので、Fedora CoreOSをインストールしてみた。基本的にはGetting Startedの通りにやればいい…のがよかったけど、そうもいかなったので手順を記したいと思う。

ディスクイメージを入手する

ストリームがStable、Testing、Nextで選べるようだけどとりあえずStableのBare Metal用ISOをダウンロード。ブータブルUSBメモリはPopsicleで作成。

Ignitionファイルを用意する

Getting Startedだと以降の手順はAmazon EC2インスタンスにインストールする例が紹介されており、別のドキュメントを参照する必要があった。

サイトを見回してProvisioning MachinesのうちのInstalling on Bare Metalを発見。前提条件としてIgnitionファイルをHTTPサーバなどでホストしてね、と書いてあるけど面倒くさい、それ以外の方法ないの…?と思った。Ignitionファイルはcoreos-installerというCLIで指定するようなので、コマンドの使い方をみると、 --ignition-file オプションでローカルからIgnitionファイルを参照することも可能と分かった。

それでIngitionファイルとはなんぞやというと、初回セットアップに使う設定ファイルとして以下の手順で用意するらしい。

  1. YAMLフォーマットでButaneコンフィグ(.bu 拡張子のファイル)を書く
  2. ButaneでJSONフォーマットのIgnitionコンフィグ(.ign 拡張子のファイル)に変換する

Ignitionファイルが用意できたら、Live ISOを起動して coreos-installer installsudo reboot するだけ。なので、Butaneファイルにどんな設定を書くかが一番重要。

初期状態だとcoreアカウントは作成されるけどパスワードもSSHの認証も設定されないので、最低限その辺の設定が必要。

私がやりたかったのは

で、以下のドキュメントとディスカッションが参考になった。

試行錯誤した結果、以下のように config.bu をつくった。

variant: fcos
version: 1.4.0
passwd:
  users:
    - name: <ユーザ名>
      ssh_authorized_keys:
        - <SSH接続で使用する公開鍵>
      password_hash: <podman run -it --rm quay.io/coreos/mkpasswd --method=yescryptして得られるハッシュ>
      groups:
        - docker
        - wheel
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: |
                    fedora-coreos
    - path: /etc/NetworkManager/conf.d/enable-mdns.conf
      mode: 0644
      contents:
        inline: |
          [connection]
          connection.mdns=2          
    - path: /etc/systemd/resolved.conf
      mode: 0644
      append:
        - inline: |
                        MulticastDNS=yes

次はButanファイルをIgnitionファイルにする。コンテナーでBlutanを動作させて変換した。(自分はFedora Silverblueを使っていてpodmanが入っているのでpodmanを使っているけど、dockerでもできるはず)

podman run -i --rm quay.io/coreos/butane:release --pretty --strict < config.bu > config.ign

インストールする

できたIgnitionファイルをブータブルUSBメモリとは別のUSBメモリにコピー。ブータブルUSBメモリとIgnitionファイルをコピーしたUSBメモリをOptiPlex 7010 USFFに挿して起動。

fdisk で中身をみて、以下のようにディスクが割り当てられていることを確認。

以下のコマンドを実行。

sudo mkdir /var/usb
sudo mount /dev/sdc1 /var/usb
sudo coreos-installer install /dev/sda --ignition-file /var/usb/config.ign

インストールはほぼほぼ2~3GBをddしたみたいな時間で終わった。終わったら sudo reboot して素早くUSBメモリを抜く。

しばらくしたら ssh -i <秘密鍵> <ユーザ名>@fedora-coreos.local でSSH接続可能になった。

感想(とオチ)

設定をIgnitionファイルとして用意すれば、インストール後のセットアップが不要になるのはとても便利だと思った。また、自動でOSアップデートしてくれるらしいので立ち上げっぱなしにしたら放置でいいのも便利だと思った。

一方でIgnitionファイルはあくまで初回セットアップにのみ使うので、インストール後に設定を変更したい場合は他のLinuxディストリビューションと同じように /etc 下にファイルを追加したり編集する必要がある。NixOSだと設定変更時も同じ /etc/nixos/configuration.nix を弄って nix-rebuild switch すればいいから、そこは好みが分かれると思った。

インストールできたのはいいけど、OptiPlex 7010 USFFをどこにおくかもどんなふうにEthernetケーブルを引くかも決まっていないので、悩ましいなと思った。