赞
踩
文件系统狭义的概念是一种对存储设备上的数据进行组织和控制的机制。在Linux 下,文件的含义比较广泛,文件的概念不仅仅包含通常意义的保存在磁盘的各种格式的数据,毕竟“linux下一切皆文件”。
文件系统分为:块设备文件系统(存储设备是机械硬盘和 SSD 等块,如EXT2/3/4)、闪存文件系统(存储设备 NOR 闪存、NAND 闪存,常用的闪存文件系统有目录型闪存文件系统2JFFS2、无序区块镜像文件系统UBIFS)、内存文件系统(文件在内存中,如tmpfs)、伪文件系统。
传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;日志式文件系统: ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS;网络文件系统: NFS / SMBFS
查看自己的linux系统支持的文件系统
[root@lc133 ~]# ls -l /lib/modules/$(uname -r)/kernel/fs
总用量 56
drwxr-xr-x 2 root root 19 3月 15 2022 9p
drwxr-xr-x 2 root root 21 3月 15 2022 afs
-rwxr--r-- 1 root root 29096 3月 11 2022 binfmt_misc.ko
drwxr-xr-x 2 root root 22 3月 15 2022 btrfs
drwxr-xr-x 2 root root 27 3月 15 2022 cachefiles
drwxr-xr-x 2 root root 21 3月 15 2022 ceph
drwxr-xr-x 2 root root 21 3月 15 2022 cifs
drwxr-xr-x 2 root root 23 3月 15 2022 cramfs
drwxr-xr-x 2 root root 20 3月 15 2022 dlm
drwxr-xr-x 2 root root 25 3月 15 2022 ecryptfs
drwxr-xr-x 2 root root 22 3月 15 2022 exfat
drwxr-xr-x 2 root root 21 3月 15 2022 ext4
drwxr-xr-x 2 root root 21 3月 15 2022 f2fs
drwxr-xr-x 2 root root 51 3月 15 2022 fat
drwxr-xr-x 2 root root 25 3月 15 2022 freevxfs
drwxr-xr-x 2 root root 24 3月 15 2022 fscache
drwxr-xr-x 2 root root 55 3月 15 2022 fuse
drwxr-xr-x 2 root root 21 3月 15 2022 gfs2
drwxr-xr-x 2 root root 20 3月 15 2022 hfs
drwxr-xr-x 2 root root 24 3月 15 2022 hfsplus
drwxr-xr-x 2 root root 22 3月 15 2022 isofs
drwxr-xr-x 2 root root 21 3月 15 2022 jbd2
drwxr-xr-x 2 root root 22 3月 15 2022 ksmbd
drwxr-xr-x 2 root root 22 3月 15 2022 lockd
-rwxr--r-- 1 root root 18480 3月 11 2022 mbcache.ko
drwxr-xr-x 2 root root 22 3月 15 2022 netfs
drwxr-xr-x 5 root root 111 3月 15 2022 nfs
drwxr-xr-x 2 root root 40 3月 15 2022 nfs_common
drwxr-xr-x 2 root root 21 3月 15 2022 nfsd
drwxr-xr-x 2 root root 23 3月 15 2022 nilfs2
drwxr-xr-x 2 root root 4096 3月 15 2022 nls
drwxr-xr-x 2 root root 25 3月 15 2022 orangefs
drwxr-xr-x 2 root root 24 3月 15 2022 overlayfs
drwxr-xr-x 2 root root 24 3月 15 2022 pstore
drwxr-xr-x 2 root root 45 3月 15 2022 smbfs_common
drwxr-xr-x 2 root root 25 3月 15 2022 squashfs
drwxr-xr-x 2 root root 20 3月 15 2022 udf
drwxr-xr-x 2 root root 20 3月 15 2022 ufs
drwxr-xr-x 2 root root 20 3月 15 2022 xfs
drwxr-xr-x 2 root root 23 3月 15 2022 zonefs
查看内存中已加载的文件系统
[root@lc133 ~]# cat /proc/filesystems
nodev sysfs
nodev tmpfs
nodev bdev
nodev proc
nodev cgroup
nodev cgroup2
nodev cpuset
nodev devtmpfs
nodev configfs
nodev debugfs
nodev tracefs
nodev securityfs
nodev sockfs
nodev bpf
nodev pipefs
nodev ramfs
nodev hugetlbfs
nodev devpts
nodev autofs
nodev mqueue
nodev pstore
fuseblk
nodev fuse
nodev fusectl
xfs
nodev rpc_pipefs
nodev binfmt_misc
centos6默认使用ext4文件系统
[root@server1 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda10 ext4 3.8G 330M 3.3G 9% /
tmpfs tmpfs 7.9G 4.1G 3.8G 52% /dev/shm
/dev/sda2 ext4 24G 44M 23G 1% /app
/dev/sda1 ext4 3.8G 47M 3.6G 2% /boot
/dev/sda11 ext4 789G 37G 713G 5% /home
/dev/sda6 ext4 15G 38M 14G 1% /opt
/dev/sda7 ext4 15G 38M 14G 1% /tmp
/dev/sda3 ext4 24G 6.0G 17G 27% /usr
/dev/sda8 ext4 15G 4.3G 9.4G 32% /usr/local
/dev/sda5 ext4 20G 355M 18G 2% /var
centos7默认使用xfs文件系统
[root@lc133 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 959M 0 959M 0% /dev
tmpfs tmpfs 977M 0 977M 0% /dev/shm
tmpfs tmpfs 977M 9.8M 967M 1% /run
tmpfs tmpfs 977M 0 977M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 7.6G 9.5G 45% /
/dev/sda1 xfs 1014M 188M 827M 19% /boot
tmpfs tmpfs 196M 32K 196M 1% /run/user/1000
tmpfs tmpfs 196M 0 196M 0% /run/user/0
记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等,一个文件系统应该只有一个superblock.
inode 的默认大小为 128 Byte ( ext4 与 xfs 可设定到 256 bytes),每个文件均对应一个inode (索引节点) , 它是由文件系统中唯一数值编址,该数值称为inode 编号(或称inode 号, inode number) ,inode 存储了与文件有关的元数据,例如文件的访问权限、最后访问时间戳、所有者、用户组、大小以及文件数据的存储位置,inode 没有存储文件名 ,文件名保存在文件所在目录的 block 中。
inode节点的总数,在格式化时就给定(ext文件系统),或者动态配置(xfs文件系统),inodes最大数量就是文件的最大数量。
每个文件都独自占用一个 inode,文件内容由 inode 的记录来指向;
如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块;
查找文件的流程:系统会先根据文件名去查找它对应的 inode 号码,通过 inode 号码获取 inode 信息,根据 inode 信息看该用户是否具有访问这个文件的权限,如果有就指向对应的数据 block,并读取数据。在Linux内部的时候,访问文件都是通过inode号来进行的,所谓文件名仅仅是给用户容易使用的。
当我们查找一个文件,比如 /root/test 时,要经过以下步骤:
硬链接:硬链接有相同的inode号码,
不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变。
不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。
硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。
硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接
使用ln命令创建硬链接
ln [选项] 源文件 目标文件
经常看到一个目录有很多硬链接,比如etc目录
[root@lc133 hello]# stat /etc
文件:"/etc"
大小:12288 块:32 IO 块:4096 目录
设备:fd00h/64768d Inode:16777281 硬链接:155
权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2022-12-06 10:59:29.925515186 +0800
最近更改:2022-12-07 14:07:15.271842159 +0800
最近改动:2022-12-07 14:07:15.271842159 +0800
原因;两个特殊的文件夹 . (一个点) …(两个点)
[root@lc133 a]# ls -ia
3397110 . 51788110 ..
[root@lc133 a]# cd ..
[root@lc133 hello]# ls -ia
51788110 . 238718 .. 3397110 a
软连接,软链接有不同的inode号码
不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。
删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。
软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。
软链接可以链接目录。
软链接可以跨分区。
block 的大小可以是 1KB、2KB、4KB,默认为 4KB。文件是存储在硬盘上的,硬盘的最小存储单位叫做 “扇区” (sector),每个扇区存储 512 字节。一般连续八个扇区组成一个 “块” (block),一个块是 4K 大小,是文件存取的最小单位。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。
Block 的大小在创建文件系统的时候可以通过参数指定,如果不指定,则会从 /etc/mke2fs.conf 文件中读取对应的值。
在ext系统中:
block大小 | 1kb | 2kb | 4kb |
---|---|---|---|
单个文件最大容量 | 16GB | 256GB | 2TB |
文件系统的最大容量 | 2TB | 8TB | 16TB |
如果一个文件系统过于庞大时,将所有的inode和block放到一起会造成性能上的影响,所以在ext2的文件系统中,就出现了一个区块群组的概念。
在centos6中使用dumpe2fs查看ext4文件系统的具体信息,
先看下挂载位置
[root@server1 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda10 ext4 3.8G 330M 3.3G 9% /
tmpfs tmpfs 7.9G 4.1G 3.8G 52% /dev/shm
/dev/sda2 ext4 24G 44M 23G 1% /app
/dev/sda1 ext4 3.8G 47M 3.6G 2% /boot
/dev/sda11 ext4 789G 37G 713G 5% /home
/dev/sda6 ext4 15G 38M 14G 1% /opt
/dev/sda7 ext4 15G 38M 14G 1% /tmp
/dev/sda3 ext4 24G 6.0G 17G 27% /usr
/dev/sda8 ext4 15G 4.3G 9.4G 32% /usr/local
/dev/sda5 ext4 20G 356M 18G 2% /var
[root@server1 ~]# dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name: <none> #文件系统名称,
Last mounted on: /boot #最近一次挂载位置
Filesystem UUID: b7b8e165-0a00-46ff-8b65-6b7c7f88ea31 #uuid为linux对装置的定义码
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic) #下方features为文件系统的特征数据
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl #默认的挂载参数
Filesystem state: clean #文件系统状态
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 256000
Block count: 1024000
Reserved block count: 51200
Free blocks: 979713
Free inodes: 255961
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 249
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8000
Inode blocks per group: 500
RAID stride: 1
Flex block group size: 16
Filesystem created: Mon Jan 4 17:01:58 2021
Last mount time: Sun Dec 4 16:46:30 2022
Last write time: Sun Dec 4 16:46:30 2022
Mount count: 77
Maximum mount count: -1
Last checked: Mon Jan 4 17:01:58 2021
Check interval: 0 (<none>)
Lifetime writes: 168 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 0af1d738-cef0-4297-9db2-e5d715c4c21e
Journal backup: inode blocks #这几项为journal日志模式的部分参数,特征数据中has_journal开启日志
Journal features: (none)
日志大小: 64M
Journal length: 16384
Journal sequence: 0x0000007f
Journal start: 0
Group 0: (Blocks 0-32767) [ITABLE_ZEROED]
校验和 0x938d,7962个未使用的inode
主 superblock at 0, Group descriptors at 1-1
保留的GDT块位于 2-250
Block bitmap at 251 (+251), Inode bitmap at 267 (+267)
Inode表位于 283-782 (+283)
24475 free blocks, 7963 free inodes, 4 directories, 7962个未使用的inodes
可用块数: 8293-32767
可用inode数: 22, 39-8000
Group 1: (Blocks 32768-65535) [ITABLE_ZEROED]
校验和 0x1a9b,7998个未使用的inode
备份 superblock at 32768, Group descriptors at 32769-32769
保留的GDT块位于 32770-33018
Block bitmap at 252 (+4294934780), Inode bitmap at 268 (+4294934796)
Inode表位于 783-1282 (+4294935311)
22696 free blocks, 7998 free inodes, 2 directories, 7998个未使用的inodes
可用块数: 35247, 35262-35263, 35271, 35282-35283, 36702-36863, 43008-65535
可用inode数: 8003-16000
Group 2: (Blocks 65536-98303) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
校验和 0x6c35,8000个未使用的inode
Block bitmap at 253 (+4294902013), Inode bitmap at 269 (+4294902029)
Inode表位于 1283-1782 (+4294903043)
32768 free blocks, 8000 free inodes, 0 directories, 8000个未使用的inodes
可用块数: 65536-98303
可用inode数: 16001-24000
Group 3: (Blocks 98304-131071) [INODE_UNINIT, ITABLE_ZEROED]
....
dumpe2fs的前半部分显示的是超级块的信息,包括文件系统名称、已使用以及未使用的 inode 和 block 的数量、每个 block 和 inode 的大小,文件系统的挂载时间等。
后半部分,就是每个区块群组的详细信息(如 Group0、Group1)。
Superblock 是记录整个 filesystem 相关信息的地方,其实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定都包含 superblock,如果包含,也是做为第一个 block group 内 superblock 的备份。superblock 记录的主要信息有:
block group
Superblock(超级块) | 在 0号 block 内 |
---|---|
Group Description(组描述) | 用来描述每个 group 的开始与结束位置的 block 号码,位于1号block内 |
Block bitmap(块位图) | 记录的是使用与未使用的 block 号,位于251号block内 |
Inode bitmap(inode 位图) | 记录的是使用与未使用的 inode 号。位于267号block内 |
Inode table(inode 表) | Inode table 中存放着一个个 inode,inode 的内容记录文件的属性以及该文件实际数据是放置在哪些 block 内,位于283-782号block内 |
Data Blocks(数据块) | 是用来存放文件内容的地方,可用块数: 8293-32767 可用inode数: 22, 39-8000 |
ext文件系统(支持度最广、但格式化超慢):ext系列的文件系统,在文件格式化时,采用的是规划出所有的inode、区块、元数据等数据,未来系统可以直接使用,不需要再进行动态配置,但是这个做法在早期磁盘容量还不大的时候可以使用。如今,磁盘的容量越来越大,当使用磁盘容量在TB以上的传统ext系列文件系统在格式化的时候,会消耗相当多的时间。
xfs可以解决这个问题。xfs本身也是一个日志是的文件系统,ext4有的功能,xfs本身也都支持。
xfs文件系统在数据的分布上,主要规划为3个部分:
数据区(data section),数据区跟之前的 ext 一样,包括 inode/data block/superblock 等数据,都放置在这个区块。 这个数据区与 ext 家族的 block group 类似,也是分为多个储存区群组(allocation groups,AG) 来分别放置文件系统所需要的数据。 每个储存区群组都包含了 (1)整个文件系统的 superblock、 (2)剩余空间的管理机制、 (3)inode 的分配与追踪。此外,inode 与 block 都是系统需要用到时, 这才动态配置产生,所以格式化动作超级快!
文件系统活动登录区(log section),文件的变化会在这 里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。如果文件系统因为某些缘故 (例如最常见的停电) 而损毁时,系统会拿这个登录区块来进行检验,看看系统挂掉之前,文件系统正在运作些啥动作,藉以快速的修复文件系统。
实时运行区(realtime section)。当有文件被创建时,会在这个区段里找一个或多个的extent区块(根据文件大小选择区块的数据),并把文件暂时放置到这个区块内,等到分配完成后,再写入到数据区(data section)中的i节点与区块中。extent区块的大小要在格式化的时候要先指定大小,它的值在4K~1G之间。一般非磁盘陈列的磁盘默认为64K容量,而如果具有类似磁盘陈列的stripe情况下,则应该将其大小设置为与stripe一样大,通常情况下这个值不改变为最好,因为它会影响到物理磁盘的性能。
在centos7中使用xfs_info查看xfs文件系统的具体信息
[root@lc133 hello]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 959M 0 959M 0% /dev
tmpfs tmpfs 977M 0 977M 0% /dev/shm
tmpfs tmpfs 977M 9.5M 968M 1% /run
tmpfs tmpfs 977M 0 977M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 7.6G 9.5G 45% /
/dev/sda1 xfs 1014M 188M 827M 19% /boot
tmpfs tmpfs 196M 12K 196M 1% /run/user/42
tmpfs tmpfs 196M 0 196M 0% /run/user/0
[root@lc133 hello]# xfs_info /dev/sda1
meta-data=/dev/sda1 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
描述元数据的部分 | isize:inode的容量,每个是512 。 agcount:存储区群组(ag)的数量,4个 。 agsize:每个ag包含的block的数量,65536。配合bsize可以计算出每个ag的大小。 sectsz:逻辑扇区的大小,512byte。 整个文件系统的容量4*65536*4k=1048576k,大概一个G |
---|---|
数据区(data) | bsize:block的大小。 blocks:有多少个block sunit和swidth与磁盘阵列的相关性比较高,虚拟机默认没有做raid。 |
日志区域(log) | log =internal表示日志区域使用的不是一个设备 |
实时运作区域 | realtime =none 目前还没有用过,每个extend的大小是4096 |
nfs,ext为具体的文件系统。文件系统的种类很多,而操作系统为了实现对用户提供一个统一的接口,于是在用户层与为文件系统层引入了中间层,这个中间层就被称为虚拟文件系统。
一台服务器存在多种文件系统,如根目录下dev,proc,run,sys的inode节点一样,但属于不同的文件系统,所以并不是同一个文件。
[root@lc133 /]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 959M 0 959M 0% /dev
tmpfs tmpfs 977M 0 977M 0% /dev/shm
tmpfs tmpfs 977M 9.5M 968M 1% /run
tmpfs tmpfs 977M 0 977M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 7.6G 9.5G 45% /
/dev/sda1 xfs 1014M 188M 827M 19% /boot
tmpfs tmpfs 196M 12K 196M 1% /run/user/42
tmpfs tmpfs 196M 0 196M 0% /run/user/0
[root@lc133 /]# ls -i
163334 bin 1 dev 50331763 home 83 lib64 16778318 mnt 1 proc 1 run 50331764 srv 16777288 tmp 50331713 var
64 boot 16777281 etc 81 lib 84 media 33763818 opt 33574977 root 163338 sbin 1 sys 33763755 usr
VFS(Virtual Filesystem Switch)定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的统一接口就可。
虚拟文件系统在文件系统挂载之后,将文件系统的一些元数据加载到内存中,虚拟文件系统只存在于内存中,它在系统启动时被创建,系统关闭时注销。VFS作用就是屏蔽给各类文件系统的差异,给用户、应用程序一个统一的接口。
虚拟文件系统在linux中的位置
VFS是一种软件机制,只存在于内存中,每次系统初始化期间Linux都会先在内存中构造一棵VFS的目录树(也就是源码中的namespace)。
对于每个具体的文件系统,他们有自己的组织方法,操作方法。对于用户来说,只能于VFS打交道,不用也不能区别对待这些真正的文件系统。实际中使用系统调用函数例如read,write,映射到vfs中就是sys_read,sys_write,vfs会根据你操作的是哪个“实际文件系统”(哪个分区)来进行不同的实际的操作。
伪文件系统是为了使用vfs的编程接口而设计的假的文件系统,常用的有文件系统有:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。