3. 磁盘和文件
Linux的文件存储结构如图3-29所示。
图3-29 Linux的文件结构
索引节点(inode)是持久化存储到磁盘中的,而目录项(dentry)是由内核维护(目录项缓存)的。
在讨论文件存储结构之前需要了解一下扇区(Sector)和块(block),一个扇区为512B,操作系统读取硬盘的时候,不会一个个扇区地去读取,这样效率非常的低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。每8个扇区为一个块,块的大小为(512B×8=4098B,即4KB)。文件数据都存储在“块”中,必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件的元信息区域就叫做索引节点(inode)。
inode包含文件的元信息,具体来说有以下内容。
•文件的字节数。
•文件拥有者的User ID。
•文件的Group ID。
•文件的读、写、执行权限。
•文件的时间戳。
时间戳共有三个。
Øctime指inode上一次变动的时间。
Ømtime指文件内容上一次变动的时间。
Øatime指文件上一次打开的时间。
•链接数,即有多少文件名指向当前inode。
•文件数据block的位置。
可以用stat命令,查看某个文件的inode信息。
# stat runserver.bat
File: runserver.bat
Size: 52 Blocks: 8 io Block:4096 regular file
Device: 801h/2049d Inode: 554863 Links: 1
Access: (0777/-rwxrwxrwx) stat runserver.bat
Access: 2019-12-06 01:38:13.895735646 -0800
Modify: 2019-01-30 01:40:25.009354932 -0800
Change: 2019-01-30 01:40:25.021354285 -0800
Birth: -
由于inode也要消耗硬盘,所以硬盘格式化的时候,操作系统会自动把硬盘分成两个区域:数据区,用于存放文件数据inode区(inode table),用于存放inode信息。
作为一个单独的inode节点,一般是128个字节或者256个字节。inode节点的总数,在格式化的时就给定了,一般是每1KB或每2KB设置一个inode节点。假定2GB的硬盘中,每个inode节点的大小为128个字节,每1KB设置一个inode节点,这样inode table的大小就会达到256MB,占整块硬盘的12.8%。
可以通过df -i命令来查看每个硬盘分区的inode总数和已经使用的数量。
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 531381 493 530888 1% /dev
tmpfs 539081 1016 538065 1% /run
/dev/sda1 1310720 364285 946435 28% /
tmpfs 539081 1 539080 1% /dev/shm
tmpfs 539081 5 539076 1% /run/lock
tmpfs 539081 18 539063 1% /sys/fs/cgroup
/dev/loop0 354 354 0 100% /snap/gnome-logs/81
/dev/loop1 25385 25385 0 100% /snap/gtk-common-themes/1198
…
还可以利用df来查看某个Filesystem磁盘详细情况。
# df /dev/sda1
Filesystem 1K-blocks Used Available Use%Mounted on
udev 373728 124 373604 1% /dev
使用-h参数更便于阅读。
# df -h /dev/sda1
Filesystem Size Used Avail Use% Mounted on
udev 365M 124K 365M 1% /dev
df如果不加-i参数,不会统计inode大小的。有时候剩余空间很充足,但是系统提示磁盘空间不足,可以确定是否索引过大需要占的磁盘空间,需要通过df -i来查看。
目录项(dentry)是用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。
在Windows95、Windows98中使用的是FAT格式的文件系统,到WindowNT以后Window改用NTFS文件格式。在Linux中文件格式就多了,包括。
•基于磁盘的文件系统。Ext4、XFS、OverlayFS等。
•基于内存的文件系统(虚拟文件系统)。不需要任何磁盘分配存储空间,但会占用内存。比如:/proc 、/sys。
•基于网络文件系统。NFS、SMB、iSCSI 等。
为了兼容以上各种不同的文件格式,Linux提出虚拟文件系统 VFS的概念,Viritual Filesystem给用户空间程序提供统一的文件和文件系统访问接口的内核子系统。借助VFS,即使文件系统的类型不同,也可以实现文件系统之间的交互,比如:移动、复制等。VFS所处位置如图3-30所示。
图3-30 Viritual File system所处位置