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-RWsquashfsを使うことにした。バックアップ対象をsquashfsイメージで固めて、それをさらにISO9660で固めてみる。大きい箱のなかにまた箱が入っているイメージ。だからmountを二重で使うことになる。

以前はafioで固めていたが、ファイルシステムとしてアクセスできないのが不満。

そして、肝心のサイズ比較。ホームディレクトリのうち、RCSなど余分なファイル・ディレクトリを除外したものを固めると約1.1GBほど。

約14%ほど小さくなった。こんな感じでマウントする。

mount -t squashfs -o loop rubikitch.squashfs /mnt

あとは/etc/fstabに追加だ。

[追記]必ずしもISO9660フォーマットでなくてもいいようだ。いきなりsquashfsにできる。