如何从 Linux 终端挂载和卸载存储设备

可以使用终端挂载、卸载和重新挂载 Linux 和类 Unix 操作系统(如 macOS)中的文件系统。这是一款功能强大且用途广泛的工具——这里有您需要知道的一切。
Linux 文件系统
Linux、macOS 和其他类 Unix 操作系统中的文件系统不像 Windows 那样为存储设备使用单独的卷标识符。 Windows 为每个卷分配一个驱动器号,例如 C: 或 D:,每个卷的文件系统是位于该驱动器号下方的目录树。
在 Linux 中,文件系统是一个一体化的目录树。已安装的存储设备将其文件系统移植到该树上,因此它看起来是一个内聚文件系统的组成部分。新安装的文件系统将可以通过安装它的目录访问。该目录称为该文件系统的安装点。
许多文件系统在启动时自动安装或在运行时作为连接到计算机的存储卷即时安装。谨慎的系统管理员可以关闭运行时自动挂载功能,以便他们可以控制与系统的连接。
这意味着在运行时连接的存储设备可能不会自动挂载,需要手动挂载。手动挂载文件系统让您可以决定该文件系统,例如挂载点的位置以及文件系统是只读还是读写。
无论是出于必要还是通过选择,mount
、umount
和 remount
命令都可以让您控制这一重要方面你的 Linux 系统。
使用 mount 查询你的文件系统
Mount 有很多选项,但要列出计算机上所有已安装的文件系统,根本不需要任何选项。只需键入 mount
并按 Enter:

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 惰性选项
如果您(或其他用户)在尝试卸载文件系统时正在使用它,会发生什么情况?卸载将失败。
sudo umount /dev/sdb

它失败了,因为用户的当前工作目录在他试图卸载的文件系统中。 Linux 足够聪明,不会让您锯掉您所在的树枝。
要克服此问题,请使用 -l
(惰性)选项。这会导致 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 pi@marineville.local
ls /media/pi/USB64/Backup
exit

用户发出 SSH
命令并被提示输入他们的 Raspberry Pi 密码。
他们提供密码并通过身份验证。终端窗口提示变为 pi@marineville
,因为它已连接到 Raspberry Pi。
他们在 /media/pi/USB64/Backup
列出了共享目录的内容。内容是两个目录,一个名为dave
,一个名为pat
。所以现在我们知道挂载 Samba 共享时会发生什么。
他们键入 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
的受保护文件的路径并包含树莓派用户的用户名和密码;用于设置文件系统根目录的所有者和组的用户 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
在其中创建一个文件系统。然后可以挂载该文件系统。这是练习和试验 mount
的好方法。
我们使用 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
通过 grep
重复 mount
的管道显示 ro
已被 rw
替换(突出显示)。文件系统现在处于读写模式。
mount | grep /mnt
(不)移动文件系统
您过去可以使用单个命令卸载文件系统并将其重新挂载到另一个挂载点。
mount
中的 -M
(移动)选项专门用于允许您执行此操作。但它不再适用于已转移到 systemd
的 Linux 发行版。这就是大多数知名人士。
如果我们尝试将文件系统从 /mnt
移动到 ./geek
,它会失败并给出如下所示的错误消息。尝试通过 ./geek
列出文件系统中的文件不会返回任何结果。
sudo mount -M /mnt ./geek
ls ./geek

解决方法是使用我们之前使用的 -B
(绑定)选项将原始挂载点绑定到新的挂载点。
sudo mount -B /mnt ./geek
ls ./geek
除了不释放原始挂载点之外,这将具有相同的实际结果。
最后的观察
使用 --make-private
选项可以 强制在 Linux 的 systemd
版本上进行移动。出于两个原因,此处未介绍该技术。
- 它可能有不可预测的行为。
- 它不是持久性的,需要在每次重新启动时重复。
Devuan Linux 使用 SysV
init 而非 systemd
。一台计算机加载了最新版本的 Devuan 并进行了测试。 -M
(移动)选项在该系统上按预期工作。
除了 systemd
与 -M
(移动)选项的问题外,您还应该找到 mount
和 umount
直截了当。面对损坏的系统时,这些是非常有用的命令,您必须开始手动将文件系统拼凑起来。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts