如何在 Linux 上使用 mkfs 命令

在Linux系统中,使用任何数据存储设备之前,必须先建立文件系统。 本文将详细介绍如何使用 mkfs 命令以及其他工具来为各种文件系统执行此操作。我们将逐步引导你完成整个过程。

使用mkfs创建文件系统

mkfs 命令的主要功能是创建文件系统。在其他操作系统中,这个过程通常被称为格式化。 无论名称如何,它都是为了准备一个分区以便存储数据的过程。分区不仅需要存储文件,还需要维护文件的名称、位置以及诸如文件创建时间戳、修改时间戳、文件大小等元数据。 一旦mkfs构建了处理和存储文件元数据所需的框架,你就可以开始向分区中添加文件了。

其语法相当直接:你只需要告诉 mkfs 你想在哪个设备分区上创建文件系统以及你期望的文件系统类型。表面上看来是这样,但实际上背后涉及到更复杂的操作。在大多数Linux发行版中,mkfs实际上是对 mke2fs 命令的封装。当你使用mkfs时,它会调用 mke2fs 并将你指定的选项传递给它。 真正的执行者是 mke2fs,它完成实际工作,却往往被忽略。

mkfs 的语法已更新,旧格式已被弃用。这两种方式都能使用,但本文将侧重于现代用法。

选择合适的文件系统

使用 mkfs 的现代方式是输入 mkfs,然后加上你想创建的文件系统的名称。

若要查看 mkfs 可以创建哪些文件系统,请键入 mkfs,然后按两次 Tab 键。注意,mkfs 后面没有空格,直接按 Tab 键即可。

终端窗口将显示可用的文件系统列表。此截图来自 Ubuntu 18.04 LTS,不同发行版可能提供不同的选项。我们将逐一介绍这些文件系统,并简要描述它们的特点,在此之前,先谈谈日志的概念。

日志是文件系统中一个至关重要的组成部分。文件系统将待处理的文件写入操作记录在日志中。每次写入操作时,日志都会更新并记录待处理的写入操作。这使得文件系统能够在发生诸如断电等灾难性事件时修复受损或部分写入的文件。一些较老的文件系统不支持日志。那些不支持日志的文件系统写入磁盘的频率较低,因为它们不需要更新日志。它们可能执行得更快,但由于文件写入中断,它们更容易受到损坏。

Ext2:Linux的第一个文件系统是MINIX文件系统。后来,它被第一个专门为Linux编写的文件系统Ext取代。Ext2 是 Ext的继任者。Ext2 不是一个日志文件系统。
Ext3: 这是 Ext2的继任者,可以看作是带有日志功能的Ext2,它保护你的文件系统免受崩溃和突然断电导致的数据损坏。
Ext4:Ext4 是许多 Linux 发行版的标准文件系统。它是一个可靠、久经考验且值得信赖的文件系统。它具有减少文件碎片的特点,并且可以用于比Ext3更大的驱动器、分区和文件。
BFS:这是引导文件系统,专门设计用于处理引导分区中的文件。通常情况下,你不需要手动创建引导文件系统,Linux安装过程会自动完成。
FAT文件分配表 文件系统是由计算机行业巨头联盟为软盘设计的。 它于1977年推出。你使用这种非日志文件系统的唯一原因是为了与非Linux操作系统兼容。
NTFS新技术文件系统是随Windows NT引入的微软日志文件系统。 它是FAT的继任者。你使用此文件系统的唯一原因是为了与非Linux操作系统兼容。
MINIX:最初由安德鲁·S·塔南鲍姆作为教育辅助工具开发的 MINIX 是一个“迷你Unix”操作系统。如今,它的目标是提供一个自我修复和容错的操作系统。MINIX 文件系统被设计成一个简化的Unix文件系统。如果你在Linux计算机上进行交叉开发并针对MINIX平台,你可能会用到这个文件系统,或者你可能需要出于其他原因与MINIX计算机兼容。在Linux计算机上,此文件系统的用例并不常见,但它是可用的。
VFAT虚拟文件分配表,在Windows 95中引入,取消了文件名的八字符限制,允许最多255个字符的文件名。你使用此文件系统的唯一原因是为了与非Linux操作系统兼容。
CRAMFS压缩ROM文件系统 是一种只读文件系统,专为嵌入式系统和专业只读用途而设计,例如在 Linux 计算机的引导过程中。 通常首先加载一个小的、临时的文件系统,以便启动引导进程,为要挂载的“真实”引导系统做准备。
MSDOS:文件系统来自微软磁盘操作系统。它于 1981 年发布,是一个基本的文件系统。第一个版本甚至没有目录。它在计算历史上占有重要地位,但除了与遗留系统的兼容性之外,今天几乎没有理由使用它。

安全测试文件系统的方法

在分区上创建文件系统会破坏该分区上可能已存在的任何数据。 使用备用硬盘驱动器(甚至是备用计算机)是尝试创建和使用不同文件系统的理想方式。 但许多人没有可用于实验的闲置硬件。

不过,我们可以创建一个镜像文件并在其中创建文件系统。 一旦我们挂载它,我们就可以像使用常规分区一样使用它。 这使我们可以在无需备用硬件的情况下探索和尝试不同的文件系统。 我们将使用 dd 命令 创建我们的镜像文件

镜像文件是通过获取源数据并将其放入文件中创建的。 我们需要告诉 dd 从哪里获取源数据。 我们将使用 if (输入文件)选项告诉 dd 使用/dev/zero 作为输入数据源。 这将产生一个零流。

of (输出文件)选项允许我们为镜像文件提供名称。我们将其命名为 “wdzwdz.img”。

镜像文件的大小由我们添加的块的大小和数量决定。我们使用 bs (块大小)选项请求 1MB 的块大小,并使用 count 选项请求 250 个块。这将创建一个 250MB 的文件系统。在执行此命令时,请根据你的需求和Linux计算机上的可用空间调整块的数量。

dd if=/dev/zero of=~/wdzwdz.img bs=1M count=250

该文件已成功创建,dd 报告它按照要求创建了 250 个块。

我们可以使用 ls 命令查看镜像文件:

ls -hl

如我们所料,它的大小为 250MB,一切正常。

创建文件系统

现在让我们选择一个要使用的文件系统。我们选择使用 Ext2,它是 mkfs 可以创建的第一个 Ext 版本。它是一个非日志文件系统,因此不要在其中存储任何重要的东西,以免数据丢失。我们使用 mkfs 命令的 mkfs.ext2 变体,并指定镜像文件作为目标。

mkfs.ext2 ~/wdzwdz.img

文件系统已创建,并显示了一些文件系统的详细信息。

从突出显示的文本中,我们可以看到 mke2fs 在幕后执行了操作。

现在我们有了一个文件系统容器(镜像文件),它可以看作是硬盘驱动器。 在这个容器中,我们创建了一个文件系统。 现在我们需要挂载文件系统才能使用它。

这是一个临时设置,因此我们将在 /mnt 中创建一个名为 “geek” 的 挂载点。 完成后,我们将删除它。

sudo mkdir /mnt/geek

现在我们可以挂载我们的镜像文件了。

sudo mount ~/wdzwdz.img /mnt/geek

我们需要更改挂载点的文件所有权,以便我们可以对其进行读写访问。

sudo chown dave:users /mnt/geek/

现在我们应该可以使用新的文件系统了。让我们切换到文件系统,并将一些文件复制到其中。

cd /mnt/geek
cp ~/Documents/Code/*.? .

这将把 ~/Documents/Code 目录中所有带有单字母扩展名的文件复制到新的文件系统中。让我们检查一下它们是否被复制。

ls

文件已成功复制,表明文件系统已创建、挂载和使用。或者我们认为如此。让我们仔细检查一下。在主目录中,我们将卸载文件系统。注意,卸载的命令是 “umount”,只有一个 “n” umount.

sudo umount /mnt/geek

现在,如果我们回到 /mnt/geek 并检查文件,我们将找不到任何文件,因为它们位于镜像文件中,并且已经被卸载。

cd /mnt/geek
ls

进一步探索

既然我们完成了这个过程,尝试另一种文件系统应该很容易。 这次我们将使用 MINIX 文件系统。在主目录中,我们可以在现有的镜像文件中创建一个新的文件系统。

请注意! 如果镜像文件中的文件系统包含重要文件,请先挂载镜像文件并在创建新文件系统之前检索这些文件。

mkfs.minix ~/wdzwdz.image

不会有任何提示询问你“是否确定”,新的文件系统会直接覆盖旧的文件系统。 我们可以使用与之前完全相同的命令来挂载镜像文件:

sudo mount ~/wdzwdz.img /mnt/geek

让我们切换到 /mnt/geek 中的新文件系统,看看是否可以创建一个文件。

touch geek.txt

ls -ahl geek.txt

就是这样简单快捷,我们已经创建了一个新的文件系统,挂载了它,并且可以使用它了。

移除挂载点

完成后,我们可以删除 “geek” 挂载点。为此,我们将使用 rmdir

cd /mnt
sudo rmdir geek

安全练习

在 Linux 系统中,就像大多数事情一样,你可以在实践中学习。 一些命令的问题在于它们具有潜在的破坏性。 问题在于如何在不危害你的系统或数据的情况下练习使用它们?

现在你已经有了一个简单的方法来创建和尝试使用 mkfs 的文件系统,而不会影响你的计算机。