在这篇关于在正在运行的系统上更改分区的技巧(第二篇)中,Daniel Robbins 说明了如何将 /tmp 和 /var 移动到它们自己的共享分区上。同时,他还介绍了几个诀窍,从而使您可将停机时间缩到最短,并可避免犯严重错误。
在我的上一篇技巧中,我们已成功地将 /home 移动到一个新分区上。现在是学习如何将经常修改的文件整理到一个新分区上的时候了。为什么要这样做呢?下面是一个例子。经常修改的文件会产生大量的碎片。包含碎片的最佳方式之一就是将经常修改的文件存储在它们自己的分区上。这样,其他分区就不会受经常修改的文件所产生的碎片的影响。这在概念上不难理解,但实际上该如何操作呢?
整理数据
首先,必须创建一个新分区专门用于存储频繁修改的文件。您可能希望将这个分区置于单独的磁盘上以增强性能。接下来,我将逐步说明将 /tmp 和 /var 移动到这个新分区上的各个步骤。
警告
下面的技术说明如何移动一个或多个分区。尽管这项技术经过专门设计,使您能够“撤销”失败的分区移动,但它并不防止用户的错误。换言之,只要进行格式化分区或复制大量文件的操作,就存在因输入错误而导致大量数据被破坏的可能性。因此,强烈建议您 在行动之前采取适当的措施来备份所有的重要文件。
1. 在新分区上创建文件系统
这个过程的第一步是创建一个足以容纳 /var 和 /tmp 并有一点额外空间的新分区。您需要另有一个硬盘驱动器或者一个备用的(未使用的)分区来存储经常修改的文件。如果确实需要使用 fdisk 或 cfdisk 来创建分区,则必须重新启动一次系统。现在就可以格式化新分区了,如下所示(完全可以在多用户模式下完成这一工作;我将提示您何时切换到单用户模式):
# mkfs.ext2 /dev/???
2. 将新分区挂载到 /mnt/rwstorage
正如在我的前一篇技巧中那样,应该用刚创建的空分区的设备名替换 ???。意外键入错误的名称将破坏现有分区上的数据,所以一定要小心!键入这个命令以后,您就在新分区上创建了一个新的 ext2 文件系统。现在几乎就可以挂载这个分区了,但我们首先要创建一个挂载点。
# mkdir /mnt/rwstorage
我选择名称 "rwstorage" 是为了提醒我们,这个特殊的分区将专用于存储频繁读写的文件系统。要挂载分区,请键入:
# mount /dev/??? /mnt/rwstorage
3. 创建新的 /tmp
分区已经挂载好,现在就可以创建新的 /tmp 目录了:
# cd /mnt/rwstorage
# mkdir tmp
# chmod 1777 tmp
4. 进入单用户模式
我们的新目录 /mnt/rwstorage/tmp 具有临时目录应该具有的权限。现在,请进入单用户模式,因为我们必须复制整个 /var。像往常一样,我们将进入单用户模式推迟到最后一刻进行。从现在起我们不希望任何程序读写 /var 中的文件,所以必须停止所有守护程序,断开所有用户,执行一些快速的维护,为此请键入以下命令:
# init 1
如果提示您输入口令来进行系统维护,请按指示操作。您现在应该在 root shell 中,所有不必要的守护进程已被停止。键入以下命令为 /var 中的文件创建一个新位置:
# cd /mnt/rwstorage
# mkdir var
5. 复制 /var
在我们的新 /mnt/newstorage/var 目录上的默认权限应该是正确的,现在就可以将原来的全部 /var 数据复制到新分区上了:
# cd /var
# cp -ax * /mnt/rwstorage/var
6. 执行备份并创建符号链接
这个命令完成以后,/mnt/rwstorage/var 就成为 /var 的一个完全相同的副本。现在您可能会问,如何让 linux 正确使用 /mnt/rwstorage/var 和 /mnt/rwstorage/tmp 而不是根目录下的默认位置呢?使用符号链接很容易实现这一点 -- 我们将创建新的符号链接 /tmp 和 /var,它们指向 /mnt/rwstorage 中的正确目录。我们首先备份原来的目录:
# cd /
# cp var var.old
# cp tmp tmp.old
最后一行可能没有必要,因为通常您不会将任何重要的文件放在 /tmp 中,但我们这样做更安全一些。现在开始创建符号链接:
# cd /
# ln -s /mnt/rwstorage/var /var
# ln -s /mnt/rwstorage/tmp /tmp
7. 最后修改 /etc/fstab
现在,当任何用户或程序使用 /var 时,他们将被自动转移到 /mnt/rwstorage/var!对于 /tmp 也一样。我们还有一个步骤要做;但是这一步可以安全地在多用户模式下执行。现在可以让 apache 恢复运行了,也可以让您的所有用户重新登录了。请按 CTRL-D 退出 runlevel 1。系统应该正常启动。请以 root 身份登录。
我们必须完成的最后一个步骤是配置 /etc/fstab 文件,以便将 /dev/??? 挂载到 /mnt/rwstorage。必须在 /etc/fstab 中添加这样一行:
/dev/??? /mnt/rwstorage ext2 defaults 1 2
重要说明:如果您使用的内核版本属于 2.3+,则在您的 /etc/fstab 文件中很可能有这样一行:
none /var/shm shm defaults 0 0
该行在系统中启用共享内存,默认情况下它挂载在 /var 中。为了使该行正常工作,它必须出现在您刚添加的那一行的下一行。这样,当 linux 启动时,/mnt/rwstorage 将首先被挂载(启用 /var)。然后,并且仅当在此以后,shm 设备将被挂载在 /var/shm,而后者实际上是 /mnt/rwstorage/var/shm。确保这两行的次序为:
/dev/??? /mnt/rwstorage ext2 defaults 1 2
none /var/shm shm defaults 0 0
在保存了对 /etc/fstab 的更改以后,您的系统已经成功升级了!在证实一切工作正常以后,您可删除所备份的 /tmp.old 和 /var.old 目录。恭喜您 -- 为了获得最佳性能,您已经成功地对您的系统分区进行了重新配置。
参考资源
* 在 Maximum swappage 中,我说明了如何大幅提高 linux 下的交换 (swap) 性能
* 在 Partition planning tips 中,我说明了可用来有效地组织分区布局的几种方法
* 在 Partitioning in action: Moving /home 中,我逐步说明了如何将 /home 移动到一个新分区上
* 我一向建议读者查阅 The linux Documentation Project 上的 howtos -- 这些都是有价值的参考资源
作者简介
Daniel Robbins 住在新墨西哥州 Albuquerque 市,他是 Gentoo Project 的首席体系结构设计师,Gentoo Technologies 公司的首席执行官,linux Advanced Multimedia Project (LAMP) 的顾问,他还是 Macmillan 公司出版的《Caldera OpenLinux Unleashed》、《SuSE Linux Unleased》和《Samba Unleashed》几本书的重要作者之一。由于深受 Pac Man 的影响,Daniel 在读二年级时第一次接触到 Logo 语言后即执迷于计算机。这可能是他后来作为 SONY Electronic Publishing/Psygnosis 的首席图形艺术家的原因。Daniel 喜欢与他的妻子 Mary 共度美好时光,Mary 今年春天已经怀孕。(www-900.ibm)