我公司有一个旧的 CentOS 5 系统,我们需要复制它进行测试。我在 2 个较小的分区上运行 dd 并将它们保存到 /home,但 /home 分区无法保存到自身或其他分区,因为空间不足。
/home 只占用了 7% 左右的空间,因此将其所有文件复制到 tarball 应该很容易,但我想知道是否有更好的方法来做到这一点。
我无法使机器脱机,也无法外部连接 USB 驱动器并以此方式复制到文件,因此我很可能必须使用 SCP、dd 或 tar。
有什么建议吗?以下是df -h
Filesystem Size Used Left usage% Mount point /dev/sda2 97G 17G 75G 19% / /dev/sda1 99M 15M 80M 16% /boot tmpfs 2.0G 0 2.0G 0% /dev/shm /dev/sda3 352G 22G 312G 7% /home
答案1
肯定有“更好”的方法来实现这一点,但具体怎么做取决于你有哪些资源。我会列出几种不同的方法,你可以决定哪种方法最适合你。
首先,将 /home 中的数据复制到 tarball 是没有意义的。您无法将其保存在本地,这意味着要做到这一点,您需要一个可以向其发送数据的远程服务器。最好是与此计算机位于同一网络上且可通过 SSH 访问的服务器。坦率地说,制作其他分区的 tarball 并将其放入 /home 是浪费时间。
如果您想要复制此服务器,我会使用dd
/dev/sda 制作映像并通过 SSH 将数据发送到另一台服务器。执行此操作的最佳两种方法是同时制作另一块硬盘的映像或将映像保存为文件。
dd if=/dev/sda bs=4096 conv=notrunc,noerror,sync | ssh user@machine "dd of=/dev/sdX"
这将克隆整个驱动器,包括 MBR(以及引导加载程序)、所有分区、UUID 和数据,通过 SSH 将其发送到另一台机器并创建您选择的驱动器映像。我建议的选项如下:
- notrunc 或“不截断”通过指示 dd 不要截断任何数据来维护数据完整性。
- noerror 指示 dd 继续操作,忽略所有读取错误。dd 的默认行为是遇到任何错误时停止。
- sync 对读取错误写入零,因此数据偏移保持同步。
- bs=4096 将块大小设置为 4k,这是硬盘读写效率的最佳大小,因此也是克隆速度的最佳大小。
为了实现此功能,您使用 SSH 登录的用户必须是 root 或属于该disk
组。/dev/sdaX 应为模式 660,授予组读/写访问权限。默认组所有者应为disk
。
或者,您可以创建一个可用于直接写入磁盘的图像。
dd if=/dev/sda bs=4096 conv=notrunc,noerror,sync | ssh user@machine "dd of=/path/to/wherever/server.img"
要将图像从保存它的计算机写入硬盘驱动器,可以使用以下命令。
dd if=/path/to/server.img bs=4096 conv=notrunc,noerror,sync of=/dev/sdX
最后,如果担心空间问题,您可以在通过 SSH 发送图像之前对其进行 gzip 压缩。
dd if=/dev/hda conv=sync,noerror bs=4096 | gzip -c | ssh user@machine "of=/path/to/wherever/server.img.gz"
并写下来
gunzip -c /path/to/server.img.gz | dd of=/dev/sdX
最后,如果您想从映像中提取单个文件而不将其写入另一个驱动器,您可以将其挂载。但是,如果它是压缩的,则此方法不起作用。
您必须fdisk -lu /path/to/server.img
获取各个分区的偏移量。完成此操作后,您需要要安装的分区的起始扇区。为了便于论述,我们假设我们要访问的分区从扇区 122441728 开始。
$ fdisk -lu server.img
Disk server.img: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders, total 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x86308630
Device Boot Start End Blocks Id System
/dev/sda1 * 63 114441469 57220703+ 83 Linux
/dev/sda2 114442240 122441727 3999744 82 Linux swap / Solaris
/dev/sda3 122441728 625141759 251350016 83 Linux
然后您可以使用mount -o ro,loop,offset=$((122441728 * 512)) server.img /mnt
它将第三个分区挂载到 /mnt。
资料来源: