《Linux就该这么学》学习笔记(六)——存储结构与磁盘划分

364 阅读16分钟

本次内容

  1. 一切从“/”开始
  2. 物理设备的命名规则
  3. 文件系统与数据资料
  4. 挂载硬件设备
  5. 分区和格式化
  6. 添加交换分区
  7. 磁盘容量配额
  8. 软硬方式链接

1.一切从“/”开始

Linux 中一切都是文件,一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件。另外,在 Linux 系统中的文件和目录名称是严格区分大小写的并且文件名称中不得包含斜杠(/)。下图为文件存储结构示意图:

Linux 系统中常见的目录名称以及相应内容:

目录名称 应放置文件的内容
/boot 开机所需文件—内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户家目录
/bin 存放单用户模式下还可以操作的命令
/lib 开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux 系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

在 Linux 中,路径分为两种:绝对路径相对路径。绝对路径是指从根目录(/)开始写起的文件或目录名称;相对路径则是指相对于当前路径的写法。 由于相对路径不具有普适性,因此可以发现在许多配置文件中我们都需要使用绝对路径。

2.物理设备的命名规则

在 Linux 系统中一切都是文件,当然也包括硬件设备。既然是文件,就必须有文件名称。系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等。Linux 系统中常见的硬件设备的文件名称如下:

硬件设备 文件名称
IDE 设备 /dev/hd[a-d]
SCSI/SATA/U 盘 /dev/sd[a-p]
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0 或/dev/ht0

由于现在的 IDE 设备已经很少见了,所以一般的硬盘设备都会是以“/dev/sd”开头的。 在一台主机上通常可以安装多块硬盘,系统采用 a~p 来代表 16 块不同的硬盘(默认从 a 开始分配)。一块硬盘中的分区也有如下特点:

  • 主分区或扩展分区的编号从 1 开始,到 4 结束
  • 逻辑分区从编号 5 开始

另外,有两点需要格外注意

  1. /dev 目录中的 sda 设备之所以是 a ,并不是由电脑主板的插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序
  2. 分区的号码未必是顺延的,也可能是手工指定的,因此我们不能根据分区的序号直接判断硬盘上已经存在了几个分区

我们可以根据上面所记录的知识对下图中的信息进行分析:

/dev/目录中保存的应当是硬件设备文件;其次,sd 表示是存储设备;然后,a 表示系统中同类接口中第一个被识别到的设备,最后,5 表示这个设备是一个逻辑分区。因此,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件”。

最后在此小节中简单记录一下和分区有关的基础知识。硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节;其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。如下图所示:

但是有时候我们需要4个以上的分区,这时采用上面这种方案就无法达到要求了。因此我们可以将第一个扇区分区表中的 16 字节(原本需要写入主分区信息)的空间拿出来作为拓展分区来指向另一个分区。这样看来,拓展分区更像是一个占用 16 字节分区表空间的指针——一个指向另外一个分区的指针。我们可以在拓展分区中创建数个逻辑分区使其指向其他分区,以此来满足四个分区以上的需求。如下图:

3.文件系统与数据资料

用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。像 Ext3 、 Ext4 、 XFS 都是较为常见的文件系统,其中 XFS 是 RHEL7 中默认的文件管理系统。另外,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux 内核中的软件层为用户程序提供了一个 VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。如下图:

在我们拿到了一块新硬盘后,需要先分区,再格式化文件系统,最后才能挂载并正常使用。根据个人需求,可以不对硬盘进行分区,但是后面两步是不可以省略的。日常使用中,我们会在硬盘中存放许多文件。Linux 系统中有一个名为 super block 的 硬盘地图,需要注意的是硬盘地图不是用来直接写入文件内容而是记录整个文件系统的信息例如inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关信息等。而 inode 则是用来记录文件的属性的,每个文件占用一个独立的 inode 表格,在 Ext3 中该表格默认为128字节,里面记录着如下信息:

  • 该文件的访问权限(read、write、execute)
  • 该文件的所有者与所属组(owner、group)
  • 该文件的大小(size)
  • 该文件的创建或内容修改时间(ctime)
  • 该文件的最后一次访问时间(atime)
  • 该文件的修改时间(mtime)
  • 文件的特殊权限(SUID、SGID、SBIT)
  • 该文件的真实数据地址(point)

文件的真实内容则是存放在 block 块中(大小可以是 1KB、2KB 或 4KB),一个 block 块不管是否被写满,只要被一个文件使用了,那么就算还有剩余空间也无法写入其他文件的内容了。例如一个文件1KB,但它仍会占用一个 block 块,这样一来就浪费了3KB的空间。inode 记录一个 block 块消耗 4B 的空间,如果文件内容较多导致 inode 被写满,系统会分配一个 block 块用于像 inode 那样记录其他 block 块的信息,但写到 block 块中会损失一些性能。

4.挂载硬件设备

当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是挂载。下面两个命令与挂载有关:

  1. mount 命令:此命令用于挂载文件系统,格式为 mount [参数] [文件系统] 挂载目录。当 mount 命令不加任何参数时,表示列出已加载文件系统的信息,包括以何种方式进行的加载。下面为 mount 命令部分常用参数:

    参数 作用
    -a 挂载所有在/etc/fstab 中定义的文件系统
    -t 指定文件系统的类型

    对于比较新的 Linux 系统来讲,一般不需要使用-t 参数来指定文件系统的类型,Linux 系统会自动进行判断。而 mount 中的-a 参数则会在执行后自动检查 /etc/fstab 文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。
    但是通过 mount 命令挂载的硬件设备在重启后就会失效,如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式 设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检 写入到 /etc/fstab 文件中。以下为挂载信息各字段的意义:

    字段 意义
    设备文件 一般为设备的路径+设备名称,也可以写唯一识别码
    挂载目录 指定要挂载到的目录,需在挂载前创建好
    格式类型 指定文件系统的格式,比如 Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
    权限选项 若设置为 defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
    是否备份 若为 1 则开机后使用 dump 进行磁盘备份,为 0 则不备份
    是否自检 若为 1 则开机后自动进行磁盘自检,为 0 则不自检

    例:如果想将文件系统为 ext4 的硬件设备/dev/sdb2 在开机后自动挂载到/backup 目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab 文件中写入下面的信息,这样在系统重启后也会成功挂载。

    /dev/sdb2 /backup ext4 defaults 0 0
    
  2. umount 命令:此命令用于撤销已经挂载的设备文件,格式为 umount [挂载点/设备文件],例如手动卸载掉/dev/sdb2 设备文件 umount /dev/sdb2

5.分区和格式化

  1. fdisk 命令:此命令用于管理磁盘分区,它提供了集添加、删除、转换分区等功能于一身的一站式分区服务,格式为 fdisk [磁盘名称],这条命令的特殊之处在于它是交互式的,在交互时我们可以将下列参数作为命令使用:

    参数 作用
    m 查看全部可用的参数
    n 添加新的分区
    d 删除某个分区信息
    l 列出所有可用的分区类型
    t 改变某个分区的类型
    p 查看分区信息
    w 保存并退出
    q 不保存直接退出

    在设置完成并保存退出后,Linux 系统会自动把这个硬盘主分区抽象成/dev/sdb1 设备文件。我们可以使用 file 命令查看该文件的属性,有些时候系统并没有自动把分区信息同步给 Linux 内核,这时我们可以输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令。如果使用这个命令都无法解决问题,那么就重启计算机。

  2. mkfs 命令:此命令用于对存储设备进行格式化操作,我们可以将存储设备格式分区为不同的文件系统。格式为 mkfs.文件格式名称 文件名。文件系统有许多,我们不需要一一记住它们的后缀名,输入 mkfs 命令后敲击两次 Tab 键会有如下效果:

    mkfs    mkfs.cramfs     mkfs.ext3   mkfs.fat    mkfs.msdos  mkfs.xfs
    mkfs.btrfs  mkfs.ext2   mkfs.ext4   mkfs.minix  mkfs.vfat
    

    如果要格式分区为 XFS 的文件系统,则命令应为 mkfs.xfs /dev/sdb1

  3. df -h 命令:可以使用此命令来查看挂在状态和硬盘使用量信息,参数 h 表示使用更合适的单位

  4. du 命令:此命令用于查看文件数据占用量,格式为 du [参数] [文件],简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。其中参数 s 表示仅显示总计;参数 h 表示以K,M,G为单位,提高信息的可读性。因此我们可以使用du -sh /*来来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小。

6.添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。在生产环境中,交换分区的 大小一般为真实物理内存的 1.5~2 倍。设置交换分区的方法和之前记录的挂载并使用存储设备的相似,只是部分命令发生了改变,过程如下

  1. 对存储设备进行分区:这一步和之前的分区方法完全一样,都是使用 fdisk 方法
  2. 格式化:与之前使用 mkfs 进行格式化不同的是,这里需要使用 mkswap 命令,格式为 mkswap 设备文件名mkswap /dev/sdb2
  3. 挂载:挂载交换分区需要使用 swapon 命令,格式为 swapon 设备文件名swapon /dev/sdb2。和之前类似,如果我们希望交换分区在电脑重启后依然生效,需要将相关信息写入 /etc/fstab 文件中如下:
    /dev/sdb2 swap swap defaults 0 0
    

经过以上操作后,我们可以通过命令 free -h 来查看交换分区发生的变化。
与之前学习的取消挂载 umount 相对应的,swapoff 命令可以关闭交换空间,如swappoff /dev/sdb2

7.磁盘容量配额

在 Linux 系统中,root 管理员可以使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。我们可以使用 quota 命令 进行磁盘容量配额管理。quota 命令还有软限制和硬限制的功能。

  • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用
  • 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作

RHEL 7 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 的支持,此时需要手动编辑配置文件。如果我们希望 /boot 目录支持 quota 磁盘配额技术,那么需要做如下配置(uquota是重点):

UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b/boot xfs defaults,uquota 1 2

重启后通过 mount 命令进行查询可以发现 /boot 目录信息最后一个字段已经变为了 usrquota 如下:

/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
  1. xfs_quota 命令:此命令是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令,格式为 xfs_quota [参数] 配额 文件系统 。-c 参数用于以参数的形式设置要执行的命令;-x 参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。 使用范例:

    • 设置用户 tom 对/boot 目录的 quota 磁盘容量配额,软限制和硬限制分别为 3MB 和 6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个:
      xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
      
    • 查看 /boot 目录的磁盘配额情况:xfs_quota -x -c report /boot
  2. edquota 命令:此命令用于编辑用户的 quota 配额限制,格式为 edquota [参数] [用户]edquota -u tom 。在为用户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。其中,-u 参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置。edquota 命令会调用 Vi 或 Vim 编辑器来让 root 管理员修改要限制的具体细节。

8.软硬方式链接

在 Linux 系统中存在硬链接软连接两种文件:

  • 硬链接:可以将它理解为一个“指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和文件。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1;而且只有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。个人理解如下图:

  • 软链接(也称为符号链接):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效。

ln 命令:此命令用于创建链接文件,格式为 ln [参数] 目标 。以下为部分常用参数:

参数 作用
-s 创建“符号链接”(如果不带-s 参数,则默认创建硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程

使用范例:

  • 为 readme.txt 创建一个名为 readit.txt 的符号链接:ln -s readme.txt readit.txt
  • 为 readme.txt 创建一个名为 readit.txt 的硬链接:ln readme.txt readit.txt