如何将 Linux 移动到另一个分区?

如何将 Linux 移动到另一个分区?

我需要复制一个可以运行的 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。我建议采用以下步骤:

  1. mkdir /tmp/dev
  2. mount --move /dev /tmp/dev
  3. 使用上述命令之一复制/dev/mnt/sdb5
  4. mount --move /tmp/dev /dev
  5. 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技术,要么全有,要么全无:要么新磁盘启动并且一切都相同,要么磁盘无法启动。不存在以后出现潜在问题的风险。

现在,当然存在分区无法填满新磁盘的问题,但我宁愿创建一个新分区来填充额外空间,并依靠符号链接来移动目录。(我确信也有用于调整分区大小的工具,但我没有使用它们。)

答案4

更优化的变体dd是使用partimage,它将仅复制分区中使用过的部分,从而使复制大量未使用的分区更加方便。

请注意重要警告:

Partimage 不支持 Ext4,这是新 Ubuntu 安装的默认设置。

随附一份方便的副本系统救援光盘分配。

相关内容