文件系统

==什么是文件系统?

计算机的文件系统是一种存储和组织数据的方法,文件系统使用文件和树形目录的抽象逻辑
概念代替了硬盘和光盘等物理设备使用数据块的概念
文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置。
实际上文件系统也可能仅仅是一种访问数据的界面而已,实际的数据是通过网络协议
(如NFS、SMB、9P等)提供的或者内存上,甚至可能根本没有对应的文件(如proc文件系统)

==什么是数据块?

块是一段标准长度(块大小)的字节或位元,一般为512字节或1024字节,又称为簇,是管理
存储的最小单元,一般一次会读取一个完整的块

==文件系统类型有哪些?

磁盘支持类型:FAT、exFAT、NTFS、HFS、HFS+、ext2、ext3、ext4、ODS-5、btrfs、XFS、UFS、ZFS。
linux支持类型:Btrfs、JFS、ReiserFS、exFAT、ext、ext2、ext3、ext4、XFS、ISO 9660、
Minix、MSDOS、UMSDOS、VFAT、NTFS(Linux Kernel内置的NTFS驱动程序,写入功能不稳定)、
HPFS、NFS、SMB、SysV、PROC等
Windows支持类型:FAT12/FAT16    FAT32/VFAT    FAT64/exFAT    NTFS

==不同的文件系统类型,怎么访问?

vfs虚拟文件系统,可以根据你操作的是哪个“实际文件系统”(哪个分区)来进行不同的实际的操作
VFS中提供一个抽象的struct结构体,然后对于每一个具体的文件系统要把自己的字段和函数填充进去

==ext2分区过程举例

bootblock blockgroup_0 blockgroup_1 blockgroup_2 blockgroup_n
            |        |
        |                        |
    |                                        |
superblock gdt blockbitmap inodebitmap inodetable datablocks


    boot block:大小1KB固定,磁盘分区信息和启动信息
    块:mkfs -b 设置block大小,大于1KB,块组起始就是0
    块组:每个block大小有关,block bitmap可容纳的大小*8bit,多余的大小顺延多个块组
    块组内容:

    super block 
    超级块    大小1 block    ,    文件信息 ,    dumpe2fs内容,损坏后整个分区完蛋
    每个块组有一个copy,内核只用第一个,fsck可以检查备份进行恢复
    
    GDT group description table
    块组描述符表,描述其他信息位置,inode、数据块起始位置和未使用,损坏后整个块组完蛋,reserv
    信息描述中占第二多部分
    
    block bitmap
    描述哪些块是空闲的
    
    inode位图
    描述哪些inode是空闲的
    
    inode表
    8K一个inode,一个占128字节,1/64块组大小,信息描述中占最多的部分
    stat(status) 功能说明:显示inode内容
    
    
    data block
    常规文件数据存储到数据块
    目录中的文件名称和目录名称到数据块
    符号链接较短,直接到inode,没有数据块
    设备文件,fifo和socket没有数据块
    
    FIFO有两种用途:
    (1)FIFO由shell使用以便数据从一条管道线传输到另一条,为此无需创建临时文件。
    (2)FIFO用于客户进程-服务器进程程序中,已在客户进程与服务器进程之间传送数据

    cp
    分配一个空闲的inode,inode表新加一个项目,目录中新加目录名执行inode,数据复制到block
    rm
    减少文件名对应inode的连接数,当为0时候,删除inode,释放数据
    mv
    inode不变,新加目录名,删除原有目录名,新目录名指向inode,数据块没有影响
    不同文件系统,则等同于cp+rm两个操作
    软连接
    ln -s source new,新建inode,数据内容指向源数据所在的目录,不影响源
    硬链接
    ln source new,指向同一个inode同一个数据块,增加一个链接
    ls -l查看其实是统计累加,硬链接会统计翻倍,du计算准确
    目录下的硬链接初始为2,. ..是硬链接到当前和上一级目录,本身一个硬链接
        
创建文件系统举例
    dd if=/dev/zero of=fs count=256 bs=4K
    mkfs fs
    dumpe2fs fs
    stat fs
    sudo mount -o loop fs /mnt
    od -tx1 -Ax fs
        以十六进制输出,每列输出一字节。od -tx1 testfile
        od、hexdump、xxd
        hexdump的输入格式最灵活,因为它有专门的参数指定格式, 常用选项 -C。
        od没什么特点,od -x 和不带选项的xxd差不多。
        xxd还可以通过-r选项把16进制表示的反转换为正常的文件
    debugfs fs
    debugfs 也提供了 cd、ls 等命令,不需要 mount 就可以查看这个文件系统中的目录


1M的文件系统,有5%的预留系统使用,1/64接近2%的inode
    
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          571f8127-3ea7-40e4-9ed4-d7520ac1ae04
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              128                    8K空间分配一个inode
Block count:              1024                    一个block大小1k
Reserved block count:     51                    只能由特权进程分配的文件系统百分比,保证继续正确运行
Free blocks:              986
Free inodes:              117
First block:              1                        block大于1k,first是0
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      3
Blocks per group:         8192                    BLOCK BITMAP 1024 * 8 bit
Fragments per group:      8192
Inodes per group:         128                    1M/8K
Inode blocks per group:   16                    每个inode 1/8个block
Filesystem created:       Tue Jul 30 16:29:04 2019
Last mount time:          n/a
Last write time:          Tue Jul 30 16:29:04 2019
Mount count:              0
Maximum mount count:      -1
Last checked:             Tue Jul 30 16:29:04 2019
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11                    前10个ext2保留,11是lost+found,2是根目录
Inode size:              128                        128个字节
Default directory hash:   half_md4
Directory Hash Seed:      9f8be758-4723-4853-98a7-96f413ac43fa


Group 0: (Blocks 1-1023)
  Primary superblock at 1, Group descriptors at 2-2
  Reserved GDT blocks at 3-5
  Block bitmap at 6 (+5), Inode bitmap at 7 (+6)
  Inode table at 8-23 (+7)
  986 free blocks, 117 free inodes, 2 directories
  Free blocks: 38-1023
  Free inodes: 12-128
    
lost+found是系统panic或者断电,未链接的文件被系统使用但是没有删除,有inode没有名字,mklost+found

e2label 相当于给分区重命名,即使硬盘顺序改变,系统可以自动挂载正确的分区
tune2fs是调整和查看ext2/ext3文件系统的文件系统参数
        -l 查看文件系统信息
        -c max-mount-counts 设置强制自检的挂载次数,如果开启,每挂载一次mount conut就会加1,超过次数就会强制自检
        -i interval-between-checks[d|m|w] 设置强制自检的时间间隔[d天m月w周]
        -m reserved-blocks-percentage 保留块的百分比
        -j 将ext2文件系统转换为ext3类型的文件系统
        -L volume-label 类似e2label的功能,可以修改文件系统的标签
        -r reserved-blocks-count 调整系统保留空间
        -o [^]mount-option[,...] Set or clear the indicated default mount options

du-Disk Usage
    逐个调用fstat这个系统调用,统计中不考虑Meta Data,inode等信息
    du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数
df-Disk Free
    statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况
    df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数
    
df命令获得真正的文件系统数据,而du命令只查看文件系统的部分情况    
    
已经删除的文件,如果有进程在引用,链接减一,还存在一个 inode的引用,df会统计,du不会统计
    
恢复已经删除,但是进程在使用的文件
        lsof |grep xxx.txt                    获取进程号
        ls -l /proc/6511/fd/*                获取正在使用文件的文件描述符
        cp /proc/6511/fd/3 xxx.saved        复制到文件


==mount的执行过程

目录项:目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,
更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计

第一部分建立vfsmount对象和superblock对象,必要时从设备上获取文件系统元数据;
第二部分将vfsmount对象加入到mount树和Hash Table中,并且将原来的dentry对象无效掉


==rootfs挂载
在启动选项中没有指定root=“”时候,采用ramfs进行启动mount
tmpfs启动会默认设置一半内存大小进行mount
==tmpfs挂载

==格式化文件系统

如何知道文件被哪个进程写
http://blog.yufeng.info/archives/2581#more-2581
SystemTap 是监控和跟踪运行中的Linux 内核的操作的动态方法

https://www.cnblogs.com/sparkbj/p/7161669.html
lsof(list open files)是一个列出当前系统打开文件的工具
列出除了某个用户外的被打开的文件信息
lsof   -u ^root
sar(SystemActivityReporter系统活动情况报告)


 

上一篇:elasticsearch索引的初始化操作


下一篇:POJ 2392 Space Elevator 多重部分和问题变种