ext3の最大ファイルサイズは2TBでなく16GB?!

Linux 12月 3, 2007
(Last Updated On: )

24GBのファイルをコピーしようとしてエラーになり??な話です。大きなファイルを使いそうなファイルシステムにはXFSを利用していたので気が付きませんでした。

sshfsでマウント先のファイルシステムにコピーしようとしたら16GBでエラー、クラッシュした為と思いますが勝手にumountされました。sshfsの制限かな?とscpにしても同じ、4GBにsplitしてコピー後にcatしても16GBちょうどでエラーなのでググるとKernel 2.4の制限が出てきました。

http://www.ussg.iu.edu/hypermail/linux/kernel/0403.3/1673.html

Depends upon the block size.

Block size file size
1 kb 16 GB
2 kb 256 GB
4 kb 2048 GB
8 kb 2048 GB

2.4カーネルのこの制限はそのまま2.6カーネルのext3にも引き継がれているいたようです。
# 追記を参照

古いe2fsprogsの場合、mkfs -t ext3で作られるデフォルトのファイルシステムのブロックサイズは1KBなので最大ファイルサイズはたったの16GBになります。

ext3 filesize“くらいでヒットしても良さそうですが出てきませんでした。”ext3 16gb filesize“でやっと適切な検索結果になりました。やはり大きなファイルを使う場合はXFSですね。

他のキーワードでも試してみました。

もう少し検索してみると「“ファイルサイズ” 16GB linux」でやっとKernel 2.4の翻訳に当たりました。

私もXFSだったので困ることは今まで無かったですし、皆さんも16GBの壁にはあまり困っていないのかな??

 

追記

smbdさんに教えてもらった有用なリンク:

  • ファイルシステム諸元
  • ext3 諸元拡大に関する研究開発動向、及び改造方式の検討
    http://lc.linux.or.jp/paper/lc2006/CP-09.pdf

後のPDFにおもしろい事が書いてあります。PDFに記載されているext3の最大ファイルサイズの拡張は2.6.17-rc1で取り込まれ

ブロックサイズ: 4KB 最大ファイルサイズ: 4TB
ブロックサイズ:64KB 最大ファイルサイズ: 256TB

まで拡張されている、としています。ということはこのエントリのタイトルは「ext3の最大ファイルサイズは256TBでなく16GB?!」になるのかも知れません。それとも、ブロックサイズ128KBとかできる?

 

追記2

最近のe2fsprogsはデフォルトのブロックサイズは4096byteになっています。320GBのSATA HDD 2本でRAID1にしていた/dev/md0の全体がext3でフォーマットされていたので最近フォーマットされた、と思っていたのですがブロックサイズが1024byteであった事を考えるとkernel 2.4くらいのシステムでフォーマットされていたパーティションだとと思います。3年か4年前くらいに購入したテスト用のPowerEdge800なので何度かOSを入れ替えているのですが/dev/md0は相当古い(?)linuxでフォーマットしたか、mkfs.ext3のデフォルト値が小さいシステムでフォーマットしたのだと思います。

気になたのでいつ頃から4KBブロックサイズがデフォルトになったか調べてみました。
Fedoraのe2fsprogsパッケージのChangeLogによるとS/390とzSeriesは2002年に4KBブロックサイズがデフォルトになったようです。

* Mon Jun 17 2002 Karsten Hopp <karsten @redhat.de>
– set default blocksize for mke2fs on S/390 and zSeries to 4096

ソースを見た方が正確なのでe2fsprogs-1.39のdoc/libext2fs.texinfoによるとまだ1KBがext2のデフォルトだと書いてあります。(ext3の記述は見つからず、ただext3はext2+ジャーナルの構造なのでブロックサイズなどは同じだと思います)

lesystem. Valid values are 0 (1024 bytes), 1
(2048 bytes), or 2 (4096 bytes). The default blocksize is 1024 bytes.

どうもtexinfoファイルはアップデートされていないようなのでコードの方を見てみました。
misc/mke2fs.cがmkfs.ext2, mkfs.ext3のコードでe2fsprogs-1.39のソースだと1221行目にデフォルト値が設定されています。

} else {
retry:
    retval = ext2fs_get_device_size(device_name,EXT2_BLOCK_SIZE(&fs_param),&dev_size);
    if ((retval == EFBIG) && (blocksize == 0) && (fs_param.s_log_block_size == 0)) {
        fs_param.s_log_block_size = 2;
        blocksize = 4096;
        goto retry;
    }
}

 

git-annotateによると”2005-01-27 19:07:26″にデフォルトブロックサイズの行が変更された事になっています。

20953129 (Theodore Ts’o 2005-01-27 19:07:26 -0500 1244) blocksize = 4096;

# これはe2fsprogsの開発版なのでデフォルト値を設定している
# 行が1.39と異なっています。

最近のシステムであれば4KBブロックサイズがデフォルトだと思います。この為、4TB(システムによっては2TB)が最大ファイルサイズになるのでext2/ext3の最大ファイルサイズは4TBと考えて問題ないと思います。

mke2fs.confをサポートしているe2fsprogsの場合(ほとんどのlinuxはサポートしていると思いますが)/etc/mke2fs.confでもデフォルトのブロックサイズを設定/参照できます。

[defaults]
base_features = sparse_super,filetype,resize_inode,dir_index
blocksize = 4096
inode_ratio = 8192

[fs_types]
small = {
blocksize = 1024
inode_ratio = 4096
}
floppy = {
blocksize = 1024
}
news = {
inode_ratio = 4096
}
largefile = {
inode_ratio = 1048576
}
largefile4 = {
inode_ratio = 4194304
}

最近のext3ファイルシステムはディレクトリエントリでB-Tree検索をサポートしています。mkfs.ext3のコマンドのオプションで指定してもよいですが/etc/mke2fs.confに記述してもよいです

もし、ブロックサイズが分からないまたは気になる場合は

dumpe2fs /dev/sda1 | less

等とするとブロックサイズを確認できます。

 

参考

投稿者: yohgaki