ソースコード・リテラシーのススメ

第16回 トラブルの状況を読む

この記事を読むのに必要な時間:およそ 4.5 分

この結果を見ると,カーネルがサポートしているファイルシステムはext4devであってext4ではないようです。確かにe2fsprog-1.41.0にはmkfs.ext4mkfs.ext4devの2種のコマンドがあります。⁠ext4とext4devって異なるファイルシステムという扱いなのかな?」と首をかしげつつ,こういった場合はmenuconfigのヘルプメッセージが参考になるだろうと,make menuconfigを実行して,⁠Ext4dev/ext4 extended fs support development⁠のHelpメッセージを読んでみました。

図2 menuconfigのext4devに関するヘルプメッセージ

図2 menuconfigのext4devに関するヘルプメッセージ

このヘルプメッセージを見る限り,ext4 fsは現在も開発が進行中の機能で,開発が完了するまではext4devという名称にしてあるようです。

それでは,mkfs.ext4とmkfs.ext4devの違いはどこにあるのでしょう? e2fsprogsと共にインストールされる,これらのコマンドの設定ファイル/etc/mke2fs.confを調べてみました。

# cat /etc/mke2fs.conf
[defaults]
        base_features = sparse_super,filetype,resize_inode,ext_attr
        blocksize = 4096
        inode_size = 256
        inode_ratio = 16384

[fs_types]
        ext3 = {
                features = has_journal
        }
        ext4 = {
                features = has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
                inode_size = 256
        }
        ext4dev = {
                features = has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
                inode_size = 256
                options = test_fs=1
        }
        small = {
                blocksize = 1024
                inode_size = 128
                inode_ratio = 4096
        }
 ...

この設定ファイルは,それぞれの形式でファイルシステムを作成する際に利用するオプション類を指定しています。このファイルを見る限り,ext4とext4devの違いは,test_fs=1というオプションを指定するかどうかだけのようです。このオプションを指定すると何が変わるのだろう,mke2fsのmanページ を調べてみました。

# export LANG=C ; man mke2fs
MKE2FS(8)                                               MKE2FS(8)

NAME
       mke2fs - create an ext2/ext3 filesystem
...
                  test_fs
                         Set  a  flag in the filesystem superblock indicating that it
                         may be mounted using experimental kernel code, such  as  the
                         ext4dev filesystem.

manページを見ると,test_fsというオプションは-Eで指定する拡張オプションの1つで,ファイルシステムのスーバーブロックに開発中のコードを使うことを示すフラグを立てる指定のようです。

man mke2fsの前にexport LANG=Cしているのは,日本語版ではなく英語版のmanページを参照するためです。日本語版のmanページは便利ですが,新しいバージョンが翻訳されるまで時間がかかるので,ext4のような最新機能を調べるにはソースコードに付属の英語版のmanページを参照する必要があります。

「なるほど」と思って,mkfs.ext4devコマンドで再度ファイルシステムを作成し,Ext4dev/ext4機能を組み込みにしたカーネルでマウントできるか試してみました。

# mount /dev/sda2 /mnt -t ext4dev
EXT4-fs: sda2: Filesystem with huge files cannot be mounted read-write without CONFIG_LSF.
mount: wrong fs type, bad option, bad superblock on /dev/sda2,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail or so

うーん,まだダメのようです。dmesgを調べても,⁠EXT4-fs: sda2:...⁠という同じメッセージが出力されているだけです。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html