ファイルシステム用のfuzzツール「fsfuzzer」にminixのファイルシステムをテストするコードを追加して,遊んでみました.
このツールは,何年か前の,「Month of kernel Bugs」でも使われてたような気がします.
fsfuzzの基本的な使い方は,以下の通りで単純明解です.
sudo ./fsfuzz ファイルシステム名
他のファイルシステムを参考に,minixのコードを追加しました.
正確にこれであってるかって言われると自信ないですけどorz
あ,fsfuzzってシェルスクリプトなんですが,家のPCは/bin/shは/bin/dashにリンクされてて,
bashほど機能が豊富ではないので,シェルが/bin/shだと上手く動きませんでした.
なので,先頭の#!/bin/shは#!/bin/bashに変えました.下のようなやりかたでも問題ないんですが,面倒だったのでw
sudo /bin/bash ./fsfuzz ext4
diffはこんな感じです.
--- fsfuzz.orig 2010-02-03 00:30:25.923586664 +0900 +++ fsfuzz 2010-02-03 00:44:14.055147024 +0900 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # (c) 2006-2009 Steve Grubb <sgrubb@redhat.com> # (c) 2006, LMH <lmh@info-pull.com> # @@ -53,6 +53,9 @@ if [ -x /usr/bin/genromfs ] ; then filesystems="$filesystems romfs" fi +if [ -x /sbin/mkfs.minix ] ; then + filesystems="$filesystems minix" +fi # ecryptfs overlays another fs, so fudge the check this way... if [ -x /sbin/mount.ecryptfs ] ; then filesystems="$filesystems ecryptfs" @@ -322,6 +325,8 @@ ;; reiserfs) /sbin/mkfs.reiserfs -b $BLOCKSIZE -ff -q -s 513 $file ;; + minix) /sbin/mkfs.minix -c -i 4096 $file $BLOCKSIZE + ;; *) /sbin/mkfs -t $fstype -f $file ;; esac @@ -332,7 +337,7 @@ # Populate the initial image for filesystem created from files case $fstype in - ext?|vfat|msdos|hfs|xfs|reiserfs|ecryptfs) + ext?|vfat|msdos|hfs|xfs|reiserfs|ecryptfs|minix) echo "Populating image..." # OK mount the file system
これを動かしてたら,カーネルのoops出ました.
[12643.727334] BUG: unable to handle kernel paging request at ffff880140000000 [12643.727339] IP: [<ffffffffa02a00ae>] count_free+0xae/0x131 [minix] [12643.727345] PGD 1616063 PUD 0 [12643.727348] Oops: 0000 [#1] PREEMPT SMP [12643.727351] last sysfs file: /sys/devices/virtual/block/loop0/range [12643.727353] CPU 0 [12643.727357] Pid: 15141, comm: fstest Not tainted 2.6.33-rc6-tip+ #1 TW8/SW8/DW8/TW8/SW8/DW8 [12643.727359] RIP: 0010:[<ffffffffa02a00ae>] [<ffffffffa02a00ae>] count_free+0xae/0x131 [minix] [12643.727363] RSP: 0018:ffff88013be9fd90 EFLAGS: 00010203 [12643.727364] RAX: 000000002c46ff7d RBX: ffff880115418800 RCX: 000000002abe7800 [12643.727366] RDX: 000000000000077d RSI: 00000000fffd54ee RDI: ffff88007eaf70e0 [12643.727368] RBP: ffff88013be9fdb0 R08: 000000002abe7801 R09: 0000000000000400 [12643.727370] R10: ffff88007eaf7850 R11: 00000000000000ab R12: 0000000000000400 [12643.727372] R13: 0000000000000007 R14: 0000000000000075 R15: 0000000000000000 [12643.727374] FS: 00007f28f580b6f0(0000) GS:ffff880028200000(0000) knlGS:0000000000000000 [12643.727376] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [12643.727378] CR2: ffff880140000000 CR3: 000000013e485000 CR4: 00000000000406e0 [12643.727380] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [12643.727382] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [12643.727384] Process fstest (pid: 15141, threadinfo ffff88013be9e000, task ffff88013b47ac40) [12643.727385] Stack: [12643.727387] ffff88013decbc80 ffff88013decbc80 0000000000700000 0000000000000000 [12643.727390] <0> ffff88013be9fdc8 ffffffffa02a0154 ffff88013be9fe28 ffff88013be9fdf8 [12643.727393] <0> ffffffffa02a2528 ffff88013be9feb8 ffff88013be9fe28 ffff88013f6d9f00 [12643.727397] Call Trace: [12643.727401] [<ffffffffa02a0154>] minix_count_free_blocks+0x23/0x2c [minix] [12643.727404] [<ffffffffa02a2528>] minix_statfs+0x5a/0xb1 [minix] [12643.727408] [<ffffffff810f3721>] vfs_statfs+0x60/0x78 [12643.727411] [<ffffffff810f38ad>] vfs_statfs_native+0x22/0x3c [12643.727414] [<ffffffff810f3983>] sys_statfs+0x48/0x84 [12643.727416] [<ffffffff810f3edf>] ? fsnotify_modify+0x6c/0x74 [12643.727419] [<ffffffff810f4674>] ? vfs_write+0xd3/0x10b [12643.727423] [<ffffffff8132189d>] ? trace_hardirqs_on_thunk+0x3a/0x3c [12643.727426] [<ffffffff81002c1b>] system_call_fastpath+0x16/0x1b [12643.727428] Code: 84 9e 00 00 00 89 d6 48 8b 4f 20 48 c1 e1 03 49 0f af c8 45 31 c0 48 29 ce 48 c1 ee 04 01 f6 eb 27 44 89 c1 48 8b 5f 28 41 ff c0 <8a> 0c 0b 88 cb 83 e1 0f c0 eb 04 48 0f be db 03 04 9d 60 3f 2a [12643.727458] RIP [<ffffffffa02a00ae>] count_free+0xae/0x131 [minix] [12643.727461] RSP <ffff88013be9fd90> [12643.727463] CR2: ffff880140000000 [12643.727465] ---[ end trace 9e699897668b1389 ]---
一応,バグを見つけるという意味では,テスト成功だと思います♪