OpenRC/Baselayout 1 から 2 への移行
このガイドでは baselayout-1 から OpenRCを使ったbaselayout-2 への移行について説明します。
背景
baselayout とは?
Baselayoutは、/etc/hostsなど、すべてのシステムが正しく機能するために必要なファイルの基本セットを提供します。これはGentooで使われている基本的なファイルシステムレイアウトを提供しています。(すなわち /etc, /var, /usr, /home)
OpenRC とは?
OpenRCは依存関係ベースのrc(run command)システムであり、システムから提供されるinit(通常は/sbin/init)と共に動作します。OpenRCは/sbin/initを置き換えるものではありません。Gentooで使用されるデフォルトのinitは sys-apps/sysvinit
です。一方、Gentoo/FreeBSDはsys-freebsd/freebsd-sbin
から提供されるFreeBSD initを採用しています。
なぜ移行するの?
元々Gentooのrcシステムはbaselayout 1の中で作成され、全てbashで記述されていましたが、このためにいくつかの制限が発生しました。例えば、一部のシステムコールはブート時に呼び出す必要がありますが、この部分はC言語で記述されました。また、これらの呼出し順序はそれぞれ静的に決まったため、rcシステムの実行時間増大の原因となりました。
さらに、GentooがGentoo/FreeBSDや組み込み向けGentoo等、他のプラットフォームに広がるにつれて、bashベースのrcシステムでは対応できなくなりました。このため、C言語で記述され、POSIX準拠のシェルのみを必要とするbaselayout 2の開発が始まりました。 baselayout 2の開発期間中、baselayoutは単に基本となるファイル群とGentoo向けのファイルシステム構成を提供すればよく、rcシステムはそれぞれのパッケージに分割されることが決定されました。 このような経緯でOpenRCは誕生したのです。
OpenRCは2010年までにRoy Marplesによって開発されました。そして現在はGentoo OpenRC Projectによってメンテナンスされています。OpenRCは現在ある全てのGentoo (つまりGentoo Linux、Gentoo/FreeBSD、組み込みGentoo、Gentoo Vserver)をサポートし、FreeBSDやNetBSD等の他のプラットフォームもサポートしています。
OpenRC への移行
OpenRCへの移行は本当に単純です。この移行はパッケージ管理による通常の更新の一部として実施されるでしょう。最も重要なステップは>=sys-apps/baselayout-2
とsys-apps/openrc がインストールされた直後です。システムをリブートする前に dispatch-conf もしくは類似のツールで、/etcにあるファイルをアップデートすることが最重要です。このアップデートに失敗した場合、システムは二度とブートしません。その場合、LiveCDを使用してシステムを修復しなければなりません。
設定ファイルをアップデートした際、リブートの前に確認しなければならないいくつかの点があります。
/etc/conf.d/rc
/etc/conf.d/rcは廃止されました。このファイルに記述されていた全ての設定は、/etc/rc.confに適切に移行しなければなりません。/etc/rc.confと/etc/conf.d/rcの差分を確認して設定を移行してください。設定変更後、/etc/conf.d/rcファイルを手動で消去してください。
カーネルモジュール
通常、いくつかのカーネルモジュールはブート時に自動的にロードされます。これらの設定はカーネルに渡すパラメータと共に/etc/modules.autoload.d/kernel-2.6に記述していました。baselayout 2ではこのファイルは使用されません。代わりに自動でロードされるモジュールとパラメータは、カーネルのバージョンに関わらず/etc/conf.d/modulesに記述されます。
旧来のスタイルでは以下のように記述されていました。
'"`UNIQ--pre-00000002-QINU`"'
上記を新しいスタイルで記述すると以下のようになります。
'"`UNIQ--pre-00000005-QINU`"'
最初の例では、モジュールとパラメータは2.6.x系のカーネルのみに適用されました。しかし、新しい設定スタイルではカーネルバージョンを元に、よりきめ細かくモジュールとパラメータをコントロールできます。
複数の module* 変数に記載された設定は累積されません。特定のバージョンに固有な設定は、そうでない一般的な設定を上書きします。
module_ と modules_ の違いに注意してください。
詳細な例は次のようになります。
'"`UNIQ--pre-00000008-QINU`"'
bootランレベル
boot
ランレベルは全ての機器にとって重要ないくつかのステップを実行します。例えば、ルートファイルシステムが読み書き可能な状態でマウントできることを保証します。またファイルシステムにエラーが無いこと、マウントポイントが存在することを確認し、ブート時に/proc疑似ファイルシステムを起動します。
OpenRCでは、ブロックストレージデバイスに対するボリューム管理サービスは、ブート時、自動的には起動されません。ここで対象になるのはLVM、RAID、swap、device-mapper (dm)、dm-crypt、およびその類似サービスです。システム管理者は、これらのサービスのinitscriptをboot
ランレベルに追加しなければなりません。そうでない場合、そのシステムは二度と起動しないでしょう。
一方、OpenRCのebuildはこの移行を自ら試みます。管理者はボリューム管理サービスが適切に移行されたことを検証しなければなりません。
root #
ls -l /etc/runlevels/boot/
もし上記リストにroot、procfs、mtab、swap、fsckが無い場合は、以下のコマンドでboot
ランレベルに追加しなければなりません。
root #
rc-update add root boot
root #
rc-update add procfs boot
root #
rc-update add mtab boot
root #
rc-update add fsck boot
root #
rc-update add swap boot
もしシステムがmdraidとLVMを使っていて、かつ上記リストに含まれていない場合、以下のinitscriptをboot
ランレベルに追加しなければなりません。
root #
rc-update add mdraid boot
root #
rc-update add lvm boot
udev
OpenRCはudevをデフォルトでは起動しなくなったため、udevをsysinit
ランレベルに追加しなければなりません。OpenRCのebuildは過去にudevが有効になっていたかを検出して、自動的にsysinit
ランレベルに追加します。しかし、念のために次のコマンドで確認が必要です。
root #
ls -l /etc/runlevels/sysinit
lrwxrwxrwx 1 root root 14 2009-01-29 08:00 /etc/runlevels/sysinit/udev -> \ /etc/init.d/udev
もしudevが無かった場合、次のコマンドで適切なランレベルに追加してください。
root #
rc-update add udev sysinit
ネットワーク
baselayoutとOpenRCが2つの異なるパッケージに分割されたため、アップグレードの過程でnet.eth0 initscriptは無くなる可能性があります。このinitscriptを置き換えて再度defaultランレベルに追加するため、次を実行してください。
root #
cd /etc/init.d
root #
ln -s net.lo net.eth0
root #
rc-update add net.eth0 default
他のネットワークのinitscriptが無くなった時は、上記コマンドで修復してください。単純に、eth0
を無くなったネットワークデバイス名に置き換えてください。
さらに、/etc/conf.d/net (oldnet)は、その設定についてbashスタイルの配列を使用しません。新しいやり方については/usr/share/doc/openrc-<version>/net.exampleを参照してください。変換は直感的にできるでしょう。例えば、静的なIPアドレス割り当ては以下のように変更します。
'"`UNIQ--pre-0000000C-QINU`"'
'"`UNIQ--pre-0000000F-QINU`"'
時計
時刻の設定は/etc/conf.d/clockから、時刻を調整するためのシステム固有のツールにリネームされました。これはLinuxでは/etc/conf.d/clockとなり、FreeBSDでは/etc/conf.d/clockとなります。実時間で常時動作するクロック(Read Time Clock、RTC)のチップを搭載していないシステムは/etc/init.d/swclockを使います。この場合、システム時刻はブート時に生成したファイルのmtimeから決められます。 /etc/init.d/の中のinitscriptも適切にリネームされました。適切なスクリプトが/etc/init.d/ランレベルに追加されていることを確認してください。
さらに、このファイルでは TIMEZONE 変数はもう使用されません。この設定は/etc/timezoneファイルにあります。もしファイルが存在しない場合、適切なタイムゾーンと共に生成されなければなりません。これらのファイルが正しく生成されていることを確認してください。
このファイルに設定する値は、/usr/share/zoneinfoディレクトリから該当するタイムゾーンへの相対パスとなります。例えばアメリカ東海岸に住むユーザにとって、正しい設定は次のようになるでしょう。
'"`UNIQ--pre-00000012-QINU`"'
XSESSION
XSESSION 変数は/etc/rc.confから削除されました。代わりに XSESSION は、~/.bashrcファイルのようなユーザ毎の設定ファイルに、もしくは/etc/env.d/のようなシステム全体の設定に記述します。
以下のコマンドは、システム全体に適用されるデフォルトの XSESSION を決定します。
root #
echo 'XSESSION="Xfce4"' > /etc/env.d/90xsession
/etc/env.d配下のファイルを変更した場合は、env-update を実行し、ユーザは一度ログアウト後、再度ログインしなければなりません。もし変数を~/.bashrcで設定している場合は、source ~/.bashrc で変更を反映する必要があります。
EDITOR と PAGER
EDITOR 変数も/etc/rc.confから削除されました。EDITOR と PAGER はデフォルトでは/etc/profileで設定されます。この設定は~/.bashrcファイル(bashの場合)でユーザ毎に、もしくは/etc/env.d/99editorでシステム全体の値を決めることができます。
/etc/env.d配下のファイルを変更した場合は、env-update を実行し、ユーザは一度ログアウト後、再度ログインしなければなりません。もし変数を~/.bashrcで設定している場合は、source ~/.bashrc で変更を反映する必要があります。
ブートログ
これまで、ブートプロセスのログはapp-admin/showconsoleパッケージを使って取得できました。しかしOpenRCは全てのログを内部で管理します。そのため、showconsole を使ったハックはもう必要ありません。showconsole は安全にunmerge可能です。引き続きブートメッセージのログを取得する場合は、/etc/rc.confファイルの適切な変数(rc_logger
)を設定してください。このログは/var/log/rc.logに保存されます。
'"`UNIQ--pre-00000016-QINU`"'
local.start と local.stop
OpenRCでは/etc/conf.d/local.startとlocal.stopは使用されなくなりました。OpenRCへの移行期間中、これらのファイルを/etc/local.dに移動して、サフィックス.startもしくは.stopを付与しておけば、OpenRCはこれらのファイルをアルファベット順に実行します。
システム サブタイプ:仮想化の場合
初期のOpenRCは複数の仮想化のタイプを検出できました。この情報はdepend
関数のkeyword
を呼び出しを通して、いくつかのinitscriptをスキップするために使用されていました。
しかし、0.7.0リリース時点で、サブタイプは/etc/rc.confファイルのrc_sys
変数に明確に設定しなければならなくなりました。このサブタイプは、ルートが存在する仮想化環境に合致しなければなりません。一般的に空でないrc_sys
は仮想環境で動作するシステムで使用されます。逆に仮想環境のホストはrc_sys=""
を持つでしょう。
もし固有のサブタイプが存在しない場合、空の文字列
""
をデフォルトとして使用しなければなりません。もし変数がセットされない場合、警告が表示されると共に、従来の検出アルゴリズムを試みます。自動検出で設定される値が不明な時は、暫定的に
rc_sys
変数をコメントアウトして、検出するためのコマンド rc -S を実行してください。'"`UNIQ--pre-00000019-QINU`"'
新しいサブタイプを導入するため、また事前検出が信頼できないカーネルに変更するため、自動検出はマニュアルでの設定に変更されました。
Subtype | Description | Notes |
---|---|---|
デフォルト、サブタイプ無し | 未設定とは異なります。FreeBSD、Linux、NetBSDを想定しています。 | |
jail | FreeBSDのjail | |
lxc | Linux Containers | 自動検出では検出されません。 |
openvz | Linux OpenVZ | |
prefix | Prefix | 自動検出では検出されません。FreeBSD、Linux、NetBSDを想定しています。 |
vserver | Linux vserver | |
xen0 | Xen0ドメイン | Linux、NetBSDを想定しています。 |
xenU | XenUドメイン | Linux、NetBSDを想定しています。 |
使われなくなった設定ファイルの消去
移行後、Portageでは自動的に削除されない設定ファイルがファイルシステムに残ります。これらは各種設定ファイルに対するPortageの保護機能のためです。
最も注目すべき例は/etc/conf.d/net.exampleです。このファイルは/usr/share/doc/openrc-*/net.example.bz2に引き継がれます。
仕上げ
各設定ファイルとinitscriptのアップデート完了後、ターミナルからルート権限でrebootコマンドを入力してください。理由はアップグレードの間、システム状態は適切に保持されないためです。新鮮なブートが必要です。
変更された機能
ポーズ動作
以前は /etc/init.d/service pause を使うことで、あるサービスを、それに依存するサービス全体を停止することなく中断できました。OpenRCでは、このpause
動作は非サポートになりました。ただし、同じ機能が、古いbaselayoutでも動作する /etc/init.d/service --nodeps stop でサポートされます。
/etc/mtab内のrootfsエントリー
これまでは、起動時のrootfs
エントリーは/etc/mtabから削除され、真のルート/に対応するエントリーだけが存在していました。そしてこの重複したrootfsは、システムのシャットダウンの間に再度追加されていました。OpenRCでは、initramfsとルート上のtmpfsをフルサポートするため2つのrootfsエントリーをサポートします。これにより、シャットダウン時の再追加も不要になりました。
This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: cardoe, nightmorph, robbat2, uberlord
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.