还没想好用什么标题

0%

Ext2文件系统

参考《深入理解Linux内核》 第十七章

针对ext2文件系统,先说下对当个文件大小限制

Block 大小 1KB 2KB 4KB
最大單一檔案限制 16GB 256GB 2TB
最大檔案系統總容量 2TB 8TB 16TB

示例计算大小


ext2以一种特殊的文件实现了目录,这种文件的数据块存放了文件名和吸纳高硬度索引节点号。特别说明的是,这样的数据块包含了类型为ext2_dir_entry_2的结构。下表列出了这个结构的域,因为该结构最后一个名字域是最大为ext2_name_len(通常是255)个字符的边长数组,因此这个结构的长度是可变的。此外,因为效率的原因,一个目录项的长度总是4的倍数,并在必要时用null自读(\0) 填充文件名的末尾。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”目录项的长度)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                      file_type---+
|
name_len---+ |
| |
inode rec_len | | name
+-----------------+--------+----+----+----+----+----+----+
| 21 | 12 | 1 | 2 | . | \0 | \0 | \0 |
+-----------------+--------+----+----+----+----+----+----+
| 22 | 12 | 2 | 2 | . | . | \0 | \0 |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 53 | 16 | 5 | 2 | h | o | m | e | 1 | \0 | \0 | \0 |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 67 | 28 | 3 | 2 | u | s | r | \0 |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 0 | 16 | 7 | 1 | o | l | d | f | i | l | e | \0 |
+-----------------+--------+----+----+----+----+----+----+----+----+----+----+
| 34 | 12 | 4 | 2 | s | b | i | n |
+-----------------+--------+----+----+----+----+----+----+

下面做个简单的测试
先随机生成84个40字符长度的文件 按照前面的介绍占用空间(84个文件加两个目录)应该有 84(40+8) + (8 + 4)2= 4056

1
mkdir /tmp/dir1 && for num in `seq 1 84`; do mktemp --tmpdir=/tmp/dir1 --suffix=.txt  dd79fcba-c737-4854-ba33-bb222ceab513.XXX;done

看下目前的文件目录大小

1
2
3
4
5
6
7
8
9
10
11
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字符长度的文件

1
touch 12345678901234567890123456789012

这样再看下文件夹大小

1
2
3
4
5
6
7
8
9
10
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字符长度的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
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字符长度文件

1
2
3
4
5
6
7
8
9
10
11
12
13
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