linux文件系统原理详解2-文件系统、文件链接、挂载

硬盘异步写入机制

我们知道一般要操作一个文件必须先将其加载到内存中,如果文件每次次该都立刻回写到硬盘,那么肯定会频繁等待磁盘的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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当计算机启动时,操作系统需要将根文件系统挂载到指定的目录下,以便让用户能够访问和管理文件。以下是Linux文件系统挂载过程的详细解释: 1. BIOS/UEFI: 计算机开机后,首先执行BIOS或UEFI程序,进行硬件初始化和自检。然后BIOS/UEFI会查找并加载引导设备上的引导程序。 2. 引导程序:引导程序(例如GRUB)负责加载内核并开始操作系统的初始化过程。 3. 内核初始化:引导程序加载内核后,内核开始初始化各个子系统,包括内存管理、设备驱动、文件系统等。 4. init 进程:内核初始化完成后,会启动第一个用户空间进程init(通常是/sbin/init),它是所有其他进程的父进程。 5. /etc/fstab:init进程读取/etc/fstab文件,该文件定义了要挂载文件系统及其挂载点。 6. 根文件系统挂载:在/etc/fstab中,根文件系统的配置通常以“/”(斜杠)表示。init进程根据配置信息,将根文件系统挂载到指定的目录(通常是/)下。 7. 文件系统驱动:init进程通过相应的文件系统驱动来访问和管理根文件系统。 8. 用户空间初始化:根文件系统挂载完成后,init进程继续初始化其他用户空间的进程和服务。 总结来说,Linux文件系统挂载过程包括硬件初始化、引导程序加载、内核初始化、init进程启动、读取/etc/fstab配置文件、根文件系统挂载以及文件系统驱动的加载。这个过程确保了操作系统能够正常访问和管理文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值