我有一个带有分区的现有系统,但想将它们移动到新设备。新设备可能更小,并且与现有设备的连接方式不同。如何移动分区和文件系统并保留引导系统?
答案1
使用一组标准工具可以将驱动器与 Linux 操作系统一起复制。对于发行版有一些注意事项,但大多数情况下这适用于任何发行版。在我们的示例中,我们将从 HDD 迁移到同样小于 HDD 的 SSD。
收集有关分区和文件系统的信息。
分区/块设备布局:
lsblk -o NAME,VENDOR,SERIAL,FSTYPE,MODEL,SIZE,TYPE,MOUNTPOINT
确定您将要处理的分区和接收磁盘。
ls /dev/disk/by-id/
根据 lsblk 中的信息,写下一组指向现有分区和接收磁盘的 /dev/disk 路径。请注意 lsblk 中的 VENDOR 实际上是总线名称。
/dev/disk/by-id/[busname]-[model]_[serial]-partX
例如:
/dev/disk/by-id/usb-hdd1000_1234-part1
/dev/disk/by-id/usb-hdd1000_1234-part2
/dev/disk/by-id/usb-hdd1000_1234-part3
/dev/disk/by-id/usb-hdd1000_1234-part4
/dev/disk/by-id/usb-hdd1000_1234-part5
以及源盘和接收盘:
/dev/disk/by-id/usb-hdd1000_1234
/dev/disk/by-id/ata-ssd1000_1234
使用 ls -la 确认这些是您期望的设备:
ls -la /dev/disk/by-id/usb-hdd1000_1234
/dev/disk/by-id/usb-hdd1000_1234 -> ../../sda
ls -la /dev/disk/by-id/ata-ssd1000_1234
/dev/disk/by-id/ata-ssd1000_1234 -> ../../sdb
决定理想的分区布局
例如
Device size: 256GiB
1 EFI 256MiB
2 Linux 20GiB
3 Windows 80GiB
4 Data 139.75GiB
5 Swap 16GiB
请参阅其他问题,了解您的特定系统需要或应该拥有什么类型的分区。但是,请确保所有分区都与 4K 扇区对齐,尤其是在迁移到 SSD 时。为此,请调整每个分区的大小,使其可以被 4KiB 整除。
创建新分区
我们可以使用fdisk或parted等。我们现在只介绍这些并且只介绍 GPT。使用示例分区布局:
fdisk /dev/disk/by-id/ata-ssd1000_1234
g 对于新的 GPT 分区表
n 对于新分区
ENTER 用于默认分区号。
ENTER 用于默认起始扇区。
+256M 对于起始扇区 (+) 之前的 256MiB (M)。
t 1
1
对于 EFI 系统 fs 类型。
类型代码包括:
1 EFI System - Needed on EFI systems for booting
4 BIOS Boot - Used for executable data on BIOS mode GPT disks
11 Microsoft Basic Data - Used for most Windows data partitions including NTFS
20 Linux file system - Used for all Linux based file systems except swap. Other types exist for special volume types like RAID (29) and LVM (31).
19 Linux swap - for swap partitions
对其他分区重复此操作。
或与分开:
parted
> select /dev/disk/by-id/ata-ssd1000_1234
> mktable gpt
> mkpart ESP fat32 1MiB 513MiB
> set 1 boot on
> mkpart primary ext4 513MiB 20737MiB
> mkpart primary ntfs 20737MiB 102657MiB
> mkpart primary ext4 102657MiB 245761MiB
> mkpart primary linux-swap 245761MiB 262145MiB
确定是否有任何文件系统需要调整大小
如果接收磁盘较小或需要一些较小的分区,则需要缩小现有文件系统。
文件系统利用率:
dh -h
确定文件系统有足够的可用空间来执行此操作。如果文件系统是 NTFS,请考虑使用 Windows 上的磁盘管理。
例如,我们将调整 Linux 分区的大小/dev/disk/by-id/usb-hdd1000_1234-part2
e2fsck -f /dev/disk/by-id/usb-hdd1000_1234-part2
resize2fs /dev/disk/by-id/usb-hdd1000_1234-part2 20G
如果您不确定确切的大小,只需将大小调整为明显小于预期的新分区大小。稍后可以将文件系统扩展到确切的大小。
resize2fs /dev/disk/by-id/usb-hdd1000_1234-part2 19G
或者 大约 500MiB 19 GiB = 19456MiB + 500MiB = 19956 MiB
resize2fs /dev/disk/by-id/usb-hdd1000_1234-part2 19956M
将文件系统克隆到新分区
仅通过复制分配的空间来克隆文件系统:
您可能希望在单用户模式或 Live CD 下执行此操作。
partclone.fat32 -b -s /dev/disk/by-id/usb-hdd1000_1234-part1 -o /dev/disk/by-id/ata-ssd1000_1234-part1
partclone.ext4 -b -s /dev/disk/by-id/usb-hdd1000_1234-part2 -o /dev/disk/by-id/ata-ssd1000_1234-part2
partclone.ntfs -b -s /dev/disk/by-id/usb-hdd1000_1234-part3 -o /dev/disk/by-id/ata-ssd1000_1234-part3
partclone.ext4 -b -s /dev/disk/by-id/usb-hdd1000_1234-part4 -o /dev/disk/by-id/ata-ssd1000_1234-part4
重新进行交换
mkswap /dev/disk/by-id/usb-hdd1000_1234-part5
因为我们缩小了 /dev/disk/by-id/usb-hdd1000_1234-part2 上文件系统的大小,现在将其复制到 /dev/disk/by-id/ata-ssd1000_1234-part2 ,所以可能需要扩大它。如果尺寸被精确复制,则没有必要。
resize2fs /dev/disk/by-id/ata-ssd1000_1234-part2
使系统可使用新磁盘启动
现在文件系统和分区已移至 UEFI,引导加载程序和 Linux 需要了解新分区。另一种方法是重用 UUID 或分区排序,但这种方法可能需要调整和修复,因此让我们根据需要进行更新。
Linux:
根据您的发行版,交换分区将被自动检测和使用,或者可能需要将它们包含在 fstab 中。
更新启动所需分区的 fstab。这将包括分区
/
/boot
/boot/efi
/home
在我们的示例中,我们只有 / 和 /boot/efi 需要更新。
在 fstab 中使用 lsblk 输出的 UUID。
编辑/etc/fstab
首创EFI系统
lsblk -no UUID /dev/disk/by-id/ata-ssd1000_1234-part1
使用输出更改 fstab 中带有 /boot/efi 的行,其中 UUID= 应更改为 lsblk 的 UUID 输出
对 Linux 文件系统执行相同的操作。 lsblk -无 UUID /dev/disk/by-id/ata-ssd1000_1234-part2
UEFI:
或者,您可能只想从格式化的 EFI 系统分区开始,这也需要 Windows 修复其引导加载程序。否则跳过此步骤。
mkfs.vfat -F32 /dev/disk/by-id/ata-ssd1000_1234-part1
您可以使用 efibootmgr 手动将条目添加到 UEFI,但我们将使用 GRUB 中内置的功能。
GRUB:
我们现在只介绍 GRUB 引导加载程序。
mount /dev/disk/by-id/ata-ssd1000_1234-part2 /mnt
mount /dev/disk/by-id/ata-ssd1000_1234-part1 /mnt/boot/efi
grub-install --target=x86_64-efi --boot-directory=/mnt/boot --efi-directory==/mnt/boot/efi --bootloader-id="NewLinux"
grub-mkconfig -o /mnt/boot/grub/grub.cfg
将 bootloader-id 参数设置为您想要在 UEFI 中显示的条目。您希望这与您当前的设置不同。
请注意,grub-mkconfig 使用您正在运行的系统脚本来生成条目。如果您使用现有磁盘,这将包括其自身的条目,然后 os-prober 将包括另一个磁盘。您必须选择此项,因为启动时它不会是默认值。如果您使用的是 live cd,那么 os-prober 将会检测到这两个安装。进入新系统后,重新运行 grub-mkconfig 以获得新系统生成的条目。
最后卸载文件系统并重新启动
umount /mnt/*
reboot
确保从 osprober 条目中选择 grub 中的新磁盘,然后在启动到新磁盘后重新生成。
grub-mkconfig -o /boot/grub/grub.cfg