【原理剖析】b-Linux 系统文件管理
概述:从逻辑结构上看,Linux 系统中的文件是没有结构的流式文件。从物理结构上看,Linux 采用混合多重索引结构,即将文件所占用磁盘的盘块号直接或间接存放在该文件索引节点的地址项中。在查找文件时只要找到该文件的索引节点就可以用直接或间接的寻址方式获得指定文件的盘块号。
- Linux 文件的物理结构
- Linux 文件系统
- Linux 文件目录管理命令
- Linux 操作系统下的软链接和硬链接
0x01 Linux文件的屋里结构
在 Linux 中根据文件的大小,形成小型、中型、大型和巨型等不同规模的文件,如下图所示:
![图片描述](b-Linux 系统文件管理/1.png)
0x02 寻址方式
- 直接寻址方式
Linux 系统为了提高对文件的检索速度,采用直接寻址方式。在索引节点中建立 12 个地址项,用来直接存放该文件所在的盘块号,对应的盘块称为直接块。
- 一次间接寻址方式
当文件较大时,Linux 系统提供了一次间接寻址方式。在这种寻址方式中,一次间接地址项中所对应的盘块(间接块)存放的不是文件所在的物理盘块号,而是直接块的块号表。为了通过间接块读取文件数据,需要先读取间接块找到对应的直接块项,然后从直接块中读取数据。
- 多次间接寻址方式
对于大型或巨型的文件,Linux 系统又引入了二次间接寻址和三次间接寻址。二次间接项中存放的是一次间接块号表,三次间接项对应的盘块中放有二次间接块号表。
0x03 地址转换
Linux 系统利用地址转换过程将逻辑文件中的字节偏移量转换成文件的物理块号。首先,将字节偏移量转换成文件逻辑块号及块内偏移量,然后将逻辑块号转换成物理块号。
- 直接地址
当文件逻辑盘块号小于 12 时,将逻辑块号转换成物理块号的方法是将文件逻辑块号转换为索引节点的地址项下标,然后从该地址项中就可以直接获得该文件的物理盘块号。
- 间接地址
当计算出的文件逻辑块号大于或等于 12 而小于 268 时,采用一次间接地址方式。将逻辑块号转换为物理块号的方法是从一次间接项中得到一级间接的盘块号,根据该间接块的内容计算一次间接块中的地址下标,即将文件的逻辑块号减去 12 ,从相应下标的地址项中得到物理块号。
0x04 Linux文件系统
和普通 Unix 系统意义,Linux 使用树状的文件系统。每个系统都有一个根目录,从这里开始可以遍历整个系统中的所有文件,Linux 文件系统中没有类似 Windows 系统中的驱动器和盘符的概念。
0x05 Linux文件类型
Linux 系统下的文件类型主要有:
- 普通文件:C 语言元代码、SHELL 脚本、二进制的可执行文件等。分为纯文本和二进制。
- 目录文件:目录,存储文件的唯一地方。
- 链接文件:指向同一个文件或目录的的文件。
- 特殊文件:与系统外设相关的,通常在/dev 下面。分为块设备和字符设备。
在 Linux 系统下可以在终端使用 ls –l
、file
、stat
几个命令来查看文件的类型等相关信息。如下图所示:
![图片描述](b-Linux 系统文件管理/2.png)
0x06 Linux 文件存储结构
Linux 正统的文件系统(如 ext2
、ext3
)一个文件由目录项、inode 和数据块组成。
- 目录项:包括文件名和 inode 节点号。
inode
:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。- 数据块:文件的具体内容存放地。
Linux 正统的文件系统(如 ext2
、ext3
等)将硬盘分区时会划分出目录块、inode Table
区块和 data block
数据区域。一个文件由一个目录项、inode
和数据区域块组成。Inode
包含文件的属性(如读写属性、owner
等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从 inode table
中查出文件属性及数据存放点,再从数据块中读取数据。
如下图所示:
![图片描述](b-Linux 系统文件管理/3.png)
其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里),如下图所示:
![图片描述](b-Linux 系统文件管理/4.png)
其中文件的 inode 结构如下(inode 里所包含的文件信息可以通过 stat filename
查看得到):
![图片描述](b-Linux 系统文件管理/5.png)
以上只反映大体的结构,linux 文件系统本身在不断发展。但是以上概念基本是不变的。且如 ext2
、ext3
、ext4
文件系统也存在很大差别,如果要了解可以查看专门的文件系统介绍。
0x07 软连接、硬链接
软链接和硬链接是我们常见的两种概念:
- 硬链接:是给文件一个副本,同时建立两者之间的链接关系。修改其中一个,与其链接的文件同时被修改。如果删除其中 [color=red] 任意一个 [/color] 其余的文件将不受影响。
- 软链接:也叫符号链接,他只是对源文件在新的位置建立一个“快捷方式(借用一下
wondows
常用词)”,所以,当源文件删除时,符号链接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个链接,也不会影响到源文件,但对链接文件的使用、引用都是直接调用源文件的。
具体关系可以看下图:
![图片描述](b-Linux 系统文件管理/8.png)
从图上可以看出硬链接和软链接的区别:
- 硬链接原文件和新文件的
inode
编号一致。而软链接不一样。 - 对原文件删除,会导致软链接不可用,而硬链接不受影响。
- 对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。
0x08 Linux文件目录管理
磁盘和文件空间使用命令:
dd
:把指定的输入文件复制到指定的输出文件中,并且在复制过程中进行格式转换。fdisk
:创建和维护分区表的程序,它兼容 DOS 类型的分区表、BSD 或者 SUN 类型的磁盘列表。df
:可以显示所有文件系统对 i 节点和磁盘块的使用情况du
:该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块( 1024 字节)的情况。
文件目录与管理使用命令:
cd
:改变当前工作目录pwd
:显示当前工作目录的全路径名mkdir
:创建目录rmdir
:删除目录ls
:用于显示目录内容,类似DOS
下的dir
命令,它的使用权限是所有用户cp
:带目录复制rm
:删除文件或目录mv
:目录更名或搬移
查看文件内容命令:
cat
:cat [file]
查看文件的内容。全称是 concatenate 的意思,将文件内容连续输出到屏幕上。第一行到最后一行显示。tac
:tac [file]
和cat
刚好相反 是从最后一行到第一行的方式查看。
cat
有个比较不好的地方时当文件比较大时候没办法看清楚,这个时候可以用 more
或者 Less
命令。
more
:more [file]
如果使用grep
或者find
等命令时,可以配合使用more
一页一页的查看。如果看到一半想退出,则敲入’q’即可退出。less
:less [file]
less
比more
更有弹性,可以上下翻页。
如果只想读取文件的头几行或者文件的末尾几行,可以用 head
或 tail
.
head –n [file]
:读取文件的前 n 行。tail –n [file]
:读取文件末尾 n 行。
以上命令都是用于查看字符文件,二进制文件出来的都是乱码,要看二进制文件的内容,可以用 od
命令,如查看一个 MP3 文件里面的内容: od shijiemori.mp3
文件目录与权限命令:
chmod
:修改文件或目录的存取权限chown
:改变文件拥有者chgrp
:改变文件的所属组umask
:用来设定[权限掩码]。[权限掩码]是由 3 个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。
文件查找命令:
which
:which [filename]
该命令用于查询通过 PATH 路径到该路径内查找可执行文件。如:Which passwd:查找可执行文件 passwdwhereis
:whereis [-bmsu] [keyword]
该命令用于把相关字的文件和目录都列出来。(Linux 会将文件都记录在一个文件数据库里面,该命令式从数据库去查询,所以速度比较快,Linux 每天会更新该数据库)locate
:locate [filename]
该命令用于把相关字的文件和目录都列出来。查找数据特别快,也是通过数据库方式来查询。但是数据库一周更新一次,所以可能有些存在数据查不到。可以去修改配置文件。find
:find [path] [参数] [keyword]
该命令用于在指定路径下查找文件。不是通过数据来查询,所以速度会比较慢。
0x09 Linux文件系统常见目录描述
Linux 各种发行版的目录结构基本一致,各个目录简单介绍如下:
目录 | 描述 |
---|---|
/ | 根目录 |
/bin | 做为基础系统所需要的最基础的命令就是放在这里。比如 ls、cp、mkdir 等命令;功能和/usr/bin 类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。 |
/boot | Linux 的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB 或 LILO 系统引导管理器也位于这个目录;启动装载文件存放位置,如 kernels,initrd,grub。一般是一个独立的分区。 |
/dev | 一些必要的设备,声卡、磁盘等。还有如 /dev/null. /dev/console /dev/zero /dev/full 等。 |
/etc | 系统的配置文件存放地. 一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;/etc/opt:/opt 对应的配置文件;/etc/X11:Xwindows 系统配置文件;/etc/xml:XML 配置文件;…… |
/home | 用户工作目录,和个人配置文件,如个人环境变量等,所有的账号分配一个工作目录。一般是一个独立的分区。 |
/lib | 库文件存放地。bin 和 sbin 需要的库文件。类似 windows 的 DLL。 |
/media | 可拆卸的媒介挂载点,如 CD-ROMs、移动硬盘、U 盘,系统默认会挂载到这里来。 |
/mnt | 临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,比如有 cdrom 等目录。可以参看 /etc/fstab 的定义。 |
/opt | 可选的应用程序包。 |
/proc | 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如 cpu、硬盘分区、内存信息等)存放在这里。/proc 目录伪装的文件系统 proc 的挂载目录,proc 并不是真正的文件系统,它的定义可以参见 /etc/fstab 。 |
/root | Root 用户的工作目录 |
/sbin | 和 bin 类似,是一些可执行文件,不过不是所有用户都需要的,一般是系统管理所需要使用得到的。 |
/tmp | 系统的临时文件,一般系统重启不会被保存。 |
/usr | 包含了系统用户工具和程序。/usr/bin:非必须的普通用户可执行命令;/usr/include:标准头文件; /usr/lib:/usr/bin/ 和 /usr/sbin/的库文件; /usr/sbin:非必须的可执行文件;/usr/src:内核源码;/usr/X11R6:X Window System, Version 11, Release 6. |
/srv | 该目录存放一些服务启动之后需要提取的数据 |