我正在尝试将整个 Ubuntu 20.04 LTS 操作系统从较大的 (500 GB) HDD 克隆到较小的 (120 GB) SSD。我知道 120 GB 和 500 GB 之间有很大差异,但我只使用了约 50 GB。
我已成功缩小分区以便能够克隆它们。我有 4 个分区:
- 30 GB 系统分区 (/)(已使用 8 GB)
- 70 GB 数据分区 (/home)(已使用 12 GB)
- 8 GB 交换分区
- 300 MB EFI 分区
(这是一个 GPT 磁盘)
总计:~110 GB。这意味着它们的最大大小无法达到我的 SSD 的 120 GB 限制。我在调整分区大小后测试了我的系统,它运行正常。
但是,我无法将 HDD 的内容克隆到较小的 SSD 上。我尝试使用带-icds
参数的 Clonezilla(从 DVD 启动)。它不起作用。所以我决定尝试禁用/启用“按比例调整分区表大小”选项。它再次失败。
之后,我尝试了dd
。根据本网站,dd
可以用作克隆工具,适合将较大的磁盘克隆到较小的磁盘。所以我按照说明进行操作。
使用 fdisk 探索我的磁盘:
Disk model: ST500LT012-1DG14
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 8C2B2A2F-1B20-47AA-81E5-B3C18447B27D
Device Start End Sectors Size Type
/dev/sdc1 2048 58652671 58650624 28G Linux filesystem
/dev/sdc2 99999744 116000767 16001024 7,6G Linux swap
/dev/sdc3 116000768 116586495 585728 286M EFI System
/dev/sdc4 116586496 252962815 136376320 65G Linux filesystem
(这是我的源盘)
我的目标磁盘是 /dev/sdb。计算一些值后,我“创建”了适合我的磁盘的命令:
sudo dd if=/dev/sdc bs=31620352 count=4096 conv=sync,noerror | pv -s 110G | sudo dd of=/dev/sdb
这个过程大约需要 50-60 分钟。完成后,我非常惊讶,因为我的 SSD 已经满了(就像dd
过程之前一样)。所以我不得不意识到这种方式是错误的(再次)。
我如何才能正确地将我的整个操作系统(和每个分区)从 HDD 克隆到 SSD?
预先感谢您的帮助 :)
答案1
dd
虽然不需要这些参数,但该方法应该可以工作。既然你有pv
它,也可以简化为:
# pv /dev/sdc > /dev/sdb
不需要dd
,但dd
应该可以工作。由于 IO 重定向,这需要以 root 身份完成。如果您想使用,sudo
则需要在 shell 中执行:
$ sudo sh -c 'pv /dev/sdc > /dev/sdb'
或者确实使用 dd:
$ sudo pv /dev/sdc | sudo dd of=/dev/sdb
如果您这样做了但认为没有效果,请向我们展示sdb
之后的分区表。
$ sudo fdisk -l /dev/sdb
请务必备份!一旦出错,所有数据都会丢失……
答案2
如果总分区大小和位置适合较小的磁盘,则可以使用 Clonezilla。诀窍是从 clonezilla 启动后退出到 shell,并使用 sgdisk 创建分区表。最好的方法是从源 HDD(本例中为 sda)获取它
sgdisk --backup=table /dev/sda # To save from source HDD
sgdisk --load-backup=table /dev/sdb # To load into target SDD
sgdisk -R /dev/sdb /dev/sda # If on same system
sgdisk -G /dev/sdb # Cange UUID
运行 clonezilla。使用专家模式。确保选择了 -icds,然后选择 -k(不要在目标机器的引导扇区上创建分区表)
希望这能起到作用
答案3
忘记 dd 吧,它正在复制整个文件,使用 rsync 并将目录挂载到已连接的新 ssd 上。首先,让我们确保您以正确的顺序设置了新驱动器的分区,1 应该是 efi 系统分区。gdisk 执行此操作的一个示例。
root@zeus-H370M-DS3H:~# dd if=/dev/zero of=/dev/sdb bs=512 count=34
34+0 records in
34+0 records out
17408 bytes (17 kB, 17 KiB) copied, 0.00286715 s, 6.1 MB/s
root@zeus-H370M-DS3H:~# dd if=/dev/zero of=/dev/sdb bs=512 count=34 seek=$((`blockdev --getsz /dev/sde` - 34))
34+0 records in
34+0 records out
17408 bytes (17 kB, 17 KiB) copied, 0.00584954 s, 3.0 MB/s
root@zeus-H370M-DS3H:~# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.5
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries in memory.
Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-234441614, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-234441614, default = 234441614) or {+-}size{KMGTP}: +256M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI system partition'
Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-234441614, default = 526336) or {+-}size{KMGTP}:
Last sector (526336-234441614, default = 234441614) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sde.
The operation has completed successfully.
您只需继续为所需的 3 和 4 个分区设置适当的大小,第二个大小使用 30G,第三个大小使用 70G,剩下的用于交换,选择 8200 类型。当然要格式化。第一个扇区并不重要,它将默认为正确的扇区,只需使用第二个扇区的大小,它就会为您正确完成。
root@zeus-H370M-DS3H:~# mkfs.vfat /dev/sdb1
mkfs.fat 4.1 (2017-01-24)
root@zeus-H370M-DS3H:~# mkfs.ext4 /dev/sdb2
mke2fs 1.45.6 (20-Mar-2020)
root@zeus-H370M-DS3H:~# mkfs.ext4 /dev/sdb3
mke2fs 1.45.6 (20-Mar-2020)
root@zeus-H370M-DS3H:~# mkswap /dev/sdb4
现在进入要挂载的一些目录
root@zeus-H370M-DS3H:~# mkdir /tmp/ssdboot
root@zeus-H370M-DS3H:~# mkdir /tmp/oldssdboot
root@zeus-H370M-DS3H:~# mkdir /tmp/ssdroot
root@zeus-H370M-DS3H:~# mkdir /tmp/ssdhome
安装它们。
root@zeus-H370M-DS3H:~# mount /dev/sdb1 /tmp/ssdboot
root@zeus-H370M-DS3H:~# mount /dev/sda3 /tmp/oldssdboot
root@zeus-H370M-DS3H:~# mount /dev/sdb2 /tmp/ssdroot
root@zeus-H370M-DS3H:~# mount /dev/sdb3 /tmp/ssdhome
现在开始复制。
root@zeus-H370M-DS3H:~# cp -av /tmp/oldssdboot/* /tmp/ssdboot/
root@zeus-H370M-DS3H:~# rsync -ahPHAXx --delete --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found} / /tmp/ssdroot/
root@zeus-H370M-DS3H:~# rsync -avP /home/* /tmp/ssdhome/
Nano 至少用于编辑 fstab,以便使用正确的分区 ID 创建条目。下面是我的 Pi 中的驱动器和文件作为示例。
root@buster-raspi:~# blkid
/dev/sda1: SEC_TYPE="msdos" UUID="3651-174E" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="9fad4e77-177d-4a3c-929a-3897e6bc1810"
/dev/sda2: UUID="4a349c2c-0df5-4fdb-a99f-906423554de9" TYPE="ext4" PARTUUID="59097f66-f9fb-4a50-a491-8a71becaa2bd"
root@buster-raspi:~# cat /etc/fstab
# The root file system has fs_passno=1 as per fstab(5) for automatic fsck.
#LABEL=RASPIROOT / ext4 rw 0 1
PARTUUID=59097f66-f9fb-4a50-a491-8a71becaa2bd / ext4 rw 0 1
# All other file systems have fs_passno=2 as per fstab(5) for automatic fsck.
#LABEL=RASPIFIRM /boot/firmware vfat rw 0 2
PARTUUID=9fad4e77-177d-4a3c-929a-3897e6bc1810 /boot/firmware vfat rw 0 2
# the /proc filesystem
proc /proc proc defaults 0 0
root@zeus-H370M-DS3H:~# nano /tmp/ssdroot/etc/fstab
我认为我没有遗漏任何带有 UUID 的内容,您看到的大部分帖子都是从我的 Kubuntu 机器上安装的,因此我无法安装 efi 分区来检查 Pi 是否通过它在驱动器上的第一个 fat 分区中找到的固件中硬连线的命名文件进行启动。如果需要重新安装 grub,也许此页面会有所帮助。
编辑:现在我发现,您可以让 PARTUUID 与旧驱动器相同,这样它就可以启动了。此外,如果需要恢复额外空间,他也解释了这一点,并使用分区表手动获取所有空间。
https://jamesachambers.com/raspberry-pi-4-usb-boot-config-guide-for-ssd-flash-drives/
最好使用已启动的 USB Linux 棒或 DVD 将两个驱动器都离线来完成所有这些操作。
编辑 2:我有时间,所以在 /boot 分区上再查看了一下,文件 EFI/ubuntu/grub.cfg 有一个 UUID,需要将其更改为 /。以及新驱动器 / 分区上的 /etc/fstab。下面的这个链接非常适合我将 grub 安装到我系统的 EFI 分区,几个小时前它还是以 MBR 启动,现在以 EFI 启动。您可能想尝试从 EFI 模式下的安装程序启动。
root@zeus-H370M-DS3H:/home/zeus# ll /sys/firmware/efi/
config_table esrt/ fw_vendor runtime-map/ vars/
efivars/ fw_platform_size runtime systab
root@zeus-H370M-DS3H:/home/zeus# mount |grep sda
/dev/sda3 on / type ext4 (rw,relatime,errors=remount-ro)
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
https://www.debugpoint.com/2016/11/fix-ubuntu-boot-grub2-corrupted/