Linux 文件系统结构
十三、Linux 文件系统结构
13.1、文件系统结构
Linux 文件系统由三部分组成 : 文件名,inode,block
Linux 文件系统: ext3,ext4,xfs
windows 文件系统: FAT32,NTFS
13.1.1 文件名
[root@xuegod63 ~]# cp /etc/passwd a.txt
[root@xuegod63 ~]# ls a.txt # a.txt 就是文件名
a.txt
13.1.2 inode 的内容
inode 包含文件的元信息,具体来说有以下内容:
* 文件的字节数
* 文件拥有者的 User ID
* 文件的 Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime 指 inode 上一次变动的时间,mtime 指文件内容上一次变动的时间,atime 指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个 inode
* 文件数据 block 的位置 / block 指针
echo $LANG 查看当前字符集 zh_CN.UTF-8 如果修改:LANG=“en_US.UTF-8” 字符集改为英文
用 stat 命令,查看某个文件的 inode 信息:
[root@Hengji ~]# stat a.txt
文件:a.txt
大小:2747 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:67178027 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-10-28 11:02:00.188403794 +0800
最近更改:2020-10-28 11:02:00.189403794 +0800
最近改动:2020-10-28 11:02:00.189403794 +0800
创建时间:-
[root@Hengji ~]# ll /etc/passwd #ll 其实就是查看 passwd 的 inode 信息
-rw-r--r--. 1 root root 2747 9月 3 10:24 /etc/passwd
mtime : modify time 修改文件内容的时间
atime : access time 访问文件内容的时间
ctime 指 inode 上一次文件属性变动的时间,change time 。 (如修改拥有者)改变文件属性
比如: chmod +x a.sh
mtime 指文件内容上一次变动的时间,modify time 。
如:echo aa >> a.sh 或 vim a.sh 修改内容
atime 指文件上一次查看文件的时间,access time 。 如: cat a.sh
[root@Hengji ~]# stat a.txt #查看时间
文件:a.txt
大小:2747 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:67178027 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-10-28 11:02:00.188403794 +0800
最近更改:2020-10-28 11:02:00.189403794 +0800
最近改动:2020-10-28 11:02:00.189403794 +0800
创建时间:-
[root@Hengji ~]# date -s '13:42'
2020年 10月 28日 星期三 13:42:00 CST
[root@Hengji ~]# vim a.txt #写入 aaaa,vim 会修改 mtime 和 atime 时间
[root@Hengji ~]# stat a.txt #查看时间
文件:a.txt
大小:2751 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:67184846 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-10-28 13:42:21.876001320 +0800
最近更改:2020-10-28 13:42:21.876001320 +0800
最近改动:2020-10-28 13:42:21.877001320 +0800
创建时间:-
[root@Hengji ~]# chmod +x a.txt
[root@Hengji ~]# stat a.txt
文件:a.txt
大小:2751 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:67184846 硬链接:1
权限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-10-28 13:42:21.876001320 +0800
最近更改:2020-10-28 13:42:21.876001320 +0800
最近改动:2020-10-28 13:42:38.835002343 +0800
创建时间:-
13.1.3 inode 的大小
inode 也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区(inode table),存放 inode 所包含的信息。
每个 inode 节点的大小,一般是 128 字节或 256 字节。inode 节点的总数,在格式化时就给定,假定在一块 1GB 的硬盘中,每个 inode 节点的大小为 128 字节,每 1KB 就设置一个 inode,那么 inode table 的大小就会达到 128MB,占整块硬盘的 12.8%。
inode 号码
每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件。
Unix/Linux 系统内部不使用文件名,而使用 inode 号码来识别文件。对于系统来说,文件名只是inode 号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的 inode 号码;其次,通过 inode 号码,获取 inode 信息;最后,根据 inode 信息,找到文件数据所在的 block,读出数据。
内核发布指令>查找文件信息>发现 inode 号>找到 block 指针>文件位置。
使用 ls -i 命令,可以看到文件名对应的 inode 号码
[root@Hengji ~]# ls -i a.txt
67184846 a.txt
查看每个硬盘分区的 inode 总数和已经使用的数量,可以使用 df 命令
[root@Hengji ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 1010029 406 1009623 1% /dev
tmpfs 1016901 1 1016900 1% /dev/shm
tmpfs 1016901 932 1015969 1% /run
tmpfs 1016901 17 1016884 1% /sys/fs/cgroup
/dev/sda2 26214400 185881 26028519 1% /
/dev/sda1 65536 320 65216 1% /boot
tmpfs 1016901 23 1016878 1% /run/user/42
tmpfs 1016901 36 1016865 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS-8-2-2004-x86_64-dvd
由于每个文件都必须有一个 inode,因此有可能发生 inode 已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
13.1.4 目录文件
Unix/Linux 系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的 inode 号码。
ls -i 命令列出整个目录文件,即文件名和 inode 号码:
[root@Hengji ~]# ls -id /etc
33554561 /etc
[root@Hengji ~]# ls -i /etc
33928937 adjtime 34848526 man_db.conf
...
13.1.5 block 块大小
block 是真正存储数据的地方。
block 是 文件系统 中最小的存储单位
扇区 是 磁盘 中最小的存储单位
在 linux 下中叫:block,在 windows 中叫:簇
操作系统读取硬盘的时候,不会一个个扇区(512 字节)地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是 1KB,即连 2 个 sector 扇区组成一个block。或 4K。
查看 Linux 系统块大小
[root@Hengji ~]# stat /etc/passwd | grep IO
大小:2747 块:8 IO 块:4096 普通文件
总结:
硬盘的结构:ZBR 区位记录
inode(inode 表中主要看 inode 号)
inode 号唯一标识一个文件(一个文件系统里面)
inode 用完了,文件就不能创建了。
inode 数据量设置大一些:可以创建多个文件。占用空间比较大
inode 数据量设置小一些:可以创建很少文件。占用空间比较小
block
block 设置大:效率高,利用率低。
block 设置小:效率低,利用率高。
13.2、文件的硬链接和软链接
13.2.1 Linux 链接概念
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为软链接,即符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。
硬连接:
硬连接指通过索引节点号来进行连接。inode 是可以对应多个文件名的
在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。
在 Linux 中,多个文件名可以指向同一索引节点。一般这种连接就是硬连接。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软连接
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
13.2.2 ln 命令创建硬链接
[root@Hengji ~]# ln a.txt b.txt
[root@Hengji ~]# ll a.txt
-rwxr-xr-x. 2 root root 2751 10月 28 13:42 a.txt
[root@Hengji ~]# ll b.txt
-rwxr-xr-x. 2 root root 2751 10月 28 13:42 b.txt
[root@Hengji ~]# echo 11111 > a.txt
[root@Hengji ~]# cat a.txt
11111
[root@Hengji ~]# cat b.txt
11111
[root@Hengji ~]# echo 222 >> b.txt
[root@Hengji ~]# cat b.txt
11111
222
[root@Hengji ~]# cat a.txt
11111
222
[root@Hengji ~]# ls -i a.txt
67184846 a.txt
[root@Hengji ~]# ls -i b.txt
67184846 b.txt
[root@Hengji ~]# chmod 777 a.txt
[root@Hengji ~]# ll a.txt
-rwxrwxrwx. 2 root root 10 10月 28 13:51 a.txt
[root@Hengji ~]# ll b.txt
-rwxrwxrwx. 2 root root 10 10月 28 13:51 b.txt
创建硬链接,属性是一致的。
写入一个文件数据,可以看到内容是实时显示的。
两个文件内容是一样的。
两个文件的INODE是一样的。权限修改后,两个文件都会改。
硬链接的原理就是多个文件名指向同一个 inode,因此多个文件名共用一个 inode 号,达到共享与备份的目的
源文件被删除,不影响链接文件的正常使用
[root@Hengji ~]# rm -f a.txt
[root@Hengji ~]# cat b.txt
11111
222
[root@Hengji ~]# echo 00000 >> b.txt
[root@Hengji ~]# cat b.txt
11111
222
00000
硬链接不能针对目录创建
[root@Hengji ~]# ln /etc/ test
ln: /etc/: 不允许将硬链接指向目录
13.2.3 ln -s 创建软连接
软链接:相当于 windows 中的快捷方式
语法:ln -s 源文件 软链接的名字
[root@Hengji ~]# cp /etc/passwd a.txt
[root@Hengji ~]# ln -s a.txt a-link.txt
[root@Hengji ~]# ll a-link.txt
lrwxrwxrwx. 1 root root 5 10月 28 13:57 a-link.txt -> a.txt
[root@Hengji ~]# rm -rf a.txt
[root@Hengji ~]# ll a-link.txt
lrwxrwxrwx. 1 root root 5 10月 28 13:57 a-link.txt -> a.txt
源文件被删除,链接文件失效
能针对目录和跨分区创建软链接
[root@Hengji ~]# ln -s /boot/grub grub-link
[root@Hengji ~]# ll -d grub-link
lrwxrwxrwx. 1 root root 10 10月 28 16:27 grub-link -> /boot/grub
13.2.4 inode 的特殊作用
由于 inode 号码与文件名分离,这种机制导致了一些 Unix/Linux 系统特有的现象。
- 有时,文件名包含特殊字符,无法正常删除。这时,直接删除 inode 节点,就能起到删除文件的作用。
- 移动文件或重命名文件,只是改变文件名,不影响 inode 号码。
- 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从 inode 号码得知文件名。
vim 每次修改完后,Inode 号都会变
[root@Hengji boot]# cp /etc/passwd passwd
[root@Hengji boot]# ls -i passwd
319 passwd
[root@Hengji boot]# vim passwd
[root@Hengji boot]# ll -i passwd
321 -rw-r--r--. 1 root root 2751 10月 28 16:30 passwd
就是为什么每次修改完服务器的配置文件,都要重启服务,重新读一下配置文件。