1 Linux文件系统基础知识
1.1 文件结构
1.2 文件类型
1.3 存取权限和文件模式
1.4 Linux文件系统
2 虚拟文件系统
3 其他
3.1 相关命令
3.2 proc目录
3.2.1 /proc 以数字命名的目录
3.2.2 /proc 系统信息文件
4 参考
1 Linux文件系统基础知识
1.1 文件结构
Linux使用标准的目录结构,在Linux安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型, 如下图所示:
Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。在Linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。因为Linux是一个多用户系统,因此制定这样一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理。下面列出了Linux下一些主要目录的功能:
/bin 二进制可执行命令
/dev 设备特殊文件
/etc 系统管理和配置文件
/home 用户主目录的基点,比如用户user的主目录就是/home/user。
/lib 标准程序设计库,又叫动态链接共享库。
/sbin 系统管理命令,这里存放的是系统管理员使用的管理程序
/tmp 公用的临时文件存储点
/root 系统管理员的主目录
/mnt 用户临时安装其他文件系统的目录。
/proc 虚拟的目录,不占用磁盘空间,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var 某些大文件的溢出区,例如各种服务的日志文件
/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录下。
1.2 文件类型
文件类型 | 作用 |
---|---|
常规文件 | 计算机用户和操作系统用于存放数据、程序等信息的文件。一般都长期地存 放在外存储器(磁盘、磁带等)中。常规文件一般又分为文本文件和二进制文件。 |
目录文件 | Linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录文件就是将文件的名称和它的索引节点号结合在一起的一张表。目录文件只允许系统进行修改。用户进程可以读取目录文件,但不能对它们进行修改。 |
设备文件 | Linux把所有的外设都当作文件来看待。每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp文件,第一个软盘驱动器对应/dev/fd0文件 |
管道文件 | 主要用于在进程间传递数据。管道是进程间传递数据的“媒介”。某进程数据写入管道的一端,另一个进程从管道另一端读取数据。Linux对管道的操作与文件操作相同,它把管道做为文件进行处理。管道文件又称先进先出(FIFO)文件。 |
链接文件 | 又称符号链接文件,它提供了共享文件的一种方法。在链接文件中不是通过文件名实现文件共享,而是通过链接文件中包含的指向文件的指针来实现对文件的访问。使用链接文件可以访问常规文件,目录文件和其它文件 |
1.3 存取权限和文件模式
为了保证文件信息的安全,Linux设置了文件保护机制,其中之一就是给文件都设定了一定的访问权限。当文件被访问时,系统首先检验访问者的权限,只有与文件的访问权限相符时才允许对文件进行访问。
Linux中的每一个文件都归某一个特定的用户所有,而且一个用户一般总是与某个用户组相关。Linux对文件的访问设定了三级权限:文件所有者,与文件所有者同组的用户,其他用户。对文件的访问主要是三种处理操作:读取、写入和执行。三级访问权限和三种处理操作形成了9种情况,如下图所示:
1.4 Linux文件系统
文件系统指文件存在的物理空间,Linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。Linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。
- 索引节点(inode)
Linux文件系统使用索引节点来记录文件信息,索引节点是一个数据结构,它包含文件的长度、创建时间、修改时间、权限、所属关系、磁盘中的位置等信息。每个文件或目录都对应一个索引节点,文件系统把所有的索引节点形成一个数组,系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为 索引节点号。文件系统正是靠这个索引节点号来识别一个文件。可以用ls –i命令查看文件的索引节点。
- 软链接和硬链接
可以用链接命令ln(Link)对一个已经存在的文件再建立一个新的链接,而不复制文件的内容。顾名思义,ln是将两个文件名彼此链接起来,使得用户无论使用哪一个文件名都可以访问到同一文件。链接有 软链接(也叫 符号链接 )和 硬链接之分。
硬链接(hard link)就是让一个文件对应一个或多个文件名, 硬链接有两个限制,
- 不允许给目录创建硬链接;
- 只有在同一文件系统中的文件之间才能创建链接
例如, 为owner.txt创建硬链接owner2.txt
ln owner.txt owner2.txt
ls -i | grep owner
143432398 owner.txt
143432398 owner2.txt
可以看到, owner.txt和owner2.txt的索引节点号相同。
为了克服硬链接的两个限制,引入 符号链接 (symbolic link)。符号链接实际上是一种特殊的文件,这种文件包含了另一个文件的任意一个路径名。这个路径名指向位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件。系统会自动把对符号链接的大部分操作(如读、写等)变为对源文件的操作,但某些操作(如删除等)就会直接在符号链接上完成。
例如下面为文件创建软链:
ln -s owner.txt owner2.txt
ls -i | grep owner
143432398 owner.txt
143448635 owner2.txt
可以看到, owner.txt和owner2.txt的索引节点号不相同。
由于索引节点号inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
- 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用, 比如删除上面的owner2.txt :
find . -inum 143448635 -exec rm -i {} \;
- 移动文件或重命名文件,只是改变文件名,不影响inode号码。
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
索引节点号的总数是有限制的,可以通过df -i 命令查看索引节点的使用情况,如下示例:
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 2621440 127120 2494320 5% /
/dev/vdb 20971520 902254 20069266 5% /home
2 虚拟文件系统
为了保证Linux的开放性,设计人员必须考虑如何使Linux除支持Ext4文件系统外,还能支持其他各种不同的文件系统,例如集群文件系统以及加密文件系统等。为此,就必须将各种不同文件系统的操作和管理纳入到一个统一的框架中,使得用户程序可以通过同一个文件系统界面,也就是同一组系统调用,能够对各种不同的文件系统以及文件进行操作。这样,用户程序就可以不关心各种不同文件系统的实现细节,而使用系统提供的统一、抽象、虚拟的文件系统界面。这种统一的框架就是所谓的虚拟文件系统转换(Virtual Filesystem Switch),一般简称虚拟文件系统 (VFS)。虚拟文件系统描述如下所示:
可以把文件看作是一个有序字节串,字节串中第一个字节是文件的头,最后一个字节是文件的尾。为了便于系统和用户识别,每一个文件都被分配了一个便于理解的名字。典型的文件操作有读、写、创建和删除等。
文件系统通过目录来组织文件。文件目录好比一个文件夹,用来容纳相关文件。因为目录也可以包含子目录,所以目录可以层层嵌套,形成文件路径。路径中的每一部分被称作目录项,例如“/home/clj/myfile”是文件路径的一个例子,其中根目录是/,home,clj和文件myfile都是目录项。在Unix中,目录属于普通文件,所以对目录和文件可以实施同样的操作。
文件系统如何对文件的属性(例如文件名,访问控制权限、大小、拥有者、创建时间等信息)进行描述?这就是索引节点(index Inode),为什么不叫文件控制块而叫索引节点,主要是因为有一个叫索引号的属性可以惟一的标识文件。
以上说明了文件,目录项,索引节点,还有超级块,超级块是一种包含文件系统信息的数据结构。
通过以上的介绍,可以概括出VFS中四个主要对象:
- 超级块对象:描述已安装文件系统。
- 索引节点对象:描述一个文件。
- 目录项对象:描述一个目录项,是路径的组成部分。
- 文件对象:描述由进程打开的文件。
注意,因为VFS将目录作为一个文件来处理,所以不存在目录对象。换句话说,目录项不同于目录,但目录却和文件相同。
3 其他
3.1 相关命令
Linux文件系统相关命令比较多,大致列表如下:
命令 | 描述 |
---|---|
cat | 查看文件内存 cat [options] [file_names] , 主要的options有 -n ,可以显示每一行的行数 |
chmod | 改变文件的权限,chmod [options] mode[,mode] file1 [file2 ...] |
chown | 将指定文件的拥有者改为指定的用户或组, chown [选项]... [所有者][:[组]] 文件... |
chgrp | |
cksum | |
cmp | cmp命令用来比较两个文件是否有差异。当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有差异,预设会标示出第一个不通之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为“-”,则cmp指令会从标准输入设备读取数据。 |
cp | |
dd | |
du | disk usage, 查看文件或者目录的使用空间, 比如查看目录 du -hs dir |
file | |
fuser | |
ln | link , 创建软链或者硬链 |
ls | |
mkdir | |
mv | |
pax | |
pwd | |
rm | |
rmdir | |
split | split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。 |
tee | |
touch | |
type | |
umask | |
comm | 比较2个文件,找出2个文件中的相同行或者不同行 |
lsof | 在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。lsof打开的文件可以是:
|
3.2 proc目录
在Linux下的/proc目录下,有两种类型的内容: ** 数字目录和系统信息文件 **。
/proc不是一个真正的文件系统,它是一个虚拟的文件系统。它不存系统磁盘上,而是存在系统内存中例如,当我们使用ls -al命令查看/proc/stat文件信息时,可以看到该文件的大小为0,但是当我们使用cat命令查看该文件时,却可以查看到该文件的一些内容。
了解/proc文件系统,如果要了解/proc目录下文件的详细信息,可以使用man 5 FILENAME命令查看。
3.2.1 /proc 以数字命名的目录
在/proc目录下,有很多以数字命名的目录,这些数字表示系统进程的id。在这些目录下的文件对应相应的进程。
在这种类型的目录下,有一些很重要的文件(每个进程都有):
- cmdline
- environ
- fd
- limits
- mounts
还有一些很重要的链接:
- cwd
- exe
- root
3.2.2 /proc 系统信息文件
- /proc/cpuinfo
- /proc/meminfo
- /proc/loadvg
- /proc/partitions
- /proc/version
4 参考
- https://xylinuxer.gitbooks.io/lkpa/content/%E7%AC%AC%E5%85%AB%E7%AB%A0/section8_1.html
- http://www.ruanyifeng.com/blog/2011/12/inode.html
- http://www.php101.cn/2015/05/08/%E4%BA%86%E8%A7%A3Linux-proc%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/