4-文件系统简介

本文简要介绍一下Linux的文件存储系统,inode,文件目录结构等内容。

Linux最基础的设计理念之一就是 一切对象皆文件。所有的目录、文件、命令、设备等,在Linux看来都是文件,这些文件被拆分为若干的基本存储单元,存放在磁盘的不同物理地址上,并具有特定的读写执行权限。

文件类型

在终端输入ls -al命令可以查看当前目录内的所有文件的详细信息。其中,第一个字母是文件类型,常见的文件类型如下:

  • -普通文件,也就是纯粹的文本文件。

  • d目录(Directory)文件。操作系统会用处理目录文件的方式处理这类文件,而非直接把纯粹的文本展现出来。

  • l软链接(Link)文件,相当于Windows系统下的链接文件。

    例如有个可执行文件test,那么可以使用ln -s test test.s来生成链接至test的软链接文件test.s。执行test.s就是在执行test

  • b块设备(Block)文件,就是存储数据的设备,简单来说就是硬盘。

  • c字符设备(Character)文件,主要有鼠标、键盘、显示器、打字机等。因为这些设备是以字符的方式进行数据传输的,所以叫做字符设备文件。

  • p管道(Pipe)文件,用于进程间通信。

  • s套接字(Socket)文件,用于网络通信。

文件系统

文件是依靠文件系统来管理的,常见的文件系统有Ext2Ext3Ext4JFS2XFS等。

文件存储相关概念

磁盘

就是用来存储数据的硬盘,是长期存储数据的硬件。

分区

可以被当做独立空间使用的物理磁盘的一部分,这是 软件层面 上的概念,操作系统是可以设置的。

磁盘的分区可以分为 主分区扩展分区 两种:

  • 主分区:在分区后就可以被马上使用,例如Windows的C盘。
  • 扩展分区:要继续划分才能使用,继续划分出来的就叫做逻辑分区。在Windows中,扩展分区可以被继续划分为D、E盘等,这些盘被称为逻辑分区。

为什么要分区,分区有诸多好处:

  1. 有利于管理:
    1. 操作系统系统一般单独放一个区(主分区),这个区由于只放操作系统相关文件,产生的磁盘碎片较少,系统也就比较稳定。
    2. 软件放一个区,软件的升级、安装与卸载会产生磁盘碎片。单独将软件放一个分区有利于管理软件,也易于整理磁盘碎片。
    3. 多媒体相关内容/设备最好再放一个区,这些设备对硬件都会有一些损坏,即使程度很低。
  2. 多个分区会相对更安全一点,即使一个分区发生损坏,其他分区也不会受到较大的影响。

对于Linux系统,它的分区是隐藏的,只有一个根目录/。这是因为Linux的目录其实是分区的 逻辑映射,每个分区可以作为一个目录载入到Linux的文件系统中,根目录也是一个分区的映射。

可以使用df命令查看分区情况:

zeroize@client:~/Desktop$ df 
Filesystem     1K-blocks     Used Available Use% Mounted on
tmpfs             396356     1968    394388   1% /run
/dev/sda3       40453376 13917156  24449104  37% /
tmpfs            1981768        0   1981768   0% /dev/shm
tmpfs               5120        4      5116   1% /run/lock
/dev/sda2         524252     6220    518032   2% /boot/efi
tmpfs             396352       96    396256   1% /run/user/1000

一般来说分区有/boot/home/var/logswap等,至少要有/swap分区。对于swap分区,当内存不够时,可以将部分数据存放在swap分区中。

如果需要操作分区,可以使用fdisk命令。例如可以用fdisk -l列出所有分区的情况:

zeroize@client:~/Desktop$ sudo fdisk -l
Disk /dev/loop0: 4 KiB, 4096 bytes, 8 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
......

硬件设备

在上面发现多个/dev/*的文件名,这些都是硬件设备:

  • IDE硬盘:/dev/hd[a-d]。例如第一个IDE设备是hda,它可以分区为hda1, hda2等。
  • SCSI/SATA/USB硬盘:/dev/sd[a-p]
  • 光驱:/dev/cdrom
  • 软盘:/dev/fd[0-1]
  • 伪设备:/dev/loop[n]。对于虚拟机来说,很多设备都是模拟出来的,所以虚拟机上伪设备很多。

(Block)是文件系统读写,存放数据的最小单元,可以自己设置大小(1kbyte, 2kbyte, 4kbyte)。每个块只能存放一个文件的数据,如果文件大于块的大小,就会用多个块来存储该文件;如果文件小于块的大小,当前块也只能被该文件占用,剩余空间不会被再使用。

块是软件层面的概念,它是文件系统的一个概念,因此可以被设置大小。如果块太大,会导致空间浪费严重;如果块太小,会导致块数量变多,影响效率。

扇区

磁盘控制器每次对磁盘读写的最小单位,一般为512byte。

扇区是硬件层面的概念,扇区大小是硬件厂商设定的,用户无法更改。

inode

是Linux系统的一个非常重要的设计,它 将文件的属性、权限等信息与文件实际数据分开存储。inode用来记录文件的属性,一个文件占用一个inode,同时记录该文件数据所存储的块。

Linux系统读取文件的过程:操作系统通过文件名称找到对应的inode,再通过inode找到文件真正存储的block。然后磁盘控制器开始读取block对应的扇区,磁盘读取到的数据达到一个block,就传输到内存中

可以认为inode就是一个文件索引,它具有如下属性:

  • 文件的权限:读、写、可执行
  • 文件所有者,所属组
  • ctime,atime,mtime
  • 文件数据存储的位置
  • ……

注意,文件的名称不存储在inode中,而是存储在所属的目录文件中。也就是说文件的名称本身就是目录文件的数据,文件的名称正是文件inode的索引。

文件目录结构

LInux的文件系统为倒树状,根目录存放众多目录文件的名称,可以根据这些目录文件的名称打开下一级目录,直至找到我们想要的文件。

常用的目录如下:

  • /bin/:存放二进制可执行文件(Binary),也就是存储普通用户用到的命令。
  • /dev/:设备文件(Device)目录,对应硬件的文件就存储在这里。
  • /etc/:配置文件目录,但并不是所有配置文件都存放在/etc/中。
  • /usr/:存放 各种软件资源(Unix Software Resource) 的目录,不是存放用户信息的目录。
  • /home/:各个用户的工作目录。
  • /var/:存一些日志。
  • /lib/:存一些安装包、头文件、运行库等。
  • /proc/:存一些进程相关的信息。

参考资料

  • Linux系统编程 - 飘零的落花
  • Linux基础课 - Acwing