Linux文件存储结构与共享

455 阅读3分钟

Linux文件与目录

文件目录结构

目录全称作用
usrUnix Software Resource建议用来存放所有的软件
home普通用户的目录
rootroot用户所在目录
mntmount挂载设备,如U盘等
mediamount挂载媒体设备,如光盘等
bin存放系统的各个命令
etc存放配置文件
dev存放设备文件

文件命名规则

可用字符

除了"/"字符之外,所有字符都可以使用,但是使用一些特殊字符会造成很多麻烦。

使用空格,<,>,?,*,非打印字符进行文件命名,在访问文件时会产生很多不必要的麻烦。如访问hello world.txt,必须使用转义字符进行转义或者使用引号。

区分大小写

目录名区分大小写,但是不建议

文件名区分大小写,但是不建议使用字符大小写区分不同文件。

扩展名无意义

不同于Windows,Linux系统中,文件的扩展名毫无意义。hello.txthello.mp4并无区别。Linux系统中,并不以文件的扩展名区别文件类型。

Linux文件系统

文件存储结构

几个重要的概念

  对于操作系统来说,文件的组织有几个重要的概念。目录,目录项,文件控制块,索引节点inode.

名称作用
目录实质也是一个文件,目录是目录项构成的线性表
目录项和文件控制块FCB相近,存放着文件的名称和inode指针
inode存放着文件的元数据
数据块文件的内容存放在磁盘的数据块之中

目录和目录项

Linux系统的目录项是由文件名inode指针构成的数据结构,目录项也可以称之为文件控制块FCB.Windows系统的FCB包括的信息包括文件名和inode中保存的信息,而Linux中将除文件名的其他信息都存放到了inode节点中.Linux中目录项的类图为:

classDiagram
class FCB{
    +file_name
    +inode_index
}

inode

  inode节点记录了文件的元数据,其中最重要的一个信息就是文件内容在系统数据块区的位置.可以使用stat命令,查看一个文件的inode的信息.如:

qingbin@Pc-QingBin:~$ stat paper.pdf
File: paper.pdf                             # 文件名
Size:  373939                               # 文件大小
Blocks: 736                                 # 为文件分配的磁盘块数
IO Block: 512                               # 每个块的大小,以字节(KB)为单位
regular file                                # 文件的类型
Device: 2h/2d                               # 设备编号,在Linux中,设备也是文件
Inode: 3377699720594374                     # inode的索引号,index
Links: 1 # 硬链接的数量
Access: (0777/-rwxrwxrwx)                   # 文件的访问权限
Uid: ( 1000/ qingbin)                       # 所有者的id
Gid: ( 1000/ qingbin)                       # 所有者的组id
Access: 2022-05-31 12:17:07.662225600 +0800 # 最近访问时间
Modify: 2021-07-03 16:47:00.201650800 +0800 # 最近修改时间
Change: 2021-07-03 16:47:00.201650800 +0800 # 更改数据
Birth: -

  实际上,使用ls -l命令查看文件的详细信息时,其先查找文件的inode index,然后根据index从索引区中查询文件的其他信息.

目录项,inode,data block之间的关系

  一个文件可以被多个用户共享,他们并不需要使用额外的创建文件inode,数据块等,只需要在自己的目录上加入一个目录项就行,目录项中文件的名字可以随意取.

graph LR
subgraph zhangsan目录区
目录项1(目录项1-file_name=hwllo.txt)
end
subgraph lisi目录区
目录项2(目录项2-file_name=world.txt)
end
subgraph inode区
inode(inode count=2)
end
subgraph 数据块区
data_blocks
end
目录项1-->inode-->data_blocks
目录项2-->inode

  这种硬链接形式的文件共享,在inode节点的引用计数器count=0时会删除文件.

软链接与硬链接

硬链接
硬链接介绍

  硬链接是目录项指向inode的一个指针.一个文件只有一个inode节点,通过多个目录项指向同一个inode,可以实现文件的共享.inode节点中通过设置引用计数器count记录有多少个目录项指向该inode,当count=0时,说明没有目录项引用,因此就会删除该文件.

硬链接示意图
graph LR
subgraph zhangsan目录区
目录项1(目录项1-file_name=hwllo.txt)
end
subgraph lisi目录区
目录项2(目录项2-file_name=world.txt)
end
subgraph inode区
inode(inode count=2)
end
subgraph 数据块区
data_blocks
end
目录项1-->inode-->data_blocks
目录项2-->inode
ln命令创建硬链接

  Linux中使用ln命令创建链接,实现文件共享.在目录中,创建hello.txt,使用ln命令创建硬链接.

$ touch hello.txt
$ ls -l hello.txt
-rw-r--r-- 1 qingbin qingbin 0 Jun  2 12:02 hello.txt
$ ln hello.txt hello_world.txt
$ ls -li
total 0
2533274790550902 -rw-r--r-- 2 qingbin qingbin 0 Jun  2 12:02 hello.txt
2533274790550902 -rw-r--r-- 2 qingbin qingbin 0 Jun  2 12:02 hello_world.txt

  可以看出使用ln命令创建硬链接时,由hello.txt创建的hello_world.txthelo.txt使用的是同一个inode index,因此两个文件的各个信息,如权限,修改时间等信息都是相同的.因为有两个目录项:hello.txthello_world.txt共同指向了inode index=2533274790550902的索引节点,因此该inode的引用计数器count=2.

软链接
软链接介绍

  软链接类似于Windows中的快捷方式,他创建一个额外的文件,指向原有目录项,又叫做符号链接.

软链接示意图
graph TD
subgraph zhangsan目录区
目录项1(目录项1-file_name=hwllo.txt)
end
subgraph lisi目录区
目录项2(目录项2-file_name=world.txt)
end
subgraph inode区
inode(inode1 count=1)
inode2(inode2 count=1)
end
subgraph 数据块区
data_blocks
end
目录项1-->inode-->data_blocks
目录项2-->inode2
inode2-->目录项1
ln -s创建软链接

  对于上面所创建的文件,使用ln -s命令创建软链接文件hello_sl.txt,其结果为:

$ ln -s hello.txt hello_sl.txt
$ ls -li
total 0
2533274790550902 -rw-r--r-- 2 qingbin qingbin 0 Jun  2 12:02 hello.txt
2533274790550904 lrwxrwxrwx 1 qingbin qingbin 9 Jun  2 12:37 hello_sl.txt -> hello.txt
2533274790550902 -rw-r--r-- 2 qingbin qingbin 0 Jun  2 12:02 hello_world.txt

  可以看出,对于原始文件hello.txt与创建的软链接文件hello_sl.txt指向的是不同的inode,且新建软链接文件并不增加hello.txt目录项所指向的inode的引用计数器count数值不变.

文件系统存储结构

Linux使用ext作为文件系统,ext磁盘在磁盘的布局上为

ext4文件系统磁盘布局.webp

Block group的核心结构为:

flowchart LR
   subgraph block_group
       subgraph 超级块
       end
       subgraph inode表
       end
       subgraph 数据块
       end
   end

REFERENCE

  1. inode详解
  2. Linux stat命令详解
  3. Ext4 Disk Layout