在Linux和类似Unix的操作系统(如macOS)中,可以使用终端来挂载、卸载和重新挂载文件系统。这是一个强大而多功能的工具,下面是你需要了解的全部内容。
Linux文件系统
在Linux、macOS和其他类Unix操作系统中,文件系统不像Windows那样使用单独的卷标识符来管理存储设备。Windows为每个卷分配一个驱动器号(如C:或D:),而每个卷的文件系统是驱动器号下面的目录树。
在Linux中,文件系统是一个全包含的目录树。挂载的存储设备的文件系统被嫁接到该目录树上,以使其看起来成为一个统一的文件系统的一部分。新挂载的文件系统将通过其挂载的目录访问。该目录被称为该文件系统的挂载点。
许多文件系统会在启动时自动挂载,或在运行时连接到计算机的存储设备上自动挂载。谨慎的系统管理员可以关闭运行时自动挂载功能,以便控制对系统的连接。
这意味着运行时连接的存储设备可能不会自动挂载,并需要手动挂载。手动挂载文件系统可以让您对该文件系统做出决策,例如挂载点位置和文件系统是只读还是可读写。
无论是出于必要性还是选择性,mount、umount和remount命令都可以让您控制Linux系统中这一重要方面。
使用mount来审查你的文件系统
挂载命令有很多选项,但要列出计算机上所有已挂载的文件系统则不需要任何选项。只需输入 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,因为它大小方便且下载速度快。(一个带有图形界面的微型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 (label) 选项和 mount 命令一起使用,来找出文件系统是否有附加的标签。标签只是任意的名称,没有实际用途。
我们使用 -t (type) 选项来让 mount 命令只报告 vfat 文件系统。
mount -l -t vfat
你可以在列表的末尾的方括号中找到标签。这个软盘驱动器的标签是 NORTUN。
我们可以通过 /mnt 挂载点访问这个软盘驱动器。
cd /mnt
ls
ls -l AMATCH.C
这个软盘包含了 C 语言源代码文件。其中一个文件的日期显示它最后修改于 1992 年 10 月。它可能比很多读者都要古老了。(不用说,作为标签的 NORTUN 的意义已经迷失在时间的迷雾中了。)
如果我们重复使用 df 命令并通过 grep 过滤 sd 设备文件的命令,我们会看到现在有两个 sd 设备文件。
df | grep /dev/sd
我们预期软盘驱动器会以 /dev/sdb 的形式显示为已挂载。软盘驱动器中软盘的文件系统挂载在 /mnt 上。
要卸载软盘,我们使用 umount 命令,并将设备文件作为参数传递给它。
sudo umount /dev/sdb
延迟卸载选项
如果你(或另一个用户)在尝试卸载文件系统时正在使用它,会发生什么?卸载将失败。
sudo umount /dev/sdb
失败是因为用户的当前工作目录位于他正在尝试卸载的文件系统内。Linux足够聪明,不会让你在坐的树枝上锯掉树枝。
为了克服这个问题,可以使用-l(lazy)选项。这会导致umount命令等待,直到文件系统能够安全地卸载。即使发出了umount命令,文件系统仍然被挂载,用户可以像正常情况下一样列出文件。
sudo umount -l /dev/sdb
ls
cd -
ls /mnt
一旦用户切换到自己的主目录,软盘文件系统就会被释放和卸载。尝试列出/mnt中的文件将不会产生任何结果。
安装Samba共享
Samba是一组软件服务,允许在Linux、类Unix操作系统和Windows操作系统之间互相访问网络共享。设置Samba超出了本文的范围。但是,如果您已经获得了Samba共享的授权访问权限,这是您如何在Linux中挂载它。
连接到与测试机器相同网络的树莓派上有一个Samba共享。它是一个名为Backup的目录,其Samba名称是”share”。让我们建立一个SSH连接并查看共享目录的内容。共享目录位于树莓派上挂载的USB设备上。
用户名是pi,树莓派的网络名称是marineville.local。用户发出SSH命令,并提示输入他们的树莓派密码。
ssh [email protected]
ls /media/pi/USB64/Backup
exit
他们提供密码并通过认证。终端窗口的提示符更改为pi@marineville,因为它已连接到树莓派。
他们列出了位于/media/pi/USB64/Backup的共享目录的内容。内容包括两个目录,一个名为dave,一个名为pat。所以现在我们知道在挂载Samba共享时可以期望什么。
他们键入exit断开与树莓派的连接,提示符恢复为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的挂载点,我们可以通过网络访问树莓派上的共享目录。我们可以看到树莓派上名为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(只读)标志。然后我们将通过grep管道挂载并查看软盘文件系统的详细信息。正如您所看到的,突出显示的”ro”表示文件系统以只读方式挂载。
sudo mount -r /dev/sdb /mnt
mount | grep /mnt
使用 -o remount 选项和 rw (读写)标志,我们可以在一个命令中卸载和重新挂载文件系统,并使用新的设置。
sudo mount -o remount,rw /mnt
通过重新用grep管道对挂载进行过滤,我们可以看到”ro”已被”rw”(突出显示)替换。文件系统现在处于读写模式。
sudo mount -o remount,rw /mnt
(不)移动文件系统
以前,您可以使用一个命令卸载文件系统并将其重新挂载到另一个挂载点上。
mount 中的 -M(移动)选项专门用于允许您执行此操作。但是,在已经转向systemd的Linux发行版中,这不再起作用。而这有大多数知名的发行版。
如果我们尝试将文件系统从 /mnt 移动到 ./geek,它将失败,并给出下面显示的错误消息。试图通过 ./geek 列出文件系统中的文件将不会返回结果。
sudo mount -M /mnt ./geek
ls ./geek
可行的解决方法是使用我们早先使用的-B(绑定)选项,将原始挂载点与新的挂载点绑定。
sudo mount -B /mnt ./geek
ls ./geek
除了没有释放原始挂载点之外,这将产生相同的实际结果。

文章评论