==什么是文件系统?
计算机的文件系统是一种存储和组织数据的方法,文件系统使用文件和树形目录的抽象逻辑
概念代替了硬盘和光盘等物理设备使用数据块的概念
文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置。
实际上文件系统也可能仅仅是一种访问数据的界面而已,实际的数据是通过网络协议
(如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系统活动情况报告)