BaselayoutとOpenRCの移行ガイド
1.
背景
baselayoutとは何ですか?
Baselayoutは、すべてのシステムで正常に動作するために必要とされる、例えば/etc/hostsのような基本的なファイルセットを提供します。
また、Gentooで使用されている基本的なファイルシステムのディレクトリ構成(言い換えれば、/etc、 /var、/usr、/homeなどのディレクトリ )も提供します。
OpenRCとは何ですか?
OpenRCは、依存関係を前提としたrcシステムで、システムにはinitとして提供されています。普通は/sbin/initを指します。
しかし、/sbin/initを置き換えるものではありません。
Gentoo Linuxが標準で使用するinitは、sys-apps/sysvinitです。しかし、FreeBSDで使用されるGentoo/FreeBSDのinitは、sys-freebsd/freebsd-sbinで提供されます。
なぜ移行するのでしょうか?
もともとGentooのrcシステムは、ほぼbashで書かれたbaselayout 1に組み込まれていました。
これはいくつかの制限につながりました。例えば、特定のシステムコールは、起動中はずっとアクセスできる必要があり、これを実現するにはC言語ベースの呼び出しを追加する必要があります。これらの呼び出しは、個々にスタティックリンクされ、長期間かけて肥大化する結果となった。
それに加えて、GentooがGentoo/FreeBSDやGentoo Embeddedのようなプラットフォームに拡大するにつれて、bashを必要とするrcシステムは合わなくなってきました。
これはPOSIXに準拠したshellのみを必要とするC言語で実装されたbaselayout 2の開発につながりました。
baselayout 2の開発中に、
baselayoutは、ただ単に基本ファイルとGentoo向けのファイルシステムのディレクトリ構成だけを提供すれば汎用性が向上し、rcシステムの個々の機能は、個々のパッケージに分割することが決定した。
それゆえ、OpenRCと呼ばれます。
OpenRCは、主にRoy Marplesによって開発され、現在提供されている全てのGentooのバリエーション(Gentoo Linux、Gentoo/FreeBSD、Gentoo Embedded、Gentoo Vserver)とFreeBSDやNetBSDのような他のプラットフォームをサポートします。
2.
OpenRCへの移行
OpenRCへの移行は、非常に簡単です。パッケージマネージャの通常のアップグレードプロセスで導入できます。
最も重要なステップは、実際に>=sys-apps/baselayout-2とsys-apps/openrcの2つの新しいパッケージをインストールした後です。
再起動前に、dispatch-confを実行し、/etc配下を更新しておくことがもっとも重要です。
上記を実行しないと、起動不能なシステムになります。
こうなってしまったシステムを復旧するには、Gentoo 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に集約されました。もう、カーネルのバージョンは関係ありません。
以前の設定例を紹介します。
コード表示 2.1: /etc/modules.autoload.d/kernel-2.6 |
ivtv
cx88_dvb video_br=2
|
上記の例は、移行後は以下のようになります。
コード表示 2.2: /etc/conf.d/modules |
modules_2_6="ivtv cx88_dvb"
module_cx88_dvb_args_2_6="video_br=2"
|
上記の例では、モジュールとそのパラメータは、2.6.xシリーズのカーネルのみに渡されます。
新しい設定では、モジュールとパラメータをカーネルのバージョンまで指定することが可能となります。
重要:
module*変数は、重複設定はできません。バージョン毎に指定された変数は、一般的な変数を上書きします。
|
注意:
module_とmodules_は意味が違うので、注意してください。
|
コード表示 2.3: /etc/conf.d/modulesの詳細な設定例 |
modules_2_6_23_gentoo_r5="ivtv"
modules_2_6_23="cx88_dvb"
modules_2_6="tun usbserial"
modules="ohci1394 ieee1394"
module_cx88_dvb_args_2_6_23_gentoo_r5="video_br=2"
module_usbserial_args_2_6="vendor=0x1410 product=0x2110"
module_ieee1394_args="debug"
|
起動時のランレベル
起動時に選択されたランレベルは、全てのマシンにおける重要なステップのいくつかを実行します。
例えば、rootファイルシステムがread/writeでマウントされたかを確認し、マウントされたファイルシステムにエラーが無いことを確認し、マウントポイントが利用可能となり、その後、/procという疑似ファイルシステムがスタートします。
OpenRCにおいて、ブロック ストレージ デバイスのためのボリューム管理サービスは、起動時に自動的に実行されません。
これは、lvm、raid、swap、device-mapper(dm)、dm-crypt、evmsのようなものを含みます。
起動時ののランレベルの中で、これらのサービスのための適切なinitscriptを実行する必要があります。そうしなければ、システムは起動しなくなるでしょう!
OpenRC ebuildは、この移行作業を自動的に行いますが、全てのボリューム管理サービスに対して適切に移行できたかは、ユーザが確認する必要があります。
コード表示 2.4: 起動時のランレベルのすべてのサービスを表示する |
# ls -l /etc/runlevels/boot/
|
もし、上記コマンドで出力したリストにrootとprocfs、mtab、swap、fsckが見当たらなければ、起動時ののランレベルに、以下の追加手順を実施してください。
コード表示 2.5: 起動時のランレベルに最重要サービスを追加する |
# rc-update add root boot
# rc-update add procfs boot
# rc-update add mtab boot
# rc-update add fsck boot
# rc-update add swap boot
|
もし、mdraidとlvmを使用していて、先のリストで見当たらなければ、起動時のランレベルに以下の手順でinitscriptを追加してください。
コード表示 2.6: 起動時のランレベルにmdraidとlvmを追加する |
# rc-update add mdraid boot
# rc-update add lvm boot
|
Udev
OpenRCは、もはやデフォルトでudevを実行しません。しかし、実行するためにsysinitランレベルに存在する必要があります。
OpenRC ebuildは、もし移行前のシステムでudevを使用していることを検知したら、sysinitランレベルに追加します。
しかし、安全のためにudevがあるか確認してください。
コード表示 2.7: udevを確認する |
# ls -l /etc/runlevels/sysinit
lrwxrwxrwx 1 root root 14 2009-01-29 08:00 /etc/runlevels/sysinit/udev -> \
/etc/init.d/udev
|
udevがリストアップされない場合は、適切なランレベルに追加します。
コード表示 2.8: sysinitランレベルにudevを追加する |
# rc-update add udev sysinit
|
ネットワーク
baselayoutとOpenRCという2つの異なるパッケージに分割されたため、net.eth0というinitscriptはアップグレード プロセスの中で消失する可能性があります。このinitscriptを置き換えるために、以下の手順を実行してください。
コード表示 2.9: 消失したnet.eth0スクリプトを追加しなおす |
# cd /etc/init.d
# ln -s net.lo net.eth0
|
その他のネットワーク用のinitscriptが見当たらない場合は、再追加する上記手順を同様に行ってください。
単純に、ネットワーク デバイスのeth0を置き換えて実行してください。
また、/etc/conf.d/net(oldnet)の設定に、bashスタイルの配列は使用できなくなります。
設定手順が記載されている/usr/share/doc/openrc-<version>/net.exampleを見直してください。
設定の書き直しは、比較的簡単です。(以下のroutes_eth0のように)
分離したエントリを書くには改行が必要になります。
例えば、スタティックIPアドレスの設定は、以下のように変更となります。
コード表示 2.10: 以前のスタイル/etc/conf.d/net |
config_eth0=( "192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255" )
routes_eth0=( "default via 192.168.1.100" "10.0.0.0/8 via 192.168.1.2" )
|
コード表示 2.11: 新しいスタイルの/etc/conf.d/net |
config_eth0="192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255"
routes_eth0="default via 192.168.1.100
10.0.0.0/8 via 192.168.1.2"
|
Clock
Clockの設定は、/etc/conf.d/clockから時刻を設定するためのネイティブツールに名前が変更されました。
Linuxは、/etc/conf.d/hwclockになり、FreeBSDは、/etc/conf.d/adjkerntzになりました。
リアルタイムクロック(RTC)チップが働かないシステムは、システムがシャットダウン時に作成されるmtimeというファイルのシステムクロックである、/etc/init.d/swclockを使用すべきです。
/etc/init.d/のinitscriptは、それに応じて名称を変更しています。
そのため、自分のシステムの適切なスクリプトを、起動時のランレベルに追加する必要があります。
また、TIMEZONE変数は、このファイルでは無くなりました。
この変数は、/etc/timezoneファイルに統合されました。
もし、/etc/timezoneファイルが無い場合は、自分のタイムゾーンに合わせたファイルを作成する必要があります。
これらのファイルが正しく更新されたかどうか確認してください。
このファイルの適切な設定値は、/usr/share/zoneinfoからの相対パスになります。
例えば、米国の東海岸に住んでいる人は、以下が正しい設定になります。
コード表示 2.12: /etc/timezone |
America/New_York
|
XSESSION
XSESSION変数は、/etc/rc.confから無くなりました。
その代わりXSESSION変数は、利用者毎の設定は、~/.bashrc(または同等のファイル)に設定し、システム全体の設定は、/etc/env.d/で行います。
システム全体に適用するXSESSIONの設定例を示します。
コード表示 2.13: システム全体に適用するXSESSIONの設定例 |
# 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(または同様のファイル)で行い、システム全体で設定する場合は、/etc/env.d/99editorを作成してください。
重要:
/etc/env.dにファイルを作成した後は、env-updateを必ず実行してください。そして、設定を反映するためにログアウトして、ログインしてください。
~/.bashrcに設定する場合は、source ~/.bashrcで読み込み直してください。
|
起動時のログ
以前は、app-admin/showconsoleで起動中のプロセスのログを取ることができました。
しかし、最新のOpenRCは、内部機能で全てのログを処理しますので、showconsoleを使用する必要が無くなりました。
showconsoleを安全にアンインストールすることができます。
起動中のメッセージのログをとり続けるために、/etc/rc.confに適切な変数を設定します。
ログは、/var/log/rc.logに出力されます。
コード表示 2.14: /etc/rc.confに起動のログを出力を有効にする |
rc_logger="YES"
|
システムのsub-type: 仮想化の場合
OpenRCの初期のバージョンでは、数種類の仮想化を検出し、
depend関数の中でkeywordを使って一部のinitスクリプトをスキップできるようにしていました。
しかし、0.7.0からは/etc/rc.confのrc_sys変数を自分でsub-typeにあわせて設定しなくてはいけません。
sub-typeはそのルートのある仮想化環境によって変わります。
一般的には空文字ではないrc_sysは仮想化の中で使われます。
つまり、仮想化のホスト環境ではrc_sys=""となります。
重要:
特別なsub-typeがなければデフォルトの空文字""を設定するようにしてください。
この変数が設定されていなければ、警告が出て旧来の自動検出のアルゴリズムが使われます。
|
注意:
自動検出でどの値が使われるかわからなければ、一時的にrc_sysをコメントアウトして
rc -Sで検出コマンドを実行してください。
|
コード表示 2.15: /etc/rc.confでシステムのsub-typeを「なし」に設定する |
rc_sys=""
|
新しいsub-typeの導入のため、また旧来の検出方法を信頼できなくなるカーネルの変更があったため、
自動検出アルゴリズムを使うのではなく、手動の設定に置き換えなければなりませんでした。
| sub-type |
説明 |
補足 |
|
デフォルト sub-typeなし |
設定なしと同じではない。 FreeBSD, Linux & NetBSD |
| jail |
FreeBSDのjail |
|
| lxc |
Linux Containers |
自動検出されない |
| openvz |
Linux OpenVZ |
|
| prefix |
Prefix |
自動検出されない。 FreeBSD, Linux & NetBSD |
| vserver |
Linux vserver |
|
| xen0 |
Xen0 Domain |
Linux & NetBSD |
| xenU |
XenU Domain |
Linux & NetBSD |
仕上げ
設定ファイルとinitscriptの更新作業が完了すると、最後の作業は、再起動することです。
システムの状態情報は、この更新作業で保存されないので、再起動を行うことでシステムの状況を更新する必要があるのです。
3.
変更された機能
pause アクション
以前は/etc/init.d/service pauseで依存しているサービスの全てを止めることなく、
一時的にサービスを停止することができました。
OpenRCではpauseアクションは削除されました。
/etc/init.d/service --nodeps stopで同じ機能が動きます。
これは旧来のbaselayoutでも有効です。
/etc/mtabのrootfs項目
以前は初期化時のrootfs項目は/etc/mtabから削除され、
実際のルートの/の項目だけが残っていました。
実際のルートと重複するrootfsの項目はシャットダウン時に再び戻されていました。
OpenRCではinitramfsを完全にサポートするため、またtmpfs-on-rootをサポートするために、
両方の項目が出てくるようになります。これによって、シャットダウン時の書きこみも少なくなります。
このドキュメントの内容は、他のものが明示されない限りは、
CC-BY-SA-2.5ライセンスです。
Gentoo Name and Logo Usage Guidelines (日本語訳)が適用されます。
|