如何将分区和文件系统迁移到另一个设备

如何将分区和文件系统迁移到另一个设备

我有一个带有分区的现有系统,但想将它们移动到新设备。新设备可能更小,并且与现有设备的连接方式不同。如何移动分区和文件系统并保留引导系统?

答案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

相关内容