内容


学习 Linux,101

控制文件系统的挂载和卸载

理解您的数据

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 学习 Linux,101

敬请期待该系列的后续内容。

此内容是该系列的一部分:学习 Linux,101

敬请期待该系列的后续内容。

概述

在本教程中,学习:

  • 手动挂载和卸载文件系统
  • 配置引导时的文件系统挂载
  • 配置用户可挂载、可移除的文件系统,比如磁带驱动器、外部 USB 驱动器、软盘和 CD 或 DVD

本教程可以帮助您针对 Linux Server Professional (LPIC-1) 考试 101 的主题 104 中的目标 104.3 进行应考准备。该目标的权重为 3。

Linux 文件系统

Linux 文件系统是一个以 / 为根的大树,我们在不同的设备和分区上都有文件系统。我们如何处理这种明显的不一致性?根 (/) 文件系统是在初始化过程中挂载的。您创建的其他每个文件系统在挂载挂载点 之后才能供您的 Linux 系统使用。

前提条件

要从本系列教程中获得最大收获,您应该拥有 Linux 的基本知识和一个正常工作的 Linux 系统,您可以在这个系统上实践本教程中涵盖的命令。除非另行说明,本教程中的示例使用 CentOS 6 和 2.6.-504 内核。您在其他系统上的结果可能有所不同。有时,程序的不同版本将得到不同的输出格式,所以您的结果可能并不总是与这里给出的清单和图完全相同。

您还应熟悉我们的教程 “学习 Linux 101:创建分区和文件系统”。

挂载文件系统

在目前的一组已挂载文件系统中,挂载点只是一个目录,设备上的文件系统通过它连接到树上。挂载是使设备上的文件系统可供访问的过程。例如,您可以将硬盘驱动器分区上的文件系统挂载为 /boot、/tmp 或 /home,您可以将软盘驱动器上的文件系统挂载为 /mnt/floppy,将 CD-ROM 上的文件系统挂载为 /media/cdrom1。您可以看到,挂载点可以在根目录中或在数的远端的子目录中。

除了分区、软盘和 CD 上的文件系统之外,还有其他类型的文件系统。tmpfs 文件系统是一个虚拟内存文件系统。您还可以使用 NFS 或 AFS 等网络文件系统将来自一个系统的文件系统挂载在另一个系统上。甚至可以在现有的文件系统内创建一个文件,将它格式化为一种不同种类的文件系统并挂载它。这通常是通过光学介质镜像来完成的,您可以下载一个 ISO CD 或 DVD 镜像,然后挂载该文件,而不将它刻录到真实的介质中。专用交换分区外的文件中的交换空间是另一个示例。

尽管挂载过程会实际挂载某个设备(或其他资源)上的文件系统,但我们通常简单地将其称为 “挂载设备”,意思就是 “挂载设备上的文件系统”。

挂载和卸载文件系统通常需要根用户权限。如果您以普通用户身份登录,可以使用 su - 切换为根用户或使用 sudo。在我们的示例中,当命令提示符以 # 结尾时,如下面的 所示,您将需要根用户权限。

mount 命令的基本形式接受两个参数:包含要挂载的文件系统的设备(或其他资源)和挂载点。我们将小型 FAT32 分区 /dev/sda3 挂载在挂载点 /dos 上。该挂载点必须在您给它挂载任何东西之前已经存在。如果它不存在,您会获得一个错误,并需要创建该挂载点或使用不同的挂载点。我们在 清单 1 中演示了基本挂载的这些方面。

清单 1. 挂载错误
[root@attic4-cent ~]# mount /dev/sda3 /dos
mount: mount point /dos does not exist
[root@attic4-cent ~]# mkdir /dos
[root@attic4-cent ~]# mount /dev/sda3 /dos

将一个文件系统挂载到现有目录上时,您挂载的文件系统上的文件会变成该挂载点的文件和子目录。如果挂载点目录已包含文件或子目录,它们不会丢失,但只在卸载所挂载的文件系统后才可见。可以仅使用空目录作为挂载点来避免此问题,这是一个不错的主意。

挂载文件系统后,创建或复制到挂载点或它之下的任何目录的任何文件或目录都将在挂载的文件系统上创建。所以在我们的示例中,一个像 /dos/sampdir/file.txt 这样的文件将在我们挂载在 /dos 上的 FAT32 文件系统上创建。

通常,mount 命令会自动检测挂载的文件系统的类型。有时,您可能需要使用 -t 选项显式指定文件系统类型,如清单 2 所示。

清单 2. 使用现有文件系统类型来挂载
[root@attic4-cent ~]# mount -t vfat /dev/sda3 /dos

要查看挂载了何种文件系统,可以使用没有参数的 mount 命令。清单 3 显示了我们的示例系统。请注意,仅列出挂载的文件系统不需要根用户权限。

清单 3. 显示挂载的文件系统
[ian@attic4-cent ~]$ mount
/dev/sda11 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /grubfile type ext3 (rw)
/dev/sdb2 on /home/ian/data type ext4 (rw)
/dev/sdb3 on /home/ian/research type ext3 (rw)
/dev/sdc1 on /home/ian/pictures type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sda3 on /dos type vfat (ro)
/dev/sr0 on /media/KNOPPIX type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=1000,
gid=1000,iocharset=utf8,mode=0400,dmode=0500)

您还可以通过显示 /proc/mounts 或 /etc/mtab 来查看类似信息,二者都包含挂载的文件系统的信息。

挂载选项

mount 命令有多个覆盖默认行为的选项。例如,您可以指定 -o ro 在只读模式下挂载文件系统。如果文件系统已挂载,可添加 remount,如 清单 4 所示。

清单 4. 在只读模式下重新挂载
[root@attic4-cent ~]# mount -o remount,ro /dos

备注:

  • 可以使用逗号分隔多个选项,比如 remountro
  • 重新挂载一个已挂载的文件系统时,只需指定挂载点或设备名称。没有必要同时指定二者。
  • 您不能将只读文件系统挂载为读写模式。无法修改的介质(比如 CD-ROM 光盘)会自动以只读模式进行挂载。
  • 要以读写模式重新挂载可写入的设备,可指定 -o remount,rw

如果任何进程打开了您正在重新挂载的文件系统中的文件或目录,则不会成功完成 Remount 命令。请参阅下面的 卸载文件系统 来了解更多的信息。

标签、UUID 和链接

在 UNIX 和早期的 Linux 系统中,/dev 目录通常包含可能曾附加到系统中的所有设备的条目。任何使用过的设备始终位于 /dev 树中的同一个位置,所以可以使用相应的名称,比如 /dev/sda6。随着热插拔设备的出现,比如 USB 或 Firewire (IEEE 1394) 附加设备,特定的设备可能今天出现在一个 USB 端口中,明天插入到另一个 USB 端口中。在这种环境中,您可能希望始终将您的 USB 设备挂载在 /media/myusbstick 上,无论您将它插入到哪个 USB 端口。在针对主题 102 的教程 “学习 Linux,101:引导管理器” 中,您学习了使用标签和 UUID(通用唯一标识符)代替设备名称来标识分区。如果分区上的文件系统支持任一种方式,您还可以对它们使用 mount 命令。可以使用 blkid 命令查找与某个设备有关联的 UUID 和标签(如果存在)。

清单 5 展示了如何使用 blkid 查找我们的根分区的标签和 UUID,然后如何创建两个额外的挂载点,并将根分区挂载在它们之上。这个示例仅用于演示。您通常不会在生产环境中这么做。

清单 5. 使用标签或 UUID 执行挂载
[root@attic4-cent ~]# blkid /dev/sda11
/dev/sda11: UUID="2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2" TYPE="ext3" LABEL="CentOS 6" 
[root@attic4-cent ~]# mkdir /mnt/sda11label
[root@attic4-cent ~]# mkdir /mnt/sda11uuid
[root@attic4-cent ~]# mount LABEL="CentOS 6" /mnt/sda11label
[root@attic4-cent ~]# mount UUID="2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2" /mnt/sda11uuid

随着 udev 的出现,您会在硬盘驱动器等设备的 /dev 目录中找到更多符号链接。清单 6 显示了我的 CentOS 6 系统上的 /dev/sda6 的链接。

清单 6. /dev/sda6 的符号链接
[root@attic4-cent ~]# find /dev -lname "*sda11"/dev/root
/dev/disk/by-label/CentOS\x206
/dev/disk/by-uuid/2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2
/dev/disk/by-id/wwn-0x50014ee056628af6-part11
/dev/disk/by-id/scsi-SATA_WDC_WD6401AALS-_WD-WMASY6347052-part11
/dev/disk/by-id/ata-WDC_WD6401AALS-00L3B2_WD-WMASY6347052-part11
/dev/disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0-part11
/dev/block/8:11
/dev/.udev/watch/113
/dev/.udev/links/disk\x2fby-label\x2fCentOS\x5cx206/b8:11
/dev/.udev/links/root/b8:11
/dev/.udev/links/disk\x2fby-id\x2fwwn-0x50014ee056628af6-part11/b8:11
/dev/.udev/links/disk\x2fby-uuid\x2f2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2/b8:11
/dev/.udev/links/disk\x2fby-path\x2fpci-0000:00:11.0-scsi-0:0:0:0-part11/b8:11
/dev/.udev/links/disk\x2fby-id\x2fscsi-SATA_WDC_WD6401AALS-_WD-WMASY6347052-part11/b8:11
/dev/.udev/links/disk\x2fby-id\x2fata-WDC_WD6401AALS-00L3B2_WD-WMASY6347052-part11/b8:11

还可以使用符号链接作为在挂载设备时指定设备名称的另一种方法。

引导时间和 fstab

在针对主题 102 的教程 “学习 Linux,101:引导管理器” 中,您学习了如何在 GRUB 和 LILO 中使用 root= 参数告诉引导加载程序,应将哪个文件系统挂载为根。对于 GRUB2,可以使用 set root 语句。挂载根文件系统后,初始化过程会运行带 -a 选项的 mount 来自动挂载一组文件系统。这组文件系统是在文件 /etc/fstab 中指定的。

清单 7 显示了一个示例 CentOS 6 系统的 /etc/fstab。在这个示例中,大部分硬盘驱动器分区都使用 UUID 来标识。我像之前一样添加如何将 /dev/sda3 挂载在 /dos 上的示例,以及如何使用标签来将带标签的分区挂载在 /mnt/fedora22 上。

清单 7. 示例 CentOS 6 fstab
[root@attic4-cent ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Jul  8 09:34:46 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2 /                   ext3    defaults        1 1
UUID=3c3de27e-779a-44d5-ad7a-61c5fd03d9e7 /grubfile           ext3    defaults        1 2
UUID=158d605e-2591-4749-bf59-5e92e1b1c01d swap                swap    defaults        0 0
tmpfs                                     /dev/shm            tmpfs   defaults        0 0
devpts                                    /dev/pts            devpts  gid=5,mode=620  0 0
sysfs                                     /sys                sysfs   defaults        0 0
proc                                      /proc               proc    defaults        0 0
UUID=4c962b67-c646-467f-96fb-cbbd6de40140 /home/ian/data      ext4    defaults        1 2
UUID=0998d33c-3398-463d-b0e3-7c13ca0c675f /home/ian/research  ext3    defaults        1 2
UUID=e3be4658-b79b-470d-82fe-bb434bcdcc2f /home/ian/pictures  ext4    defaults        1 2
LABEL="FEDORA22"                          /mnt/fedora22       ext4    defaults        1 2
/dev/sda3                                 /dos                vfat    defaults        0 0

以 # 字符开头的行是注释。剩余行包含 6 个字段。因为这些字段具有固定的位置,所以它们都需要指定。

file system
这可能是设备名称(比如 /dev/sda1)或标记 (LABEL=) 或 UUID (UUID=)。对于我们的 CentOS 6 示例的根文件系统,它可以是 /dev/sda11、LABEL="CentOS 6" 或 UUID=2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2。使用标签或 UUID 让您的系统在添加或移除设备时变得更可靠。
mount point
这是我们在上面的 挂载文件系统 中讨论的挂载点。对于交换空间,该值应该是 ‘none’ 或 ‘swap’。在旧系统上,您通常会找到值 ‘none’。
type
指定文件系统的类型。CD/DVD 驱动器通常支持 ISO9660 或 UDF 文件系统,所以如果您在 /etc/fstab 中指定了这样一个驱动器,可以在逗号分隔的列表中指定多种可能性。如果希望 mount 自动确定类型,可以指定 auto。例如,在一些旧系统上,您可能看到以下针对 CD 或 DVD 和软盘的行。
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8  0       0

就像针对软盘驱动器的 最后一行中一样。
option
指定挂载选项。如果您想使用默认的挂载选项,可以指定 defaults。您需要了解的一些选项是:
  • rwro 指定文件系统应以只读还是读写模式挂载。
  • noauto 指定此文件系统不应在引导时或在发出 mount -a 时自动挂载。在我们的示例中,会对可移动驱动器这么做。
  • user 指定允许非根用户挂载和卸载该文件系统。这对可移动介质特别有用。在旧版的系统中,此选项是在 /etc/fstab 中指定的,而不是在 mount 命令上指定。对于较新的系统,可以在位于 /lib/udev/rules.d 或 /etc/udev/rules.d 内的规则文件中的 udev 规则中指定它。在我的 CentOS 6 系统上,针对 DVD 驱动器的选项来自 udev 规则,这正是 /etc/fstab 中没有针对光学驱动器的条目的原因。
  • execnoexec 指定是否了允许执行来自挂载的文件系统的文件。用户挂载的系统默认情况下被设置为 noexec,除非在 user 之后指定了 exec
  • noatime 将禁用访问时间记录。不使用访问时间可以提高性能。
dump
指定 dump 命令是否应考虑对这个 ext2 或 ext3 文件系统备份。值 0 告诉 dump 忽略此文件系统。
pass
非 0 的 pass 值指定了在引导时检查文件系统的顺序,这已在我们的教程 “学习 Linux,101:维护文件系统的完整性” 中介绍。

挂载 /etc/fstab 中列出的一个文件系统时,可以在挂载文件系统时提供设备名称或挂载点。不需要同时提供二者。

在一些系统上,例如 SUSE 11.2,您可能发现在安装时生成的 fstab 使用了设备的符号链接。所以您可能看到 file system 值为 /dev/disk/by-id/ata-WDC_WD1001FALS-00J7B1_WD-WMATV3772868-part6,而不是 /dev/sda6。请参阅 清单 6,了解更多可能性。

请查阅 fstabmountudev 的手册页,了解有关的更多信息,包括这里没有介绍的选项。

卸载文件系统

系统在重新启动或关机时,通常会自动卸载所有挂载的文件系统。当卸载一个文件系统时,内存中所有缓存的文件系统数据都会被写入到设备中。

您还可以手动卸载文件系统。当然,在移除可写入介质时,比如磁盘、USB 驱动器或闪存盘,您应该这么做。

可以使用 unmount 命令卸载文件系统,指定设备名称或挂载点作为参数。清单 8 展示了如何卸载 /dos,重新挂载它,然后再次使用设备名卸载它。

清单 8. 卸载文件系统
[root@attic4-cent ~]# umount /dos
[root@attic4-cent ~]# mount /dev/sda3 /dos
[root@attic4-cent ~]# umount /dev/sda3

文件系统卸载后,用作挂载点的目录中的所有文件将再次可见。

如果您尝试在某个进程打开文件系统上的文件时卸载该文件系统,您会看到一条错误消息。在卸载文件系统之前,应确认没有正在运行的进程打开该文件系统上的文件。可以使用 lsoffuser 命令确定哪些文件是打开的,或者哪个进程打开了文件。您可能需要使用 lsof 上的 -w 选项来避免与 Gnome 虚拟文件系统 (gvfs) 相关的警告消息。请查阅手册页来了解其他挂载点和 lsof。如果您正在检查整个设备,可以指定设备名称或挂载点。还可以检查单个文件是否在使用。

为了演示这些命令,我在 /dos 上创建了 /etc/fstab 的一个副本,还创建了一小段脚本来从 stdin 读取行并将它们打印到 stdout,每行之间暂停 10 秒。清单 9 显示了在文件正在使用时来自 umount 的错误消息,以及使用 lsoffuser 来检查 /dos 或底层设备 /dev/sda9 上打开的文件。

清单 9. 检查打开的文件
[root@attic4-cent ~]# umount /dos
umount: /dos: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@attic4-cent ~]# lsof -w /dos
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
slowread. 28960  ian    0r   REG    8,3     1207    2 /dos/fstab
sleep     28972  ian    0r   REG    8,3     1207    2 /dos/fstab
[root@attic4-cent ~]# lsof -w /dev/sda3
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
slowread. 28960  ian    0r   REG    8,3     1207    2 /dos/fstab
sleep     28978  ian    0r   REG    8,3     1207    2 /dos/fstab
[root@attic4-cent ~]# lsof -w /dos/fstab
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
slowread. 28960  ian    0r   REG    8,3     1207    2 /dos/fstab
sleep     28989  ian    0r   REG    8,3     1207    2 /dos/fstab
[root@attic4-cent ~]# fuser -m /dos
/dos:                28960 29001
[root@attic4-cent ~]# fuser -m /dev/sda3
/dev/sda3:           28960 29001

此刻您可以等待文件系统不再繁忙,或者可以指定 -l 选项来执行惰性卸载。惰性卸载会立即将该文件系统与文件系统树分离,并在文件系统不再繁忙时清除对它的引用。

可移动文件系统

我们提到了可移动设备的一些问题,比如 USB 或 Firewire (IEEE 1394) 附加设备。每次在需要挂载或卸载这样一个设备时切换到根访问权限很不方便。CD、DVD 和软盘驱动器也是如此,您需要卸载设备来更改介质。在上面的 fstab 讨论中,我们提到了 user 选项,它允许普通用户挂载和卸载设备。 展示了一种为软盘驱动器或为 CD 或 DVD 驱动器编写 fstab 条目的方式。

请注意,光学驱动器的文件系统类型被指定为 udf,iso9660,而软盘的文件系统类型被指定为 auto。对于光学驱动器,挂载过程将首先检查 udf 文件系统(通常位于 DVD 上),然后检查 iso9660 文件系统(通常位于 CD 上)。对于软盘驱动器,挂载过程将探测文件系统类型。您可以创建或编辑 /etc/filesystems 来更改将探测文件系统的顺序。

备注:在断开驱动器或尝试移除介质之前,应该始终卸载可移动驱动器或介质。不这么做可能会导致尚未写入设备的数据丢失。

如果运行的是图形桌面,比如 Nautilus,您通常会找到允许自动挂载可移动设备和介质的选项。例如,如果将 Knoppix DVD 插入到系统的 DVD 驱动器中,可以看到如 清单 10 所示的挂载条目。'uid=1000' 的存在表明具有 id 1000 的用户可以卸载此光盘。id 命令显示用户 ian 的 uid 为 1000,所以 ian 可以卸载此光盘。

清单 10. DVD 的桌面挂载
[ian@attic4-cent ~]$ mount | grep sr0
/dev/sr0 on /media/KNOPPIX type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=1000,
gid=1000,iocharset=utf8,mode=0400,dmode=0500)
[ian@attic4-cent ~]$ id ian
uid=1000(ian) gid=1000(ian) groups=1000(ian)

在驱动器支持弹出操作时(如大多数 CD 和 DVD 驱动器所做的那样),也可以使用 eject 命令弹出可移动介质。如果您未首先卸载该设备,eject 会卸载并弹出光盘。

交换空间

您可能已在上面的 fstab 讨论中注意到,交换空间没有挂载点。引导过程通常会启用 /etc/fstab 中定义的交换空间,除非指定了 noauto 选项。要手动控制正在运行的系统上的交换空间(例如,如果您添加了一个新交换分区),可以使用 swaponswapoff 命令。请参阅手册页了解有关的细节。

可以使用 cat /proc/swapsswapon -s 来查看目前启用的交换空间,如 清单 11 所示。

清单 11. 显示交换空间
[ian@attic4-cent ~]$ swapon -s
Filename				Type		Size	Used	Priority
/dev/sda2                               partition	10241432	8	-1
[ian@attic4-cent ~]$ cat /proc/swaps
Filename				Type		Size	Used	Priority
/dev/sda2                               partition	10241432	8	-1

对 Linux 上的设备挂载和卸载的介绍就到此结束了。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=1032053
ArticleTitle=学习 Linux,101: 控制文件系统的挂载和卸载
publish-date=05242016