<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <!-- this stylesheet will later on be added by lfparser automatically: --> <style type="text/css"> <!-- pre { font-family:monospace,Courier } pre.code { font-family:monospace,Courier;background-color:#aedbe8; } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm ; text-align:left } --> </style> <title></title> </head> <body> <h1>加载点揭密</h1> <h4>ArticleCategory:</h4> UNIXBasics <h4>AuthorImage:[Here we need a little image from you]</h4> <img src="../../common/images/Guido-S.gif" alt= "[Photo of the Author]" height="164" width="173"> <h4>TranslationInfo:[Author + translation history. mailto: or http://homepage]</h4> <p>original in en <a href= "http://main.linuxfocus.org/%7Eguido/">Guido Socher</a></p> <p>en to cn <a href="nospam:wangxu(at)linuxfocus.org">王旭</a></p> <h4>AboutTheAuthor:[A small biography about the author]</h4> <p>Guido 因为这个社区而喜欢 Linux。这是一个实实在在的大项目,而项目中全世界各种各样的人们相着同一个目标工作:让它每天变得都更好。<br> 不幸的是,Linux 现在太大了,同样吸引了全世界的坏蛋只想得到利润而不想贡献任何东西。看看!从外面好象是小型 "pro-linux" 商务,其实就是机会主义。</p> <h4>Abstract:</h4> 这篇文章解释了加载点的概念,但我认为,其中的部分内容即使对于一些不是新手的读者也有点意思。 <h4>ArticleIllustration:</h4> <img src="../../common/images2/illustration349.jpg" alt="mount" hspace="10"> <h4>ArticleBody:</h4> <h2>简介</h2> 我将首先解释加载文件系统的概念,然后介绍一些高级特性。如果你觉得你已经是 Linux 专家了,那你可以从后面一点开始阅读。 <h2>加载如何工作</h2> 在 windows 下,直到今天仍有这样的问题:当你加上一个磁盘的时候,分区的编号就变得混乱了。原来是 D:盘的分区现在成了 E:盘,不论是用户还是程序都被搞得很茫然。 <br> <br> 而在 Unix 下,你永远不会遇到这种问题,因为所有的物理分区都被加入到一个目录树中了。你可以通过命令"mount"或"df"来看到这些分区: <table> <tr> <td> <pre class="code"> # 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) </pre> </td> </tr> </table> 这里,我们有两个磁盘分区,一个包括 /home 以外的所有内容。这就是根分区"/",它物理上是 hda1。hda1 是第一个 IDE 硬盘 (hda) 的第一个分区 (1)。同一块硬盘的第三个分区(hda3)被加载到了 /home。这样,如果你进入目录 /home,实际上你在访问 hda3 上的文件。你永远不用担心哪个是 D: 哪个是 E:。永远只有一个不变的目录树。 <h2>文件系统繁忙问题</h2> <br> Linux缓冲文件系统的读写操作---如果你有 USB 1.1 的 U 盘,并访问上面的一个大文件,你能注意到:第一次读写很慢,但以后就变快了很多,而 U 盘上的读写指示灯根本就不闪。 <br> <br> 因为缓冲这个特点,你不能直接拔下一个正在使用的盘,相反,你需要卸载它。对于内置的硬盘来说,这根本就不是什么问题,但对于光盘和 U 盘就要注意了。 <br> <br> 比如,如果你把一个 U 盘加载到了 /mnt/usb,然后"cd /mnt/usb",这时,bash 就在使用这个文件系统了。如果这时想要从另一个 shell 去 umount 它,你将得到"file system busy" (文件系统繁忙) 的提示,umount 不会成功。这时,你只要"cd"一下,离开 /mnt/usb,就可以成功 umount 了。而有时,你忘了谁在用它,或者你有很多程序正在打开 U 盘,这就可能很难找到导致卸载失败的原因。 <br> <br> 问你的计算机好了! <pre class="code"> # fuser -m -u /mnt/usb /mnt/usb: 1347c(root) 1348c(guido) 1349c(guido) </pre> 你从 fuser 命令得到的是使用文件系统的进程的列表。现在你可以使用"ps auxw"检查它们到底是什么,也可以直接 kill 它们。现在 umount 可以正常工作了。 <h2>但 Windows 不需要这样?!</h2> 为什么不直接拔下U盘呢?好,老的 dos/win3.1 计算机直接切断电源就行,不需要关机。那时,我的朋友总报怨为什么在 Linux 下必须 shutdown 呢。后来,Win95 出来了,这些报怨也就没了,因为谁都要先关机了。 <h2>Linux 也可以!</h2> Linux 下也有方法可以直接拔掉磁盘(比如 U 盘)的。Mandrake Linux 有一个叫做 supermount 的特征,确实可以达到和 windows 一样的结果。但我不建议你这样做,因为这会导致不稳定和丢失文件。 <br> <br> 最好使用 mtools (http://mtools.linux.lu/)。mtools 是一组访问软驱、U 盘这些使用 FAT 文件系统的可移动存储介质的命令,而且不需要加载文件系统。 <br> <br> 这是使用方法: <ol> <li> 编辑 /etc/mtools.conf,加上这么几行:<br> <pre> drive u: file="/dev/sda1" # 或 sda4; 有些 U 盘缺省使用分区4. </pre> <br> <br> </li> <li> 现在你不用 mount /dev/sda1,而是输入<br> mdir u:<br> 来看 U 盘上有什么。<br> <br> mcopy * u:<br> 来拷贝当前目录的所有文件到 U 盘上面。<br> <br> mcopy u:\* .<br> 拷贝 U 盘上的所有文件到当前目录(注意通配符前面的'\'。)。<br> <br> </li> </ol> 非常容易使用。 <h2>允许所有用户加载文件系统</h2> 通常只有root可以加载文件系统。对于像 U 盘或是光盘这样的设备,你可能希望每个用户都可以加载它们。处理这个问题,只要修改一下 /etc/fstab 就可以了: <pre class="code"> # dev mount point fs type flags /dev/sda1 /mnt/usb auto noauto,user 0 0 </pre> 这行表示 sda1( 第一个 scsi 硬盘的第一个分区,USB 存储设备被映射成 scsi 磁盘)应该在启动的时候不被自动加载 (noauto),并且可以被任何用户加载/卸载 (user)。文件类型域设置成 auto,这样你可以加载任何文件系统的 U 盘,比如 vfat 或是 ext2,文件系统的类型会被自动地识别。 <h2>笔记本和 NFS</h2> 网络文件系统 NFS 对于想要集中备份 home 目录的多个用户很有效。你要做的所有事情就是从中心服务器上加载 home 目录,所有用户的个人 home 目录都对于所有网络中的计算机是可用的。只要在网络中,用户就可以得到同样的设置、同样的偏好、同样的数据。真的很理想。 <br> <br> But how do we handle mobile users with Laptops? (no backups?) 但如何处理使用笔记本的移动用户呢?(不是备份?) <br> <br> 你一旦离开网络,home 目录就消失了。一个解决方法是始终复制所有数据(rsync),但如果不是非常严格同步的话,很容易导致不一致。而且你也不一定需要你的完整 home 目录。我发现一个不错的解决方案是使用一个小的 home 目录,里面只有设置和一些我在旅游的时候需要的数据。 <br> <br> 当你在一个非空目录的位置加载一个文件系统(任何文件系统/磁盘,包括 NFS)的时候,原来目录里面的内容就都不可见了,取而代之的是加载上的文件系统。 <br> <br> 这就是解决方案:为 home 目录建立一个加载点(/home),当计算机在网络上的时候自动加载不同的 home 目录。而当你加载任何东西之前,建立一个笔记本电脑的用户的离线 home 目录的符号链接: <pre class="code"> /home/guido -> ../home_nonet/guido </pre> 当用户 guido 在网络上的时候,他将看到一个通常的 home 目录,因为符号链接完全被掩盖了。而当他在公诉上的时候,他将看到 /home_nonet/guido 成为了他的 home 目录 (/home/guido)。 <br> <br> 一个很漂亮的解决方案。 <h2>结论</h2> 建立一个硬件之上的抽象层是 UNIX 的一贯目标之一。加载/卸载文件系统/磁盘正是这一目标的一个实现方案。这的确是一个先进的现代的设计,尽管 UNIX 比其他现代 PC 操作系统老很多。 </body> </html>