SSブログ

fsprotect(1.0.5)の問題 [プログラム]

私のようなバカなことをする人はいないと思いますが...

バカなこと、はじまりはじまり。

ふと思うことがあって、busyboxのパッケージ削除してしまいました。
それで、update-initramfsを実行した後、あれこれfsprotectを試していたら、
fsckができないよ
と言われて、止まってしまいました。おいおい。

よくよく見てみると、その前に
touchがないんだけど...
と言われています。前にinitramfs内のfsprotectのスクリプトを読んでいたので、「ピン」と来ました。
犯人はお前だ!

initramfs内のfsprotctのスクリプトは、
/usr/share/initramfs-tools/scripts/{local-bottom,nfs-bottom}
の下にあります(2つとも同じ内容です)。スクリプト自体はさほど長くないのでfsprotectを機能させる手順に興味のある方は目を通しておくとよいでしょう。

さて、この中に、
# This one will prevent FSCKs
touch ${rootmnt}/fastboot
という部分があります。コメントのとおり、rootfsに対してfsckをさせないための細工です。/fastbootがあると起動時にfsckは実行されません。
…それはよいのですが、「touchがないんだけど...」と言われている、このtouchコマンドはどこにあるのでしょう? それはinitramfsの中です。fsprotectしようとしているrootfs内ではありません。つまり、initramfsを作るときに、touchコマンドのバイナリ(/usr/bin/touch)とそれが使用する共有ライブラリ(ldd /usr/bin/touchで出力されるもの)をコピーしてinitramfs内に入るようにしなければなりません。

mkinitramfsはこのへんが、よく考えられていて、initramfsを作るときにやるべき「操作」を/usr/share/initramfs-tools/hooksの下のスクリプトで行うことができます。で、/usr/share/initramfs-tools/hooks/fsprotectを見てみると、その最後のところに
copy_exec /bin/grep "/bin"
copy_exec /bin/is_aufs "/bin"
という部分があります。ほほぅ、grepとis_aufsはコピーしてるのに、touchはコピーしてませんね。これが「犯人」です。
直すのは、
copy_exec /usr/bin/touch "/bin"
を追加すればOKです。なお、コピー先を"/usr/bin"としてしまうと、/usr/binがinitramfs内でのPATHに含まれていないらしく、やはり「touchがないんだけど...」と言われてしまいます。ですので、/binへコピーしてやるとよいです。

修正したら、update-initramfs -uです。これでinitramfsが書き換わります。

以上、バカなことでした。

本当は、そんな修正をせずに、黙ってbusyboxパッケージインストールすべきなのです。
なぜなら、busyboxはtouchアプレットを持っているので、touchをコピーする必要がないのです。
だから、見方を変えれば、
fsprotectのパッケージがbusyboxパッケージをrequiredにしていないのがバグ
ということになります。が、それよりも、
touch ${rootmnt}/fastboot
と書くのではなく
echo '' > ${rootmnt}/fastboot
と書けば、touchコマンドを使う必要すらないと思うのですが…

共通テーマ:パソコン・インターネット

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。