zoukankan      html  css  js  c++  java
  • Ext2文件系统

    参考《深入理解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

  • 相关阅读:
    【源码笔记】BlogEngine.Net 中的权限管理
    Asp.Net MVC 分页、检索、排序整体实现
    AngularJS 初印象------对比 Asp.net MVC
    Asp.Net MVC Filter 实现方式和作用范围控制
    上传图片压缩+水印(文字、图片)+验证码
    2014年及五年计划
    【读书笔记】Asp.Net MVC 上传图片到数据库(会的绕行)
    VS2012 生成事件
    CSS position绝对定位absolute relative
    CSS兼容性解决方法!important的IE7,Firefox问题
  • 原文地址:https://www.cnblogs.com/mikeguan/p/7647222.html
Copyright © 2011-2022 走看看