在Linux中使用mount和umount命令附加和分离文件系统或设备
1. 概述
我们知道,文件是 Linux 系统中的核心操作单元 。文件和目录存储在文件系统中,文件系统可以位于各种设备上,例如硬盘或 USB 驱动器。文件系统也可以通过网络共享。
在本教程中,我们将讨论如何使用*mount * 命令附加各种文件系统并使用命令*umount 分离它们。*
2. 列出挂载的文件系统
在 Linux 中,我们可以将文件系统挂载到任何目录中。结果,当我们进入目录时,可以访问存储在该文件系统中的文件。
我们称这些目录为文件系统的“挂载点”。
我们可以使用不带任何参数的mount命令获取所有当前挂载的文件系统的信息:
$ mount
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sys on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
dev on /dev type devtmpfs (rw,nosuid,relatime,size=8133056k,nr_inodes=2033264,mode=755)
run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
/media/Data/archLinux.iso on /mnt/archIso type udf (ro,relatime,utf8)
/dev/sdb1 on / type ext4 (rw,noatime,commit=120)
...
让我们以最后的输出行为例来了解mount命令给我们的信息:
## /dev/sdb1 on / type ext4 (rw,noatime,commit=120)
(1) (2) (3) (4)
- **我们要挂载的设备或文件系统名称。**在这种情况下,它是第二个硬盘上的第一个分区。
- 挂载点。这是设备安装到的目录——在本例中为根目录。
- 文件系统的类型。在这个例子中,它是ext4。
- 挂载选项。我们将在以下部分介绍一些常用的挂载选项。
默认情况下,命令mount将报告所有已安装的文件系统,包括虚拟系统,例如*/sys/fs[?] 上的 cgroup*。
它可能是一个很长的列表。但是,如果我们想检查特定文件系统类型的挂载信息,我们可以使用*-t type*选项。
让我们看看如何仅获取udf(通用磁盘格式)文件系统的挂载信息:
$ mount -t udf
/media/Data/archLinux.iso on /mnt/archIso type udf (ro,relatime,utf8)
3. 挂载文件系统
挂载文件系统并不复杂。通常,它只需要两个步骤:
- 创建挂载点(使用mkdir命令创建目录)
- 使用以下命令挂载文件系统:
mount -t Type Device MountPoint
**通常,mount命令可以自动检测文件系统的类型。*也就是说,我们不必显式传递-t*选项。
在某些情况下,mount命令无法检测到文件系统类型:
- 分区已损坏或未格式化
- 所需的文件系统工具不可用——例如,在未安装ntfs-3g软件包的情况下尝试以“读写”访问权限挂载NTFS分区
在 Linux 系统上,出于安全原因,挂载通常仅限于root用户。
root用户可以设置挂载点目录的权限。因此,所有允许进入目录的用户都可以访问挂载的文件系统。
接下来,让我们看看如何挂载各种设备和文件系统。
3.1. USB驱动器/棒
在 Linux 中挂载 USB 驱动器,首先,我们必须找出我们要挂载的 USB 设备的名称。
在我们插入 USB 设备后,Linux 系统会在*/dev*目录中添加一个新的块设备 文件。
大多数现代 Linux 发行版将通过udev 规则填充*/dev/disk/by-label目录。*要识别 U 盘上的分区,我们可以到/dev/disk/by-label通过检查分区的标签来找到块设备。**
让我们看一个如何找到我们要挂载的设备的例子。
假设我们插入一个具有单个分区的 16GB USB 记忆棒,该分区以ext4格式格式化,标签为“ SanDisk_16G ”:
$ pwd
/dev/disk/by-label
$ ls -l
...
lrwxrwxrwx 1 root root 10 Oct 28 23:47 Backup -> ../../sda3
lrwxrwxrwx 1 root root 10 Nov 1 18:07 SanDisk_16G -> ../../sdd1
...
ls -l输出显示我们 U 盘的块设备文件是*/dev/sdd1*。
但是,并非所有 Linux 发行版都会填充*/dev/disk/by-label目录。例如, CirrOS 默认不填充按标签*目录。
除了在*/dev/disk/by-label中搜索之外,*我们还可以使用带有-l选项的fdisk 命令**来识别我们 USB 设备的块设备文件:
root# fdisk -l
...
Disk /dev/sdd: 14.94 GiB, 16013942784 bytes, 31277232 sectors
Disk model: Extreme
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xfdc01076
Device Boot Start End Sectors Size Id Type
/dev/sdd1 * 63 31277231 31277169 14.9G 83 Linux
...
一旦我们找到了正确的设备文件,安装设备就非常简单了。
首先,我们创建挂载点:
root# mkdir /mnt/usb16G
现在让我们挂载 U 盘:
root# mount /dev/sdd1 /mnt/usb16G
root# mount | grep usb16G
/dev/sdd1 on /mnt/usb16G type ext4 (rw,defaults,data=ordered)
现在,我们可以访问目录*/mnt/usb16G* 下的 U 盘了。
3.2. ISO 文件
安装不限于物理设备。如果我们有一个文件系统“映像”,例如光盘 ISO 映像,我们可以将映像挂载为文件系统。 我们通过使用称为“循环设备 ”的伪设备来安装映像。这使得图像中包含的文件可访问。
让我们看看如何在*/mnt/archIso上挂载 ISO 文件archLinux.iso*:
首先,我们创建一个目录作为挂载点:
root# mkdir /mnt/archIso
接下来,我们将 ISO 映像挂载到刚刚创建的目录中:
root# mount /media/Data/archLinux.iso /mnt/archIso -o loop
root# mount | grep archIso
/media/Data/archLinux.iso on /mnt/archIso type udf (ro,relatime,utf8)
在上面的mount命令中,我们使用*“loop”选项告诉mount*命令将 ISO 映像视为循环设备。
3.3. SMB
SMB 协议允许类 Unix 系统访问 Microsoft Windows 系统中的共享资源。
Samba 是 SMB 协议的开源实现。
安装 Samba 共享需要 cifs-utils 软件包。
例如,假设我们在 Windows 服务器 (192.168.0.7) 上有一个 Windows 共享*“sharedOnWin”* ,并且密码为*“kent_PWD”的 Windows 用户“kent”*已被授权访问共享资源。
在我们挂载 Samba 共享之前,我们创建一个目录:
root# mkdir /mnt/winShare
接下来,让我们挂载 Samba 共享:
root# mount -t smbfs //192.168.0.7/sharedOnWin /mnt/winShare -o username=kent,password=kent_PWD
root# mount | grep winShare
//192.168.0.7/shareOnWin on /mnt/winShare type cifs (rw,relatime...addr=192.168.0.7,username=kent...)
现在,Windows 共享中的文件在目录*/mnt/winShare* 中可用。
3.4. NFS
NFS(网络文件系统 )是一种分布式文件系统协议,它允许我们通过网络共享远程目录。
要挂载 NFS 共享,我们必须先安装 NFS 客户端软件包。
假设我们在服务器192.168.0.8上有一个配置良好的 NFS 共享目录*“/export/nfs/shared”* 。与 Samba 共享挂载类似,我们首先创建挂载点,然后挂载 NFS 共享:
root# mkdir /mnt/nfsShare
root# mount -t nfs 192.168.0.8:/export/nfs/shared /mnt/nfsShare
root# mount | grep nfsShare
192.168.0.8:/export/nfs/shared/ on /mnt/nfsShare type nfs (rw,addr=192.168.0.8)
3.5. 常用的mount -o选项
mount命令支持许多选项 。
一些常用的选项是:
- loop – 挂载为循环设备
- rw – 以读写方式挂载文件系统(默认)
- ro – 以只读方式挂载文件系统
- iocharset=value – 用于访问文件系统的字符(默认iso8859-1)
- *noauto –*文件系统在系统引导期间不会自动挂载
3.6. /etc/fstab 文件
到目前为止,我们已经看到了mount命令附加到各种文件系统的几个示例。但是,重新启动后,挂载将无法生存。
对于某些文件系统,我们可能希望在系统启动或重启后自动挂载它们。/etc/fstab文件可以帮助我们实现这一点。
/etc/fstab文件包含描述哪些文件系统或设备将被挂载到哪些挂载点以及使用哪些挂载选项的行。
** fstab文件中列出的所有文件系统都将在系统引导期间自动挂载,但包含“ noauto ”挂载选项的行除外。**
让我们看一个*/etc/fstab*示例:
$ cat /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sdb1 / ext4 rw,defaults,noatime,commit=120,data=ordered 0 1
/dev/sdb2 /home ext4 rw,defaults,noatime,data=ordered 0 2
/dev/sda3 /media/Backup ntfs-3g defaults,locale=en_US.UTF-8 0 0
/dev/sda2 /media/Data ntfs-3g defaults,locale=en_US.UTF-8 0 0
...
因此,如果我们在此文件中添加以下行,archLinux.iso映像将在系统启动后自动挂载到*/mnt/archIso* :
/media/Data/archLinux.iso /mnt/archIso udf ro,relatime,utf8 0 0
一旦在/etc/fstab*中提到了文件系统,我们就可以通过提供挂载点或设备来挂载它。*
例如,使用上述fstab配置,我们可以使用以下两个短命令之一挂载*/dev/sda2*分区:
root# mount /media/Data
或者
root# mount /dev/sda2
4. 卸载文件系统
umount命令通知系统分离给定的挂载文件系统。我们只需在umount命令之后提供文件系统名称或挂载点。
例如,如果我们要卸载之前挂载的 U 盘和 ISO 映像:
root# umount /dev/sdd1
root# umount /mnt/archIso
我们还可以一次性umount多个挂载的文件系统:
root# umount /dev/sdd1 /mnt/archIso
4.1. 懒惰卸载
当我们想umount一个文件系统时,我们并不总是知道是否还有操作仍在其上运行。例如,复制作业可能正在文件系统上运行。
当然,我们不想破坏副本并获得不一致的数据。选项*-l将让我们做一个“懒惰”的umount*。
** -l选项通知系统在该文件系统上完成挂起的读取或写入操作,然后安全地卸载它**:
root# umount -l mount_point
4.2. 强制卸载
如果我们将*-f选项传递给命令umount*,它会强制卸载文件系统,即使它仍然很忙:
root# umount -f mount_point
在使用 -f 执行 umount 时我们应该小心,因为它可能会导致已卸载文件系统中的数据损坏或不一致。
强制卸载的一个实际用例可能是由于连接问题而卸载网络共享。