在 Linux 和类 Unix 操作系统(如 macOS)中,文件系统的管理可以通过终端进行,包括挂载(mount)、卸载(umount)和重新挂载(remount)。本文将深入探讨这些强大而灵活的工具,让你全面了解其功能和应用。
Linux 文件系统的运作机制
与 Windows 系统为每个存储设备分配单独的卷标(如 C:、D:)不同,Linux 及其他类 Unix 系统采用统一的目录树结构。在 Linux 中,所有文件系统都整合到一个单一的目录树中。已挂载的存储设备将其文件系统接入这个树形结构,使其成为一个整体。新挂载的文件系统通过其挂载点(即文件系统所连接的目录)进行访问。
大多数文件系统在系统启动时会自动挂载,或者在运行时作为存储卷自动连接到系统中。然而,谨慎的系统管理员可以选择禁用自动挂载功能,从而对系统的连接进行更精细的控制。
手动挂载文件系统允许用户决定挂载点的位置以及文件系统的读写权限,这种方式在需要更精确控制时非常有用。不论是出于必要还是个人选择,`mount`、`umount` 和 `remount` 命令为用户提供了管理 Linux 系统文件系统的重要工具。
使用 `mount` 命令查询文件系统
`mount` 命令功能强大,选项繁多,但要列出当前计算机上所有已挂载的文件系统,无需任何额外选项。只需在终端中输入 `mount` 并按下 Enter 键即可:
此命令会在终端窗口中显示所有已连接的文件系统。
由于输出信息较多,可能难以快速找到所需信息。为了优化输出,可以要求 `mount` 仅列出感兴趣的文件系统类型。使用 `-t` (type) 选项可以指定要显示的文件系统类型,例如:
mount -t tmpfs
mount -t ext4
以上命令分别列出 `tmpfs` 和 `ext4` 文件系统。 `tmpfs` 文件系统看起来像常规的已挂载文件系统,但实际上它存储在易失性内存中,而不是持久存储设备上。你可以根据需要替换文件类型参数。
在示例中,我们看到一个位于设备 `sda`(通常是主硬盘驱动器)上的 `ext4` 文件系统,它被挂载在文件系统树的根目录 `/` 上。输出中,`rw` 表示该文件系统可读写;`relatime` 表示内核正在使用优化方案记录文件访问和修改元数据;`errors=remount-o` 表示如果检测到严重错误,文件系统将以只读模式重新挂载。
使用 `df` 命令查询文件系统
`df` 命令也可以用来显示已挂载的文件系统及其挂载点。不带参数运行 `df` 命令会导致信息过载,如同 `mount` 命令一样。例如,在 Ubuntu Linux 中,使用 snap 命令安装的每个应用都会创建一个 `squashfs` 伪文件系统,这些信息通常并不需要显示。
为了排除特定类型的文件系统,可以使用 `-x` (exclude) 选项,例如排除 `squashfs` 文件系统:
df -x squashfs
通过 `df` 命令,你可以轻松查看文件系统的名称、容量、已用空间、可用空间及其挂载点。
在 `fstab` 中重新挂载所有文件系统
所有在系统启动时自动挂载的文件系统,其配置信息都保存在 `/etc` 目录下的 `fstab` 文件中。`fstab` 文件是文件系统表,记录了系统启动时要挂载的文件系统。
可以使用 `mount -a` 命令强制 “刷新” 并重新挂载 `fstab` 文件中列出的所有文件系统。正常情况下无需使用此命令,但当多个文件系统出现问题时,此命令可能非常有效。使用 `sudo` 需要输入管理员密码:
sudo mount -a
在运行良好的计算机上,此命令可能看起来不起眼,但对于存在文件系统问题的计算机,重新挂载可能会解决问题。如果问题依然存在,系统至少会在屏幕和系统日志中显示诊断信息,帮助你找到问题的根源。
挂载 ISO 镜像
挂载 ISO 镜像文件可以让你像访问文件系统一样访问其内容。以下命令可以挂载任意 ISO 镜像文件。 这里使用了一个微型内核 Linux ISO 镜像作为示例,因为它体积小,下载速度快。
在与 ISO 镜像文件相同的目录中,输入以下命令,将 `TinyCore-current.iso` 替换为你想要挂载的 ISO 文件名:
sudo mount -t iso9660 -o loop TinyCore-current.iso /mnt
使用 `sudo` 需要输入管理员密码。其中,`-t iso9660` 选项指定要挂载的文件系统类型为 ISO 文件,而 `-o loop` 参数告诉 mount 使用循环设备文件来连接 ISO 镜像。循环设备文件允许将 ISO 镜像这类文件视为存储设备。设备文件是特殊的接口文件,使得连接的设备看起来像普通的文件系统文件,这是 Linux 中“一切皆文件”设计理念的一部分。
命令还需要指定 ISO 镜像的名称以及挂载点。这里选择 `/mnt` 作为挂载点。挂载完成后,ISO 镜像的内容就可以像普通目录一样被访问。终端窗口会显示 ISO 镜像始终以只读模式挂载。
浏览 ISO 镜像
成功挂载 ISO 镜像后,你可以像浏览文件系统的其他部分一样,导航 ISO 镜像中的目录。可以使用 `ls` 命令列出 `/mnt` 下的文件和目录,例如:
ls /mnt
ls /mnt/cde/
卸载 ISO 镜像
要卸载已挂载的文件系统,可以使用 `umount` 命令。注意,“u”和“m”之间没有“n”。你需要告诉 `umount` 要卸载的文件系统,可以通过提供文件系统的挂载点来实现:
sudo umount /mnt
没有消息就是好消息。如果没有任何错误报告,则说明卸载成功。
创建挂载点
你可以创建和使用自己的挂载点。挂载点本质上只是一个目录。可以使用 `mkdir` 命令创建新的挂载点,例如:
sudo mkdir /media/dave/isomnt
创建好挂载点之后,你可以使用相同的命令格式挂载 ISO 镜像,例如:
sudo mount -r -t iso9660 -o loop TinyCore-current.iso /media/dave/isomnt/
现在,你可以从新的挂载点访问挂载的文件系统,如:
ls /media/dave/isomnt/cde/optional
绑定挂载点
可以将挂载点绑定到另一个目录。这样,就可以通过原始挂载点或绑定目录访问挂载的文件系统。以下是一个示例: 在用户的主目录中创建一个名为 `iso` 的目录,并将 ISO 镜像 `/media/dave/isomnt` 的挂载点绑定到这个新目录:
mkdir iso
sudo mount -B /media/dave/isomnt/ iso
ls iso
ls /media/dave/isomnt
cd iso
ls
cd cde
通过 `-B` (bind) 选项,你可以将一个目录绑定到另一个目录。现在你可以通过原始挂载点 `/media/dave/isomnt` 和新的 `iso` 目录访问 ISO 镜像。
`umount` 与绑定挂载点
对于已绑定到另一个目录的文件系统,需要从其挂载点和绑定点都卸载。 即使你从原始挂载点卸载文件系统,仍然可以从绑定目录访问该文件系统,因此必须同时从两个位置卸载:
sudo umount /media/dave/isomnt
ls iso
sudo umount iso
ls iso
挂载软盘
软盘驱动器(包括软盘)是一种存储设备,使用 `sd`(存储设备)设备文件连接到物理设备。要确定下一个可用的 `sd` 设备文件,可以使用 `df` 命令结合 `grep` 命令来搜索包含 “sd” 的条目:
df | grep /dev/sd
在此示例中,`/dev/sda` 设备文件正在使用中,下一个可用的 `sd` 设备文件将是 `/dev/sdb`,当连接软盘驱动器时,Linux 将使用 `/dev/sdb` 连接到软盘驱动器。要将软盘驱动器中的软盘上的文件系统挂载到 `/mnt` 挂载点,可以使用以下命令:
sudo mount /dev/sdb /mnt
文件系统标签
可以使用 `-l`(label)选项找出文件系统上的标签(如果有)。 标签仅仅是任意名称,没有实际的功能用途。例如,要查看 `vfat` 文件系统的标签,可以使用:
mount -l -t vfat
标签会显示在列表末尾的方括号中。可以通过 `/mnt` 挂载点访问软盘驱动器,例如:
cd /mnt
ls
ls -l AMATCH.C
软盘可能包含旧的 C 语言源代码文件,其最后修改日期可能在很久以前。通过 `df` 命令列出 `sd` 设备文件,可以看到当前有两个 `sd` 设备文件:
df | grep /dev/sd
`/dev/sdb` 是软盘驱动器,而软盘上的文件系统挂载在 `/mnt`。要卸载软盘,可以使用 `umount` 命令,并将其设备文件作为参数:
sudo umount /dev/sdb
`umount` 的惰性选项
如果用户正在使用某个文件系统,此时尝试卸载该文件系统将会失败。例如,如果用户当前的工作目录在尝试卸载的文件系统中,卸载操作会失败。为了解决这个问题,可以使用 `-l`(lazy)选项,这将使 `umount` 命令等待文件系统安全卸载。例如:
sudo umount -l /dev/sdb
ls
cd ~
ls /mnt
即使执行了 `umount` 命令,文件系统仍然处于挂载状态,用户可以正常列出文件。一旦用户将目录更改为其主目录,软盘文件系统就会被释放并卸载。
挂载 Samba 共享
Samba 是一组软件服务,允许在 Linux 和类 Unix 操作系统以及 Windows 操作系统之间进行网络共享。 在 Linux 中,你可以挂载 Samba 共享。要访问已提供的 Samba 共享,首先要安装 `cifs-utils` 软件包。在基于 Debian 的发行版中,可以使用 `apt-get` 命令安装,例如:
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` 文件(包含 Samba 用户名和密码的路径),用户 ID (UID) 和组 ID (GID) 用于设置文件系统的根目录所有者和组。
- `//192.168.4.13/share`:Samba 共享的网络位置和共享目录的 Samba 名称。
- `/media/dave/NAS`:挂载点的名称(需要提前创建)。
通过访问 `/media/dave/NAS` 的挂载点,你可以通过网络访问 Raspberry Pi 上的共享目录。你也可以看到 Raspberry Pi 上的两个文件夹:`dave` 和 `pat`,例如:
cd /media/dave/NAS
创建和挂载文件系统
可以使用 `dd` 命令创建镜像文件,然后使用 `mkfs` 命令在其中创建文件系统,之后可以挂载此文件系统。这是一个练习和试验 `mount` 命令的好方法。以下命令创建了一个名为 `geek_fs` 的镜像文件,并使用来自 `/dev/zero` 的零值流作为输入:
dd if=/dev/zero of=./geek_fs bs=1M count=20
可以使用 `mkfs` 命令在 `geek_fs` 文件中创建文件系统,例如创建一个 `ext4` 系统:
mkfs -t ext4 ./geek_fs
要挂载该文件系统到 `/media/dave/geek`,并设置文件系统的所有者和组,可以使用以下命令:
sudo mount ./geek_fs /media/dave/geek
sudo chown dave:users /media/dave/geek
现在,你可以进入新的文件系统并在其中拷贝文件,如:
cd /media/dave/geek
cp /etc/fstab .
ls -l
使用 `mount` 命令列出已挂载的文件系统,并通过 `-t` 选项限制只显示 `ext4` 文件系统,你会看到现在有两个已挂载的 `ext4` 文件系统,如下所示:
mount -t ext4
重新挂载文件系统
使用 `-o remount` 选项可以重新挂载文件系统,通常用于将文件系统从只读模式更改为读写模式。例如,首先以只读模式挂载软盘驱动器:
sudo mount -r /dev/sdb /mnt
mount | grep /mnt
使用 `-o remount,rw` 选项,可以卸载并使用新的设置重新安装文件系统,所有操作都可以在一个命令中完成,例如:
sudo mount -o remount,rw /mnt
mount | grep /mnt
这将文件系统切换到读写模式。
文件系统的移动(不适用)
曾经可以使用单个命令卸载文件系统并将其重新挂载到另一个挂载点,`-M`(移动)选项用于此目的。但是,该选项不再适用于使用 systemd 的 Linux 发行版。 例如尝试将文件系统从 `/mnt` 移动到 `./geek` 将会失败。 此时可以使用之前介绍的 `-B` (bind) 选项将原始挂载点绑定到新的挂载点:
sudo mount -M /mnt ./geek
ls ./geek
sudo mount -B /mnt ./geek
ls ./geek
这可以实现相同的结果,只是不会释放原始挂载点。
最后的总结
在 Linux 的 systemd 版本中,可以使用 `–make-private` 选项强制进行迁移,但此技术可能存在不可预测的行为,且不是持久的,每次重启后都需要重复操作。在没有采用 systemd 的 Linux 发行版中,`-M`(移动)选项按预期工作。
总的来说,`mount` 和 `umount` 命令非常实用,且使用简单。当系统出现问题时,这些命令可以帮助你手动重新组合文件系统。