squashfsがコンパイルできない!
# uname -a Linux XXXX 2.6.21 #2 Fri Jul 13 01:15:47 JST 2007 i686 GNU/Linux # cd /usr/src/linux # m-a -t --kernel-dir=/usr/src/linux a-i squashfs パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 squashfs-source はすでに最新バージョンです。 アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 842 個。 . 1 パッケージについての情報を更新しました Extracting the package tarball, /usr/src/squashfs.tar.bz2, please wait... /usr/bin/make clean make[1]: ディレクトリ `/m/home/src/modules/squashfs' に入ります find . \( -name '*.ko' -o -name '*.o' -o -name '.tmp_versions' -o -name '*~' -o -name '.*.cmd' \ -o -name '*.mod.c' -o -name '*.tar.bz2' -o -name '*.rej' -o -name '*.orig' \)\ -print | xargs rm -Rf make[1]: ディレクトリ `/m/home/src/modules/squashfs' から出ます /usr/bin/make -f debian/rules kdist_clean kdist_config binary-modules make[1]: ディレクトリ `/m/home/src/modules/squashfs' に入ります /usr/bin/make -w clean make[2]: ディレクトリ `/m/home/src/modules/squashfs' に入ります find . \( -name '*.ko' -o -name '*.o' -o -name '.tmp_versions' -o -name '*~' -o -name '.*.cmd' \ -o -name '*.mod.c' -o -name '*.tar.bz2' -o -name '*.rej' -o -name '*.orig' \)\ -print | xargs rm -Rf make[2]: ディレクトリ `/m/home/src/modules/squashfs' から出ます /usr/bin/gcc-4.0 for templ in ; do \ cp $templ `echo $templ | sed -e 's/_KVERS_//g'` ; \ done for templ in `ls debian/*.modules.in` ; do \ test -e ${templ%.modules.in}.backup || cp ${templ%.modules.in} ${templ%.modules.in}.backup 2>/dev/null || true; \ sed -e 's/##KVERS##//g ;s/#KVERS#//g ; s/_KVERS_//g ; s/##KDREV##/r2/g ; s/#KDREV#/r2/g ; s/_KDREV_/r2/g' < $templ > ${templ%.modules.in}; \ done dh_testroot dh_clean -k dh_installdirs /usr/bin/make KDIR=/usr/src/linux KVER= make[2]: ディレクトリ `/m/home/src/modules/squashfs' に入ります make -C /usr/src/linux SUBDIRS=`pwd`/linux-2.6 CONFIG_SQUASHFS=m \ CC="gcc" modules make[3]: ディレクトリ `/m/home/src/linux-source-2.6.21' に入ります CC [M] /usr/src/modules/squashfs/linux-2.6/inode.o /usr/src/modules/squashfs/linux-2.6/inode.c: In function 'squashfs_iget': /usr/src/modules/squashfs/linux-2.6/inode.c:629: error: 'struct inode' has no member named 'i_blksize' /usr/src/modules/squashfs/linux-2.6/inode.c:682: error: 'struct inode' has no member named 'i_blksize' /usr/src/modules/squashfs/linux-2.6/inode.c: At top level: /usr/src/modules/squashfs/linux-2.6/inode.c:2141: warning: 'kmem_cache_t' is deprecated /usr/src/modules/squashfs/linux-2.6/inode.c: In function 'squashfs_alloc_inode': /usr/src/modules/squashfs/linux-2.6/inode.c:2147: error: 'SLAB_KERNEL' undeclared (first use in this function) /usr/src/modules/squashfs/linux-2.6/inode.c:2147: error: (Each undeclared identifier is reported only once /usr/src/modules/squashfs/linux-2.6/inode.c:2147: error: for each function it appears in.) /usr/src/modules/squashfs/linux-2.6/inode.c: At top level: /usr/src/modules/squashfs/linux-2.6/inode.c:2160: warning: 'kmem_cache_t' is deprecated /usr/src/modules/squashfs/linux-2.6/inode.c: In function 'destroy_inodecache': /usr/src/modules/squashfs/linux-2.6/inode.c:2184: error: void value not ignored as it ought to be make[4]: *** [/usr/src/modules/squashfs/linux-2.6/inode.o] エラー 1 make[3]: *** [_module_/usr/src/modules/squashfs/linux-2.6] エラー 2 make[3]: ディレクトリ `/m/home/src/linux-source-2.6.21' から出ます make[2]: *** [modules] エラー 2 make[2]: ディレクトリ `/m/home/src/modules/squashfs' から出ます make[1]: *** [binary-modules] エラー 2 make[1]: ディレクトリ `/m/home/src/modules/squashfs' から出ます make: *** [kdist_build] エラー 2 BUILD FAILED! See /var/cache/modass/squashfs-source.buildlog..1187123469 for details. ビルドに失敗しました。続けるには Return を押してください...
もう自分でカーネルをコンパイルするのはやめて素直にdebianizeされたカーネルを使ったほうがいいかもね。こんなエラーに困らされるだけ時間の無駄だし。
debianのカーネルを使う
apt-get install linux-image-2.6.21-2-686
した後liloしてrebootした後いきなりKernel panicに襲われた。
Switch to high resolution mode on CPU 0 VFS: Cannot open root device "303" or unknown-block (3,3) Please add a correct "root=" boot option Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block
あ、そうかdebianized kernelはinitrdを使ってるんだな。ということで/etc/lilo.confをこんな感じに書き換える。
image=/boot/vmlinuz label=Linux initrd=/boot/initrd.img read-only root=/dev/hda3
そしたら、あっさり起動。DHCP接続もサウンドも問題なし。squashfsも問題なく使用できた。IP MasqueradeもOK。やっぱりパッケージシステムでしっかり管理されていると安心できる♪
と思ったらテレビの録画ができんかった。
v4l2: open /dev/video0: No such file or directory v4l2: open /dev/video0: No such file or directory v4l: open /dev/video0: No such file or directory no grabber device available
ぐぐったらmknodすればいいことがわかったので、
# cd /dev/ # mknod /dev/video0 c 81 0 # ln -s /dev/video0 /dev/video
あっさり録画できた。こんなにとんとん拍子でいっていいのだろうか…
ついでにdebianizeされた最新カーネル2.6.22へ移行してみる。
# apt-get install linux-image-2.6.22-1-686 # lilo
あっさり完了。liloは自分で実行しないといけないようだ。aptもそこまでは面倒見てくれない。
aptは/boot/vmlinuz, /boot/initrd.imgのsymlinkを更新してくれる。けど、/boot/configや/boot/System.mapのsymlinkは更新してくれてない!不備か?
まあカーネルの更新といった大がかりな作業も一発でやってくれるから助かるね。Pentium4用にコンパイルされていないとか勝手にSMPが有効になってるとか不満点は残るのだが…
しまった!debianized squashfsは2.6.18と2.6.21しか対応してない!仕方ないので2.6.21に戻す。まあ2.6.22を消して2.6.21に戻せばいい。消すときにブートできなくなるので危険と言われたが承知でやった。そしてすぐにdpkg-reconfigureしておいたので無事に。
apt-get remove linux-image-2.6.22-1-686 dpkg-reconfigure linux-image-2.6.21-2-686 lilo
><
あら、再起動したら録画ができない!そうか、/devはtmpfsだから再起動したら消えてしまうんだ…
/etc/init.d/udevを読んでると、新しくノードを作る部分を見つけた。そうか、/etc/udev/links.confを書き換えればいいのか。
make_extra_nodes() { if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then cp --archive --update /lib/udev/devices/* /dev/ fi [ -e /etc/udev/links.conf ] || return 0 grep '^[^#]' /etc/udev/links.conf | \ while read type name arg1; do [ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue case "$type" in L) ln -s $arg1 /dev/$name ;; D) mkdir -p /dev/$name ;; M) mknod -m 600 /dev/$name $arg1 ;; *) log_warning_msg "links.conf: unparseable line ($type $name $arg1)" ;; esac if [ -x /sbin/restorecon ]; then /sbin/restorecon /dev/$name >/dev/null 2>/dev/null fi done }
/etc/udev/links.confに以下を追加。/devがtmpfsって今のGNU/Linuxのスタイルなのかな。
L cdr /dev/hdd M video0 c 81 0 L video /dev/video0
squashfsを使ってみた。
これからバックアップ用CD-RWにsquashfsを使うことにした。バックアップ対象をsquashfsイメージで固めて、それをさらにISO9660で固めてみる。大きい箱のなかにまた箱が入っているイメージ。だからmountを二重で使うことになる。
以前はafioで固めていたが、ファイルシステムとしてアクセスできないのが不満。
そして、肝心のサイズ比較。ホームディレクトリのうち、RCSなど余分なファイル・ディレクトリを除外したものを固めると約1.1GBほど。
- rw-r--r-- 1 root root 470292480 2007-08-15 09:24 rubikitch.afz
- rwx------ 1 root root 404017152 2007-08-15 18:29 rubikitch.squashfs
約14%ほど小さくなった。こんな感じでマウントする。
mount -t squashfs -o loop rubikitch.squashfs /mnt
あとは/etc/fstabに追加だ。