参考《深入理解Linux内核》 第十七章
针对ext2文件系统,先说下对当个文件大小限制
Block 大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大單一檔案限制 | 16GB | 256GB | 2TB |
最大檔案系統總容量 | 2TB | 8TB | 16TB |
示例计算大小
ext2以一种特殊的文件实现了目录,这种文件的数据块存放了文件名和吸纳高硬度索引节点号。特别说明的是,这样的数据块包含了类型为ext2_dir_entry_2的结构。下表列出了这个结构的域,因为该结构最后一个名字域是最大为ext2_name_len(通常是255)个字符的边长数组,因此这个结构的长度是可变的。此外,因为效率的原因,一个目录项的长度总是4的倍数,并在必要时用null自读( ) 填充文件名的末尾。name_len域存放实际的文件名长度
类型 | 域 | 描述 |
---|---|---|
__u32 | inode | 索引节点号 |
__u16 | rec_len | 目录项长度 |
__u8 | name_len | 文件名长度 |
__u8 | file_type | 文件类型 |
char [ext2_name_len] | name | 文件名 |
file_type域存放制定的文件类型的值, rec_len域可以被解释为指向下一个有效目录项的指针:他是偏移量,与目录项的起始地址相加就得到下一个有效目录项的起始地址。为了删除一个目录项,把他的inode域置为0并适当地增加前一个有效目录项rec——len域的值就足够了。仔细看一下图 rec_len域,你会发现”oldfile“项已被删除,因为"usr"的"rec_len"域被置为12+16 ("usr"和 "odlfile"目录项的长度)
file_type---+
|
name_len---+ |
| |
inode rec_len | | name
+-----------------+--------+----+----+----+----+----+----+
| 21 | 12 | 1 | 2 | . | | | |
+-----------------+--------+----+----+----+----+----+----+
| 22 | 12 | 2 | 2 | . | . | | |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 53 | 16 | 5 | 2 | h | o | m | e | 1 | | | |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 67 | 28 | 3 | 2 | u | s | r | |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 0 | 16 | 7 | 1 | o | l | d | f | i | l | e | |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 34 | 12 | 4 | 2 | s | b | i | n |
+-----------------+--------+----+----+----+----+----+----+
下面做个简单的测试
先随机生成84个40字符长度的文件 按照前面的介绍占用空间(84个文件加两个目录)应该有 84(40+8) + (8 + 4)2= 4056
mkdir /tmp/dir1 && for num in `seq 1 84`; do mktemp --tmpdir=/tmp/dir1 --suffix=.txt dd79fcba-c737-4854-ba33-bb222ceab513.XXX;done
看下目前的文件目录大小
drwxr-xr-x 2 root root 4096 Oct 10 19:07 ./
drwxrwxrwt 11 root root 4096 Oct 10 19:07 ../
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_11gCHL.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_1ZiBMU.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_2DMtQw.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_30VwjB.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_34bGTx.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_3BdNFC.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_3X9Bfu.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_4WHZMV.txt
.......
这样还有 4096-4056=40
我们在生成一个32字符长度的文件
touch 12345678901234567890123456789012
这样再看下文件夹大小
drwxr-xr-x 2 root root 4096 Oct 10 19:08 ./
drwxrwxrwt 11 root root 4096 Oct 10 19:07 ../
-rw-r--r-- 1 root root 0 Oct 10 19:08 12345678901234567890123456789012
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_11gCHL.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_1ZiBMU.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_2DMtQw.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_30VwjB.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_34bGTx.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_3BdNFC.txt
......
删除刚创建的32字符长度文件后建立一个30字符长度的文件
rm 12345678901234567890123456789012
touch 123456789012345678901234567890
drwxr-xr-x 2 root root 4096 Oct 10 19:11 ./
drwxrwxrwt 11 root root 4096 Oct 10 19:10 ../
-rw-r--r-- 1 root root 0 Oct 10 19:11 123456789012345678901234567890
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_11gCHL.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_1ZiBMU.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_2DMtQw.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_30VwjB.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_34bGTx.txt
......
目录大小保持4096, 这样删除30字符大小文件,建立33字符长度文件
rm 123456789012345678901234567890
touch 123456789012345678901234567890123
drwxr-xr-x 2 root root 12288 Oct 10 19:13 ./
drwxrwxrwt 11 root root 4096 Oct 10 19:10 ../
-rw-r--r-- 1 root root 0 Oct 10 19:13 123456789012345678901234567890123
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_11gCHL.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_1ZiBMU.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_2DMtQw.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_30VwjB.txt
-rw------- 1 root root 0 Oct 10 19:07 random_forty_length_file_name_34bGTx.txt
......
按照计算 (40+8)84 + (32+8)1 + (4+8)*2 = 4096
所以建立33个字符长度的文件时,超出一个block大小, 需要另外申请block存储了,这里还有一个地方需要注意 文件系统并不是只申请一个block,而是一次性申请了两个 目录大小达到了 12288