关于本系列
典型的UNIX®管理员经常使用一系列重要的实用程序,技巧和系统,以协助管理过程。 有一些关键实用程序,命令行链和脚本可用来简化不同的过程。 这些工具中的一部分随操作系统一起提供,但是大多数技巧来自多年的经验以及减轻系统管理员生活的渴望。 本系列的重点是从各种不同UNIX环境中的可用工具中获取最大收益,包括简化异构环境中管理的方法。
移动UNIX目录或文件系统
在很多情况下,您可能需要将UNIX文件系统从一个设备或硬盘分区移动到另一设备,或者需要将内容从文件系统移动以释放空间,从而在此过程中创建新的文件系统。 设备可能即将发生故障,或者您可能只是空间不足。 您可以在以单用户模式运行的系统上,或者在需要确保文件在移动过程中可用的实时运行系统上执行此操作。
在后一种情况下(迁移实时文件系统),可能是您需要在应用程序运行时移动应用程序。 在这两种情况下,您都可能必须移动与系统相关的文件系统(例如/ usr或/ var),并且无论您是否以单用户模式运行,该文件系统实际上都可能处于活动状态。
在任何文件系统移动操作中,必须确保已将数据正确复制到新目的地。 作为一个典型的例子,假设您有一个具有清单1所示的文件/磁盘布局和用法的系统。
清单1.示例文件/磁盘布局和用法
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 7692908 6467756 1225152 84% /
udev 517560 184 517376 1% /dev
/dev/hda1 115377640 1743668 107773060 2% /var/lib/mysql
/dev/hdb1 115380192 14604460 94914696 14% /export/data
/dev/hde1 96132940 3962940 87286644 5% /export/home
/dev/hde4 22960280 133484 21660480 1% /tmp
none 517560 0 517560 0% /dev/shm
如清单1所示 ,根文件系统已满84%,您可能应该将目录从尚未位于其他分区的根文件系统移至新分区或设备,以确保根文件系统无法填满。
最好移动具有特定用途的单个目录,该目录对要释放空间的文件系统产生最大影响。 例如,在这种情况下,您可能希望将/ var或/ usr目录放到其自己的文件系统中。 移动多个较小的目录效率不高。 您需要一个易于移动的目录来释放空间。
在某些情况下,您会将现有分区移动或复制到新位置(例如,在潜在的设备故障期间)。 在此,已经为您选择了目录或现有文件系统。
在本文中,我假定您已经添加了新的硬盘设备,或具有备用磁盘设备或分区以用作目录或文件系统的目标。
移动数据快速指南
移动文件系统或将现有目录放置到新文件系统上的基本顺序如下:
- 选择要复制的数据。
- 创建一个新分区。
- 在分区上创建一个新的文件系统。
- 将分区挂载到临时目录上。
- 将数据复制到临时目录。
- 重命名原始目录。
- 创建新的安装点。
- 挂载文件系统。
理想情况下,尽管并不总是必要或可能的,但应该在此之后重新启动。 您当然应该尽早重启。
让我们仔细看看序列的每个步骤。
创建一个新的分区和文件系统
在创建新的分区和文件系统之前,首先请确保可用大小和空间与要放置在新文件系统上的文件/目录的大小相匹配。 最简单的方法是使用du工具确定当前文件/目录的大小。 例如,如果要从示例系统中移动/ usr目录,则可以使用清单2中所示的命令。
清单2.从示例系统中移动/ usr目录
$ du -sk /usr
3923068 /usr
-s
选项可确保生成整个目录的摘要,而不是目录的摘要, -k
选项可确保获得以KB为单位的目录大小。 根据以上内容,您可以确定需要至少4GB的新分区。
如果要将现有文件系统移至更大的分区(而不是现有文件系统中的单个目录),请使用df的输出确定当前文件系统的大小。
知道大小后,您应该创建一个分区,该分区理想情况下比所需大小大25%,并且一定要大10%。 对于上面的示例文件系统,您需要一个至少5GB的新分区。
要创建新的分区和文件系统,您需要使用适合您的操作系统的工具。 例如:
- 在Linux®下,您需要使用fdisk在物理硬盘驱动器上配置分区,并使用
mke2fs
或mkfs.*
创建命令之一在新分区上创建合适的文件系统。 - 在Solaris SPARC框中,使用format创建或配置分区。 在Solaris x86机器上,在使用format配置Sun分区表之前,您可能还需要使用fdisk配置磁盘分区。 然后,您可以使用
newfs
(或特定于文件系统的命令之一)创建文件系统。 - 在AIX®下,使用mkvg,chpv或其他一些卷管理工具为新分区创建合适的分区或卷组。 然后,您可以使用crfs创建文件系统。
在文件系统就绪的情况下,创建一个新目录,您可以在该目录下复制数据时挂载新文件系统。 例如,我更喜欢在相似的位置创建一个新文件系统,并使用一个名称将其标识为临时文件系统。
在上面的/ usr示例中,我将创建一个新目录/mnt/usr.tmp,将在其中安装新文件系统。
复制信息
实际上,复制信息可能是该过程中最简单的部分,但是选择正确的工具可能会极大地影响信息的传输效率。 但是,您应注意确保将文件复制到正确的位置。 您要避免覆盖现有数据。
有许多可用的方法,但是两个主要解决方案是使用基本的cp工具或tar工具。 前者是一种非常快速的方法,但是在某些操作系统上,您可能会遇到非标准文件的问题,例如管道和设备。 tar工具可能是一个较慢的替代方法,但是在传输其他文件类型时它更可靠,并提供有关复制过程的更多视觉反馈。
无论使用哪种方法,都应确保未主动更新源文件系统上的任何文件。 请记住,您制作的任何副本仅包含制作副本时各个文件中的数据。 如果此时正在文件系统上更新文件,则新文件系统上的文件可能不完整且已损坏。
使用cp
cp工具支持递归复制选项( -r
),该选项将所有文件,目录以及这些目录中的文件复制到目标位置。 您还可以使用-p
选项保留对复制文件的所有权和权限。 如果要确保新文件系统保留源的安全性详细信息,这至关重要。 在少数情况下,这不是必需的。
要将文件从现有目录复制到新位置,请按照下列步骤操作:
- 切换到新的目标目录,并确认您在正确的位置(请参见清单3 )。
清单3.更改目标目录
$ cd /mnt/usr.tmp $ pwd /mnt/usr.tmp
- 将文件从旧目录复制到当前(新)目录,如清单4所示。
清单4.将文件复制到新目录
$ cp -pr /usr/* .
您应该对文件是否已复制进行快速验证。 一个简单的ls
会给出一个指示(参见清单5 )。 稍后将检查更详细的检查方法。
清单5.验证文件是否已复制
$ ls -l /usr
total 238
drwxr-xr-x 2 root bin 1024 Apr 20 13:11 4lib/
lrwxrwxrwx 1 root root 5 Apr 20 12:40 5bin -> ./bin/
lrwxrwxrwx 1 root root 9 Apr 20 12:34 X -> ./openwin/
drwxr-xr-x 6 root bin 512 Apr 20 12:42 X11/
lrwxrwxrwx 1 root root 3 Apr 20 12:41 X11R6 -> X11/
lrwxrwxrwx 1 root root 10 Apr 20 13:03 adm -> ../var/adm/
drwxr-xr-x 10 root bin 512 Apr 20 12:59 apache/
drwxr-xr-x 8 root bin 512 Apr 20 12:47 apache2/
drwxr-xr-x 8 root bin 512 Apr 20 12:53 appserver/
drwx------ 8 root bin 512 Apr 20 12:53 aset/
drwxr-xr-x 4 root bin 16384 Apr 20 13:17 bin/
drwxr-xr-x 4 root bin 512 Apr 20 12:33 ccs/
...
lrwxrwxrwx 1 root root 10 Apr 20 12:32 tmp -> ../var/tmp/
drwxr-xr-x 4 root bin 2048 Apr 20 13:00 ucb/
drwxr-xr-x 4 root bin 512 Apr 20 13:17 ucbinclude/
drwxr-xr-x 3 root bin 1024 Apr 20 13:17 ucblib/
drwxr-xr-x 7 root bin 512 Apr 20 13:03 vmsys/
drwxr-xr-x 5 root bin 512 Apr 20 12:44 xpg4/
drwxr-xr-x 3 root bin 512 Apr 20 12:40 xpg6
如果发现某些文件没有被正确复制,或者符号链接和其他特殊文件类型没有被正确复制,则您可能需要尝试tar。
使用tar
与cp相比,tar工具具有许多优点。 首先,对于非标准文件类型,它往往更可靠。 其次,由于它可以提供有关正在复制的文件的视觉反馈,因此它可以是一种将文件复制到新系统的更舒适的方法。 最后但并非最不重要的一点是,您可以使用tar创建文件系统的存档文件,该文件可以在出现问题时用作源目录/文件系统的备份。 在具有单用户模式计算机的用户文件系统上,可以使用tar文件方法创建新的文件系统内容,而无需在临时目录安装点上安装新的目标。
使用tar复制的最佳方法是将tar创建的文件通过提取文件的新位置中的另一个tar传输。 清单6显示了一个示例。
清单6.使用tar复制
$ cd /usr
$ tar cfp - ./* |(cd /mnt/usr.tmp; tar xvfp -)
第一个tar中的c
参数告诉tar创建一个归档文件。 v
, f
和p
选项指定详细输出(打印要添加/提取的文件),从文件(而不是磁带设备)写入/读取,并分别保留权限和所有权。
清单6中的行起作用了,因为在从标准输入读取管道的前半部分中创建的.tar文件之前,管道的后半部分首先更改为目标目录。
如果要创建一个.tar文件并使用它,而不是执行直接复制,则必须具有一个能够保存源目录中所有文件的文件系统。 清单7显示了复制过程。
清单7.复制过程
$ cd /usr
$ tar cfp /tmp/usr.tar ./*
$ cd /mnt/usr.tmp
$ tar xvfp /tmp/usr.tar
无论使用哪种解决方案,只要您使用v
命令行选项(参见清单8 ),就应该将每个文件复制到归档中或从归档中复制出来。
清单8.复制过程的打印输出
a ./4lib/ 0K
a ./4lib/libX.so.1.0 symbolic link to ./libX11.so.4.3
a ./4lib/libX11.so.4.3 216K
a ./4lib/libXaw.so.4.0 208K
a ./4lib/libXmu.so.4.0 72K
a ./4lib/libXol.so.3.1 1056K
a ./4lib/libXt.so.4.1 264K
a ./4lib/libce.so.0.0 48K
a ./4lib/libdeskset.so.0.1 64K
a ./4lib/libdga.so.1.0 40K
a ./4lib/libhelp.so.1.0 24K
a ./4lib/libolgx.so.3.1 56K
a ./4lib/libtt.so.1.1 848K
a ./4lib/libttstub.so.1.1 32K
a ./4lib/libxview.so.3.73 1328K
a ./4lib/libdl.so.1.0 symbolic link to ../../lib/libdl.so.1
a ./4lib/libc.so.1.9 403K
a ./4lib/libc.so.2.9 402K
...
使用tar和直接文件系统交换
要将文件系统的内容复制到新位置而不创建临时安装点,必须首先有空间容纳源目录中的所有文件。
如果用新文件系统替换目录:
- 像以前一样创建新的分区和文件系统。
- 创建源目录的.tar文件(请参见清单9 )。
清单9.创建一个.tar文件
$ cd /home $ tar cfvp /tmp/home.tar
- 重命名源目录(请参见清单10 )。
清单10.重命名源目录
$ cd .. $ mv home home.old
- 创建目录,并设置与原始目录相同的权限和所有权。
- 在新目录上挂载新文件系统。
- 提取.tar文件(请参见清单11 )。
清单11.提取.tar文件
$ cd home $ tar xvfp /tmp/home.tar
如果要更改现有文件系统的分区(如清单10所示),则顺序是相似的,但是您要卸载现有文件系统而不是重命名目录(请参见清单12 )。
清单12.更改现有文件系统的分区
$ cd ..
$ umount /home
此选项仍然是安全的,因为您在旧分区上具有源文件系统的完整副本。 您尚未删除任何一种解决方案中的内容或源材料。
验证副本
无论使用cp还是tar,都应始终验证副本已成功完成。 尽管tar确认复制的文件(带有v
选项),但您应确保在新文件系统上正确地重新创建了文件。
首先,检查新旧系统上du的输出(请参见清单13 )。
清单13.检查du的输出
$ du -sk /usr
3923068 /usr
$ du -sk /mnt/usr.tmp
3923068 /mnt/usr.tmp
这两个数字应该相同; 但是,根据新文件系统的类型以及旧文件系统/目录和新文件系统/目录上文件和目录分配的大小,您可能会注意到该大小略有差异。
另一个好的测试只是比较源和目标上的文件/目录数。 您可以使用简单的find command
执行此操作,如清单14所示。
清单14.比较源和目标上的文件/目录数
$ find /usr |wc -l
347001
$ find /mnt/usr.tmp |wc -l
347001
如果要将文件系统复制到文件系统,另一项很好的测试是比较inode编号。 这些显示已分配了多少个索引节点。 如果要从一个文件系统复制到完全相同类型的另一个文件系统,则使用的索引节点数应相同。 使用带有-i
命令行选项的df来获取inode统计信息,或者在传统的UNIX系统上,裸露的df输出显示所创建的“文件”数量。
清单15中的示例来自Linux系统。
清单15.比较索引节点编号
$ df -i /usr
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 977280 411959 565321 43% /
清单16中的示例在Solaris上。
清单16.比较Solaris上的索引节点号
$ /bin/df /usr
/usr (/dev/dsk/c0t0d0s3 ): 9076010 blocks 863695 files
更新系统以反映新组织
在此阶段,您应该拥有一个新的文件系统,其中包含要移至新文件系统的文件系统或目录的副本。 现在,您应该更新系统文件(尤其是文件系统安装信息)以反映新的结构。 此信息存储在/ etc / fstab,/ etc / vfstab中,或者可以通过特定的管理工具(例如HP-UX上的SAM)获得。
如果要在现有文件系统中迁移目录:
- 重命名原始目录。
- 创建一个新目录。
- 使用chown和chmod在新目录上设置所有权和权限。
理想情况下,您现在应该重新引导系统以确保使用新布局。 如果要将文件系统从一台设备迁移到另一台设备,则必须重新引导。 您不太可能卸载现有的文件系统,特别是如果它是系统目录(即/ var或/ usr下的目录)时。
如果无法重新引导,请在新的安装点中手动安装新系统,然后尽快重新引导。
重新启动并确认一切正常后,您可以删除旧目录或重新使用旧分区。
摘要
在许多情况下,都需要实时复制或以其他方式复制UNIX文件系统。 可能是因为空间不足,文件系统需要更大的分区才能安装软件,甚至是即将发生的硬件故障。 在任何这些情况下,您都需要使用本文介绍的技术将现有文件复制到文件系统中。
这样的副本并非没有陷阱-复制活动文件系统可能会带来风险,尤其是在存在打开文件的情况下。 您还应注意确保不要意外地用要复制的文件覆盖分区或现有文件。 但是,正如您在这里仔细考虑所看到的那样,即使在实时系统上,也可以可靠地有效迁移文件以利用更多空间。
翻译自: https://www.ibm.com/developerworks/aix/library/au-satmigrat.html