加载点揭密
ArticleCategory:
UNIXBasics
AuthorImage:[Here we need a little image from you]
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:
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 文件系统的可移动存储介质的命令,而且不需要加载文件系统。
这是使用方法:
-
编辑 /etc/mtools.conf,加上这么几行:
drive u: file="/dev/sda1" # 或 sda4; 有些 U 盘缺省使用分区4.
-
现在你不用 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 操作系统老很多。