Fedora CoreOS用のButane初期設定ファイル覚書

先日、Raspberry Pi 4でFedora CoreOSを起動してみました。

Raspberry Pi 4でFedora CoreOSを起動してみました
Raspberry Pi 4でFedora CoreOSを起動してみました。 まあ、今は起動しただけですが。 ざっくり偵察編です...

CoreOSはMobyエンジンを搭載しており、DockerとPodmanのどちらも使用する事ができます。

ベアメタルとしてコンテナを動かして使うこともできますし、クラスタを構築してノード(PC)を複数追加して、その中でコンテナを動かすこともできそうです。

その準備としまして。CoreOSの初期設定ファイル、butaneファイルを作っておこうと思います。

※23.6.17追記:下記の内容を追記しました。

  1. syctlによるIPv4フォワーディング有効化(Ansibleで必要)
  2. pythonの自動インストール(Ansibleで必要)
  3. ssh-keygenによるssh認証
  4. トランスパイル

※23.6.24追記:IgnitionにてGPTパーティションを作成できることを確認できました。

  1. ルートパーティションの容量変更

※23.7.6追記: Kubesprayでkubernetesクラスタを構築する際に、calicoを使用するための設定を追加しました。

  1. sysctlによるrp_filter有効化(calicoで必要)

※23.7.13追記: ファイルディスクリプタの制限を解除するスクリプトを追加しました。


CoreOS用Butane初期設定ファイル覚書

Butaneの仕様はこちらになります。

Fedora CoreOSのほか、Flatcar、OpenShift、RHEL for Edgeの設定を作成する事が可能です。OSの指定は、yamlファイルのvariant項目で設定するようです。(Fedora CoreOSの場合variant: fcos

というわけで、この記事の記載した設定ファイルはFedora CoreOS用になります。

設定マージ用

CoreOSを構築するとき、設定ファイルであるIgnitionファイルを1つだけ指定します。

とはいえ、設定ファイルは最初から1つに混ぜ込んで作らずに、複数のbutaneファイルに分けておいたほうが、管理はしやすいように思えます。

どこかのタイミング、Butaneのyamlファイルか、トランスパイルしたIgnitionのjsonファイルか、どこかでマージするか、親子関係を作る必要があります。

適切なタイミングがどこか?まだ答えがでておらず、githubのissueもOpenの状態のようです。

この記事では、Butaneのmerge機能を使うとどうなるか、実験しようかなと思います。(まだ試していない

※23.6.11実際に試しました。個々のbuファイルを予めignにトランスパイルしておいて、mergeの中でignファイルを指定すれば、正しく動きます。

cat << EOF | tee config.bu
variant: fcos
version: 1.5.0
ignition:
  config:
    merge:
      - local: users.ign
      - local: storage.ign
      - local: network.ign
      - local: hostname.ign
      - local: timezone.ign
      - local: keyboard.ign
      - local: swaponzram.ign
      - local: enable-passwords.ign
      - local: sysctl.ign
      - local: reverse-path-filter.ign
      - local: rpm-ostree-python.ign
      - local: LimitNOFILE.ign
#      - local: container.ign
EOF

では、これらの細かいbutaneファイルの覚書を記録しておこうと思います。


ユーザ設定 users.bu

cat << EOF | tee users.bu
variant: fcos
version: 1.5.0
passwd:
  users:
    - name: core
      password_hash: <生成したパスワードのhash>
      ssh_authorized_keys:
        - ssh-ed25519 <ed25519キー>
EOF

CoreOSでは、一般的なrootユーザではなく、coreユーザが管理ユーザとなるようです。

ssh-rsaキーが一般的なのでしょうか。パスワードでログインしたい場合は、次のコマンドでパスワードのハッシュを生成し、butaneファイルを作っておきます。

podman run -ti --rm quay.io/coreos/mkpasswd --method=yescrypt

podman版が動かない場合

sudo dnf install -y mkpasswd

※23.6.17追記: rsaキーではなく、より信頼性の高いed25519キーの作成はこちら

ssh-keygen -t ed25519 -C ""

お勧めの方法は、パスワードのハッシュを作成し、password_hashの行を作成。

もしコントール用のマシンがあれば、そちらでed25519キーを作成し、ssh_authorized_keys行も追加しておく方法がお勧めです。

後述のenable-passwords.buを有効にすれば、パスワードでもSSHログインできるようになります。(セキュリティに配慮して使用してください

Ansibleを使用する場合は、sshキーは必須です。コントロールノード(指令を出すマシン)を決めて、そちらでsshキーを生成、パブリックキーをusers.buに入れておきましょう。


ネットワーク設定 network.bu

静的IPアドレスを設定したい場合、次のようなbutaneファイルになります。

address1等、xxxの部分を適宜変更しておいてください。

cat << EOF | tee network.bu
variant: fcos
version: 1.5.0
storage:
  files:
    - path: /etc/NetworkManager/system-connections/end0.nmconnection
      mode: 0600
      contents:
        inline: |
          [connection]
          id=end0
          type=ethernet
          interface-name=end0
          [ipv4]
          address1=192.168.xxx.15/24,192.168.xxx.1
          dns=192.168.xxx.1;
          dns-search=
          may-fail=false
          method=manual
EOF

path項目のネットワーク設定ファイルのパスや、id項目のネットワークデバイス名end0等は、いちどCoreOSを起動・ログインして、確認しておくのも良いかもしれません。

※23.6.11追記:記事は最初デバイス名をeth0で作成しましたが、Raspberry Pi 4のEthernetデバイスは正しく設定されなかったため、end0に変更しました。Fedora CoreOS 38.20230514.3.0にて確認しました。

address1項目はIPアドレス/サブネットマスクとゲートウェイアドレスになります。


ホスト名設定 hostname.bu

cat << EOF | tee hostname.bu
variant: fcos
version: 1.5.0
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: pi4cos1
EOF

このサンプルでは「pi4cos1」というホスト名を設定しています。


タイムゾーン設定 timezone.bu

cat << EOF | tee timezone.bu
variant: fcos
version: 1.5.0
storage:
  links:
    - path: /etc/localtime
      target: ../usr/share/zoneinfo/Asia/Tokyo
EOF
こちらは国内で使う場合は必須の感じでしょうか。

キーボード設定 keyboard.bu

cat << EOF | tee keyboard.bu
variant: fcos
version: 1.5.0
storage:
  files:
    - path: /etc/vconsole.conf
      mode: 0644
      contents:
        inline: KEYMAP=jp106
EOF

日本語キーボードを接続する場合、こちらも必須かと思います。


zarmにswapを作成 swaponzram.bu

cat << EOF | tee swaponzram.bu
variant: fcos
version: 1.5.0
storage:
  files:
    - path: /etc/systemd/zram-generator.conf
      mode: 0644
      contents:
        inline: |
          # This config file enables a /dev/zram0 device with the default settings
          [zram0]
EOF

swapをzramに作る設定になります。こちらは必要な場合のみ、使用する感じでしょうか。

クラスタを構築する場合は、swapはつくらない場合が多いと思います。


パスワードでSSHログイン enable-passwords.bu

cat << EOF | tee enable-passwords.bu
variant: fcos
version: 1.5.0
storage:
  files:
    - path: /etc/ssh/sshd_config.d/20-enable-passwords.conf
      mode: 0644
      contents:
        inline: |
          # Fedora CoreOS disables SSH password login by default.
          # Enable it.
          # This file must sort before 40-disable-passwords.conf.
          PasswordAuthentication yes
EOF

コメントに記載があるように、Fedora CoreOSは、既定ではパスワードではSSHログインできないそうです。こちらの設定を使用すると、パスワード認証が有効になります。


IPv4フォワーディング有効 sysctl.bu

※23.6.17追記

こちらはAnsibleのマネージドノード(命令を受ける側)で必要になります。

cat << EOF | tee sysctl.bu
variant: fcos
version: 1.5.0
storage:
  files:
    - path: /etc/sysctl.d/90-sysrq.conf
      contents:
        inline: |
          net.ipv4.ip_forward=1
EOF

rp_filter有効 reverse-path-filter.bu

※23.7.6追記: こちらはKubernetesでcalicoを使用する場合に必要になります。

cat << EOF | tee reverse-path-filter.bu
variant: fcos
version: 1.5.0
storage:
  files:
      - path: /etc/sysctl.d/reverse-path-filter.conf
        contents:
          inline: |
            net.ipv4.conf.all.rp_filter=1
EOF

詳細はこちらになります。


python自動インストール rpm-ostree-python.bu

※23.6.17追記

実際に自動でpythonがインストールされることを確認しました。

※23.7.1追記

pip,libselinux-python3もインストールするように変更しました。

※23.7.18追記

kubesprayでhelmをインストールする場合、python3-pyyamlが必要なようです。

cat << EOF|tee rpm-ostree-python.bu
variant: fcos
version: 1.5.0
systemd:
  units:
    # installing python as a layered package with rpm-ostree
    - name: layer-python.service
      enabled: true
      contents: |
        [Unit]
        Description=Layer python as with rpm-ostree
        After=systemd-machine-id-commit.service

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/bash -c "/usr/bin/rpm-ostree install --reboot python pip libselinux-python3 python3-pyyaml"

        [Install]
        WantedBy=multi-user.target
EOF

ログイン可能になった後、しばらく経つと自動で再起動されて、rpm-ostreeにてインストールしたパッケージが使用可能になりました。


パーティション設定 storage.bu

※23.6.24追記:正しくパーティション構成されることを確認できました。

cat << EOF | tee storage.bu
variant: fcos
version: 1.5.0
storage:
  disks:
  - device: /dev/disk/by-id/coreos-boot-disk
    wipe_table: false
    partitions:
    - label: root
      number: 4
      size_mib: 65535
      resize: true
    - label: ceph
      size_mib: 0
  filesystems:
    - device: /dev/disk/by-partlabel/root
      wipe_filesystem: true
      format: xfs
      label: root
    - device: /dev/disk/by-partlabel/ceph
      wipe_filesystem: true
      format: xfs
      label: ceph
EOF


ファイルディスクリプタの制限解除 LimitNOFILE.bu

※23.7.13追記

CoreOSで開けるファイルの数の制限をなくす内容ですが。

まだ実際に動作試験をしていません。動かない可能性もありますのでご注意を。

cat << EOF | tee LimitNOFILE.bu
variant: fcos 
version: 1.5.0
storage: 
  files:
   - path: /etc/systemd/system/containerd.service.d/override.conf
     contents: 
       inline: |
         [Service]
         LimitNOFILE=1048576
 EOF

コンテナ実行設定 container.bu

最後がこちら。(ない

systemdのサービスを作成する設定になるかと思いますが、実行したいサービスにより内容が異なります。

基本的には、dockerやpodmanでコンテナを実行する感じでしょうか。

サーバとしてサービスを動かしたい場合は、該当するイメージでコンテナを起動したり。クラスタを作る場合はkubernetesコントローラのコンテナを実行したり。

また必要に応じてetcd等のサービスを起動可能のようです。

まあ、まだどのコンテナを動かそうか決めておりませんため。

以上の設定で起動して、coreユーザでログインしてみて考えたいと思います。


butaneファイルからignitionファイル作成

※23.6.17追記

butaneコマンドのエイリアスを作っておきます。

#エイリアスを作っておきます
alias butane='podman run --rm --interactive \
 --security-opt label=disable \
 --volume ${PWD}:/pwd --workdir /pwd \
 quay.io/coreos/butane:release'

実際のトランスパイルのコマンドはこちらになります。

butane --pretty --strict users.bu > users.ign
butane --pretty --strict network.bu > network.ign
butane --pretty --strict hostname.bu > hostname.ign
butane --pretty --strict timezone.bu > timezone.ign
butane --pretty --strict keyboard.bu > keyboard.ign
butane --pretty --strict swaponzram.bu > swaponzram.ign
butane --pretty --strict enable-passwords.bu > enable-passwords.ign
butane --pretty --strict sysctl.bu > sysctl.ign
butane --pretty --strict reverse-path-filter.bu > reverse-path-filter.ign
butane --pretty --strict rpm-ostree-python.bu > rpm-ostree-python.ign
# butane --pretty --strict container.bu > container.ign

local:を使用する場合、トランスパイル時に-dオプションが必要のようです。config.buのトランスパイルのみ、下記のコマンドになります。

butane --pretty --strict -d . config.bu > config.ign

作成したconfig.ignを見ると、各ignファイルが圧縮されて埋め込まれているようです。

Fedora CoreOSのブートメディア作成時、config.ignファイルを使用します。


とりあえずCoreOSを起動して様子を見たい、という場合は、ユーザ設定のusers.buファイルのみ使用して、Ignitionファイルを作れば、coreユーザでログイン可能になりますのでお勧めです。

具体的な手順は、次回の記事にて。それではごきげんよう!

※23.6.11具体的な手順の記事はこちらです。

Raspberry Pi 4向けFedora CoreOS起動メディアの作成手順覚書
先日、microSDカードにFedora 38 Serverをインストールしました。 こちらの環境を使用して。Raspberr...

スポンサーリンク

フォローする

スポンサーリンク