RHCE8学习过程(十三)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 系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除 inode 节点,就能起到删除文件的作用。
  2. 移动文件或重命名文件,只是改变文件名,不影响 inode 号码。
  3. 打开一个文件以后,系统就以 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

就是为什么每次修改完服务器的配置文件,都要重启服务,重新读一下配置文件。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Crazy_Hengji

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

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

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

打赏作者

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

抵扣说明:

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

余额充值