加载点揭密

ArticleCategory:

UNIXBasics

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to cn 王旭

AboutTheAuthor:[A small biography about the author]

Guido 因为这个社区而喜欢 Linux。这是一个实实在在的大项目,而项目中全世界各种各样的人们相着同一个目标工作:让它每天变得都更好。
不幸的是,Linux 现在太大了,同样吸引了全世界的坏蛋只想得到利润而不想贡献任何东西。看看!从外面好象是小型 "pro-linux" 商务,其实就是机会主义。

Abstract:

这篇文章解释了加载点的概念,但我认为,其中的部分内容即使对于一些不是新手的读者也有点意思。

ArticleIllustration:

mount

ArticleBody:

简介

我将首先解释加载文件系统的概念,然后介绍一些高级特性。如果你觉得你已经是 Linux 专家了,那你可以从后面一点开始阅读。

加载如何工作

在 windows 下,直到今天仍有这样的问题:当你加上一个磁盘的时候,分区的编号就变得混乱了。原来是 D:盘的分区现在成了 E:盘,不论是用户还是程序都被搞得很茫然。

而在 Unix 下,你永远不会遇到这种问题,因为所有的物理分区都被加入到一个目录树中了。你可以通过命令"mount"或"df"来看到这些分区:
# df
Filesystem 1K-blocks    Used Available Use% Mounted on
/dev/hda1    9070728 4701180   3908768  55% /
/dev/hda3   24950428  683412  22999584   3% /home
none          257236       0    257236   0% /dev/shm

# mount
/dev/hda1 on / type ext3 (rw)
none on /proc type proc (rw)
none on /dev/shm type tmpfs (rw)
/dev/hda3 on /home type ext3 (rw)
这里,我们有两个磁盘分区,一个包括 /home 以外的所有内容。这就是根分区"/",它物理上是 hda1。hda1 是第一个 IDE 硬盘 (hda) 的第一个分区 (1)。同一块硬盘的第三个分区(hda3)被加载到了 /home。这样,如果你进入目录 /home,实际上你在访问 hda3 上的文件。你永远不用担心哪个是 D: 哪个是 E:。永远只有一个不变的目录树。

文件系统繁忙问题


Linux缓冲文件系统的读写操作---如果你有 USB 1.1 的 U 盘,并访问上面的一个大文件,你能注意到:第一次读写很慢,但以后就变快了很多,而 U 盘上的读写指示灯根本就不闪。

因为缓冲这个特点,你不能直接拔下一个正在使用的盘,相反,你需要卸载它。对于内置的硬盘来说,这根本就不是什么问题,但对于光盘和 U 盘就要注意了。

比如,如果你把一个 U 盘加载到了 /mnt/usb,然后"cd /mnt/usb",这时,bash 就在使用这个文件系统了。如果这时想要从另一个 shell 去 umount 它,你将得到"file system busy" (文件系统繁忙) 的提示,umount 不会成功。这时,你只要"cd"一下,离开 /mnt/usb,就可以成功 umount 了。而有时,你忘了水在用它,或者你有很多程序正在打开 U 盘,这就可能很难找到导致卸载失败的原因。

问你的计算机好了!
# fuser -m -u /mnt/usb
/mnt/usb:   1347c(root)  1348c(guido)  1349c(guido)  
你从 fuser 命令得到的是使用文件系统的进程的列表。现在你可以使用"ps auxw"检查它们到底是什么,也可以直接 kill 它们。现在 umount 可以正常工作了。

但 Windows 不需要这样?!

为什么不直接拔下U盘呢?好,老的 dos/win3.1 计算机直接切断电源就行,不需要关机。那时,我的朋友总报怨为什么在 Linux 下必须 shutdown 呢。后来,Win95 出来了,这些报怨也就没了,因为谁都要先关机了。

Linux 也可以!

Linux 下也有方法可以直接拔掉磁盘(比如 U 盘)的。Mandrake Linux 有一个叫做 supermount 的特征,确实可以达到和 windows 一样的结果。但我不建议你这样做,因为这会导致不稳定和丢失文件。

最好使用 mtools (http://mtools.linux.lu/)。mtools 是一组访问软驱、U 盘这些使用 FAT 文件系统的可移动存储介质的命令,而且不需要加载文件系统。

这是使用方法:
  1. 编辑 /etc/mtools.conf,加上这么几行:
    drive u: file="/dev/sda1" # 或 sda4; 有些 U 盘缺省使用分区4.
    


  2. 现在你不用 mount /dev/sda1,而是输入
    mdir u:
    来看 U 盘上有什么。

    mcopy * u:
    来拷贝当前目录的所有文件到 U 盘上面。

    mcopy u:\* .
    拷贝 U 盘上的所有文件到当前目录(注意通配符前面的'\'。)。

非常容易使用。

允许所有用户加载文件系统

通常只有root可以加载文件系统。对于像 U 盘或是光盘这样的设备,你可能希望每个用户都可以加载它们。处理这个问题,只要修改一下 /etc/fstab 就可以了:
# dev     mount point    fs type   flags
/dev/sda1  /mnt/usb      auto      noauto,user 0 0
这行表示 sda1( 第一个 scsi 硬盘的第一个分区,USB 存储设备被映射成 scsi 磁盘)应该在启动的时候不被自动加载 (noauto),并且可以被任何用户加载/卸载 (user)。文件类型域设置成 auto,这样你可以加载任何文件系统的 U 盘,比如 vfat 或是 ext2,文件系统的类型会被自动地识别。

笔记本和 NFS

网络文件系统 NFS 对于想要集中备份 home 目录的多个用户很有效。你要做的所有事情就是从中心服务器上加载 home 目录,所有用户的个人 home 目录都对于所有网络中的计算机是可用的。只要在网络中,用户就可以得到同样的设置、同样的偏好、同样的数据。真的很理想。

But how do we handle mobile users with Laptops? (no backups?) 但如何处理使用笔记本的移动用户呢?(不是备份?)

你一旦离开网络,home 目录就消失了。一个解决方法是始终复制所有数据(rsync),但如果不是非常严格同步的话,很容易导致不一致。而且你也不一定需要你的完整 home 目录。我发现一个不错的解决方案是使用一个小的 home 目录,里面只有设置和一些我在旅游的时候需要的数据。

当你在一个非空目录的位置加载一个文件系统(任何文件系统/磁盘,包括 NFS)的时候,原来目录里面的内容就都不可见了,取而代之的是加载上的文件系统。

这就是解决方案:为 home 目录建立一个加载点(/home),当计算机在网络上的时候自动加载不同的 home 目录。而当你加载任何东西之前,建立一个笔记本电脑的用户的离线 home 目录的符号链接:
/home/guido -> ../home_nonet/guido
当用户 guido 在网络上的时候,他将看到一个通常的 home 目录,因为符号链接完全被掩盖了。而当他在公诉上的时候,他将看到 /home_nonet/guido 成为了他的 home 目录 (/home/guido)。

一个很漂亮的解决方案。

结论

建立一个硬件之上的抽象层是 UNIX 的一贯目标之一。加载/卸载文件系统/磁盘正是这一目标的一个实现方案。这的确是一个先进的现代的设计,尽管 UNIX 比其他现代 PC 操作系统老很多。