《Linux系统》之"皮毛系列"(二) Linux文件系统的简介

一、Linux文件系统

1、文件系统简介

Linux系统的理念是:一切都是文件。 其实这个是Unix系统的哲学思想,而Linux是由Unix系统而来,所以也继承了这个思想:

Unix系统把一切资源都看作是文件,包括硬件设备。硬件所形成的文件,通常称为设备文件。这样用户就可以用读写文件的方式实现对硬件的访问,这样带来的优势也是显而易见的。Unix 权限模型也是围绕文件的概念来建立的,所以对设备也就可以同样处理了。

Linux文件系统的设计目的:就是用来存储文件和管理文件。Linux文件系统的文件是数据的集合,文件系统不仅包含着文件中的数据,而且还有文件系统的结构,Linux用户和应用程序看到的文件、目录、软连接及文件保护信息等都存储在其中。注意:操作系统是用来管理硬件和应用程序及其文件系统的,别弄混这个概念。

2、Linux文件系统的目录结构

Linux文件系统采用树状级结构图。因为树状结构图方便归类和整理,就好像图书馆的书一样,先进行大类分成不同的书架,在进行逐级细分,方便文件的查找和管理。

    


1)根目录 (/) 的意义与内容:

根目录是整个文件系统中最重要的一个目录,位于Linux文件系统目录结构的顶层。因为不但所有的目录都是由根目录衍生出来的, 同时根目录也与操作系统的开机、还原、系统修复等行为有关。

系统开机所需要的特定文件数据有:核心文件、开机程序、 函数库等等。如果系统出现错误,根目录也必须要包含有能够修复文件系统的程序才行。

因此FHS标准建议:根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。说白了,就是根目录和Windows的C盘一个样。因为越大的分区内你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。

因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分区则是在开机完成之后才会持续的进行挂载行为。因此根目录下与开机过程有关的目录, 就应该与根目录放在同一个分区里。这些目录分别是:/etc,/bin,/dev,/lib,/sbin。

下面对目录树进行一下介绍:

/:根目录,位于Linux文件系统目录结构的顶层。通常根目录下只存放目录,不存放文件,/etc,/bin,/dev,/lib,/sbin应该和根目录放置在一个分区中。

/bin,/usr/bin:该目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要的linux命令和二进制(可执行)文件,包含shell解释器等。

/boot 该目录中存放系统的内核文件和引导装载程序文件,/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。

/dev: 设备(device)文件目录,存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备(终端、磁盘驱动器、光驱及网卡等,包括字符设备和块设备)等,常用的是挂载光驱mount /dev/cdrom/mnt。 

/etc: 系统配置文件目录,该目录存放系统的大部分配置文件和子目录,不建议在此目录下存放可执行文件。该目录下的文件由系统管理员来使用,普通用户对大部分文件有只读权限。

/home: 系统默认的用户宿主目录,新增用户账号时,用户的宿主目录都存放在此目录下,~表示当前用户的宿主目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据。

/lib,/usr/lib,/usr/local/lib:系统最基本的动态连接资源库,内核模块文件目录。几乎所有的应用程序都用到此资源库。/lib目录存放了所有重要的库文件,其他的库文件则大部分存放在/usr/lib目录下。

/lost+fount: 在EXT2或EXT3文件系统中,系统意外崩溃或意外关机时,产生的一些文件碎片放在这里。当系统重新启动时,fsck工具会检查这里,并修复已经损坏的文件系统。

/mnt,/media: mnt目录主要用来临时挂载文件系统,为某些设备提供默认挂载点。

/opt: 给主机额外安装软件所摆放的目录。

/proc: 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间。

/root:系统管理员root的宿主目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下

/sbin,/usr/sbin,/usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。

/tmp: 存放系统产生的临时文件,因此重要文件不要放在此目录下。

/srv: 服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。

/usr: 应用程序存放目录,/usr/bin 存放应用程序, /usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件,/usr/local 存放软件升级包,/usr/share/doc 系统说明文件存放目录。

/usr/share/man:  程序说明文件存放目录,使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容。建议单独分区,设置较大的磁盘空间。

/var: 放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log。

/sys:这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。 包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。 这个目录同样不占硬盘容量。

3、绝对路径与相对路径

在访问文件或目录时,会涉及到所谓的路径。我们根据写法的不同来分成绝对路径(absolute)与相对路径(relative)。

绝对路径:由根目录(/)开始写起的文件名或目录名称。例如 /home/hyxy/.bashrc;

相对路径:相对于你当前所在路径的写法。 不是以 / 开头的写法就属于相对路径的写法。

举例来说,你目前在 /home/hyxy 这个目录下, 如果想要进入 /var/log 这个目录时,可以怎么写呢?

cd  /var/log                     --绝对路径写法

cd ../../var/log                 --相对路径写法。因为我们的位置是/home/hyxy里,所以要回到上一层(../)到达/home/里,然后再回到上                                          一层(../)到达根目录,此时才能看到/var,然后向里移动。

两个特殊的目录:

.  :代表当前的目录,也可以使用 ./ 来表示;

.. :代表上一层目录,也可以 ../ 来代表。

4、文件类型

当我们使用命令“ll”查询文件属性时,我们会看到第一列是由10个字符组成的。而10个字符的第一个字符就表示文件类型。

                         

现在,来看看Linux文件系统支持的文件类型:

-(f):普通文件

d:目录文件

b:块设备。就是一些储存数据,以提供系统存取的接口设备。例如你的一号硬盘的代码是 /dev/hda1。

c:字符文件。一些串行端口的接口设备,例如键盘、鼠标等等!

l:符号链接文件,分为软链接和硬链接。类似于windows系统的快捷方式。

p:管道文件,FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。

s:套接字文件,socket。如启动一个MySql服务器时产生的一个mysql.sock文件。

查看文件类型的三种方法:

方法1:ls -l或者ll
方法2:file命令
方法3:stat命令

5、文件属性

当使用命令   ls  -lih时,我们就会看到以下属性。

     

二、Linux虚拟文件系统

Linux 中允许不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统调用,即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,可以跨文件系统来操作文件。如下图,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘,而这样的操作涉及到两个不同的文件系统。

                            

那么,是什么原因可以让Linux系统有这样强大的功能呢?

Linux中,有一个虚拟文件系统(Virtual File System, 简称VFS),是Linux内核中的一个软件层,用于给应用程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖VFS共存,而且也依靠VFS协同工作。

为了能够支持各种实际文件系统,VFS定义了所有文件系统都支持的基本的、概念上的接口和数据结构;同时实际文件系统也提供VFS所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。下图显示了VFS在内核中与实际的文件系统的协同关系。

                   

VFS主要有四个数据结构,分别是超级块、索引节点、目录项和文件对象(文件对象是针对于内存来说的)。正是这四种数据结构的支持,因此不论是普通的文件,还是特殊的目录、设备等,VFS都将它们同等看待成文件,通过同一套文件操作界面来对它们进行操作。

操作文件时需先打开;打开文件时,VFS会知道该文件对应的文件系统格式;当VFS把控制权传给实际的文件系统时,实际的文件系统再做出具体区分,对不同的文件类型执行不同的操作。这也就是“一切皆是文件”的根本所在。

三、文件存储结构

我们都知道,硬盘是用来持久化存储内存中的信息,断电后不会丢失。由于这个原因,文件系统也就安装在了硬盘上。就像windows系统一样,一个分区,就是一个文件系统。那么,文件系统是怎么管理磁盘的呢?

它将磁盘块分为以下三个部分:
1)  超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。
2)  i-节点表。超级块的下一个部分就是i-节点表。每个i-节点就是一个对应一个文件/目录的结构,这个结构它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号
3)  数据区。文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独产的磁盘块中。

下面对上图里边的构成元素做个简单的讲解:

引导块:为磁盘分区的第一个块,记录文件系统分区的一些信息,,引导加载当前分区的程序和数据被保存在这个块中。一般占用2kB,

超级块:

超级块用于存储文件系统全局的配置参数(譬如:块大小,总的块数和inode数)和动态信息(譬如:当前空闲块数和inode数),其处于文件系统开始位置的1k处,所占大小为1k。为了系统的健壮性,最初每个块组都有超级块和组描述符表(以下将用GDT)的一个拷贝,但是当文件系统很大时,这样浪费了很多块(尤其是GDT占用的块多),后来采用了一种稀疏的方式来存储这些拷贝,只有块组号是3, 5 ,7的幂的块组(譬如说1,3,5,7,9,25,49…)才备份这个拷贝。通常情况下,只有主拷贝(第0块块组)的超级块信息被文件系统使用,其它拷贝只有在主拷贝被破坏的情况下才使用。

块组描述符:

GDT用于存储块组描述符,其占用一个或者多个数据块,具体取决于文件系统的大小。它主要包含块位图,inode位图和inode表位置,当前空闲块数,inode数以及使用的目录数(用于平衡各个块组目录数),具体定义可以参见ext3_fs.h文件中struct ext3_group_desc。每个块组都对应这样一个描述符,目前该结构占用32个字节,因此对于块大小为4k的文件系统来说,每个块可以存储128个块组描述符。由于GDT对于定位文件系统的元数据非常重要,因此和超级块一样,也对其进行了备份。GDT在每个块组(如果有备份)中内容都是一样的,其所占块数也是相同的。从上面的介绍可以看出块组中的元数据譬如块位图,inode位图,inode表其位置不是固定的,当然默认情况下,文件系统在创建时其位置在每个块组中都是一样的,如图2所示(假设按照稀疏方式存储,且n不是3,5,7的幂)

块组:

每个块组包含一个块位图块,一个 inode 位图块,一个或多个块用于描述 inode 表和用于存储文件数据的数据块,除此之外,还有可能包含超级块和所有块组描述符表(取决于块组号和文件系统创建时使用的参数)。下面将对这些元数据作一些简要介绍。

块位图:

块位图用于描述该块组所管理的块的分配状态。如果某个块对应的位未置位,那么代表该块未分配,可以用于存储数据;否则,代表该块已经用于存储数据或者该块不能够使用(譬如该块物理上不存在)。由于块位图仅占一个块,因此这也就决定了块组的大小。

Inode位图:

Inode位图用于描述该块组所管理的inode的分配状态。我们知道inode是用于描述文件的元数据,每个inode对应文件系统中唯一的一个号,如果inode位图中相应位置位,那么代表该inode已经分配出去;否则可以使用。由于其仅占用一个块,因此这也限制了一个块组中所能够使用的最大inode数量。

Inode表:

Inode表用于存储inode信息。它占用一个或多个块(为了有效的利用空间,多个inode存储在一个块中),其大小取决于文件系统创建时的参数,由于inode位图的限制,决定了其最大所占用的空间。

以上这几个构成元素所处的磁盘块成为文件系统的元数据块,剩余的部分则用来存储真正的文件内容,称为数据块,而数据块其实也包含数据和目录。

Linux文件系统的文件

Linux文件系统(如ext2、ext3)中的一个文件由目录项、inode和数据块组成。

目录项:包括文件名和inode节点号。
Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。
数据块:文件的具体内容存放地。

                                                   
Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。

                                                     

四、df命令详解

df命令的作用:列出文件系统的整体磁盘空间使用情况,包括磁盘已使用空间和还剩余空间。在默认情况下,磁盘空间是以1KB为单位进行显示的,我们可以设置环境变量POSIXLY_CORRECT环境变量为true,这种情况下使用512字节为单位显示。

命令语法:df   [选项]    [文件名] 
常用参数: 
-a:--all,显示所有的文件系统,包括虚拟文件系统,参考示例2。 
-B:--block-size,指定单位大小。比如1k,1m等,参考示例3。 
-h:--human-readable,以人们易读的GB、MB、KB等格式显示,参考示例4。 
-H:--si,和-h参数一样,但是不是以1024,而是1000,即1k=1000,而不是1k=1024。 
-i:--inodes,不用硬盘容量,而是以inode的数量来显示,参考示例5。 
-k:以KB的容量显示各文件系统,相当于--block-size=1k。 
-m:以KB的容量显示各文件系统,相当于--block-size=1m。 
-l:--local,只显示本地文件系统。 
--no-sync:在统计使用信息之前不调用sync命令(默认)。 
-sync:在统计使用信息之前调用sync命令。 
-P:--portability,使用POSIX格式显示,参考示例6。 
-t:--type=TYPE,只显示指定类型的文件系统,参考示例7。 
-T:--print-type,显示文件系统类型,参考示例8。 
-x:--exclude-type=TYPE,不显示指定类型的文件系统。 
--help:显示帮助信息。 
--version:显示版本信息。

案例1:查看文件或目录所在的文件系统

[root@master ~]# df /bin /home/michael/test/a.txt
Filesystem                   1K-blocks    Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  18134344 4699356  12513800  28% /
/dev/mapper/VolGroup-lv_root  18134344 4699356  12513800  28% /

输出结果列说明:

Filesystem:代表该文件系统是哪个分区,所以列出的是设备名称。
1K-blocks:说明下面的数字单位是1KB,可利用-h或-m来改变单位大小,也可以用-B来设置。
Used:已使用空间大小。
Available:剩余空间大小。
Use%:磁盘使用率。如果使用率在90%以上时,就需要注意了,避免磁盘容量不足出现系统问题,尤其是对于文件内容增加较快的情况(如/home、/var/spool/mail等)。
Mounted on:磁盘挂载的目录,即该磁盘挂载到了哪个目录下面。

案例2:查看所有文件系统

[root@master mm]# df -a              #包含了VFS
Filesystem                   1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  18134344   4699376  12513780  28% /
proc                                 0         0         0    - /proc
sysfs                                0         0         0    - /sys
devpts                               0         0         0    - /dev/pts
tmpfs                           502204       224    501980   1% /dev/shm
/dev/sda1                       495844     34917    435327   8% /boot
none                                 0         0         0    - /proc/sys/fs/binfmt_misc
.host:/                      420218876 122634068 297584808  30% /mnt/hgfs
vmware-vmblock                       0         0         0    - /var/run/vmblock-fuse
gvfs-fuse-daemon                     0         0         0    - /root/.gvfs
[root@master mm]# df                 #默认模式
Filesystem                   1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  18134344   4699376  12513780  28% /
tmpfs                           502204       224    501980   1% /dev/shm
/dev/sda1                       495844     34917    435327   8% /boot
.host:/                      420218876 122634068 297584808  30% /mnt/hgfs

小贴士:系统里面存在很多特殊的文件系统,这些文件系统都是在内存当中,(如/proc挂载点),不会占据硬盘空间。

案例3:指定单位来查看文件系统

[root@master mm]# df -B 1M               #指定单位为1M
Filesystem                   1M-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root     17710   4590     12221  28% /
tmpfs                              491      1       491   1% /dev/shm
/dev/sda1                          485     35       426   8% /boot
.host:/                         410370 119760    290611  30% /mnt/hgfs
[root@master mm]# df --block-size 1M     #指定单位为1M
Filesystem                   1M-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root     17710   4590     12221  28% /
tmpfs                              491      1       491   1% /dev/shm
/dev/sda1                          485     35       426   8% /boot
.host:/                         410370 119760    290611  30% /mnt/hgfs

案例4:以容易理解的方式查看文件系统

[root@master mm]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   18G  4.5G   12G  28% /
tmpfs                         491M  224K  491M   1% /dev/shm
/dev/sda1                     485M   35M  426M   8% /boot
.host:/                       401G  117G  284G  30% /mnt/hgfs

案例5:以inode数量的方式查看文件系统

[root@master mm]# df -i
Filesystem                    Inodes  IUsed   IFree IUse% Mounted on
/dev/mapper/VolGroup-lv_root 1152816 110838 1041978   10% /
tmpfs                         125551      5  125546    1% /dev/shm
/dev/sda1                     128016     38  127978    1% /boot
.host:/                            0      0       0     - /mnt/hgfs

案例6:以文件系统类型方式来查询文件系统

[root@master mm]# df -T
Filesystem                   Type   1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root ext4    18134344   4699412  12513744  28% /
tmpfs                        tmpfs     502204       224    501980   1% /dev/shm
/dev/sda1                    ext4      495844     34917    435327   8% /boot
.host:/                      vmhgfs 420218876 122634068 297584808  30% /mnt/hgfs

----------------------------------------------------------------------------未完待续,敬请留意--------------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/Michael__One/article/details/84982592