OpenRCなGentoo Linuxをsystemd化する

概要

今回は、initシステムとしてOpenRCを選択したGentoo Linuxを、systemdに移行します。

これまで何度かGentooInstallBattleしてきましたが、LVMを使用した環境でsystemdを導入しようとすると、なぜかカーネルパニックが発生してしまうので、仕方なくOpenRCを選択していました。

しかし最近になってようやく解決できたので、個人的につまずいたところを交えながら、systemd化する作業の流れをまとめていきます。

作業の流れは基本的にSystemd – Gentoo Wikiを参考にしています。

環境

カーネルの再構築

Systemdに移行するためにはまず、カーネルオプションでsystemdサポートを有効化し、ビルドし直す必要があります。

それではカーネルのソースディレクトリに移動して、make menuconfigでカーネルオプションの設定を行います。

# cd /usr/src/linux
# make menuconfig

カーネルの最近のバージョンでは、以下のsystemdオプションを有効化するだけで、必須のオプションや推奨のオプションをまとめて設定してくれます。

Gentoo Linux --->
  Support for init systems, system and service managers --->
     [*] systemd

systemdオプションのヘルプに詳細が載っています。

カーネルをコンパイルする前に、/bootディレクトリがマウントされていることを確認します。されていなかった場合、以下のようにマウントしておきます。

# mount /boot

実はここが以前やらかしたところで、/bootディレクトリにnoautoマウントオプションを指定していたことを忘れ、起動時にすでに/bootディレクトリがマウントされていると信じ込んでいました。

そのおかげで新たに再構築したカーネルがインストールされない、ブートローダの設定ファイルの変更が反映されない等の問題がおきたのです。これに気づかないままあれこれしても、何も変わらないわけです。

/bootディレクトリがマウントされていることを確認できたら、カーネルをビルドします。

# make
# make modules_install
# make install

lvmetadの有効化

Gentoo Wikiによると、LVMを使用している環境では、LVMボリュームをマウントするために、システム起動時にsystemdとlvmetadというデーモンが同時に起動されないといけないようです。

以下の設定ファイルで、use_lvmetadを1にして有効化します。

# vi /etc/lvm/lvm.conf 
use_lvmetad = 1

ちなみにsystemdに移行完了後、試しに無効化にしてみましたが、無事に動作しました。なのでこの設定は特に必須ではないのかなと思います。

そこでlvmetadは何者か気になったので調べてみました。

lvmetad(8) – Linux man page

3.5. メタデータデーモン (lvmetad) Red Hat Enterprise Linux 7

これらの情報に基づくと、lvmetadとは、LVM管理コマンドのパフォーマンスをあげるなどの役割を持ったデーモンであることが分かります。

具体的には、LVMコマンドが実行される際、ディスク内で使用されている、物理ボリュームやボリュームグループ等のメタデータを得るため、ディスク内をスキャンする仕組みになっています。そのスキャンがシステムにとって負荷になるようで、lvmetadがそのメタデータをキャッシュして、負荷を下げるようです。

つまるところ、Gentoo Wikiが言いたかったのは、lvmetadが無効でもシステムの起動に影響はないが、LVMのパフォーマンスが上がるから有効にしてくださいってことでしょうか。

プロファイルの変更

カーネルの再構築完了後は、システム全体で使用されているパッケージの中で、systemdサポートを新たに組み込む必要のあるパッケージを再ビルドします。

手順としては、systemd USEフラグをシステム全体に適用して更新する方法と、プロファイルを変更して更新する方法の二通りあります。今回は、プロファイルを変更する方法を採用します。

プロファイルとは、Portage開発者たちによって、USEフラグ等の重要な変数の初期値や、パッケージのバージョンの範囲を決めてくれたものです。systemd用のプロファイルを選択するだけで、systemd環境構築に最適な設定が自動的に行われます。

eselectコマンドを使用して、systemd用のプロファイルに切り替えます。

# eselect profile list     #現在のプロファイル確認&sytemdプロファイルの番号を確認。
# eselect profile set 15      #変更
# eselect profile list      #確認
-------(省略)---------
 [15]  default/linux/amd64/17.1/systemd (stable) *

このプロファイルの設定に基づき、システム内を更新するには以下のコマンドを実行します。

# emerge -avDN @world

ブートローダの設定

GRUB2の設定ファイルを編集して、カーネルに渡す起動オプションの設定をします。

まずは/etc/default/grub内のGRUB_CMDLINE_LINUXパラメータにinit=/usr/lib/systemd/systemdを追加します。

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="dolvm init=/usr/lib/systemd/systemd"

GRUB_CMDLINE_LINUXパラメータは、カーネルへ渡す起動オプションを指定、initパラメータはinitの代わりに実行するコマンドを指定します。

dolvmパラメータは、lvmサポートを有効にしたinitramfsを使用する際に設定します。

LVM – Gentoo Wiki – Gentoo Linux

自分の環境では、LVMを使用しているため、/usrディレクトリ等は論理ボリューム上に存在します。カーネルはそのことを知らないと、LVMを使用せずに/usrディレクトリを探してマウントしようとします。当然LVMを使用しなければ、論理ボリューム上に存在する/usrディレクトリをマウントすることすらできないので、/usr/lib/systemd/systemdを見つけられず、カーネルパニックを引き起こします。

そうならないように、dolvmパラメータを指定します。カーネルがLVMを使用して/usrディレクトリをマウントし、/usr/lib/systemd/systemdを見つけられるようにしてあげるわけです。

このdolvmパラメータを設定しなかったことが、以前systemdへの移行がうまくいかなかった原因でした。

編集が終わったら、grub-mkconfigで設定ファイルを作成して完了です。

# grub-mkconfig -o /boot/grub/grub.cfg

それでは再起動して、無事に起動することを確認します。

# reboot

ホスト名の変更

systemdとして起動したことで、様々なツールが使用可能になっているはずです。ホスト名を変更するツールとして、hostnamectlコマンドが利用できます。

移行したことでホスト名が初期設定のlocalhostに戻ってしまったので、さっそく変更します。

# hostnamectl set-hostname zukenux

ネットワークの設定(無線)

WiFiでネットワークと接続したいため、wpa_supplicantというツールを使用します。

Wpa supplicant – Gentoo Wiki

まず、以下のようにインターフェースごとのwpa_supplicantの設定ファイルを作成します。

# vi /etc/wpa_supplicant/wpa_supplicant-wlp11s0.conf
network={
        ssid="YourSSID"
        psk="your-secret-key"
}

自動でネットワークの様々な設定をしてくれるdhcpcdも含め、今すぐ起動&自動起動の設定を行います。

# systemctl enable --now wpa_supplicant@wlp11s0
# systemctl enable --now dhcpcd

pingで外部のネットワークと通信できることを確認します。

# ping -c 4 google.com

sshdの有効化

わりとssh接続でGentoo pcに入っていじる時が多いので、sshdを今すぐ起動&自動起動の設定をしておきます。

# systemctl enable --now sshd

最後に

今回は、OpenRCなGentoo Linuxをsystemd化しました。

systemd化した理由は、特にOpenRCが嫌だったというわけではなく、以前systemdでのインストールがうまくいかなかったことが悔しく、再挑戦したかったからです。

当時systemd化に失敗した原因は、Linuxのブートシーケンスへの理解が浅かったという点と(特にinitramfsの役割)、/bootのマウントを忘れるという点があったからだと思います。

今回のことがきっかけで、Linuxのブートシーケンスに興味が湧いてきたので、次回以降図解してまとめていきます。

Comments

Copied title and URL