如何完全按原样复制文件系统?


10

我有一个要编程的设备的文件系统,我想对其进行精确复制。理想情况下,我希望此副本与从其复制的文件夹相同。我已经尝试使用cp -r cp -arsync -azvP尝试实现这一目标。尽管每个文件夹都将导致一个具有不同大小的文件夹(使用du -s),并且最终即使我的设备运行的文件夹不是原始文件夹,也不会运行我复制的文件夹。

  • 我所使用的命令没有说明什么而导致的遗漏呢?
  • 复制文件系统/文件夹时,是否可以使所有内容保持一致?如果是这样,我将如何去做?

PS我在StackOverflow上发布了类似的问题,但很快意识到我在错误的交换上提出了要求


编辑:这可能无济于事,但是无论我使用哪种方法复制的目录始终会导致有问题的计算机出现以下输出,导致内核崩溃。

VFS:尝试通过软盘无法通过NFS挂载根fs。VFS:无法打开根设备“ nfs”或unknown-block(2,0),请附加正确的“ root =”引导选项;这里是可用的分区:1f00
64 mtdblock0(驱动程序?)1f02 64 mtdblock2(驱动程序?)1f04 2432 mtdblock4(驱动程序?)1f05 128 mtdblock5(驱动程序?)1f06 4352 mtdblock6(驱动程序?)1f07 204928 mtdblock7(驱动程序?)1f08 50304 mtdblock8(驱动程序?)0800
8388608 sda驱动程序:sd内核崩溃-不同步:VFS:无法在未知块(2,0)上安装根fs


5
du输出的不同并不表示内容不相同。
伊格纳西奥·巴斯克斯

我的设备无法使用复制的目录启动。我以此为指标,想知道复制的文件系统未得到相同处理,我到底在做什么错
TopGunCoder

您需要确切指定要执行的操作。rsync -acp -a进行目录的精确复制,但是您要复制可引导磁盘,则需要做几件事来完成该操作。
forcefsck

1
什么样的设备?什么样的文件系统?什么样的存储介质?
michas

1
对我来说,听起来像您想使用类似的方式dd if=/some/location of=/some/other/location bs=4M来读写数据。

Answers:


12

我通常使用以下替代方法之一:

  • rsync -aHAX(为详细程度添加v)可确保在复制时在目标文件夹中保留所有链接结构和x字。不要忘记a意味着已经存档并保留了时间,所有权和权限。
  • tar cvf如果第一个由于某种原因不能满足我的需要并且我没有时间,那么我将使用简单的方法(不要压缩以节省时间,只需将它们焦油化),但是我总是尝试第一个。

要检查一切是否按预期进行,可以diff -r <folder1> <folder2>根据需要运行。


1
这成功了!我还只需要确保我正在启动的设备(通过NFS)已关闭并且在进行复制时无法访问文件系统。
TopGunCoder

1
嗯,具有读写访问权限的NFS客户端有时可以使事情变得有趣!
bayindirh

3
如果没有-S,则不会复制稀疏文件。那可能是du -s差异的一部分。我曾经rsync -axXSAH将所有内容复制过来。-x仅在文件系统内复制,而不从其他文件系统挂载的文件。
Victor Roetman '16

那--numeric-ids呢?
0x2207

@ 0x2207仅当用户在不同的系统上具有不同的数字ID(例如,用户hbayindir在两个系统上,并且UID在源计算机上和目标在1536上)时,此功能才有用。我从来不需要使用该选项,因为我需要保留真正的所有者,而不是UID和GID。如果用户不在源或目的地中,则将数字ID用作后备。
bayindirh

4

阅读评论中的答复,听起来好像您可能正在尝试复制根文件夹(“我的设备将无法使用复制的目录启动”)。在这种情况下,您应该做几件事。

$ cd /
$ mkdir backups

$ tar -cvpf /backups/fullbackup.tar --directory=/ --exclude=proc --exclude=sys \
     --exclude=dev/pts --exclude=backups .

将根文件夹复制到新系统后,需要在启动前更新grub。

$ grub-install --recheck /dev/sdX (Where X is the partition number)
$ update-grub

+1我认为线索在OP中的失败引导消息中,这可以解决。
msw

事实证明,与此非常类似的工作。我正在处理需要复制的计算机上的文件系统(FS)。时采取了给我tar c,然后tar x它。不过,更重要的是,要确保我的机器已关闭,因为我使用的是本机本地的FS,但我的引导设备远程(我是通过NFS启动该设备的)
FS

grub-install: error: embedding is not possible, but this is required for cross-disk install.
Vitaly Zdanevich '18

2

您可以尝试FSArchiver。它是相似零件图像的继任者,该零件图像现在不再维护。过去我既使用partimage也使用FSArchiver,它们都工作良好。据我所知,它们都复制了尽可能与原始文件系统相同的文件系统。我认为FSArchiver比partimage更强大。例如,它与ext4一起使用,而partimage不起作用。请参见FSArchiver / partimage比较表


2

使用du比较文件夹本质上是麻烦的。如果您只想纯粹根据目录的大小来比较两个目录,则可以du这样使用:

$ du -sh --apparent-size <dir>

此开关将报告目录的实际大小与存储在物理驱动器介质上时消耗的磁盘空间量。磁盘被组织为块,文件被写入这些块。如果一个文件只需要BLOCK + 1个空间,它将消耗2个BLOCKS空间,这du通常是报告的。请记住,该工具的名称是磁盘使用率!

鉴于您正在处理听起来像是整个文件系统的问题,我倾向于使用它dd来精确复制目录所在的分区

$ dd if=/dev/sda1 of=/srv/boot.img

然后,您可以使用它boot.img在任何位置还原分区。

$ dd if=/srv/boot.img of=/dev/sdb1

du还将报告磁盘上的大小(因此,稀疏文件和硬链接将占用较少的空间)。例如,在我的系统上du -sh /var给出21G但du -sh --apparent-size /var给出209G。
Victor Roetman '16

0

这取决于您所说的“相同”的含义。

  • rsync大多数情况下,这样做就可以了。有时您想将tar所有内容打包到一个文件中,然后将其提取到另一个位置。
  • 如果要克隆完整的文件系统,则可以dd用来复制整个文件系统本身。

如果您有任何调试设备的方法,请尝试找出导致设备当前无法运行的确切原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.