清单 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
如果您将文件从一个文件系统复制到另一个文件系统,那么还有一种好的测试方法,即比较索引节点数目,这将显示分配了多少个索引节点。如果您将文件从一个文件系统复制到另一个与其类型完全相同的文件系统,那么所使用的索引节点的数目应该是相等的。可以使用带 -i 命令行选项的 df 命令获取索引节点的统计信息,或者在传统的 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 文件系统进行复制。可能是因为耗尽了磁盘空间,所以文件系统需要更大的分区来安装软件,甚至是因为硬件将会出现故障。在这些情况下,您需要使用本文中介绍的技巧,将现有的文件复制到新的文件系统。
这种复制操作本身存在一定的陷井,即对活动的文件系统进行复制可能是有风险的,特别是在打开了多个文件的情况下。您还应该注意,务必避免用要复制的文件意外地覆盖分区或现有的文件。然而正如您所看到的,经过周密的考虑,可以高效地、可靠地对文件进行迁移,以充分利用更大的空间,即使是在活动的系统中也可以实现。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
关于apt-get:非Linux管理员应该知道的那些事
Apt-get是广泛应用在Unix和Linux系统中的应用程序管理器,Windows和Linux管理员也可以受益于其功能。
-
Unix与Linux之间的差异不可忽视
Unix与Linux看起来非常相似,但如果没有知晓Unix和Linux之间众多细微与定义差异,可能会造成一些问题。
-
Unix在现代数据中心的份额与角色是什么?
已经40岁的Unix操作系统似乎已经廉颇老矣,但在现代数据中心中可能还有价值所在。那么今天Unix的位置在哪呢?
-
克服多重挑战 成功从Unix迁移到Windows
和Unix正在失去企业市场相对应的是,企业也在为他们的工作负载寻找新的承载平台, 微软Windows是备选目标之一。在处理Unix到Windows的迁移工作时规避许多障碍。