![如何将 rootfs 复制到另一个分区(dd 导致问题)](https://linux22.com/image/210560/%E5%A6%82%E4%BD%95%E5%B0%86%20rootfs%20%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%88%86%E5%8C%BA%EF%BC%88dd%20%E5%AF%BC%E8%87%B4%E9%97%AE%E9%A2%98%EF%BC%89.png)
我一直在使用 dd 将我的 rootfs 复制到另一个分区并使用新的 rootfs 副本启动系统。
sudo dd if=/dev/disk/by-partuuid/342853ea-cab9-4a4f-b935-1a704c1cc17f conv=sync,noerror bs=4M of=/dev/nvme0n1p1
其中partuuid是rootfs分区部分uuid。
问题是,有时 dd 复制的 rootfs 似乎有一些小损坏。 (我的文件已损坏或 dd 被卡住)
我可以使用其他更安全的选择来做到这一点吗?
答案1
问题是,有时 dd 复制的 rootfs 似乎有一些小损坏。 (我的文件已损坏或 dd 被卡住)
好的,现在我明白你的意思是两个 rootfs 都不会被安装。问题是这是不可能的,因为我使用的是没有 USB 的嵌入式系统支持。
总长DR
如果源和/或目标文件系统是积极的rsync
(安装)使用(本地或通过网络)或普通cp
.在文件系统级别复制(同步)它们。
在块级别
您可以安全地复制(重复)文件系统块级 (整个磁盘、分区、逻辑卷)仅当两个文件系统- 在源和目标块设备上未安装。
您在目标上获得不一致的副本(损坏的文件系统),因为:
挂载的文件系统源块设备当您的程序读取底层源块设备的块时,会不断更改它的(元)数据和其他内部结构
另外安装了文件系统目标块设备当您的程序绕过操作系统直接将块写入目标块设备时,会不断读取和更新它的(元)数据和其他内部结构。您会混淆目标系统上运行的操作系统和程序,因为它们的内存状态与文件系统的元(数据)不一致,并且它们可能会读取错误的数据并通过写入损坏元(数据)。
仅当上层(主要是文件系统)脱机(未安装、非活动)时才应复制块设备。
在文件系统级别
这意味着文件系统已挂载。
在这里,如果目标文件或源文件在复制时更新,您也可能会像块设备一样出现不一致,但仅限于存储在目标文件系统上的数据(逻辑级别)。正在运行的操作系统和应用程序也可能会因替换它们所使用的目标文件而感到困惑。
凭借 100% 的保证,您只能复制在源系统上打开以读取的文件,而不是目标系统上操作系统或应用程序未打开以写入的文件。
您可以将文件从已安装且活动的文件系统复制到另一个已安装且活动的文件系统,但结果可能取决于。
你不能只是盲目地在具有不同硬件架构、不同文件系统层次结构、不同发行版等的设备之间复制文件。
对于文件系统级别的复制,您可以使用rsync
(本地或通过网络)或简单的cp
.
您不应复制包含特定于两个系统的运行时数据的目录例如:/dev
、/proc
、/sys
、/tmp
、/run
、/var/run
、/var/tmp
、/lost+found
、 、/media
、/mnt
某些配置文件、运行数据库文件等等,具体取决于目标系统和源系统的差异。
如果您的文件系统位于 lvm 逻辑卷之上并复制快照的文件,则可以使用 lvm 快照。
使用 xfs,当源文件系统在线时,您可以通过管道输出 xfsdump /source_fs 到 xfsrestore /target_fs。
答案2
如果源文件系统支持冻结/解冻机制,那么您可以按顺序使用它(假设目标文件系统未安装):1/冻结源文件系统,2/使用dd复制块,3/解冻源文件系统。
当源文件系统被冻结时,无法进行写访问。请注意,如果您的源文件系统使用“atime”选项挂载,则即使读取访问也会生成写入(以更新“访问时间”元数据)。根据您的使用情况,可能可以,也可能不行。
https://linux.die.net/man/8/fsfreeze建议支持 Linux Ext3/4、ReiserFS、JFS、XFS。
顺便说一句,您可以拥有一个 COW fs(与源和目标相同)并使用以快照作为参考点的每块增量传输,如 btrfs 发送/接收机制(或 ZFS)。但我怀疑你是否在嵌入式上下文中拥有这种类型的文件系统。