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ですね。
他のキーワードでも試してみました。
- エラーメッセージだけ: “ファイルサイズ制限を超過しました” ext3の制限は出てこない
- エラーメッセージとファイルサイズ: “ファイルサイズ制限を超過しました” 16GB ext3の制限はでてこない
もう少し検索してみると「“ファイルサイズ” 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
等とするとブロックサイズを確認できます。