编者按:本文介绍Linux文件系统的安装和卸载如何控制,以及当中需要了解的原理和注意事项。
为了最有效地利用本系列中的文章,您应该具有基本的 Linux 知识,并需要准备一个 Linux 系统,用于练习本文介绍的命令。除非特殊说明,本文中的示例(大部分)使用带有 2.6.32 内核的 Fedora 13。有时候不同版本的程序输出格式不同,因此您所得到的结果未必总是与这里所示的清单和图相同。
您还应该熟悉我们的文章 “学习 Linux,101:创建分区和文件系统” 中的内容。
Linux 文件系统是一个用 / 划分根目录的大的目录树,但是我们在不同的设备和分区上也有文件系统。怎样解决这一明显的不一致呢?根(/)文件系统是作为安装过程的一部分安装的。您所创建的其他每个文件系统不能用于您的 Linux 系统,直至它被安装在一个挂载点。
在当前安装的文件系统集中,挂载点只是一个路径,其中设备上的文件系统被移植到树中。安装是使设备上的文件系统可访问的一个过程。例如,您可以将文件系统作为 /boot、/tmp 或 /home 安装到硬盘驱动上,您也可以将文件系统作为 /mnt/floppy 安装到软盘驱动上,也可以作为 /media/cdrom1 安装到 CD-ROM 上,正如您所看到的,挂载点可能是在根目录,或者是更远的子目录。
除了分区、软盘和 CD 上的文件系统外,还有其他类型的文件系统。tmpfs 文件系统是一个虚拟内存文件系统。您也可以使用一个网络文件系统(比如,NFS 或 AFS)将文件系统从一个系统安装到另一个系统。您甚至可以在已有的文件系统上创建一个文件,并格式化为一个文件系统(可能不同),然后安装。这通常使用光学媒介映像完成,在这您似乎需要下载一个 ISO CD 或 DVD 镜像,然后安装文件,而不是将其刻录成一个真正的媒体。文件中的交换空间(不是专用交换空间)是另一个示例。
安装过程实际上是指在某个设备(或其他资源)上安装文件系统,通常简称为 “安装设备”,可以理解为 “在设备上安装文件系统”。
安装和卸载文件系统通常需要 root 权限。如果您作为一个普通用户登录,您可以使用 su -
切换到根目录或者 sudo
。在我们的示例中,当命令提示以 # 结束时,如以下清单 1 所示,您将需要 root 权限。
mount
命令的基本格式有两个参数:含有将要安装的文件系统的设备(或其他资源)和挂载点。例如,我们在挂载点 /dos 安装我们的 FAT32 分区 /dev/sda9,如清单 1 所示。
清单 1. 挂载 /dos
[root@echidna ~]# mount /dev/sda9 /dos |
在挂载点上进行安装之前,必须先要有挂载点存在。如果没有,您会收到一个错误消息,需要创建挂载点或使用另一个挂载点,如清单 2 所示。
清单 2. 安装错误
[root@echidna ~]# mount /dev/sda9 /dos mount: mount point /dos does not exist [root@echidna ~]# mkdir /dos [root@echidna ~]# mount /dev/sda9 /dos |
当您在一个已有目录上安装一个文件系统时,您将要安装的文件系统上的文件就变成了挂载点的子目录和文件。如果挂载点目录已经包含文件或子目录,它们不会丢失,但是不再可用,直至安装的文件系统被卸载,方可再次使用。要避免这类问题,一个较好的办法就是只使用空目录作为挂载点。
安装了一个文件系统之后,任何创建或复制到挂载点或其下的任何目录的文件或目录将在安装的文件系统上被创建。在我们的示例中,文件 /dos/sampdir/file.txt 将被在我们在 /dos 下安装的 FAT32 文件系统上创建。
通常,mount
命令自动检测安装的文件系统的类型。偶尔,您可能需要使用 -t
选项明确指定文件系统类型,如清单 3 所示。
清单 3. 以显式文件系统类型安装
[root@echidna ~]# mount -t vfat /dev/sda9 /dos |
想要查看安装了什么文件系统,使用不带参数的 mount
命令。清单 4 展示了我们的示例系统。注意,只是简单的列出安装的文件系统,不需要 root 权限。
清单 4. 显示安装的文件系统
[ian@echidna ~]$ mount /dev/sda6 on / type ext4 (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/sda2 on /grubfile type ext3 (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) gvfs-fuse-daemon on /home/ian/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=ian) dw.raleigh.ibm.com:/vol/vol1/dwcontent on /mnt/dwcontent type nfs (rw,addr=9.42.155.6) /dev/sdb9 on /mnt/sdb9 type ext3 (rw) /dev/sda9 on /dos type vfat (rw) /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 来查看类似信息,这两个都含有关于安装的文件系统的信息。
#p#
安装选项
mount
命令有几个覆盖默认行为的选项。例如,您可以通过指定 -o ro
来安装一个只读文件系统。如果文件系统已经安装,添加 remount
,如清单 5 所示。
清单 5. 卸载只读文件系统
[root@echidna ~]# mount -o remount,ro /dos |
注意:
- 用逗号分隔多个选项,比如
remount
和ro
。 - 卸载一个已有文件系统时,指出挂载点或者设备名其中一个就足够了,没有必要都指出。
- 您不能以读写方式安装一个只读文件系统。那些不能修改的媒介,比如 CD-ROM 光盘将自动以只读模式安装。
- 要卸载一个可写入的读写设备,指定
-o remount,rw
。
如果任何进程已经打开卸载文件系统中的文件或目录,卸载命令就不能完全成功。在下面 卸载文件系统 部分获取更多信息
#p#
标签、UUID 和链接
在 UNIX 和早期的 Linux 系统中,/dev 目录通常包含曾经附加到系统的所有设备。曾经使用过的设备都位于 /dev 树的同一位置,因此使用名称 /dev/sda6 是自然而然的。随着热插拔设备的出现,比如 USB 或 Firewire (IEEE 1394) 附加设备,今天一个给定的设备可能出现在一个 USB 端口,明天同一个设备可能被插到另一个 USB 端口。在这种情况下,无论您将 U 盘插在哪个 USB 端口上,您总是要将它安装在 /media/myusbstick 上。在主题 102 “学习 Linux,101:引导程序” 一文中,您已经学习了如何使用标签和 UUID(全局惟一标识符)来识别分区,而不用设备名。如果分区中的文件系统这两个都支持,您也可以通过 mount
命令使用它们。使用 blkid
命令来寻找设备相关的 UUID 和标签(如果有)。清单 6 展示了如何使用 blkid
来寻找根分区的标签和 UUID,如何创建两个附加挂载点,以及在这两个附加挂载点上安装根分区。以下示例做了说明。在生产环境中,您通常不需要这么做。
清单 6. 使用标签或 UUID 安装
[root@echidna ~]# blkid /dev/sda6 /dev/sda6: LABEL="Fedora-13-x86_64" UUID="082fb0d5-a5db-41d1-ae04-6e9af3ba15f7" TYPE="ext4" [root@echidna ~]# mkdir /mnt/sda6label [root@echidna ~]# mkdir /mnt/sda6uuid [root@echidna ~]# mount LABEL="Fedora-13-x86_64" /mnt/sda6label [root@echidna ~]# mount UUID="082fb0d5-a5db-41d1-ae04-6e9af3ba15f7" /mnt/sda6uui |
随着 udev 的出现,您通常在 /dev 目录下找到设备(比如硬盘驱动器)的附加符号链接。清单 7 显示的是 Fedora 13 系统上的 /dev/sda6 链接。
清单 7. 到 /dev/sda6 的符号链接
[ian@echidna ~]$ find /dev -lname "*sda6" /dev/disk/by-label/Fedora-13-x86_64 /dev/disk/by-uuid/082fb0d5-a5db-41d1-ae04-6e9af3ba15f7 /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part6 /dev/disk/by-id/wwn-0x50014ee001a8d027-part6 /dev/disk/by-id/scsi-SATA_WDC_WD1001FALS-_WD-WMATV3772868-part6 /dev/disk/by-id/ata-WDC_WD1001FALS-00J7B1_WD-WMATV3772868-part6 /dev/block/8:6 |
安装一个设备时,您也可以使用一个符号链接来作为另外一种指定设备名的方式。
#p#
引导时间和 fstab
在主题 102 “学习 Linux,101:引导程序” 一文中,您已经学习了如何在 GRUB 和 LILO 中使用 root=
参数,来通知引导加载程序应该安装什么文件系统作为根。一旦此文件系统被安装,初始化过程运行带有 -a
选项的 mount
命令来自动安装一个文件系统集合。该集合是在 /etc/fstab 中指定的。清单 8 显示了一个样例 Fedora 13 系统的 /etc/fstab。在该示例中,所有硬盘驱动分区都是用 UUID 标识的。清单 9 显示了另一个 Ubuntu 9.10 系统示例。
清单 8. 示例 Fedora 13 fstab
# # /etc/fstab # Created by anaconda on Fri May 28 12:37:05 2010 # # 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=082fb0d5-a5db-41d1-ae04-6e9af3ba15f7 / ext4 defaults 1 1 UUID=488edd62-6614-4127-812d-cbf58eca85e9 /grubfile ext3 defaults 1 2 UUID=2d4f10a6-be57-4e1d-92ef-424355bd4b39 swap swap defaults 0 0 UUID=ba38c08d-a9e7-46b2-8890-0acda004c510 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 |
清单 9. 示例 Ubuntu 9.10 fstab
# /etc/fstab: static file system information. # # Use 'blkid -o value -s UUID' to print the universally unique identifier # for a device; this may be used with UUID= as a more robust way to name # devices that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # / was on /dev/sda7 during installation UUID=8954fa66-e11f-42dc-91f0-b4aa480fa103 / ext3 errors=remount-ro 0 1 # /grubfile was on /dev/sda2 during installation UUID=3a965842-b6dd-4d52-8830-2d0fdb4284a2 /grubfile ext3 defaults 0 2 /dev/sda5 none swap sw 0 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0 |
以 # 开始的是注释,记住一行有 6 个字段。因为字段是定位的,必须被指定。
- 文件系统
- 这可能是一个设备名,比如 /dev/sda1 或者一个标签(LABEL=),或者是 UUID(UUID=)。对于 Fedora 13 示例的根文件系统,它可能是 /dev/sda6、LABEL="Fedora-13-x86_64" 或 UUID="082fb0d5-a5db-41d1-ae04-6e9af3ba15f7"。使用一个标签或 UUID,当设备被添加或删除时可以使您的系统更健壮。
- 挂载点
- 这是我们上面 安装文件系统 小节中介绍过的挂载点,其值应该是 'none' 或 'swap'。在旧的文件系统中您通常会发现其值是 'none' 。
- 类型
- 指定文件系统类型。CD/DVD 驱动器通常只支持 ISO9660 和 UDF 文件系统其中一个,因此您可能要在一个逗号分隔的列表中指定多种可能性,如清单 9 所示。如果您想
mount
自动确定类型,向清单 9 最后一行那样指定auto
。 - 选项
- 指定安装选项,如果您想用默认安装选项,指定
defaults
。您需要了解的选项有:rw
和ro
指定文件系统是以读写还是只读形式安装。noauto
指定在引导时或者mount -a
出现问题时,该文件系统不能自动安装。在我们的示例中,这样做是为了可移动驱动器。user
指定一个非根用户被允许安装或卸载文件系统。这对于移动媒介是特别有用的。在旧系统中,该选项是在 /etc/fstab 中指定的,而不是在mount
命令上。对于比较新的系统,可能是在 udev 规则中指定的,该规则位于 /lib/udev/rules.d or /etc/udev/rules.d 内的 rules 文件夹中。在我的 Fedora 13 系统上 DVD 驱动器选项是来自于 udev 规则,这就是为什么在 /etc/fstab 中没有一项用于光驱。exec
和noexec
指定是否支持来自已安装文件系统的文件执行。用户安装的文件系统默认为noexec
,除非在user
后指定exec
。noatime
将禁止记录存取时间,不使用访问时间可以提高性能。
- dump
- 指定
dump
命令是否应考虑 ext2 或 ext3 文件系统作为备份。值为 0 则通知dump
忽略该文件系统。 - pass
- 传递非零值来指定引导时检查文件系统的次序,在 “学习 Linux,101:保持文件系统的完整性” 一文中讨论过。
当您安装一个在 /etc/fstab 中列出的文件系统时,您只需给出设备名或挂载点其中一个,不需要两个都提供。
在某些系统上,例如 SUSE 11.2,您可能会发现在安装时生成的 fstab
使用符号链接到设备。因此,您可以查看 /dev/disk/by-id/ata-WDC_WD1001FALS-00J7B1_WD-WMATV3772868-part6 获取文件系统值,不需要查看 /dev/sda6。
查阅手册页获取 fstab
、mount
和 udev
其他资料,包括这里没有涉及到的选项。
#p#
卸载文件系统
所有安装的文件系统,通常是在系统重新引导或关闭时自动卸载的。当一个文件系统卸载后,在内存中缓存的所有文件系统数据都被刷新到磁盘中。
您也可以手动卸载文件系统。事实上,当删除可写入介质(比如,磁盘、U 盘或存储键)时,您应该这样做。
使用 umount
命令来卸载文件系统,指定设备名或者挂载点作为参数。清单 10 展示了如何卸载 /dos,然后重新安装,接着用设备名再次卸载。
清单 10. 卸载文件系统
[root@echidna ~]# umount /dos [root@echidna ~]# mount /dev/sda9 /dos [root@echidna ~]# umount /dev/sda9 |
当一个文件系统被卸载之后,作为挂载点的目录下的那些文件会再次出现。
如果您想卸载一个文件系统,而此时进程已打开了该文件系统上的文件,将会出现一个错误消息。卸载文件系统之前,您应当确认没有进程正在该文件系统的文件上运行。使用 lsof
或 fuser
命令确定哪个文件是打开的,或哪个进程打开了文件。您可能需要 lsof
上的 -w
选项来避免与 Gnome Virtual File 系统(gvfs)相关的警告消息。查阅手册页,学习关于安装选项和 lsof
的其他信息。如果您检查整个设备,您可以指定设备名或挂载点。您也可以检查是否一个独立的文件正在使用。
为了解释这些命令,我创建了一个 /etc/fstab on /dos 副本,用一个小的脚本来从 stdin 逐行读取,然后打印到 stdout,每行之间有 10 秒的停顿。清单 11 显示了当文件正在使用时 umount
出现的错误消息,以及使用 lsof
和 fuser
在 /dos 或基础设备 /dev/sda9 上检查打开文件的结果。
清单 11. 检查打开文件
[root@echidna ~]# 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@echidna ~]# lsof -w /dos COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME slowread. 2560 ian 0r REG 8,9 899 123 /dos/fstab sleep 2580 ian 0r REG 8,9 899 123 /dos/fstab [root@echidna ~]# lsof -w /dev/sda9 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME slowread. 2560 ian 0r REG 8,9 899 123 /dos/fstab sleep 2580 ian 0r REG 8,9 899 123 /dos/fstab [root@echidna ~]# fuser -m /dos /dos: 2560 2586 [root@echidna ~]# fuser -m /dev/sda9 /dev/sda9: 2560 2588 |
这时,您可以选择等待,直至文件系统不再繁忙,或者您也可以通过指定 -l
选项进行一个懒卸载(lazy unmount)。懒卸载直接从文件系统树分离文件系统,然后,在文件系统空闲时,清理文件系统附加项。
#p#
删除文件系统
我们谈论过删除移动设备(比如,USB 或 Firewire 附加设备)时遇到的一些问题。每次您需要安装或卸载这类设备时,切换到 root 权限并不是很方便。CD、DVD 和软盘驱动器,在其中您需要卸载设备来更换媒介,都是一样。在上一小节讨论 fstab
时,我们就提到过 user
选项,它支持普通用户安装或卸载设备。清单 9 显示了一种为软盘驱动器或 CD/DVD 驱动器编写 fstab
的方法。
注意,光驱的文件系统类型被指定为 udf,iso9660
,而软驱的文件系统类型被指定为 auto
。对于光驱,安装进程将探测文件系统类型。您可以创建或编辑 /etc/filesystems 来改变系统被探测的次序。
注意:在断开设备连接或者想要移走媒介之前,您始终应该先卸载可移动驱动。
如果您运行一个图形化桌面,比如 Nautilus,您通常可以找到支持可移动设备和媒介自动安装的选项。例如,我想将 Knoppix DVD 插入我系统的 DVD 驱动器,我可以看到如清单 12 所示的一个安装项。出现了 'uid=1000' 表示 id 为 1000 的用户可以卸载这个磁盘。id
命令显示用户 ian 的 uid 是 1000,因此 ian 可以卸载该磁盘。
清单 12. DVD 的桌面卸载
[ian@echidna ~]$ 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@echidna ~]$ id ian uid=1000(ian) gid=1000(ian) groups=1000(ian) |
如果驱动器支持这一操作(大多数 CD 和 DVD 驱动支持),您也可以使用 eject
命令弹出可移动介质。如果您不能卸载设备,那么 eject
将可以卸载和弹出磁盘。
#p#
交换空间
在前面讨论 fstab
时,您可能已经注意到了交换磁盘没有一个挂载点,引导进程通常支持在 /etc/fstab 中定义交换空间,除非 noauto
选项被指定。要在一个正在运行的系统上手工控制交换空间 — 比如,添加一个新交换分区 — 使用 swapon
和 swapoff
命令,详情见手册页。
您可以用 cat /proc/swaps
或 swapon -s
查看目前支持的交换设备,如清单 13 所示。
清单 13. 显示交换空间
[ian@echidna ~]$ swapon -s Filename Type Size Used Priority /dev/sdb1 partition 514044 0 -1 /dev/sdb5 partition 4192928 0 -2 [ian@echidna ~]$ cat /proc/swaps Filename Type Size Used Priority /dev/sdb1 partition 514044 0 -1 /dev/sdb5 partition 4192928 0 -2 |
介绍在 Linux 上安装设备到此结束。
原文:http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-104-3/index.html?ca=drs-
【编辑推荐】
【责任编辑:杨赛 TEL:(010)68476606】