<!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 -&gt; ../home_nonet/guido
</pre>
    当用户 guido 在网络上的时候,他将看到一个通常的 home 目录,因为符号链接完全被掩盖了。而当他在公诉上的时候,他将看到 /home_nonet/guido 成为了他的 home 目录 (/home/guido)。
    <br>
    <br>
    一个很漂亮的解决方案。

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