注意:请务必做好数据备份,本文的前提是对Proxmox中的VM操作, 利用了PVE的备份和还原能力.
创建一个一样大小的硬盘并挂载到VM.
选择一个live系统,这里我们选择 Ubuntu Desktop 24.04.1 LTS
将live盘设置为启动盘,启动系统,选择 Try Ubuntu 进入 live 环境
由于我原来的LVM系统盘有三个分区 1M, 1G的/boot, 199G的lvm数据分区,所以需要先拷贝系统,再把boot部分的补上, 具体操作如下:
1 | ... |
切换至root用户 sudo su
由于是live系统不需要输入密码
创建几个mount点:
1 | mkdir /mnt/src |
初始化新磁盘(这里 /dev/sda是原来的磁盘, /dev/sdb 是新的磁盘)
1 | gdisk /dev/sdb |
如果原来的磁盘不是GPT格式可以尝试如下命令:
1 | fdisk /dev/sdb |
在新的磁盘上创建文件系统
1 | mkfs -t ext4 /dev/sdb2 |
挂载磁盘
1 | mount -o ro /dev/sda2 /mnt/srcboot |
安装pv工具以便查看复制进度
1 | apt update && apt install pv |
开始拷贝数据
1 | tar -C /mnt/src --preserve-permissions --xattrs --xattrs-include=*.* --numeric-owner -c . | pv | tar -xf - -C /mnt/dst --preserve-permissions --xattrs --xattrs-include=*.* --numeric-owner |
其中 --perserve-permission
是为了保留权限, 对于 root 用户来说是默认的, 但是为了保险起见还是加上
--xattrs
, --xattrs-include=*.*
启用额外属性支持, 并拷贝全部属性. 这样类似/usr/bin/ping
等文件的 capability 也会被保存下来.
--numeric-owner
要求 tar 使用数字UID/GID 而不是用户名
给新磁盘文件系统下挂载分区
1 | cd /mnt/dst |
修改 /etc/fstab,保证里面 /dev/disk/by-uuid/
对应的磁盘和新磁盘一致. 通过 lsblk -o NAME,uuid
来查看磁盘的uuid
1 | nano /mnt/dstetc/fstab |
切换rootfs,安装grub. 再运行 update-grub
更新 grub 配置
1 | cd /mnt/dst |
退出 chroot, 关闭系统 shutdown now
弹出 live CD 和原来的磁盘 (在PVE中对应remove和detach)
重新启动新的系统,可能会遇到几个问题:
grub 菜单展示了 Ubuntu
但是回车进去报错 you need to load kernel first
这种情况应该是因为当前grub标签 (hd0,gpt2)
跟现实不匹配导致的. (也可能是前面忘记执行了update-grub)
在选择页面按下 c
进入 grub shell
1 | ls -l 确认当前磁盘列表和磁盘的UUID |
此时应该就会进入系统了
- 如果前面忘了改
/etc/fstab
此时进入新系统后会卡在两个任务上:
1 | Reached target .... |
这个没什么好办法,会卡两次,等三分钟就好了。进入系统后记得把 /etc/fstab
改了,运行 sudo grub-install && sudo update-grub
然后再重启应该就没问题了.
参考
Live-cloning a running Linux installation to a new machine
grub error: you need to load kernel first
How do I list my devices in GRUB?