首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 新用户的基本任务(6)可移除设备-2

Linux 新用户的基本任务(6)可移除设备-2

安全移除设备DVD 或 CD 加载后,您就可以使用磁盘上的文件,因为它们现在是您的文件系统的一部分。当一个 CD-ROM 装载后,Linux 将锁定该 CD,以免它被 Eject 按钮弹出。当然,这不能阻止您取出外部 CD 或 USB 驱动器,从 USB 槽拔出 U 盘,或弹出软盘。要避免潜在的数据损失,应该总是通过首先卸载 设备来安全地移除设备。
可以从图形桌面或命令行卸载设备。umount 命令(注意 umount 缺少一个 “n”)用于卸载设备,eject 命令首先卸载设备,然后试图弹出设备,例如打开 CD 托盘。以前,装载和卸载设备需要根权限。现在一般允许用户装载,以便非根用户能装载和卸载设备。您可能已经注意到了 清单 11 中的选项 uid=1000。uid 1000 对应系统上的用户 ian,如 清单 12 所示。
清单 12. 使用当前用户的 id 命令
1
2
iian@lyrebird:~> id
uid=1000(ian) gid=100(users) groups=33(video),100(users)




如果您使用图形桌面工具来卸载设备,那么如果您已经注销,然后作为另一个用户登录,则您可能只需担心 ids 问题。下面,我们先查看图形工具,然后查看命令行工具。
在 Ubuntu 或 Fedora 上,右键单击可移除媒体的图标,将看到类似于 图 25 的上下文菜单。可以选择卸载或弹出设备。对 CD 或 DVD 选择弹出选项. 设备将被卸载,设备图标将从您的桌面消失,CD 托盘将打开。对于 USB 驱动器,这个选项可能卸载而不是弹出,设备卸载后,就可以被安全地拔出。如果您使用一个包含多个分区的外部硬盘驱动器,必须先卸载所有分区,然后才能移除驱动器或关闭电源。
图 25. SUSE                        File Manager图 26 显示了我们的 OpenSUSE 系统,有一个已连接的 USB 驱动器,以及我们此前使用过的 DVD。DVD 和硬盘驱动器的一个分区已被装载。OpenSUSE 通过将插头图标(当设备未装载时)更改为一个弹出按钮(当设备装载后)来区分未装载和已装载设备。您还能注意到,设备图标左下角的小方框也从拥有一根对角线到拥有一个星号。注意,对于可写入媒体,比如我们的硬盘,还将显示可用空间。
图 26. OpenSUSE File                        Manager要卸载或弹出一个已装载驱动器,只需单击弹出图标(如上图中 2006R1 分区的弹出图标)。如果您弹出一个设备(比如 CD 或 DVD,其中托盘打开或发生其他类似的物理连接断开),那么该设备将从您的已插入设备列表中移除。
从命令行安全移除前面提到过 umount 和                    eject 命令。现在我们来了解如何使用它们,以及您可能想了解的 lsof 命令。在这个领域中,您可能发现不同的系统存在一些差异,因此您可能会遇到与这里的说明不完全一致的情况。
首先,我们查看如何使用 unmount 命令在我们的 Ubuntu 系统上卸载 CD,如 清单 13 所示。我们首先使用 grep 过滤 mount 的输出,只显示那些包含 “media”(这通常是可移除媒体的装载点)的条目。然后,我们使用 umount 卸载设备,这要用到它的装载点(/media/Ubuntu 10.10 i386)。最后,我们重复这个 “mount + grep 过滤器” 过程,确认该设备已不再处于已装载状态。注意,可以将装载点或设备名称(本例中为 /dev/sr0)作为 umount 的参数。
清单 13. 在 Ubuntu 上从命令行卸载一个 CD
1
2
3
4
5
ian@pinguino:~$ mount | grep media
/dev/sr0 on /media/Ubuntu 10.10 i386 type iso9660 (ro,nosuid,nodev,uhelper=udisks,
uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500)
ian@pinguino:~$ umount /media/Ubuntu\ 10.10\ i386
ian@pinguino:~$ mount | grep media




如您所见,Ubuntu 允许使用命令行卸载自动装载的驱动器。在 OpenSUSE 11.3 上重复上述场景可能会生成类似于 清单 14 的结果。
清单 14. 在 OpenSUSE 上从命令行卸载一个 CD (1)
1
2
3
4
5
6
7
8
ian@lyrebird:~> mount | grep media
/dev/sr0 on /media/openSUSE-DVD-x86_64.0702..001 type iso9660 (ro,nosuid,nodev,uid=1000,
utf8)
/dev/sdc6 on /media/2006R1 type ext3 (rw,nosuid,nodev)
ian@lyrebird:~> umount /media/openSUSE-DVD-x86_64.0702..001/
umount: /media/openSUSE-DVD-x86_64.0702..001 is not in the fstab (and you are not root)
ian@lyrebird:~> umount /dev/sr0
umount: /dev/sr0 is not in the fstab (and you are not root)




有时您会发现,以图形方式能执行的操作和在命令行上可能执行的操作之间有差异。随着 Linux 日益成熟,这样的差异将越来越少,但您有时还会发现它们,就像这里一样。鉴于您已经在本教程中学习的内容,明显的解决方案是使用 su 或 sudo 以根权限运行必要的命令。下面,我们尝试使用 su 命令,如 清单 15 所示。
清单 15. 在 OpenSUSE 上从命令行卸载一个 CD (2)
1
2
3
4
5
6
7
8
9
10
11
ian@lyrebird:~> su -
Password:
lyrebird:~ # mount | grep media
/dev/sr0 on /media/openSUSE-DVD-x86_64.0702..001 type iso9660 (ro,nosuid,nodev,uid=1000,
utf8)
/dev/sdc6 on /media/2006R1 type ext3 (rw,nosuid,nodev)
lyrebird:~ # umount /dev/sdc6
lyrebird:~ # umount /media/openSUSE-DVD-x86_64.0702..001/
umount: /media/openSUSE-DVD-x86_64.0702..001: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))




我们能成功卸载 /dev/sdc6 successfully,但不能卸载 /media/openSUSE-DVD-x86_64.0702..001,因为 Linux 声称它繁忙。如果我们尝试使用 eject 命令,将会得到类似的错误消息。还记得吗,前面讲过,Linux 将在 CD 或 DVD 使用时锁定它。更普遍的情况是,如果一个文件系统正在被另一个用户使用,也不能卸载。正如上面的错误消息中所建议的,可以使用 lsof 或 fuser 命令发现哪个用户正在导致您的卸载问题。典型的用法如 清单 16 所示。
清单 16. 使用 lsof 和 fuser(作为根用户)
1
2
3
4
5
6
lyrebird:~ # lsof /media/openSUSE-DVD-x86_64.0702..001/
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    3824  ian  cwd    DIR   11,0     2048 2048 /media/openSUSE-DVD-x86_64.0702..001/
boot
lyrebird:~ # fuser -um /media/openSUSE-DVD-x86_64.0702..001/
/media/openSUSE-DVD-x86_64.0702..001:  3824c(ian)




lsof 命令显示打开的实际文件或目录(本例中为 /media/openSUSE-DVD-x86_64.0702..001/boot)以及使用此文件或目录的进程 ID(3824)和用户 ID(ian)。fuser 命令显示使用 /media/openSUSE-DVD-x86_64.0702..001 文件系统但不使用此特定的打开文件或目录的用户和进程 ID。
通常,您将使用这个信息干净利落地关闭使用文件系统的打开进程或窗口。在有些 Linux 系统上,umount 命令还有一个 -L 选项,允许执行 卸载:文件系统立即与文件系统层级分离,但对文件系统的所有引用将在文件系统不再繁忙上清除。OpenSUSE 11.3 不提供这个选项,因此您必须在卸载之前手动清除文件系统引用,方法有二:一是终止肇事进程;二是确保肇事进程不再使用受影响的资源。
我们在  中提到过,OpenSUSE 系统不支持对从桌面装载的设备使用命令行命令 umount,因此我们通过使用根权限解决这个问题。另一种解决方法是使用 halmount 命令卸载设备。HAL 表示 Hardware Abstraction Layer,旨在向各种硬件设备提供一个一致的应用程序接口。但使用 halmount 还是不能卸载一个繁忙设备。清单 17 展示如何使用 halmount,然后切换到 root,强制终止导致磁盘繁忙的进程。注意,以这种方式终止进程可能会导致数据丢失,因此不推荐这种方法,除非您确定不会丢失数据。然后,我们切换回常规用户模式,使用 halmount 卸载不再繁忙的文件系统。最后,我们使用 eject 打开托盘,弹出 DVD。
清单 17. 使用 halmount、kill 和 eject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ian@lyrebird:~> halmount -u /dev/sr0
/dev/sr0: org.freedesktop.Hal.Device.Volume.Busy: umount: /media/openSUSE-DVD-x86_64.0702
..001: device is busy.
ian@lyrebird:~> lsof /dev/sr0
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    3824  ian  cwd    DIR   11,0     2048 2048 /media/openSUSE-DVD-x86_64.0702..001/
boot
ian@lyrebird:~> su -
Password:
lyrebird:~ # kill -9 3824
lyrebird:~ # ps -ef | grep 3824
root      5542  5507  0 22:47 pts/2    00:00:00 grep 3824
lyrebird:~ # logout
ian@lyrebird:~> halmount -u /dev/sr0
ian@lyrebird:~> eject /dev/sr0




希望这个关于 Linux 上的可移除媒体用法的简单介绍有助于您享受可移除媒体文件并避免数据丢失。
返回列表