Clone Gentoo Liinux

警告

实践尚未成功,待更新

我的 MacBook Air 11” Late 2010 已经有十二年历史了,目前有一个比较异常的地方: 启动时键盘失效,准确地说,是无法使用 option 键来选择启动顺序,无法从U盘启动安装操作系统,也无法激活 macOS 恢复安装 。而且启动时候非常缓慢,启动时有时进入安全模式。我感觉是SSD磁盘坏掉了,所以采用 SATA硬盘(m.2转接)升级MacBook Air 2010 来尝试替换。

为了能够在新的SATA磁盘上先安装好Linux,我采用在 在MacBook Pro上安装Gentoo Linux ( MacBook Air 13” Mid 2013 上完成 ),然后外接U盘方式进行本文的Clone步骤。目标是完整安装好系统之后,将硬盘再安装到 MacBook Air 11” Late 2010

磁盘准备

将安装了 SATA (NGFF) SSD的U盘插入已经完成 在MacBook Pro上安装Gentoo LinuxMacBook Air 13” Mid 2013 ,检查 fdisk -l 输出可以看到这块空白的磁盘:

fdisk -l 看到的空白磁盘
Disk /dev/sdc: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: RTL9210B-CG
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
使用 parted分区工具 对sdc磁盘分区
# 初始化磁盘分区表
parted /dev/sdc mklabel gpt

# 创建第一个sdc1分区,用于EFI启动
parted -a optimal /dev/sdc mkpart ESP fat32 0% 256MB
parted /dev/sdc set 1 esp on

# 系统分区sdc2,分配21GB, XFS
parted -a optimal /dev/sdc mkpart primary xfs 256MB 21GB
parted /dev/sdc name 2 rootfs

# 完成后检查
parted /dev/sdc print

# 分区格式化
mkfs.vfat -F 32 /dev/sdc1
mkfs.xfs -f /dev/sdc2

警告

这里我遇到一个问题, 奥睿科(ORICO)M.2 NVMe/SATA双协议移动硬盘盒 中安装的SATA磁盘分区总是显示不能对齐,暂时没有找到原因。我怀疑是转接卡的芯片有特定配置导致的,等后续将SATA安装到主机后再验证

磁盘挂载

  • 挂载文件系统

挂载文件系统
mkdir /mnt/gentoo
mount /dev/sdc2 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sdc1 /mnt/gentoo/boot

数据同步

由于本机已经完成Gentoo Linux安装,所以通过同步方式复制:

通过 tar 复制系统
cd /
tar -cpzf gentoo.tar.gz --exclude=/gentoo.tar.gz --one-file-system /

tar -xpzf /gentoo.tar.gz -C /mnt/gentoo --numeric-owner
(cd /boot && tar cf - .)|(cd /mnt/gentoo/boot && tar xf -)

这里使用了 --one-file-system 参数,是为了不包含其他文件系统中的文件,否则会把复制目标的 /mnt 目录也复制进去,就会死循环。参考 通过tar备份和恢复Linux系统

修订配置

需要注意,每次格式化的磁盘UUID和PARTUUID是不同的,所以目标磁盘需要修订

  • 执行 blkid 命令获取 /dev/sdc 的磁盘 UUID 和 PARTUUID:

blkid 获取 /dev/sdc 磁盘 UUID 和 PARTUUID
/dev/sdc2: UUID="6646bae2-8110-4401-bfca-3ab6bc61625b" BLOCK_SIZE="512" TYPE="xfs" PARTLABEL="rootfs" PARTUUID="58c8ad0f-0c2c-c640-ab45-3beb25828b7f"
/dev/sdc1: UUID="6DD1-FB72" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="cc71154b-84e1-cc45-b63b-42ed12ec6ffb"
  • 修订 /dev/sdc 磁盘上的 /etc/fstab 文件,此时根据磁盘挂载,应该修改 /mnt/gentoo/etc/fstab

修订磁盘上的 /etc/fstab
/dev/disk/by-uuid/6646bae2-8110-4401-bfca-3ab6bc61625b    /    xfs    defaults,noatime    0 1
/dev/disk/by-uuid/6DD1-FB72    /boot    vfat    defaults,noatime    0 2

启动管理器

现在问题来了,怎么能够把要修复的 MacBook Air 11” Late 2010 启动盘指向我新clone的Gentoo Linux呢?

毕竟没法直接在 MacBook Air 11” Late 2010 运行类似 在MacBook Pro上安装Gentoo Linuxefibootmgr

我想到Gentoo Linux 的LiveCD是可以启动的(虽然启动时要按下 option 键才能选择GRUB启动管理器),那么我在这个磁盘上安装和配置 grub 能否让MacBook启动时找到一个启动盘呢?

chroot到 /dev/sdc 上的gentoo

  • 挂载文件系统:

挂载文件系统
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --bind /run /mnt/gentoo/run
mount --make-slave /mnt/gentoo/run
  • 进入Gentoo新环境:

进入clone的Gentoo
chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot) ${PS1}"

安装Grub

  • 先安装Grub软件,然后执行 grub-install : 注意,对于EFI系统,需要确保 EFI 系统分区已经挂载好

安装grub启动管理器并部署grub (EFI系统)
emerge --ask --update --newuse --verbose sys-boot/grub

# 确保ESP分区已经挂载才能执行以下安装命令(我将 /dev/sdc1 挂载为 /boot 目录,并创建了 /boot/efi 子目录)
grub-install --target=x86_64-efi --efi-directory=/boot/efi

执行 grub-install --target=x86_64-efi --efi-directory=/boot/efi 命令之后,输出信息:

部署grub (EFI系统)输出信息
Installing for x86_64-efi platform.
Installation finished. No error reported.

此时检查 /boot/efi/ 目录下会增加一个 EFI 子目录,并且包含 gentoo/ 子目录,最终包含一个 grubx64.efi 文件:

最终安装完成 grubx64.efi
# ls -lh /boot/efi/EFI/gentoo/
total 132K
-rwxr-xr-x 1 root root 132K Dec 18 22:27 grubx64.efi

这里我看来没有真正理解,上述 grub-install 会使得本机EFI配置变化,这反而使得 在MacBook Pro上安装Gentoo Linux 这台中间笔记本的启动破坏(我理解 grub-install 的EFI命令实际上是修改了efibootmgr的)。那么是不是需要使用传统的 grub-install /dev/sdc 呢,也就是将grub安装到磁盘的启动分区表

警告

我的实践还是失败,我准备过一段时间再来重试