本章介绍如何使用各种备份命令将 UFS 文件和文件系统复制到磁盘、磁带和软盘。
以下是本章中的逐步说明列表。
需要备份和恢复完整的文件系统时,请使用第 28 章,UFS 备份和恢复命令(参考)中介绍的 ufsdump 和 ufsrestore 命令。需要复制或移动各个文件、文件系统的各部分或完整的文件系统时,可以使用本章中介绍的过程,而不是 ufsdump 和 ufsrestore 命令。
表 29–1 何时使用各种备份命令
任务 |
命令 |
更多信息 |
---|---|---|
将文件系统备份到磁带。 |
ufsdump | |
创建文件系统快照。 |
fssnap | |
从磁带恢复文件系统。 |
ufsrestore | |
将文件传输到其他系统。 |
pax、tar或 cpio | |
在磁盘之间复制文件或文件系统。 |
dd | |
将文件复制到软盘。 |
tar |
下表介绍了各种备份和恢复命令。
表 29–2 各种备份命令汇总
命令名称 |
是否可识别文件系统边界? |
是否支持多卷备份? |
物理复制还是逻辑复制? |
---|---|---|---|
volcopy |
是 |
是 |
物理 |
tar |
否 |
否 |
逻辑 |
cpio |
否 |
是 |
逻辑 |
pax |
是 |
是 |
逻辑 |
dd |
是 |
否 |
物理 |
ufsdump/ufsrestore |
是 |
是 |
逻辑 |
fssnap |
N/A |
N/A |
逻辑 |
下表介绍了其中某些命令的优点和缺点。
表 29–3 tar、pax 和 cpio 命令的优点和缺点
以下各节介绍有关如何使用这些命令的逐步说明和示例。
以下两个命令用于在磁带之间复制文件系统:
volcopy
dd
有关 volcopy 的更多信息,请参见 volcopy(1M)。
下一节介绍如何使用 dd 命令在磁带之间复制文件系统。
dd 命令可以将完整的 UFS 文件系统精确地复制到其他文件系统或磁带(块级别)。缺省情况下,dd 命令会将标准输入复制到标准输出。
如果未首先指定适当的块大小,请不要将 dd 命令和磁带长度可变的磁带机一同使用。
可以指定设备名称而不是指定标准输入和/或标准输出。在本示例中,软盘的内容将被复制到 /tmp 目录中的某个文件:
$ dd < /floppy/floppy0 > /tmp/output.file 2400+0 records in 2400+0 records out |
dd 命令可报告它所读取和写入的块数目。+ 号后的数字是已复制的部分块的数目。缺省块大小为 512 字节。
dd 命令的语法与大多数其他命令不同。选项以 keyword=value 对的形式指定,其中 keyword 是要设置的选项,value 是该选项的参数。例如,可以使用以下语法替换标准输入和标准输出:
$ dd if=input-file of=output-file |
要使用 keyword=value 对(而不使用重定向符号),则可以键入以下内容:
$ dd if=/floppy/floppy0 of=/tmp/output.file |
考虑复制磁盘时,请牢记以下要点:
请勿使用此过程复制由卷管理器控制的磁盘。
将 UFS 文件系统数据从一个磁盘或系统复制到另一个磁盘或系统的主要方法是使用 ufsdump 和 ufsrestore 命令。有关使用这些命令的更多信息,请参见第 24 章,备份和恢复文件系统(概述)。
通过创建 Flash 归档文件并将其复制到目标系统,可以克隆系统。有关创建 Flash 归档文件的更多信息,请参见《Solaris 10 Installation Guide: Solaris Flash Archives (Creation and Installation)》。
如果要复制带有 EFI 磁盘标号的磁盘,请参见示例 29–2。
如果您仍在考虑使用 dd 命令复制磁盘,请牢记以下注意事项:
确保源磁盘和目标磁盘具有相同的磁盘几何参数。
检查磁盘中要使用 fsck 实用程序复制的 UFS 文件系统。
确保在使用 dd 命令复制磁盘时系统处于单用户模式。
成为超级用户或承担等效角色。
(可选)创建 /reconfigure 文件,以使系统能够在重新引导时识别要添加的目标磁盘(如有必要)。
# touch /reconfigure |
关闭系统。
# init 0 |
将目标磁盘连接到系统。
引导系统。
ok boot -s |
# dd if=/dev/rdsk/device-name of=/dev/rdsk/device-name bs=block-size |
表示主磁盘设备的重叠片,通常为片 2。
表示目标磁盘设备的重叠片,通常为片 2。
用于标识块大小,如 128 KB 或 256 KB。较大的块大小可以缩短复制磁盘所用的时间。
有关更多信息,请参见 dd(1M)。
检查新的文件系统。
# fsck /dev/rdsk/device-name |
挂载目标磁盘的根 (/) 文件系统。
# mount /dev/dsk/device-name /mnt |
转到 /etc/vfstab 文件所在的目录。
# cd /mnt/etc |
使用文本编辑器编辑目标磁盘的 /etc/vfstab 文件,以引用正确的设备名称。
例如,将 c0t3d0 的所有实例都更改为 c0t1d0。
转到目标磁盘的根 (/) 目录。
# cd / |
取消挂载目标磁盘的根 (/) 文件系统。
# umount /mnt |
关闭系统。
# init 0 |
从目标磁盘引导至单用户模式。
# boot diskn -s |
目标磁盘不需要 installboot 命令,因为引导块是作为重叠片的一部分进行复制的。
取消配置目标磁盘。
# sys-unconfig |
系统在取消配置后即会关闭。
再次从目标磁盘引导,并提供其系统信息,如主机名、时区等。
# boot diskn |
引导系统后,以超级用户身份登录以验证系统信息。
hostname console login: |
本示例说明如何将主磁盘(带有 VTOC 标签) /dev/rdsk/c0t0d0s2 复制到目标磁盘 /dev/rdsk/c0t2d0s2。
# touch /reconfigure # init 0 ok boot # dd if=/dev/rdsk/c0t0d0s2 of=/dev/rdsk/c0t2d0s2 bs=128k # fsck /dev/rdsk/c0t2d0s2 # mount /dev/dsk/c0t2d0s2 /mnt # cd /mnt/etc # vi vfstab (Modify entries for the new disk) # cd / # umount /mnt # init 0 # boot disk2 -s # sys-unconfig # boot disk2 |
在以前的 Solaris 发行版中,片 2 (s2) 用于表示整张磁盘。在带有 EFI 标签的磁盘上,必须使用稍有不同的过程来克隆或复制大于 1 TB 的磁盘,以使克隆磁盘的 UUID 具有唯一性。如果没有为克隆磁盘创建新的标签,则其他软件产品在遇到重复的 UUID 时可能会损坏带有 EFI 标记的磁盘上的数据。
例如:
克隆带有 EFI 标记的磁盘。例如:
# dd if=/dev/rdsk/c0t0d0 of=/dev/rdsk/c0t2d0 bs=128k |
传输要复制到 fmthard 命令中的磁盘的 prtvtoc 输出,以便为克隆磁盘创建新的标签。例如:
# prtvtoc /dev/rdsk/c0t0d0 | fmthard -s - /dev/rdsk/c0t2d0 |
有关 EFI 磁盘标签的更多信息,请参见带有 EFI 磁盘标号的多 TB 磁盘支持。
可以使用 cpio(复制入和复制出)命令复制各个文件、多组文件或完整的文件系统。本节介绍如何使用 cpio 命令复制完整的文件系统。
cpio 命令是一个归档程序,可以将文件列表复制到单个大型输出文件中。此命令会在各个文件之间插入头,以便于进行恢复。可以使用 cpio 命令将完整的文件系统复制到其他片、其他系统或介质设备(如磁盘或软盘)。
由于 cpio 命令可以识别介质结尾并会提示您插入另一个卷,因此它是除了 ufsdump 以外最有效的命令,可用于创建需要多盒磁带或多张软盘的归档文件。
使用 cpio 命令时,经常将 ls 和 find 命令结合使用以列出和选择要复制的文件,然后将输出传输给 cpio 命令。
成为超级用户或承担等效角色。
转至相应的目录。
# cd filesystem1 |
通过将 find 命令与 cpio 命令结合使用,将目录树从 filesystem1 复制到 filesystem2。
# find . -print -depth | cpio -pdm filesystem2 |
从当前工作目录开始。
列显文件名。
向下派生目录分层结构并从下到上列显文件名。
创建文件列表。
根据需要创建目录。
在目录中设置正确的修改时间。
有关更多信息,请参见 cpio(1)。
系统将复制指定目录名中的文件。符号链接会被保留。
可能还要指定 -u 选项。此选项将强制执行无条件复制。否则,旧文件不会替代新文件。在需要目录的精确副本且复制的某些文件可能已存在于目标目录中时,此选项可能非常有用。
通过显示目标目录的内容,确认复制成功。
# cd filesystem2 # ls |
删除源目录(如果可行)。
# rm -rf filesystem1 |
# cd /data1 # find . -print -depth | cpio -pdm /data2 19013 blocks # cd /data2 # ls # rm -rf /data1 |
可以使用 tar、pax 和 cpio 命令将文件和文件系统复制到磁带。所选的命令取决于复制所需的灵活性和精确度。由于所有这三个命令都使用原始设备,因此在使用磁带之前不需要在其中格式化或创建文件系统。
使用的磁带机和设备名称取决于每个系统的硬件配置。有关磁带设备名称的更多信息,请参见选择要使用的介质。
以下是在使用 tar 命令将文件复制到磁带之前应了解的信息:
可以使用文件名替换通配符(? 和 *)作为复制文件时指定的文件名的一部分。例如,要复制带有 .doc 后缀的所有文档,请键入 *.doc 作为文件名参数。
从 tar 归档文件中提取文件时,不能使用文件名替换通配符。
转到包含要复制的文件的目录。
将可写磁带插入磁带机中。
将文件复制到磁带。
$ tar cvf /dev/rmt/n filenames |
指明要创建归档文件。
归档时显示每个文件的名称。
指明应该将归档文件写入指定设备或文件。
指明要复制的文件和目录。使用空格分隔多个文件。
会将指定的文件名复制到磁带,并且会覆写该磁带上的任何现有文件。
从磁带机中取出磁带。在磁带标签中写入文件名称。
确认复制的文件位于该磁带中。
$ tar tvf /dev/rmt/n |
有关列出 tar 磁带中的文件的更多信息,请参见如何列出磁带中的文件 (tar)。
以下示例说明如何将三个文件复制到磁带机 0 中的磁带。
$ cd /export/home/kryten $ ls reports reportA reportB reportC $ tar cvf /dev/rmt/0 reports a reports/ 0 tape blocks a reports/reportA 59 tape blocks a reports/reportB 61 tape blocks a reports/reportC 63 tape blocks $ tar tvf /dev/rmt/0 |
以下示例显示磁带机 0 中的磁带上的文件列表。
$ tar tvf /dev/rmt/0 drwxr-xr-x 0/1 0 Jul 28 15:00 2004 reports/ -r--r--r-- 0/1 206663 Jul 28 15:00 2004 reports/reportA -r--r--r-- 0/1 206663 Jul 28 15:00 2004 reports/reportB -r--r--r-- 0/1 206663 Jul 28 15:00 2004 reports/reportC |
将磁带插入磁带机。
$ tar xvf /dev/rmt/n [filenames] |
指明应从指定的归档文件中提取文件。指定磁带机中的磁带上的所有文件都会被复制到当前目录。
恢复时显示每个文件的名称。
指明包含归档文件的磁带设备。
指定要恢复的文件。使用空格分隔多个文件。
有关更多信息,请参见 tar(1) 手册页。
确认文件已被复制。
$ ls -l |
以下示例说明如何从磁带机 0 中的磁带恢复所有文件。
$ cd /var/tmp $ tar xvf /dev/rmt/0 x reports/, 0 bytes, 0 tape blocks x reports/reportA, 0 bytes, 0 tape blocks x reports/reportB, 0 bytes, 0 tape blocks x reports/reportC, 0 bytes, 0 tape blocks x reports/reportD, 0 bytes, 0 tape blocks $ ls -l |
从磁带中提取的文件名称必须与归档文件中存储的文件名称完全匹配。如果对文件的名称或路径有任何质疑,请首先列出磁带中的文件。有关列出磁带中的文件的说明,请参见如何列出磁带中的文件 (tar)。
转到包含要复制的文件的目录。
将可写磁带插入磁带机中。
将文件复制到磁带。
$ pax -w -f /dev/rmt/n filenames |
启用写模式。
确定磁带机。
指明要复制的文件和目录。使用空格分隔多个文件。
有关更多信息,请参见 pax(1) 手册页。
确认文件已被复制到磁带。
$ pax -f /dev/rmt/n |
从磁带机中取出磁带。在磁带标签中写入文件名称。
以下示例说明如何使用 pax 命令来复制当前目录中的所有文件。
$ pax -w -f /dev/rmt/0 . $ pax -f /dev/rmt/0 filea fileb filec |
转到包含要复制的文件的目录。
将可写磁带插入磁带机中。
将文件复制到磁带。
$ ls | cpio -oc > /dev/rmt/n |
为 cpio 命令提供文件名列表。
指定 cpio 命令应该在复制出模式 (-o) 下操作,并以 ASCII 字符格式 (-c) 写入头信息。这些选项确保可移植到其他供应商的系统。
指定输出文件。
会将目录中的所有文件复制到指定磁带机中的磁带,同时会覆写该磁带中的任何现有文件。屏幕将显示复制的总块数。
确认文件已被复制到磁带。
$ cpio -civt < /dev/rmt/n |
指定 cpio 命令应以 ASCII 字符格式读取文件。
指定 cpio 命令应在复制入模式下操作,即使该命令仅列出了此时的文件。
显示与 ls -l 命令的输出格式类似的输出。
列出指定磁带机中的磁带上的文件目录。
指定现有 cpio 归档文件的输入文件。
从磁带机中取出磁带。在磁带标签中写入文件名称。
以下示例说明如何将 /export/home/kryten 目录中的所有文件复制到磁带机 0 中的磁带。
$ cd /export/home/kryten $ ls | cpio -oc > /dev/rmt/0 16 blocks $ cpio -civt < /dev/rmt/0 -rw-r--r-- 1 root other 0 Jul 28 14:59 2004, filea -rw-r--r-- 1 root other 0 Jul 28 14:59 2004, fileb -rw-r--r-- 1 root other 0 Jul 28 14:59 2004, filec drwxr-xr-x 2 root other 0 Jul 28 14:59 2004, letters drwxr-xr-x 2 root other 0 Jul 28 15:00 2004, reports 16 blocks $ |
列出磁带中的目录需要很长时间,因为 cpio 命令必须处理整个归档文件。
以下示例说明如何列出磁带机 0 中的磁带上的文件。
$ cpio -civt < /dev/rmt/0 -rw-r--r-- 1 root other 0 Jul 28 14:59 2004, filea -rw-r--r-- 1 root other 0 Jul 28 14:59 2004, fileb -rw-r--r-- 1 root other 0 Jul 28 14:59 2004, filec drwxr-xr-x 2 root other 0 Jul 28 14:59 2004, letters drwxr-xr-x 2 root other 0 Jul 28 15:00 2004, reports 16 blocks $ |
如果已使用相对路径名创建了归档文件,则恢复文件时会在当前目录中以目录形式生成输入文件。但是,如果已使用绝对路径名创建了归档文件,则将使用相同的绝对路径在系统中重新创建该文件。
使用绝对路径名可能会有危险,因为可能会覆写系统中的现有文件。
转到要放置文件的目录。
将磁带插入磁带机。
$ cpio -icvd < /dev/rmt/n |
从标准输入中提取文件。
指定 cpio 命令应以 ASCII 字符格式读取文件。
在以与 ls 命令输出类似的格式恢复文件时,显示这些文件。
根据需要创建目录。
指定输出文件。
确认文件已被复制。
$ ls -l |
以下示例说明如何从磁带机 0 中的磁带恢复所有文件。
$ cd /var/tmp cpio -icvd < /dev/rmt/0 answers sc.directives tests 8 blocks $ ls -l |
转到要放置文件的目录。
将磁带插入磁带机。
从磁带中恢复文件子集。
$ cpio -icv "*file" < /dev/rmt/n |
从标准输入中提取文件。
指定 cpio 命令应以 ASCII 字符格式读取头。
在以与 ls 命令输出类似的格式恢复文件时,显示这些文件。
指定与该模式匹配的所有文件都将复制到当前目录。可以指定多种模式,但是每种模式都必须用双引号引起来。
指定输入文件。
有关更多信息,请参见 cpio(1) 手册页。
确认文件已被复制。
$ ls -l |
以下示例说明如何从磁带机 0 中的磁带恢复带有 chapter 后缀的所有文件。
$ cd /home/smith/Book $ cpio -icv "*chapter" < /dev/rmt/0 Boot.chapter Directory.chapter Install.chapter Intro.chapter 31 blocks $ ls -l |
必须满足以下先决条件,才能使用远程磁带机:
本地主机名和(可选)执行复制的用户的用户名必须出现在远程系统的 /etc/hosts.equiv 文件中。或者,执行复制的用户在远程计算机上必须具有可访问的对应起始目录,而且在 $HOME/.rhosts 中必须具有本地计算机名。
有关更多信息,请参见 hosts.equiv(4) 手册页。
远程系统的项必须位于本地系统的 /etc/inet/hosts 文件中,或位于名称服务 hosts 文件中。
要测试您是否具有执行远程命令的适当权限,请键入以下内容:
$ rsh remotehost echo test |
如果系统向您回显了 test,则您有权执行远程命令。如果系统向您回显了 Permission denied,请按照步骤 1 所述检查您的设置。
转到要放置文件的目录。
将磁带插入磁带机。
$ tar cvf - filenames | rsh remote-host dd of=/dev/rmt/n obs=block-size |
创建磁带归档文件,归档时列出文件并指定磁带设备。
提供有关 tar 文件项的其他信息。
表示磁带设备的占位符。
标识要复制的文件。使用空格分隔多个文件。
将 tar 命令的输出传输到远程 shell。
表示输出设备。
表示分块因子。
从磁带机中取出磁带。在磁带标签中写入文件名称。
# tar cvf - * | rsh mercury dd of=/dev/rmt/0 obs=126b a answers/ 0 tape blocks a answers/test129 1 tape blocks a sc.directives/ 0 tape blocks a sc.directives/sc.190089 1 tape blocks a tests/ 0 tape blocks a tests/test131 1 tape blocks 6+9 records in 0+1 records out |
将磁带插入磁带机。
转至临时目录。
$ cd /var/tmp |
$ rsh remote-host dd if=/dev/rmt/n | tar xvBpf - |
指明使用 dd 命令从磁带设备中提取文件时启动的远程 shell。
指明输入设备。
将 dd 命令的输出传输到用于恢复文件的 tar 命令。
确认文件已被提取。
$ ls -l |
$ cd /var/tmp $ rsh mercury dd if=/dev/rmt/0 | tar xvBpf - x answers/, 0 bytes, 0 tape blocks x answers/test129, 48 bytes, 1 tape blocks 20+0 records in 20+0 records out x sc.directives/, 0 bytes, 0 tape blocks x sc.directives/sc.190089, 77 bytes, 1 tape blocks x tests/, 0 bytes, 0 tape blocks x tests/test131, 84 bytes, 1 tape blocks $ ls -l |
将文件或文件系统复制到软盘之前,必须对软盘进行格式化。有关如何格式化软盘的信息,请参见第 2 章,管理可移除介质(任务)。
使用 tar 命令可将 UFS 文件复制到一张经过格式化的软盘。
如果需要将 UFS 文件复制到多张经过格式化的软盘,请使用 cpio 命令。cpio 命令可以识别介质结尾并会提示您插入下一张软盘。
如果使用 tar -c 命令将文件复制到经过格式化的软盘,则会损坏该软盘上已有的任何文件。
不能挂载包含 tar 映像的软盘。
如果需要使用多卷交换实用程序,则请使用 cpio 命令。tar 命令仅仅是一个单卷实用程序。
有关更多信息,请参见 tar(1)。
转到包含要复制的文件的目录。
将经过格式化但没有被写保护的软盘插入驱动器。
使软盘可用。
$ volcheck |
重新格式化软盘(如果必要)。
$ rmformat -U /dev/rdiskette Formatting will erase all the data on disk. Do you want to continue? (y/n)y |
将文件复制到软盘。
$ tar cvf /vol/dev/aliases/floppy0 filenames |
会将指定的文件名复制到该软盘,同时会覆写该软盘上的任何现有文件。
确认文件已被复制。
$ tar tvf /vol/dev/aliases/floppy0 |
有关列出文件的更多信息,请参见如何列出软盘中的文件 (tar)。
从驱动器中取出软盘。
在软盘标签中写入文件名称。
以下示例说明如何将名为 evaluation* 的文件复制到软盘。
$ cd /home/smith $ volcheck $ ls evaluation* evaluation.doc evaluation.doc.backup $ tar cvf /vol/dev/aliases/floppy0 evaluation* a evaluation.doc 86 blocks a evaluation.doc.backup 84 blocks $ tar tvf /vol/dev/aliases/floppy0 |
以下示例说明如何列出软盘中的文件。
$ volcheck $ tar tvf /vol/dev/aliases/floppy0 rw-rw-rw-6693/10 44032 Jun 9 15:45 evaluation.doc rw-rw-rw-6693/10 43008 Jun 9 15:55 evaluation.doc.backup $ |
转到要放置文件的目录。
将软盘插入驱动器。
使软盘可用。
$ volcheck |
$ tar xvf /vol/dev/aliases/floppy0 |
软盘中的所有文件都被复制到当前目录。
确认文件已被恢复。
$ ls -l |
从驱动器中取出软盘。
以下示例说明如何从软盘中恢复所有文件。
$ cd /home/smith/Evaluations $ volcheck $ tar xvf /vol/dev/aliases/floppy0 x evaluation.doc, 44032 bytes, 86 tape blocks x evaluation.doc.backup, 43008 bytes, 84 tape blocks $ ls -l |
以下示例说明如何从软盘中恢复单个文件。将从软盘中提取该文件,并会将其放置在当前工作目录中。
$ volcheck $ tar xvf /vol/dev/aliases/floppy0 evaluation.doc x evaluation.doc, 44032 bytes, 86 tape blocks $ ls -l |
如果您正在将大型文件复制到软盘上,则需要系统提示您用另一张经过格式化的软盘来替换已满的软盘。cpio 命令将提供此功能。cpio 命令的用法与将文件复制到磁带时的用法大致相同,不同的是将 /vol/dev/aliases/floppy0 指定为设备,而不是磁带设备名称。
有关如何使用 cpio 命令的信息,请参见如何将目录中的所有文件复制到磁带 (cpio)。