如何在 Linux 上编写 fstab 文件

您是否正在为您的Linux电脑增添新的硬盘驱动器或固态驱动器? 那就需要编辑fstab文件了。 很多人对这个操作感到畏惧,诚然,正确操作至关重要,但只要掌握了恰当的知识,其实并不困难。 现在,我们将一步步引导您完成编辑fstab文件的过程,从而将新驱动器整合到文件系统中。

fstab,文件系统表

虽然在Linux计算机上添加新硬盘驱动器并不算复杂,但初次尝试时可能会感到有些迷茫。您连接了硬件,启动了电脑,然后登录到操作系统,却发现新驱动器无处可寻。这是为什么?又该如何让Linux“看到”该驱动器,以便配置它呢?

实际上,Linux已经识别到了您的硬件,但它并没有直接告知您,甚至没有给您任何提示,表明它已经找到了您的新硬件。您必须向Linux查询才能获取需要放入fstab文件中的信息。

以下是如何设置新硬盘驱动器的方法,以便Linux(以及您)能够看到并使用它。整个过程分为两个部分。第一部分是进行一些侦查工作,以识别硬盘驱动器并收集相关信息。第二部分是编辑fstab文件,利用我们在侦查阶段收集的信息。

寻找新驱动器

我们现在将向系统添加两个新驱动器。一个是32GB的机械硬盘(HD),另一个是16GB的固态驱动器(SSD)。

我们需要了解Linux如何识别它们,以及Linux为它们分配了哪些块设备。在Linux和类Unix操作系统中,块设备是一个特殊的文件,它充当可以读取和写入数据的设备(除非它是只读的)的接口。块设备通常代表某种大容量存储单元(例如硬盘或CD-ROM上的分区)。它们在/dev目录中创建。

我们可以使用lsblk命令列出连接到Linux计算机的块设备。

lsblk

lsblk的输出以列的形式显示。

这些列的含义如下:

名称:这是设备的名称。以“sd”开头后跟一个字母的设备名称代表SCSI硬盘。该字母标识单个硬盘,“a”是第一个,“b”是第二个,依此类推。如果附加了一个数字,则表示一个分区。例如,“sdb2”将是第二个SCSI硬盘驱动器上的分区2。
Maj:Min:此列包含设备的主设备号和次设备号。主设备号表示设备的类型(更准确地说,是用于与该设备通信的驱动程序的类型)。次设备号是该类型设备数量的计数。
Rm:此列显示设备是否可移动。请注意,设备sr0的值为1,表示它是可移动的。这是一个CD-ROM驱动器。
大小:这是设备可以存储的数据量。
Ro:此列显示1表示只读设备,0表示读写设备。环回设备都是只读的
类型:这标识了设备的类型。“disk”条目表示磁盘驱动器,“part”条目表示分区,“rom”表示只读存储器(光盘)。
挂载点:这显示了文件系统中该设备的挂载点。如果为空白,则设备未挂载。

在上面的屏幕截图中,您可以看到循环设备都被赋予了主设备号7(表示环回或循环设备),并且次设备号每次仅增加1。循环设备与squashfs文件系统一起使用。每次使用安装应用程序时,都会创建一个squashfs文件系统,这是snap包管理系统。

SCSI硬盘驱动器的名称有sdasdbsdc,它们的主设备号都是8(SCSI硬盘驱动器)。次设备号按16位分组。第一个驱动器sda的次设备号从0到15。0表示物理驱动器,次设备号1表示该驱动器上的第一个分区。对于第二个驱动器sdb,次设备号从16到31。16代表物理驱动器,17代表该驱动器上的第一个分区。接下来的16个数字32到47用于sdc的次设备号,依此类推。

其他常见的主设备号是3(对于IDE硬盘)和11用于CD-ROM。

实际上,SCSI CD-ROM驱动器的/dev/sr0样式已被弃用。批准的格式是/dev/scd0。尽管如此,/dev/sr0格式仍用于研究本文的所有机器上。

内核文档包含所有值,主设备号和次设备号可以采取的。这是一个令人惊讶的超长列表。

为了整理lsblk的输出,我们可以使用grep仅选择感兴趣的项目。我们知道我们没有添加循环设备,所以让我们选择所有的SCSI硬盘驱动器。我们知道它们的名字中会有“sd”。

lsblk | grep sd

这个命令将导致grep只打印包含“sd”的行。在我们的测试机上,我们看到:

所以,我们有三个SCSI驱动器。第一个,/dev/sda,安装在文件系统的根目录/。另外两个根本没有安装,这对于全新的驱动器是正常的。我们可以看到驱动器/dev/sdb的大小为32GB,这意味着它是我们传统的机械驱动器。驱动器/dev/sdc大小为16GB,这是我们的SSD驱动器。

实际上,由于这是一台虚拟机,因此这些也是虚拟磁盘。因此,SSD与SCSI机械驱动器一样出现。在我的常规桌面上,NVMe固态硬盘显示为/dev/nvme0n1,其上的第一个分区是/dev/nvme0n1p1。它的主设备号是259。这些差异不会改变我们必须在fstab文件中执行的操作,但请注意,如果您的系统中有SSD,它不会显示为物理驱动器。

此外,如果它们是全新的,您的驱动器上可能没有分区。如果需要,您可以使用fdisk创建分区。

识别旋转和非旋转驱动器

如果我们在lsblk中使用-o(输出)选项,并将ROTA(旋转)列添加到显示中,则lsblk将使用1表示旋转存储设备(机械驱动器),使用0表示非旋转存储设备(固态硬盘)。

lsblk -o +ROTA | grep sd

我们在显示屏的右侧得到了一个额外的列,即ROTA(旋转)列。如您所见,“SSD”的设备和分区为0。这是有道理的,因为SSD是一种非旋转存储设备。

挂载文件系统

在开始考虑fstab文件之前,让我们检查一下是否可以手动挂载驱动器。这样,如果我们使用fstab文件时出现问题,就可以确定问题一定出在我们的语法上,而不是驱动器本身的问题。

我们将在/mnt目录中创建一些临时挂载点。您需要使用sudo,系统会提示您输入密码

sudo mkdir /mnt/scsi

sudo mkdir /mnt/ssd

现在让我们在新的挂载点上挂载SCSI驱动器。我们将以最简单的形式使用mount命令。我们将告诉它我们想要挂载的分区的名称,以及我们想要挂载它的挂载点。mount会将文件系统挂载到我们指定的挂载点的那个分区上。

我们指定的是保存文件系统的分区,而不是驱动器,因此请确保包含分区的数字,在本例中为“1”。

sudo mount /dev/sdb1 /mnt/scsi

如果一切顺利,mount将不会有任何响应。您将静默返回到命令提示符。

安装SSD也很简单。我们告诉mount挂载在哪个设备上的哪个分区,以及挂载它的挂载点。

sudo mount /dev/sdc1 /mnt/ssd

再次,沉默是金。

检查挂载

为了验证挂载是否成功,我们将再次使用lsblk。我们将通过grep管道输出,并选择sda1sdb2sdc1条目。

lsblk -o +ROTA | grep sd[a-c]1

mount向我们展示了三个已挂载的分区。那就是我们刚刚挂载的两个和挂载在/上的原始分区。

分区/dev/sdb1安装在/mnt/scsi上,并且位于旋转存储设备上。分区/dev/sdc1安装在/mnt/ssd上,并且位于非旋转存储设备上。一切似乎都很好。

现在我们需要配置fstab文件,以便在每次计算机启动时挂载这些设备。

fstab文件

fstab文件包含一个用于在您的计算机重新启动时挂载的每个文件系统的条目。每个条目由六个字段组成。这些字段是:

文件系统:这并不是分区上的文件系统类型(这就是“类型”字段的用途),而是应该挂载的分区的标识符。
挂载点:文件系统中您希望挂载分区的位置。
类型:分区上文件系统的类型。
选项:每个文件系统都可以指定用于打开或关闭功能的选项。
转储:对备份文件系统的一种完全过时的方法的引用,其中整个文件系统被“转储”到磁带。
Pass:这是“通过”标志。它告诉Linux应该使用fsck检查哪些分区的错误,以及按什么顺序。您的主引导和操作系统分区应该是1,其余的可以设置为2。如果标志设置为零,则表示“根本不检查”。如果您的文件系统不是日志文件系统(例如ext2或FAT16/32),最好将其设置为0以将其关闭。

这些字段必须按此顺序指定,并且它们之间必须有空格或制表符。查找这些字段的值可能会令人畏惧,尤其是“选项”字段的值。“选项”字段选项必须在逗号分隔的列表中,它们之间没有空格。

每个文件系统的手册页将列出可以使用的选项。ext4大约40个选项。以下是一些更常见的选项:

auto:文件系统将在引导时自动挂载。
noauto:文件系统只有在输入mount -a命令时才会挂载。
exec:允许在此文件系统上执行二进制文件。
noexec:不允许在此文件系统上执行二进制文件。
ro:文件系统应该以只读方式挂载。
rw:文件系统应以读写方式挂载。
sync:文件写入应立即进行,而不是缓冲。最好保留给软盘,如果有人仍在使用它们,可能会导致性能损失。
async:文件写入应该被缓冲和优化。
user:允许任何用户挂载文件系统。
nouser:root用户是唯一可以挂载此文件系统的用户。
defaults:这是指定一组常用设置的简写方式:rwsuiddevexecautonouserasync
suid:允许对suid和sgid位进行操作。suid位用于允许普通用户以root身份执行文件,没有给用户完全的root权限。当在目录上设置sgid位时,在该目录中创建的文件和目录具有它们的组所有权设置为目录的那个,而不是创建它们的用户组。
nosuid:不允许使用suid和sgid位。
noatime:不更新文件系统上的文件访问时间。这有助于提高旧硬件的性能。
nodiratime:不更新文件系统上的目录访问时间。
relatime:更新文件访问时间相对于文件修改时间。

“默认”选项是一个很好的开场白。如果需要进行一些微调,您可以添加或删除更多选项。如果只有一种简洁的方法可以获取您需要的设置,您需要按照您需要将它们输入到fstab文件中的顺序。

现在,让我们看看mtab文件。

mtab文件

mtab文件是当前挂载的文件系统的列表。这与fstab文件形成对比,fstab文件列出了应在引导时挂载的文件系统。mtab文件包括手动安装的文件系统。我们已经安装了我们的新驱动器,所以它们应该出现在mtab文件中。

我们可以使用cat查看mtab文件的内容。我们将通过grep管道输出,并仅查看/dev/sdb1/dev/sdc1来限制输出。

cat /etc/mtab | grep sd[b-c]1

输出显示这两个分区的mtab条目。

我们可以直接复制这些值并将它们放入fstab文件中,确保每个字段之间有空格或制表符。 就是这样。当我们重新启动时,驱动器将被安装。

有两个警告。一是挂载点。我们创建临时挂载点只是为了证明我们可以在新驱动器上挂载新分区。我们需要输入真正的挂载点而不是我们的临时挂载点——如果它们不同的话。

第二个警告是,如果我们使用mtab文件中的设置,我们将使用块设备文件作为每个分区的标识符。这会起作用,但是如果将新的大容量存储硬件添加到计算机,则/dev/sda/dev/sdb等值可能会发生变化。这意味着fstab文件中的设置不正确。

每个分区都有一个通用唯一标识符(UUID),我们可以用它来识别分区。这永远不会改变。如果我们使用UUID来识别fstab文件中的分区,则设置将始终保持准确和真实。

如果您将新分区用作廉价磁盘冗余阵列(RAID)系统,请查看该系统的文档。它可能指定您必须使用块设备标识符而不是UUID。

查找分区的UUID

要查找分区的UUID,我们可以使用blkid打印块设备的属性。我们将输出限制在新驱动器上的两个新分区:

blkid | grep sd[b-c]1

输出包括每个分区的UUID。

PARTUUID是一种UUID形式,可与GUID分区表(GPT)分区方法(如果您不使用主引导记录(MBR)分区方法)。

编辑fstab文件

在编辑器中打开fstab文件。我们正在使用gedit,这是一个在大多数Linux发行版中都可以找到的易于使用的编辑器。

sudo gedit /etc/fstab

编辑器出现,其中加载了您的fstab文件。

fstab文件中已有两个条目。它们是现有硬盘驱动器/dev/sda1上的分区和交换文件系统。注意不要更改这些条目。

我们需要在fstab文件中添加两个新条目。一个用于SCSI驱动器上的分区,一个用于SSD驱动器上的分区。我们将首先添加SCSI分区。请注意,以井号#开头的行是注释。

在“文件系统”字段中,我们将使用blkid之前为我们检索到的UUID。以“UUID=”开头,然后粘贴UUID。按空格或制表符。
对于“挂载点”字段,我们将使用我们之前创建的挂载点/mnt/scsi。您将使用系统中适当的挂载点。按空格或制表符。
对于“类型”,我们将输入ext4,这是我们分区上文件系统的类型。按空格或制表符。
在“选项”字段中,我们将使用通过cat /etc/mtab检索到的选项。这些是“rw,relatime”。按空格或制表符。
“转储”字段设置为零。按空格或制表符。
“通过”字段设置为零。

现在我们将在单独的一行中添加SSD驱动器上的fstab条目分区。

在“文件系统”字段中,我们将输入blkid为SSD驱动器上的分区检索到的UUID。以“UUID=”开头,然后粘贴UUID。按空格或制表符。
对于“挂载点”字段,我们将使用我们之前创建的挂载点/mnt/ssd。按空格或制表符。
对于“类型”,我们将输入ext4,这是我们分区上文件系统的类型。按空格或制表符。
在“选项”字段中——只是为了使我们示例中的两个新条目不同——我们将使用“defaults”选项。按空格或制表符。
“转储”字段设置为零。按空格或制表符。
“通过”字段设置为零。

保存文件并关闭编辑器。

在不重新启动的情况下测试fstab

我们可以卸载我们的新驱动器,然后强制刷新fstab文件。新分区的成功挂载将验证我们输入的设置和参数在语法上是否正确。这意味着我们的fstab文件应该在重新启动或加电序列期间正确处理。

要卸载SCSI驱动器,请使用此命令。请注意,”umount”中只有一个“n”:

sudo umount /dev/sdb1

要卸载SSD驱动器,请使用以下命令:

sudo umount /dev/sdc1

现在我们将使用lsblk检查这些块设备是否已挂载。

lsblk | grep sd

我们看到块设备存在于计算机中,但没有安装在任何地方。

我们可以使用带有-a(all)选项的mount命令来重新挂载fstab中的所有文件系统。

sudo mount -a

我们可以再次使用lsblk检查我们的新分区是否已挂载:

lsblk | grep sd

一切都安装在它应该在的地方。我们现在要做的就是更改挂载点的所有权,否则只有root可以访问新的存储设备。

我们可以使用chown轻松做到这一点。这是SCSI挂载点的命令:

sudo chown dave:users /mnt/scsi

这是SSD挂载点的命令:

sudo chown dave:users /mnt/ssd

我们现在可以放心地重新启动计算机,因为我们知道我们添加的分区将为我们安装,并且我们可以访问它们。

其实没那么可怕

所有艰苦的工作都在侦查阶段——这也不难。收集到所需信息后,编辑fstab文件变得轻而易举。准备就是一切。