
在 Linux 和类 Unix 操作系统(如 macOS)中,可以使用终端来挂载、卸载和重新挂载文件系统。这是一个强大而通用的工具——这里是你需要知道的一切。
🏷️ Linux 文件系统
Linux、macOS 和其他类 Unix 操作系统中的文件系统,不像 Windows 那样为存储设备使用单独的卷标识符。Windows 为每个卷分配一个驱动器盘符,例如 C: 或 D:,并且每个卷的文件系统都是位于该驱动器盘符下的目录树。
在 Linux 中,文件系统是一个一体化的目录树。挂载的存储设备将其文件系统连接到该树上,使其看起来像是统一文件系统的一个组成部分。新挂载的文件系统将通过其挂载到的目录进行访问。该目录被称为该文件系统的挂载点。
许多文件系统在启动时或在运行时连接到计算机的存储卷时自动挂载。谨慎的系统管理员可以关闭运行时自动挂载功能,以便他们可以控制与系统的连接。
这意味着在运行时连接的存储设备可能不会自动挂载,需要手动挂载。手动挂载文件系统允许你对该文件系统做出决策,例如挂载点的位置以及文件系统是只读还是读写。
无论是出于必要还是选择,mount、umount 和 remount 命令都能让你控制 Linux 系统的这一重要方面。

🏷️ 使用 mount 命令查询文件系统
mount 命令有很多选项,但要列出计算机上所有已挂载的文件系统,根本不需要任何选项。只需键入 mount 并按 Enter 键:
mount
mount 命令将在终端窗口中列出所有已连接的文件系统。

从这些大量的数据中找到你想要的信息可能很困难。你可以通过要求 mount 命令仅列出你感兴趣的文件系统来优化输出。-t(类型)选项告诉 mount 命令要报告的文件系统类型。
mount -t tmpfs
mount -t ext4

例如,我们要求 mount 命令仅列出 tmpfs 文件系统。我们得到了一个更易于管理的输出。
tmpfs 文件系统看起来像是常规的已挂载文件系统,但实际上它存储在易失性内存中——tmp 代表临时——而不是在持久性存储设备上。
你需要将 tmpfs 参数替换为你感兴趣的文件类型。
我们还发出了一个命令来列出 ext4 文件系统。在这台测试计算机上,只有一个 ext4 文件系统,它位于设备 sda 上——第一个挂载的存储设备,通常是主硬盘驱动器——并且挂载在 / 上,这是文件系统树的根目录。
其他指示符的含义是:
rw: 文件系统是可读写的。relatime: 内核正在使用一种优化的方案来记录文件访问和修改的元数据。errors=remount-o: 如果检测到足够严重的错误,文件系统将以只读模式重新挂载以进行诊断。
🏷️ 使用 df 命令查询文件系统
df 命令也可用于显示哪些文件系统已挂载以及它们的挂载点在哪里。
不带任何参数使用 df 命令会产生与 mount 命令相同的信息过载问题。例如,在 Ubuntu Linux 中,为每个使用 snap 命令安装的应用程序创建一个 squashfs 伪文件系统。谁想看到所有这些?
要强制 df 命令忽略它们——或任何其他文件系统类型——请使用 -x(排除)选项:
df -x squashfs
你可以轻松地看到文件系统的名称、容量、已用和可用空间以及它们的挂载点。
🏷️ 重新挂载 fstab 中的所有文件系统
所有在启动时挂载的文件系统在名为 fstab 的文件中都有条目,该文件是位于 /etc 中的文件系统表。
你可以使用 mount 命令强制“刷新”并重新挂载 fstab 中列出的所有文件系统。在正常操作条件下,这是不需要的。如果你有多个文件系统的问题,它会真正发挥作用。
你需要使用 sudo,因此系统会提示你输入密码。
sudo mount -a
诚然,在一台运行正常的计算机上,这有点平淡无奇。
但是,在有文件系统问题的计算机上,重新挂载可能会清除问题。如果这没有发生,那么至少你会在屏幕上和系统日志中收到诊断消息,这些消息将指导你找到问题的原因。
🏷️ 挂载 ISO 镜像
挂载 ISO 镜像很容易,这样你就可以访问其内容,作为文件系统的一部分。
这适用于任何 ISO 镜像。在这个例子中,我们碰巧使用 Tiny Core Linux ISO,因为它很小且下载速度很快。(一个带有 GUI 的微型 Linux 发行版,只有 18 MB!你可能有比这更大的 MP3 文件。)
在与 ISO 镜像相同的目录中,发出此命令。替换你要挂载的 ISO 文件的名称。
sudo mount -t iso9660 -o loop TinyCore-current.iso /mnt
因为我们需要使用 sudo,所以你需要输入你的密码。
-t(类型)选项告诉 mount 命令我们要挂载的文件系统类型。它是一个 ISO 文件,因此我们提供 iso9660 类型说明符。
-o(选项)标志用于将额外的参数传递给 mount 命令。我们的参数是 loop。
我们使用 loop 来强制 mount 命令使用循环设备文件来连接到我们的 ISO 镜像。循环设备文件允许挂载一个文件(如 ISO 镜像)并将其视为存储设备。
设备文件是特殊文件,用作接口,以便连接的设备看起来像是普通的文件系统文件。这是 Linux 中一切皆文件设计理念的一部分。
有许多不同类型的设备文件。我们之前看到过一个,当时我们注意到这台测试机器上唯一的 ext4 文件系统挂载在 / 上,并且名为 sda。
更准确地说,该 ext4 文件系统位于通过 /dev/sda 设备文件连接到文件系统的存储设备上,并且该存储设备上的文件系统挂载在 /。
我们当然必须提供 ISO 镜像的名称,并且我们需要让 mount 命令知道我们希望将文件系统挂载到哪里。我们选择了 /mnt。
ISO 镜像已挂载。终端窗口中出现一个提醒,即 ISO 镜像始终以只读模式挂载。
🏷️ 浏览 ISO 镜像
现在它已挂载,我们可以像浏览文件系统的任何其他部分一样浏览 ISO 镜像中的目录。让我们列出 ISO 镜像中的文件。记住,它挂载在 /mnt。
ls /mnt
ls /mnt/cde/
🏷️ 卸载 ISO 镜像
要卸载已挂载的文件系统,请使用 umount 命令。请注意,在 "u" 和 "m" 之间没有 "n"——命令是 umount 而不是 "unmount"。
你必须告诉 umount 命令你要卸载哪个文件系统。为此,请提供文件系统的挂载点。
sudo umount /mnt
没有消息就是好消息。如果没有什么可报告的,那么一切都进展顺利。
🏷️ 创建挂载点
你可以创建和使用自己的挂载点。我们将创建一个名为 isomnt 的挂载点,并将我们的 ISO 镜像挂载到该挂载点上。挂载点只是一个目录。因此我们可以使用 mkdir 命令来创建我们的新挂载点。
sudo mkdir /media/dave/isomnt
现在我们可以使用与之前相同的命令格式来挂载我们的 ISO 镜像。这次我们不会将其挂载在 /mnt 上,而是将其挂载在 /media/dave/isomnt/ 上:
sudo mount -r -t iso9660 -o loop TinyCore-current.iso /media/dave/isomnt/
我们现在可以从我们的新挂载点访问已挂载的文件系统。
ls /media/dave/isomnt/cde/optional
但是这些路径变得非常长。这很快就会变得令人厌烦。让我们对此做些什么。
🏷️ 绑定挂载点
你可以将一个挂载点绑定到另一个目录。然后,可以通过原始挂载点或通过绑定到它的目录来访问已挂载的文件系统。
这是一个实际的例子。我们将在我们的主目录中创建一个名为 iso 的目录。然后,我们将 ISO 镜像的挂载点 /media/dave/isomnt 绑定到我们主目录中的新 iso 目录。
我们将能够通过原始挂载点 /media/dave/isomnt 和通过新的 iso 目录来访问 ISO 镜像。-B(绑定)选项需要挂载点的名称和要绑定到的目录的名称。
mkdir iso
sudo mount -B /media/dave/isomnt/ iso
ls iso
ls /media/dave/isomnt
cd iso
ls
cd cde
🏷️ 将 umount 命令与绑定一起使用
已将其挂载点绑定到另一个目录的文件系统需要从其挂载点和绑定点卸载。
即使我们从其原始挂载点卸载文件系统,你仍然可以从其绑定目录访问该文件系统。文件系统也必须从该目录卸载。
sudo umount /media/dave/isomnt
ls iso
sudo umount iso
ls iso
🏷️ 挂载软盘
软盘驱动器(带软盘)是一个存储设备。这意味着将使用 sd(代表存储设备)设备文件来连接到物理设备。我们必须确定下一个空闲的 sd 设备文件是什么。我们可以通过将 df 命令的输出通过管道传递给 grep 命令并查找包含 "sd" 的条目来做到这一点。
df | grep /dev/sd
在这台计算机上,只有一个 sd 设备文件在使用。这是 /dev/sda。下一个发出的 sd 设备文件将是 /dev/sdb。这意味着当我们把软盘驱动器连接到电脑上时,Linux 将会使用 /dev/sdb 来连接软盘驱动器。
我们将告诉 mount 命令将软盘驱动器中软盘上的文件系统挂载到 /dev/sdb,挂载点为 /mnt。
将软盘插入软盘驱动器,然后将软盘驱动器连接到计算机上的 USB 端口。发出以下命令:
sudo mount /dev/sdb /mnt
🏷️ 文件系统标签
我们可以使用 -l(标签)选项与 mount 命令一起使用,以找出附加到文件系统的标签(如果有)。标签只不过是任意名称。它们没有实际用途。
我们使用 -t(类型)选项来要求 mount 命令仅报告 vfat 文件系统。
mount -l -t vfat
你会在列表的末尾的方括号中找到标签。此软盘驱动器的标签为 NORTUN。
我们可以通过 /mnt 挂载点访问软盘驱动器。
cd /mnt
ls
ls -l AMATCH.C
软盘包含 C 语言源代码文件。一个文件的时间戳显示它最后一次修改是在 1992 年 10 月。它可能比我们的许多读者都老。(不用说,NORTUN 作为标签的含义已经消失在历史的长河中。)
如果我们重复我们的 df 命令通过管道传递给 grep 命令以列出 sd 设备文件,我们会看到现在有两个。
df | grep /dev/sd
我们的软盘驱动器显示为挂载在 /dev/sdb 上,正如我们预期的那样。驱动器中软盘上的文件系统挂载在 /mnt 上。
要卸载软盘,我们使用 umount 命令并将设备文件作为参数传递给它。
sudo umount /dev/sdb
🏷️ umount 命令的 Lazy 选项
如果你(或另一个用户)在尝试卸载文件系统时正在使用该文件系统会发生什么?卸载将会失败。
sudo umount /dev/sdb
它失败了,因为用户的当前工作目录位于他试图卸载的文件系统中。Linux 非常聪明,不会让你锯掉你坐在上面的树枝。
要克服这个问题,请使用 -l(lazy)选项。这会导致 umount 命令等待,直到文件系统能够安全地卸载。
sudo umount -l /dev/sdb
ls
cd ~
ls /mnt
即使发出了 umount 命令,文件系统仍然挂载,用户可以像往常一样列出文件。
一旦用户将目录更改为他们的主目录,软盘文件系统就会被释放并卸载。尝试在 /mnt 中列出文件不会产生任何结果。
🏷️ 挂载 Samba 共享
Samba 是一组软件服务,允许在 Linux 和类 Unix 操作系统以及 Windows 操作系统之间互换访问网络共享。
设置 Samba 超出了本文的范围。但是,如果你已获得授权访问已提供给你的 Samba 共享,那么你可以这样在 Linux 中挂载它。
连接到与测试机器相同的网络的 Raspberry Pi 上有一个 Samba 共享。它是一个名为 Backup 的目录,已被赋予 Samba 名称 "share"。让我们建立一个 SSH 连接到它,并查看共享目录的内容。共享目录位于挂载在 Pi 上的 USB 闪存驱动器上。
用户名是 pi,Raspberry Pi 的网络名称是 marineville.local。
ssh [email protected]
ls /media/pi/USB64/Backup
exit
用户发出 SSH 命令,系统会提示他们输入 Raspberry Pi 密码。
他们提供他们的密码并进行身份验证。终端窗口提示符更改为 pi@marineville,因为它已连接到 Raspberry Pi。
他们在 /media/pi/USB64/Backup 列出共享目录的内容。内容是两个目录,一个名为 dave,一个名为 pat。所以现在我们知道当我们挂载 Samba 共享时会发生什么。
Linux 吉祥物看起来很困惑,背景中是一些文件夹。
他们键入 exit 以断开与 Raspberry Pi 的连接,提示符更改回 dave@howtogeek。
要使用 Samba,你必须安装 cifs-utils 软件包。
如果你使用的是 Ubuntu 或其他基于 Debian 的发行版,请使用 apt-get 将此软件包安装到你的系统上。在其他 Linux 发行版上,请改用你的 Linux 发行版的软件包管理工具。
sudo apt-get install cifs-utils
安装完成后,使用如下命令挂载共享,根据你的情况更改 IP 地址、共享名称和挂载点(必须已存在)。
sudo mount -t cifs -o credentials=/etc/samba/creds,uid=1000,gid=1000 //192.168.4.13/share /media/dave/NAS
让我们分解一下该命令的各个部分。
-t cifs:文件系统类型是 cifs。-o credentials=/etc/samba/creds,uid=1000,gid=1000:选项参数是名为 creds 的文件的路径,该文件是安全的,并且包含 Raspberry Pi 用户的用户名和密码;用于设置文件系统根目录的所有者和组的用户 ID (UID) 和组 ID (GID)。//192.168.4.13/share:具有 Samba 共享的设备的网络位置,以及共享目录的 Samba 名称。共享的根目录是一个名为 Backup 的目录,但其 Samba 共享名称设置为 share。/media/dave/NAS:挂载点的名称。你必须提前创建你的挂载点。
通过访问我们在 /media/dave/NAS 的挂载点,我们正在访问网络上 Raspberry Pi 上的共享目录。我们可以看到 Raspberry Pi 上的两个文件夹,分别名为 dave 和 pat。
cd /media/dave/NAS
🏷️ 创建和挂载文件系统
你可以使用 dd 命令创建一个镜像文件,然后使用 mkfs 命令在其中创建一个文件系统。然后可以挂载该文件系统。这是练习和试验挂载的好方法。
我们使用 if(输入文件)选项来告诉 dd 命令使用来自 /dev/zero 的零值流作为输入文件。
of(输出文件)是一个名为 geek_fs 的新文件。
我们使用 bs(块大小)选项来请求 1 MB 的块大小。
我们使用 count 选项来告诉 dd 命令在输出文件中包含 20 个块。
dd if=/dev/zero of./geek_fs bs=1M count=20
这为我们创建了镜像文件。它只包含零值。
我们可以使用 mkfs 命令在 geek_fs 文件中创建一个工作文件系统。-t(类型)选项允许我们选择文件系统类型。我们正在创建一个 ext4 系统。
mkfs -t ext4 ./geek_fs
这就是拥有一个工作文件系统所需的全部。
让我们将其挂载到 /media/dave/geek 上,然后使用 chown 命令设置所有者和组所有权,以允许访问它。
sudo mount ./geek_fs /media/dave/geek
sudo chown dave:users /media/dave/geek
它有效吗?让我们更改为新的文件系统并复制一个文件进去看看。
cd /media/dave/geek
cp /etc/fstab .
ls -l
我们能够更改目录为新的文件系统,并且我们成功地复制了 /etc/fstab 文件。它正在工作!
如果我们使用 mount 命令列出已挂载的文件系统,但使用 -t(类型)选项将其输出限制为 ext4 文件系统,我们将看到现在有两个已挂载的 ext4 文件系统。
mount -t ext4
🏷️ 重新挂载文件系统
重新挂载文件系统使用 -o remount 选项。它通常用于将文件系统从只读(测试)状态更改为读写(生产)状态。
让我们再次挂载我们的软盘驱动器。这次我们将使用 -r(只读)标志。然后我们将通过管道将 mount 命令传递给 grep 命令,并查看软盘文件系统的详细信息。
sudo mount -r /dev/sdb /mnt
mount | grep /mnt
正如你所看到的,突出显示的 ro 指示文件系统以只读方式挂载。
使用带有 rw(读写)标志的 -o remount 选项,我们可以在一个命令中卸载并重新挂载具有新设置的文件系统。
sudo mount -o remount,rw /mnt
mount | grep /mnt
重复通过管道将 mount 命令传递给 grep 命令的过程,我们看到 ro 已被 rw 替换(突出显示)。文件系统现在处于读写模式。
(不)移动文件系统
你过去可以使用单个命令卸载文件系统并将其重新挂载到另一个挂载点。
mount 命令中的 -M(移动)选项专门用于允许你执行此操作。但是,它在已迁移到 systemd 的 Linux 发行版中不再起作用。而且这几乎是所有的大牌发行版。
如果我们尝试将文件系统从 /mnt 移动到 ./geek,它将失败并给出如下所示的错误消息。尝试通过 ./geek 列出文件系统中的文件不会返回任何结果。
sudo mount -M /mnt ./geek
ls ./geek
解决方法是使用我们之前使用的 -B(绑定)选项将原始挂载点绑定到新挂载点。
sudo mount -B /mnt ./geek
ls ./geek
除了不释放原始挂载点之外,这将具有相同的实际结果。
🏷️ 最后的观察
使用 --make-private 选项,可以强制在 systemd 版本的 Linux 上进行移动。此处未介绍该技术,原因有两个。
- 它可能具有不可预测的行为。
- 它不是持久的,需要在每次重启时重复。
Devuan Linux 使用 SysV init 而不是 systemd。一台计算机已加载最新版本的 Devuan 并进行了测试。-M(移动)选项在该系统上按预期工作。
除了 systemd 导致 -M(移动)选项出现问题外,你应该会发现 mount 和 umount 命令的使用非常简单。当你面临损坏的系统并且必须手动将文件系统重新拼凑在一起时,这些都是很棒的命令。
原创文章,作者:诺多,如若转载,请注明出处:https://www.huluohu.com/posts/1607/
微信扫一扫
支付宝扫一扫