硬盘异步写入机制
我们知道一般要操作一个文件必须先将其加载到内存中,如果文件每次次该都立刻回写到硬盘,那么肯定会频繁等待磁盘的IO,导致效率低下。 为了解决上述问题linux采用异步处理方式,加载到内存中的文件,如果没有被修改过那么该文件的状态就是 干净的,否则就是脏的,读写操作都是在内存中执行,这样效率高,然后不定时将内存中的脏数据回写到硬盘。 这样的好处是,不用频繁等待磁盘io,所以效率变高,但是缺点是内存中的脏数据还未写入到磁盘时,如果发生不正常关机,那么内存中已经修改的数据可能会丢失。 我们可以通过sync 命令来强制将内存的脏数据回写到硬盘,事实上我们在执行关机命令时 该命令会自动调用sync命令。 linux 操作系统会将常用的文件都加载到内存中,所以会看到内存占用很高的情况,这是正常的。
硬盘挂载
将文件系统和操作系统目录树结合的过程我们称为挂载。文件系统只能挂载到目录,挂载的目录就是这个文件系统的入口。
支持的文件系统类型
linux支持很多其他的文件系统 传统文件系统:ext2 minix fat 等 日志文件系统:ext3 ext4 ntfs zfs 等 网络文件系统:NFS SMBFS 等 可以通过如下命令来查看,当前系统支持的 文件系统
[root@localhost ~]# ls -l /lib/modules/$(uname -r)/kernel/fs
total 20
-rw-r--r--. 1 root root 5984 Apr 1 2020 binfmt_misc.ko.xz
drwxr-xr-x. 2 root root 25 Apr 6 2021 btrfs
drwxr-xr-x. 2 root root 30 Apr 6 2021 cachefiles
drwxr-xr-x. 2 root root 24 Apr 6 2021 ceph
......
drwxr-xr-x. 2 root root 24 Apr 6 2021 nfsd
drwxr-xr-x. 2 root root 4096 Apr 6 2021 nls
drwxr-xr-x. 2 root root 27 Apr 6 2021 overlayfs
drwxr-xr-x. 2 root root 27 Apr 6 2021 pstore
drwxr-xr-x. 2 root root 28 Apr 6 2021 squashfs
drwxr-xr-x. 2 root root 23 Apr 6 2021 udf
drwxr-xr-x. 2 root root 23 Apr 6 2021 xfs
通过如下命令开查看已经加载到内存中的文件系统
[root@localhost ~]# cat /proc/filesystems
nodev sysfs
......
nodev autofs
nodev pstore
nodev mqueue
nodev selinuxfs
xfs
虚拟文件系统(VFS)
Linux支持那么多的文件系统,那么它是如何同时操作多个文件系统的呢?其实linux系统在操作的时候不用关心具体的文件系统的细节,它直接操作的是经过抽象的虚拟文件系统。虚拟文件系统再根据具体文件系统执行相应的操作,如下:
XFS文件系统
从centos7 开始linux预设的文件系统由原来的ext4 编程了xfs,为什么linux舍弃了支持度最好的ext家族呢? 因为:ext 文件系统需要在格式化的时候预先规划好所有的 inode block 等内容,随着磁盘容量的不断扩充,向着PB EB发展,ext文件系统初始化会非常耗时。 随着虚拟化的发展巨型文件也越来越多,在操作这种巨型文件时需要考虑效率问题,而xfs就是一个适合巨型文件和高容量磁盘的文件系统。
xfs是一个文件日志系统,主要分为三部分,资料区、文件修改日志区、实时运行区 资料区 就像ext2中的 inode/block/super block ,所有的数据都存放在这个区域,有点像ext2 中的 block group ,xfs 该区域也分为多个存储群组,每个群组中都包含:superblock、剩余空间管理、inode分配。需要说明的是 xfs的inode 和 data block 都是在使用时才动态分配。因此xfs初始化特别快。 同时 xfs中的 block 和 inode 都支持多重容量,block 容量支持512bytes-64k,inode 容量支持 256 byte-2M。注意:xfs 支持这么大的容量linux 操作系统未必都支持。
日志区 如前文所述,修改文件内容时先将修改内容写入到日志区,待文件内容修改完毕,再从日志区清除相关记录。xfs 支持外部磁盘来作为日志区。如果用SSD可以提高效率。
实时运行区 当有文件创建时,xfs会总这个区域内找到一定数量的 extent区块,将文件写入到区块内,呆inode 等动态分配完毕后,再讲内容写入到 inode 和 data block 中, 该区域大小 4K-1G,最好不随便改动,默认即可。
xfs文件系统查看命令 如下命令可以查看xfs文件系统的信息
[root@localhost ~]# xfs_info /dev/sda1
meta-data=/dev/sda1 isize=512 [一个inode的容量] agcount=4【存储群组的个数】, agsize=65536【每个存储群组包含的iblock数量】 blks
= sectsz=512 【扇区大小为512byte】 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096【每个datablock 的大小4K】 blocks=262144【文件系统共有这么多个 data block】, imaxpct=25
= sunit=0 swidth=0【和磁盘阵列相关】 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal【表示日志区在本文件系统内不是外部文件系统】 bsize=4096【每一个块 4K】 blocks=2560【共2560块 4K*2560=10M】, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096【运行时区域 共4K】 blocks=0, rtextents=0
查看磁盘/目录容量
通过上文得知,磁盘的使用情况在 supber block 中保存,每个文件的大小则在文件的inode中保存。 df命令:可以列出文件系统的整体使用情况 du命令:查看文件系统/目录的磁盘使用情况
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 0 1.4G 0% /dev/shm
tmpfs 1.4G 9.6M 1.4G 1% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 5.7G 12G 34% /
/dev/sda1 1014M 150M 865M 15% /boot
tmpfs 278M 0 278M 0% /run/user/0
df 主要是从 super block中读取全局数据所以速度很快 du命令是到文件系统中去搜寻数据,因此速度可能会慢
[root@localhost ~]# du -sh
457M .
文件硬链接
由上一篇文章我们直到,文件名保存在目录中,文件内容保存在 文件inode中,如果同一个文件inode 被多个目录保存 这就是硬链接。 举例:文件 etc/a 是文件 /etc/b 的硬链接那么 这两个文件的 inode 是相同的,除了文件名两个文件的所有信息都相同。效果如下:
[root@localhost ~]# cd /etc
[root@localhost ~]# > a
[root@localhost ~]# ln a b
[root@localhost etc]# ll -i
total 1044
19333837 -rw-r--r--. 2 root root 0 May 30 07:34 a
19333837 -rw-r--r--. 2 root root 0 May 30 07:34 b
优点 通过两个文件名 都可以读写该文件,且在一个文件中完成修改后,另一个文件马上就可以看到修改后的内容。删除一个文件后还可以通过另一个文件访问。 缺点 只是在目录的data block中增加记录了文件名和 inode号码,因此这种关联 不能跨文件系统。且因为对目录建立硬链接时处理逻辑复杂,所以不能链接目录,
文件软链接
软连接又称为符号链接,和windows下的快捷方式类似。这种链接方式会建立一个独立的文件(有自己的inode),这个文件的数据读取会指向被连接的文件。示例如下:
[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
[root@localhost test]# echo 11111 > a.txt
[root@localhost test]# ln -s a.txt b.txt
[root@localhost test]# ll -i
total 4
35297085 -rw-r--r--. 1 root root 6 May 30 07:49 a.txt
35297087 lrwxrwxrwx. 1 root root 5 May 30 07:49 b.txt -> a.txt
我们可以看到两个文件的 inode 不同 是两个文件,而且软链接文件中会保存目标文件的信息。我们可以看到示例中链接文件大小是5,其实就是因为目标文件的名字 a.txt长度是5. 因为链接文件只是保存了目标文件名称,所以如果目标文件被删除那么连接文件也就无法访问文件内容了。 相比之下 似乎 硬链接更安全,但是由于限制太多 软连接用户更广泛。软连接支持目录
硬链接会增加文件的链接数 如下,为a.txt 建立硬链接c.txt 后,a.txt 连接数变为2 ,软连接不会增加这个数量
[root@localhost test]# ln a.txt c.txt
[root@localhost test]# ll
total 8
-rw-r--r--. 2 root root 21 May 30 07:53 a.txt
lrwxrwxrwx. 1 root root 5 May 30 07:49 b.txt -> a.txt
-rw-r--r--. 2 root root 21 May 30 07:53 c.txt
|