我尝试将根文件系统从 ext4 迁移到另一种分区类型 (zfs),并从一个简单的开始
rsync -a --exclude=/boot --exclude=/mnt --exclude=/media --exclude=/tmp
--exclude=[all zfs pools with default mountpoint]
/ /target/directory/mountpoint/
然后传输卡在了 中的一个不同的文件上/proc
,在添加之后--exclude=/proc
rsync
又卡在了 中的一个文件上/sys/devices
,这导致我放弃了反复试验。在阅读man proc
并了解/sys
(维基百科) 我意识到我需要做比简单解决方案更多的研究才能找到它。我希望有人能帮忙。根系统是 Ubuntu 14.04 amd64(实时系统也是如此,但如果这是一个限制问题,请随时提出建议)。
当然,启动实时系统并将数据复制到那里很容易,但这仅是针对问题的解决方法。
答案1
我要首先声明这一点,因为我没有可以用来测试启动是否真的有效的系统。这个答案是基于我的理解,你应该只在开发系统上尝试,直到你确认它有效。
由于/dev
、/sys
、/proc
都是虚拟文件系统,我认为操作系统应该在启动时创建它们的内容。如果这是真的,你应该能够做到:
rsync -ax / /target/directory/mountpoint
-x 告诉 rsync 不要跨越文件系统边界,因此它将跳过虚拟文件系统,并且无需指定 zfs 池。它仍将创建挂载点,但它们将为空。
如果您的 /tmp 不是它自己的分区,并且您不想复制这些文件,那么您仍然需要手动执行--exclude
此操作。
答案2
检查您是否正在运行 LVM。如果是,您可以使用 LVM 进行文件系统快照,然后从那里复制。
之所以发明这些是因为需要从静态文件系统创建备份,否则备份就没什么用。快照将解决跨设备问题以及临时文件问题。
请注意,如果您有任何大型文件(如数据库)处于活动状态,rsync 和其他备份可能会产生不一致的版本,因为文件的一部分将在数据库更改之前复制,而其他部分将在数据库更改之后复制。快照也是为了解决这个问题而尝试的。
注意:btrfs 具有更优越的文件系统快照形式,但如果您已经在运行 ext4,那么这次就太晚了。
答案3
附加:如果可以(如果您在本地控制台,则可以;如果您通过 ssh 连接或需要保持系统完全运行,则不能),请在执行此类操作之前更改为运行级别 1(“单用户模式”,命令为“init 1”)。这将停止所有可能在您复制文件系统时更改文件系统内容的非必要进程。
注意调整你的 fstab,特别是在使用 UUID 的情况下。
考虑使用“chroot /where/the/new/root/is/mounted /bin/bash”来测试您新复制的文件系统,并可能重新安装引导加载程序。您可能必须在 chroot 下手动挂载 /proc 和 /sys。
如果从 chroot 重新安装引导加载程序,请确保 /etc/mtab(在 chroot 系统中)不包含使加载程序安装程序混淆的垃圾。如果是 grub 1.x ,您可能必须删除(新) /boot/device.map 文件。
如果您想安全地使用 /dev,您可以使用“MAKEDEV generic”填充它(在新的文件系统中) - 这将在 udev 挂载点“下方”创建一组设备文件,以防止您的系统在 udev 无法正常运行时在启动时严重崩溃。