試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

genkernel 3.4.10系でファイルシステムのUUIDのデバイス名への解決ができない件について(対処)

genkernel 3.4.10系でファイルシステムのUUIDのデバイス名への解決ができない件について(問題について)」の続き。

  1. バージョン1.10.3のbusyboxを使用して問題を回避
    1. 設定ファイルの生成
    2. ソースファイルの準備
    3. /etc/genkernel.confの設定変更
  2. 復帰デバイスのUUID指定をするためのパッチを更新
  3. 関連: busyboxの「--install」について(今回の件とは無関係)

バージョン1.10.3のbusyboxを使用して問題を回避

本家busyboxは、バージョン1.10系からfindfsを搭載しているため、このバージョンを使用するようにする。
(2008/9/29)ここではバージョン1.10.3を使用しているが、バージョン1.12.0でも同様にして作業が行える。

設定ファイルの生成
busyboxのビルド設定ファイルはカーネルの設定ファイルに似ていて、設定方法も同様。oldconfig/menuconfig/gconfig/xconfigのターゲットが使用できる。
あらかじめbusyboxのソースを取得してから下のように作業を行う。

$ tar jxf [busybox-1.10.3.tar.bz2の場所]
$ cd busybox-1.10.3/
$ cp /usr/share/genkernel/$(uname -m)/busy-config .config
$ make [menuconfig/gconfig/xconfigの内、好きなターゲット]

設定ツールが起動したら、findfsとファイルシステムごとのVOLUMEIDサポートを有効にする必要がある。CONFIG_FEATURE_VOLUMEID_[ファイルシステム名]を入れないと、findfsは使えるものの、正しいUUIDを受け取ってもデバイス名への解決ができない。

Linux System Utilities  --->
 [*] findfs                    [CONFIG_FINDFS]
 --- Routines for detecting label and uuid on common filesystems
 (ここのファイルシステムごとのチェック(CONFIG_FEATURE_VOLUMEID_xxx)を入れていく)

下はxconfigターゲットで設定した場合の参考画像。

findfs

VOLUMEID(実際には、使用していないファイルシステムのものは外してもOK)
設定が終わったら、生成される.configをどこかに保存しておく。下は/usr/share/genkernel/$(uname -m)/busy-config-1.10.3として保存する例。

$ sudo cp .config /usr/share/genkernel/$(uname -m)/busy-config-1.10.3

ソースファイルの準備
ソースの.tar.bz2ファイルはビルド時に使用されるため、/var/cache/genkernel/src/の中に入れておく。
入れた後の状態は下のようになっている。

$ ls /var/cache/genkernel/src/
LVM2.2.02.28.tgz        busybox-1.7.4.tar.bz2      dmraid-1.0.0.rc14.tar.bz2
busybox-1.10.3.tar.bz2  device-mapper.1.02.22.tgz  e2fsprogs-1.39.tar.gz

/etc/genkernel.confの設定変更
busyboxのバージョン番号とビルド設定ファイルの場所を指定しておく必要がある。先ほど別の場所にビルド設定ファイルを保存した場合、変数BUSYBOX_CONFIGをその場所に合わせておく。
下は、busyboxに関係した部分の変更後の状態の例。
ファイル名: /etc/genkernel.conf

# Configuration file for busybox
#BUSYBOX_CONFIG="${GK_SHARE}/%%ARCH%%/busy-config"  # コメントアウト
BUSYBOX_CONFIG="${GK_SHARE}/%%ARCH%%/busy-config-1.10.3"

#BUSYBOX_VER="1.7.4"                                # コメントアウト
BUSYBOX_VER="1.10.3"
BUSYBOX_SRCTAR="${DISTDIR}/busybox-${BUSYBOX_VER}.tar.bz2"
BUSYBOX_DIR="busybox-${BUSYBOX_VER}"
BUSYBOX_BINCACHE="%%CACHE%%/busybox-${BUSYBOX_VER}-%%ARCH%%.tar.bz2"

復帰デバイスのUUID指定をするためのパッチを更新

Gentoo Linux上のTuxOnIceでUUID指定による休止を試すが...」で扱ったパッチ(アップロードしたのは「Gentoo Linux上のuswsuspについての覚え書き(UUID指定による休止を行う)」)をバージョン3.4.10向けに修正した。今回も、スワップパーティション自体に対しての復帰はうまくいかず、ext2などのファイルシステムを作成の上、その中にスワップのファイルを作成するという方法によってのみ、UUID指定が機能する。カーネルの引数の指定などは「Gentoo Linux上のTuxOnIceでUUID指定による休止を試すが...」を参照。
ebuild
cid-3f9be5b1cd4a806c.skydrive.live.com/browse.aspx/%E5%85%AC%E9%96%8B/Gentoo%20Linux%20ebuild/sys-kernel/genkernel
に、パッチは
cid-3f9be5b1cd4a806c.skydrive.live.com/browse.aspx/%E5%85%AC%E9%96%8B/Gentoo%20Linux%20ebuild/sys-kernel/genkernel/files
にアップロードした。
(2008/9/29)パッチにsuspend_resume()関数が追加されていなかったのを修正

関連: busyboxの「--install」について(今回の件とは無関係)

initrdのlinuxrcで「busybox --install -s」という処理が書かれているが、これは、busyboxの中に含まれるコマンドを外部コマンドのように実行*1するためのシンボリックリンクを作成する。
一般ユーザ権限で

$ busybox --install -s 2>&1 | less

を実行すると

busybox: /bin/[: Permission denied
busybox: /bin/[[: Permission denied
busybox: /bin/addgroup: Permission denied
busybox: /bin/adduser: Permission denied
busybox: /sbin/adjtimex: Permission denied
busybox: /bin/ar: Permission denied
busybox: /bin/arping: Permission denied
busybox: /bin/ash: Permission denied
busybox: /bin/bbconfig: Permission denied
busybox: /bin/cal: Permission denied
(中略)
busybox: /bin/vi: Permission denied
busybox: /bin/vlock: Permission denied
busybox: /bin/watch: Permission denied
busybox: /sbin/watchdog: Permission denied
busybox: /bin/wget: Permission denied
busybox: /bin/which: Permission denied
busybox: /bin/who: Permission denied
busybox: /bin/whoami: Permission denied
busybox: /bin/xargs: Permission denied
busybox: /sbin/zcip: Permission denied

のように既存のコマンドを置き換えようとするのが分かる(書き込み権限がないため失敗する)。この機能は

Busybox Settings  --->
 General Configuration  --->
  [*] Support --install [-s] to install applet links at runtime   [CONFIG_FEATURE_INSTALLER]

の設定を有効にすると使用できる。無効の場合には

--install: applet not found

が出る。
それにしても、busyboxがそのサイズの小ささの割に非常に多機能なのには驚かされる。

使用したバージョン:

  • genkernel 3.4.10-r1
  • busybox 1.10.3

*1:例えば、busybox findfsfindfsとして実行する