![如何将 Linux 移动到另一个分区?](https://linux22.com/image/560009/%E5%A6%82%E4%BD%95%E5%B0%86%20Linux%20%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%88%86%E5%8C%BA%EF%BC%9F.png)
我需要复制一个可以运行的 Linux 系统,该系统(包含在 / 中,新位置准备在 /mnt/sdb5 中)似乎在 /dev 中包含大量硬链接、软链接和特殊文件;cpio
无需施加额外的魔法就能处理这项工作吗?
目前已知的保障措施:
- 在副本被视为可启动并正常工作之前,不会删除/修改正在运行的系统
root=/dev/sdb5
;删除之前,请进行完整的分区备份。 - 将使用 cpio 分别存档每个根目录,因此将从 LiveCD 环境中解压它,这样捐赠分区就不会受到损害
但是,不会因为 cpio 错过了一些标志并破坏了权限/节点类型/软或硬链接而浪费时间。
要使用哪种工具/要避开哪些水下岩石?
答案1
回答有关的实际问题cpio
:这些是我将使用的标志cpio
:
find / -xdev -depth \! -path ./lost+found -print0 | cpio --pass-through --null --dot --make-directories --unconditional --preserve-modification-time --sparse /mnt/sdb5
当然,由于您不是通过网络复制,我只会使用cp
:
cp --archive --sparse=always --verbose --one-file-system --target-directory=/mnt/sdb5 /
如果你想复制多次,rsync
是更好的选择,因为它具有恢复功能。(它还像 一样cp
处理 ACL 和扩展属性,并且可以像 一样选择性地通过网络工作cpio
。因此,除了在本地进行第一次复制(我更喜欢使用 )之外,它是最有用的选项cp
。)
rsync --archive --inplace --hard-links --acls --xattrs --devices --specials --one-file-system --8-bit-output --human-readable --progress / /mnt/sdb5
不要忘记复制/boot
和/dev
!
/boot
很简单,只需复制它即可。但/dev
现在它变得更加棘手,因为它被隐藏了udev
。我建议采用以下步骤:
mkdir /tmp/dev
mount --move /dev /tmp/dev
- 使用上述命令之一复制
/dev
到/mnt/sdb5
mount --move /tmp/dev /dev
rmdir /tmp/dev
答案2
正如@Klox 提到的,当复制相同大小的分区时,我同意使用dd
。
但是当你想将磁盘复制到不同大小的不同分区时,我宁愿使用rsync
。挂载新分区(比如说 /mnt/new)并:
# rsync -a --exclude=/proc --exclude=/dev --exclude=/sys / /mnt/new
不需要符号链接的额外魔法,也不需要 live cd(单用户/init 1 就可以了)。
答案3
在硬盘之间移动 Linux 安装时,我总是从 Live CD 启动并使用dd
复制整个分区。我认识到这不会处理磁盘大小的变化(新磁盘不可避免地会更大,这简化了事情),但我喜欢这种技术,原因正是您担心使用 的原因cpio
:可能会出错。使用该dd
技术,要么全有,要么全无:要么新磁盘启动并且一切都相同,要么磁盘无法启动。不存在以后出现潜在问题的风险。
现在,当然存在分区无法填满新磁盘的问题,但我宁愿创建一个新分区来填充额外空间,并依靠符号链接来移动目录。(我确信也有用于调整分区大小的工具,但我没有使用它们。)