zoukankan      html  css  js  c++  java
  • 第十一章学习笔记

    EXT2文件系统

    知识点归纳以及自己最有收获的内容

    1.EXT2文件系统

    Linux一直使用EXT2(Card等1995)作为默认文件系统;EXT3中增加的主要内容是日志文件;EXT4增加:磁盘块的分配;

    2.EXT2文件系统数据结构

    2.0EXT2在硬盘上的索引节点的数据结构如下:


    EXT2通过索引节点中的数据块指针数组进行逻辑块到物理块的映射。在EXT2索引节点中,数据块中数组共有15项,前12个为直接指针,后三个分别为“一次间接指针”、“二次间接指针”、“三次间接指针”,EXT2默认的物理块大小为1KB,块地址占4个字节,所以每个物理块可以存储256个地址。

    2.1通过mkfs创建虚拟磁盘

    mke2fs [-b blksize -N ninodes] device nblocks
    在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。

    2.2虚拟磁盘布局

    Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。

    2.3超级块

    Block#1:超级块(在硬盘区分中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息。

    2.4块组描述符

    Block#2:块组描述符块(硬盘上的s_first_data_block+1)
    Block#8:块位图
    Block#9:索引节点位图

    2.5索引节点

    Block#10:索引(开始)节点,每个文件用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示

    2.6数据块

    紧跟在索引节点后面的是文件存储数据块。

    2.7目录条目

    目录包含dir_entry结构

    3邮差算法

    例:一个城市有M个街区,编号从0到M-1。每个街区有N座房子,编号从0到N-1。每座房子有一个唯一的街区地址,用(街区,房子)表示,其中0≤街区<M,0≤房子<N。外人不熟悉该街区寻址方案,采用线性方法将房子地址编为0,1,…,N-1,N,N+1等。已知某个街区地址BA=(街区,房子),如何转换为线性地址LA,相反,已知线性地址,如何转换为街区地址?
    LA=N*block + house;
    BA=(LA/N, LA%N); (只有从0开始计数转换才有效)

    4编历EXT2文件系统树

    编历一个EXT2文件系统和一个文件的路径名,例如/a/b/c,问题是如何找到这个文件。查找文件相当于查找其索引节点。

    4.1编历算法

    (1)读取超级块;
    (2)读取块组描述符块(1+s_first_data_block),以访问组0描述符;
    (3)读取InodeBeginBlock,获取/的索引节点,即INODE#2;
    (4)将路径名标记为组件字符串,假设组件数量为n;
    (5)从(3)中的根索引节点开始,在其数据块中搜索name[0];
    (6)使用索引节点号ino来定位相应的索引节点。Ino从1开始计数,使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量;
    (7)由于(5)~(6)步将会重复n次,所以最好编写一个搜索函数。

    4.2将路径名转换为索引节点

    已知一个包含EXT2文件系统和路径名的设备,例如/a/b/c/d,编写一个C函数:INODE *path2inode(int fd, char *pathname);返回一个指向文件索引节点的INODE指针;如果文件不可访问,则返回0。

    4.3显示索引节点磁盘块

    编写一个C程序showblock,可打印文件的所有磁盘块(编号);

    5 EXT2文件系统的实现

    问题与解决思路

    为什么用df命令比du命令统计整个磁盘的已用空间更快?

    详情可参照:

    http://www.runoob.com/linux/linux-comm-df.html
    http://www.runoob.com/linux/linux-comm-du.html
    因为df命令只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。
    Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。
    Linux du命令用于显示目录或文件的大小。

    实践内容与截图,代码链接

    1、查看文件操作系统

    以上示例效果中还有一个叫做buffers memory的内存区块,这个区块缓存了文件系统的部分Inode信息,这样保证了操作系统不会随时到文件系统上寻找Inode——优化文件系统的读性能。cache memory区块和buffers memory区块由操作系统自行管理,它们只会使用当前没有被应用程序占用的空闲内存。当应用程序请求新的内存区块且空闲内存不够时,操作系统会释放部分cache memory区块或者buffers memory区块。

    2、df、du命令学习

    df(英文全拼:disk free)用于显示目前在Linux系统上的文件系统磁盘使用情况统计。

    第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。
    使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。
    用一个-i选项的df命令的输出显示inode信息而非块使用量

    du命令 查看目录和文件容量

    星光荡开宇宙
  • 相关阅读:
    Oracle 备份与恢复介绍
    Oracle 监听器
    ORA-01041: 内部错误,hostdef 扩展名不存在
    NIO读写文件并加锁
    ActiveMQ消息生产消费流程
    金额,有效值等保留小数位处理
    JVM
    Linux架构分布式集群之基础篇
    Vue.js 开发实践:实现精巧的无限加载与分页功能
    Mysql 查看连接数,状态
  • 原文地址:https://www.cnblogs.com/pogbar/p/15415429.html
Copyright © 2011-2022 走看看