トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

NetBSDのext2fsあれこれ

ext2のあれこれ、めも。

はじめに

NetBSDには、5.0で newfs_ext2fs ができ、ext2ファイルシステムを作ったり、mountしたりがNetBSDだけでできるようになった。(それ以前からも、mountはできていたし、sysutils/e2fsprogs パッケージをインストールすれば、ext2/ext3が作れていた。)

ところが、Linuxでつくったext2だと、mountできたりできなかったりするなど、NetBSDのnewfs_ext2fsでつくったext2と、どうも違うみたい。そこらへんの試行錯誤めも。

試したのは、NetBSD/amd64 5.1_RC2 と、sysutils/e2fsprogsパッケージ(e2fsprogs-1.40.7)の mkfs.ext2。

準備

 # fdisk sd2
 Disk: /dev/rsd2d
 NetBSD disklabel disk geometry:
 cylinders: 13424, heads: 15, sectors/track: 63 (945 sectors/cylinder)
 total sectors: 12685680
 
 BIOS disk geometry:
 cylinders: 790, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
 total sectors: 12685680
 
 Partition table:
 0: Linux native (sysid 131)
     start 63, size 208782 (102 MB, Cyls 0-12), Active
         PBR is not bootable: All bytes are identical (0x00)
 1: Linux swap or Prime or Solaris (sysid 130)
     start 208845, size 1108485 (541 MB, Cyls 13-81)
  PBR is not bootable: Bad magic number (0x3030)
 2: Linux native (sysid 131)
     start 1317330, size 11357955 (5546 MB, Cyls 82-788)
         PBR is not bootable: All bytes are identical (0x00)
 3: <UNUSED>
 First active partition: 0
 Drive serial number: 286886 (0x000460a6)

こんなふうに、MBRパーティションを切ると、とくになにもしないときのデフォルトのdisklabelは、

 0: e
 1: f
 2: g
 3: h

になるので、今回は、0 = /dev/sd2e と 3 = /dev/sd2g をつかって、フォーマットをしてみる。

あとは、sysutils/e2fsprogsパッケージをインストールして、準備完了。

mountできない

Linuxのext2をmountとしようとすると、NetBSDではmountできないことがある。これを試す。(これは、sysutils/e2fsprogs の mkfs.ext2 でつくっても同じなため、それで比較してみる。)

 newfs_ext2fs

 # newfs_ext2fs /dev/rsd2e
 /dev/rsd2e: 101.9MB (208782 sectors) block size 1024, fragment size 1024
         using 13 block groups of 8.0MB, 8192 blks, 2008 inodes.
 super-block backups (for fsck_ext2fs -b #) at:
 8193, 16385, 24577, 32769, 40961, 49153, 57345, 65537, 73729, 81921, 90113,
 ...............................................................................
 # mount_ext2fs /dev/sd2e /mnt
 # touch /mnt/a
 # ls /mnt
 a          lost+found
 # umount /mnt
 # newfs_ext2fs /dev/rsd2g
 /dev/rsd2g: 5545.8MB (11357955 sectors) block size 4096, fragment size 4096
         using 44 block groups of 128.0MB, 32768 blks, 16160 inodes.
 super-block backups (for fsck_ext2fs -b #) at:
 32768, 65536, 98304, 131072, 163840, 196608, 229376, 262144, 294912, 327680,
 ...............................................................................
 # mount_ext2fs /dev/sd2g /mnt
 # touch /mnt/a
 # ls /mnt
 a          lost+found
 # umount /mnt

なんの問題もなく、mountして、使える。

とりあえず、dumpe2fsしておく。

 # dumpe2fs /dev/sd2e
 dumpe2fs 1.40.7 (28-Feb-2008)
 Filesystem volume name:   <none>
 Last mounted on:          <not available>
 Filesystem UUID:          28cfa11c-a965-df11-b5d3-00301b45925f
 Filesystem magic number:  0xEF53
 Filesystem revision #:    0 (original)
 Filesystem features:      (none)
 Default mount options:    (none)
 Filesystem state:         clean
 Errors behavior:          Continue
 Filesystem OS type:       Linux
 Inode count:              26104
 Block count:              104391
 Reserved block count:     5219
 Free blocks:              101062
 Free inodes:              26092
 First block:              1
 Block size:               1024
 Fragment size:            1024
 Blocks per group:         8192
 Fragments per group:      8192
 Inodes per group:         2008
 Inode blocks per group:   251
 Last mount time:          n/a
 Last write time:          Sat May 22 22:57:52 2010
 Mount count:              0
 Maximum mount count:      20
 Last checked:             Sat May 22 22:51:24 2010
 Check interval:           15552000 (6 months)
 Next check after:         Thu Nov 18 22:51:24 2010
 Reserved blocks uid:      0 (user root)
 Reserved blocks gid:      0 (group wheel)
 
 <snip>
 # dumpe2fs /dev/sd2g
 dumpe2fs 1.40.7 (28-Feb-2008)
 Filesystem volume name:   <none>
 Last mounted on:          <not available>
 Filesystem UUID:          cea32e24-a965-df11-b5d3-00301b45925f
 Filesystem magic number:  0xEF53
 Filesystem revision #:    0 (original)
 Filesystem features:      (none)
 Default mount options:    (none)
 Filesystem state:         clean
 Errors behavior:          Continue
 Filesystem OS type:       Linux
 Inode count:              711040
 Block count:              1419744
 Reserved block count:     70987
 Free blocks:              1397343
 Free inodes:              711028
 First block:              0
 Block size:               4096
 Fragment size:            4096
 Blocks per group:         32768
 Fragments per group:      32768
 Inodes per group:         16160
 Inode blocks per group:   505
 Last mount time:          n/a
 Last write time:          Sat May 22 22:58:10 2010
 Mount count:              0
 Maximum mount count:      20
 Last checked:             Sat May 22 22:51:37 2010
 Check interval:           15552000 (6 months)
 Next check after:         Thu Nov 18 22:51:37 2010
 Reserved blocks uid:      0 (user root)
 Reserved blocks gid:      0 (group wheel)
 
 <snip>

 mkfs.ext2

次は、mkfs.ext2。

 # mkfs.ext2 /dev/rsd2e
 mke2fs 1.40.7 (28-Feb-2008)
 /dev/rsd2e is not a block special device.
 Proceed anyway? (y,n) n

あれ、rawデバイスじゃだめなんだ。やりなおし。

 # mkfs.ext2 /dev/sd2e
 mke2fs 1.40.7 (28-Feb-2008)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 26104 inodes, 104388 blocks
 5219 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=67371008
 13 block groups
 8192 blocks per group, 8192 fragments per group
 2008 inodes per group
 Superblock backups stored on blocks:
         8193, 24577, 40961, 57345, 73729
 
 Writing inode tables: done
 Writing superblocks and filesystem accounting information: done
 
 This filesystem will be automatically checked every 29 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 # mount /dev/sd2e /mnt
 # touch /mnt/a
 # ls /mnt
 a          lost+found
 # umount /mnt

mountできた。あれ、勘違い?

 # mkfs.ext2 /dev/sd2g
 mke2fs 1.40.7 (28-Feb-2008)
 Warning: 256-byte inodes not usable on older systems
 Filesystem label=
 OS type: Linux
 Block size=4096 (log=2)
 Fragment size=4096 (log=2)
 355520 inodes, 1419744 blocks
 70987 blocks (5.00%) reserved for the super user
 First data block=0
 Maximum filesystem blocks=1455423488
 44 block groups
 32768 blocks per group, 32768 fragments per group
 8080 inodes per group
 Superblock backups stored on blocks:
         32768, 98304, 163840, 229376, 294912, 819200, 884736
 
 Writing inode tables: done
 Writing superblocks and filesystem accounting information: done
 
 This filesystem will be automatically checked every 33 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 # mount /dev/sd2g /mnt
 mount_ext2fs: /dev/sd2g on /mnt: incorrect super block

mountできない!そう、これこれ。

 dumpe2fsする。
 # dumpe2fs /dev/sd2e
 dumpe2fs 1.40.7 (28-Feb-2008)
 Filesystem volume name:   <none>
 Last mounted on:          <not available>
 Filesystem UUID:          598681a3-40b7-480b-90d7-c949adc8544a
 Filesystem magic number:  0xEF53
 Filesystem revision #:    1 (dynamic)
 Filesystem features:      ext_attr resize_inode filetype sparse_super
 Filesystem flags:         signed_directory_hash 
 Default mount options:    (none)
 Filesystem state:         clean
 Errors behavior:          Continue
 Filesystem OS type:       Linux
 Inode count:              26104
 Block count:              104388
 Reserved block count:     5219
 Free blocks:              99536
 Free inodes:              26092
 First block:              1
 Block size:               1024
 Fragment size:            1024
 Reserved GDT blocks:      256
 Blocks per group:         8192
 Fragments per group:      8192
 Inodes per group:         2008
 Inode blocks per group:   251
 Filesystem created:       Sat May 22 23:09:39 2010
 Last mount time:          n/a
 Last write time:          Sat May 22 23:11:42 2010
 Mount count:              0
 Maximum mount count:      29
 Last checked:             Sat May 22 23:09:39 2010
 Check interval:           15552000 (6 months)
 Next check after:         Thu Nov 18 23:09:39 2010
 Reserved blocks uid:      0 (user root)
 Reserved blocks gid:      0 (group wheel)
 First inode:              11
 Inode size:		  128
 Default directory hash:   tea
 Directory Hash Seed:      530effc5-4cdc-4419-9216-e4c27458e89d
 
 <snip>
 # dumpe2fs /dev/sd2g
 dumpe2fs 1.40.7 (28-Feb-2008)
 Filesystem volume name:   <none>
 Last mounted on:          <not available>
 Filesystem UUID:          351487ea-cea0-425b-aaf3-ebb6f270ee92
 Filesystem magic number:  0xEF53
 Filesystem revision #:    1 (dynamic)
 Filesystem features:      ext_attr resize_inode filetype sparse_super large_file
 Filesystem flags:         signed_directory_hash 
 Default mount options:    (none)
 Filesystem state:         clean
 Errors behavior:          Continue
 Filesystem OS type:       Linux
 Inode count:              355520
 Block count:              1419744
 Reserved block count:     70987
 Free blocks:              1394646
 Free inodes:              355509
 First block:              0
 Block size:               4096
 Fragment size:            4096
 Reserved GDT blocks:      346
 Blocks per group:         32768
 Fragments per group:      32768
 Inodes per group:         8080
 Inode blocks per group:   505
 Filesystem created:       Sat May 22 23:12:40 2010
 Last mount time:          n/a
 Last write time:          Sat May 22 23:15:06 2010
 Mount count:              0
 Maximum mount count:      33
 Last checked:             Sat May 22 23:12:40 2010
 Check interval:           15552000 (6 months)
 Next check after:         Thu Nov 18 23:12:40 2010
 Reserved blocks uid:      0 (user root)
 Reserved blocks gid:      0 (group wheel)
 First inode:              11
 Inode size:		  256
 Default directory hash:   tea
 Directory Hash Seed:      bbf8eabb-f087-466b-8e94-1284cf93fc4a
 
 <snip>

Filesystem revision # や Filesystem features や Filesystem flags が違うけど、sd2eの方も違うのにmountできているので、これが原因ということではなさそう。

inode sizeというのがどうもあやしいので、google大明神に聞いてみると、"kern/40936: ext2fs: add support for inodes > 128 bytes"という、そのものずばりのものがあった。ようは、index sizeの大きさが、128 bytes/inodeでないと、NetBSDはmountできないようだ。えーん。2009/3/1にはcurrentに反映されたとあるけど、このままだと、NetBSD 6からということになる。NetBSD 5.1_RC2のソースをみると、当然のように反映前のまま ;_;。NetBSD 5系でも使えるようにしてーと、だめもとでsend-prしたところ、幸いにもNetBSD 5.2で入ることになった。(Jeff Rizzoさん、Tsutsuiさんに感謝。)ちなみに、FreeBSDは、2009/10末に、7-stableと8-stableにこの変更が反映されたみたい。

 対策

最初からLinuxと共用することがわかっているext2/ext3パーティションは、inode sizeを128bytesにするとよい。NetBSDのnewfs_ext2fsでフォーマットするか、

 mkfs.ext2 -I 128 /dev/sd2g

などと、-I オプションで、サイズを指定すれば、mountできるようになる。

 # mkfs.ext2 -I 128 /dev/sd2g
 mke2fs 1.40.7 (28-Feb-2008)
 Filesystem label=
 OS type: Linux
 Block size=4096 (log=2)
 Fragment size=4096 (log=2)
 356224 inodes, 1419744 blocks
 70987 blocks (5.00%) reserved for the super user
 First data block=0
 Maximum filesystem blocks=1455423488
 44 block groups
 32768 blocks per group, 32768 fragments per group
 8096 inodes per group
 Superblock backups stored on blocks:
         32768, 98304, 163840, 229376, 294912, 819200, 884736
 
 Writing inode tables: done
 Writing superblocks and filesystem accounting information: done
 
 This filesystem will be automatically checked every 32 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 # mount /dev/sd2g /mnt
 # touch /mnt/a
 # ls /mnt
 a          lost+found
 # umount /mnt

しかし、すでにあるファイルシステムだと、手も足も出ないよね...。kern/40936のパッチをあてて、自分でビルドするしかないよね...。あるいは、2011/1/18以降の、netbsd-5 stableにupdateすると、mountできるようになります!

large_file

NetBSDのnewfs_ext2fsでフォーマットすると、mkfs.ext2の時と比べて、Filesystem revision # や Filesystem features や Filesystem flags が違う。特に気になるのが、featuresのlarge_file。newfs_ext2fsのmanをよむと、

    -O filesystem-format
                Select the filesystem-format
                      0    `GOOD_OLD_REV'; This option is primarily used to
                           build root file systems that can be understood by
                           old or dumb firmwares for bootstrap. (default)
                      1    `DYNAMIC_REV'; Various extended (and sometimes
                           incompatible) features are enabled (though not all
                           features are supported on NetBSD).  Currently only
                           the following features are supported:
                                 RESIZE       Prepare some reserved struc-
                                              tures which enable future file
                                              system resizing.
                                 FTYPE        Store file types in directory
                                              entries to improve performance.
                                 SPARSESUPER  Prepare superblock backups for
                                              the fsck_ext2fs(8) utility on
                                              not all but sparse block
                                              groups.
                                 LARGEFILE    Enable files larger than 2G
                                              bytes.

とあり、-O 1 と指定すれば、よいみたい。

では、試す。2G以上のファイルがつくれるかどうかもみよう。

 # newfs_ext2fs -O 0 /dev/rsd2g
 <snip>
 # dumpe2fs /dev/sd2g | grep features
 dumpe2fs 1.40.7 (28-Feb-2008)
 Filesystem features:      (none)
 # mount /dev/sd2g /mnt
 # dd if=/dev/zero of=/mnt/3g.dd bs=1m count=3072
 dd: /mnt/3g.dd: File too large
 2048+0 records in
 2047+0 records out
 2146435072 bytes transferred in 52.678 secs (40746328 bytes/sec)
 # umount /mnt
 # newfs_ext2fs -O 1 /dev/rsd2g
 <snip>
 # dumpe2fs /dev/sd2g | grep features
 dumpe2fs 1.40.7 (28-Feb-2008)
 Filesystem features:      resize_inode filetype sparse_super large_file
 # mount /dev/sd2g /mnt
 # dd if=/dev/zero of=/mnt/3g.dd bs=1m count=3072
 3072+0 records in
 3072+0 records out
 3221225472 bytes transferred in 83.088 secs (38768841 bytes/sec)
 # umount /mnt

たしかに、-O 1 の時は、3GiBのファイルができた。

その他

間違いの指摘や、ご意見などは、FrontPageにある連絡先にメールを下さるとうれしいです。

最終更新時間:2011年02月27日 23時05分24秒