fsprotect(1.0.5)の問題 [プログラム]
私のようなバカなことをする人はいないと思いますが...
バカなこと、はじまりはじまり。
ふと思うことがあって、busyboxのパッケージを削除してしまいました。
それで、update-initramfsを実行した後、あれこれfsprotectを試していたら、
よくよく見てみると、その前に
犯人はお前だ!
initramfs内のfsprotctのスクリプトは、
さて、この中に、
…それはよいのですが、「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を見てみると、その最後のところに
直すのは、
修正したら、update-initramfs -uです。これでinitramfsが書き換わります。
以上、バカなことでした。
本当は、そんな修正をせずに、黙ってbusyboxパッケージをインストールすべきなのです。
なぜなら、busyboxはtouchアプレットを持っているので、touchをコピーする必要がないのです。
だから、見方を変えれば、
バカなこと、はじまりはじまり。
ふと思うことがあって、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という部分があります。コメントのとおり、rootfsに対してfsckをさせないための細工です。/fastbootがあると起動時にfsckは実行されません。
touch ${rootmnt}/fastboot
…それはよいのですが、「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"という部分があります。ほほぅ、grepとis_aufsはコピーしてるのに、touchはコピーしてませんね。これが「犯人」です。
copy_exec /bin/is_aufs "/bin"
直すのは、
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コマンドを使う必要すらないと思うのですが…