V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jqtmviyu
V2EX  ›  程序员

请教关于使用 tar 还原系统的问题(主要是关于 grub 引导)

  •  
  •   jqtmviyu · 2023-03-15 06:18:30 +08:00 · 1062 次点击
    这是一个创建于 620 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    使用 tar 命令还原系统搞不定 grub 引导,启动报错

    尝试解决

    正在看 arch wiki 和各种教程, 看得头大, 搞了一个晚上都没搞定

    有概念但不清楚:

    1.分区 uid 发生变化,需要修改 grub 相关信息 2.需要重建 grub 引导 3.需要重新挂载分区, 分区 uid 也发生变化

    过程

    1. 用 tar 备份/
    2. 格盘重装其他系统
    3. 不满意删掉想还原
    4. liveCD 下重新分区, 分区格式和原来一样,但调整了大小
    5. 挂载分区, 用 tar 还原,创建排除备份的文件夹
    6. 搞不定启动

    系统为 arch(endeavouros)

    分区情况为:

    /dev/sda1 ==> /boot/efi     fat32/esp
    /dev/sda2 ==> /  			xfs
    /dev/sda3 ==> /home  		xfs
    
    • 备份命令
    tar cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=backup.tgz --exclude=/mnt --exclude=/sys --exclude=/media --exclude=/run /
    
    • 还原过程
    # 挂分区并还原
    mount /dev/sda2 /mnt
    mkdir /mnt/home
    mount /dev/sda3 /mnt/home
    mkdir /mnt/boot/efi
    mount /dev/sta1 /mnt/boot/efi
    tar xvpzf /path/to/backup.tar.gz -C /mnt --numeric-owner
    # 修复引导
    sudo arch-chroot /mnt
    grub-install —target=x86_64-efi —efi-directory=/boot/efi
    grub-mkconfig -o /boot/grub/grub.cfg
    
    # 修复挂载分区 uuid
    blkid
    # 更新三个分区的 uuid
    vim /etc/fstab
    
    # 新建排除备份的文件夹
    mkdir proc
    mkdir mnt
    mkdir sys
    mkdir run
    
    exit
    sudo umount /mnt/home
    sudo unmout /mnt/boot/efi
    sudo unmout /mnt
    reboot
    

    启动报错

    /boot/grub/x86_64-efi/normal.mod not found
    grub rescue 
    

    临时进入系统

    set
    cmdpath=(hd3,gpt3)/EFI/BOOT
    prefix=(hd0,gpt3)/boot/grub
    root=hd0,gpt3
    
    ls
    ls (hd0,gpt2)/boot/grub
    set root=hd0,gpt2
    set prefix=(hd0,gpt2)/boot/grub
    insmod normal
    normal
    

    进入系统后

    sudo pacman -S grub
    sudo mv /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
    sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=EndeavourOS
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    # 检查 cfg,发现是 gpt2 了
    

    但为什么重启还是同样错误, root 还是 gpt3????

    第 1 条附言  ·  2023-03-15 20:17:43 +08:00

    过了一天, 左思右想, 又对比了下 OC 引导的文件, 终于发现问题了. 关键是还是出在 grub-install 这里:

    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=EndeavourOS
    

    它会在 /boot/efi 也就是 /dev/sda1 里创建一个 /EFI/EndeavourOS/grubx64.efi, 而不是去更新 /EFI/BOOT/bootx64.efi

    我的解决方法是

    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=BOOT
    

    然后进 pe, 把 grubx64.efi 改成 bootx64.efi, 再用 DG 分区工具重新添加 efi 启动项, 启动分区指向 /dev/sda2

    我怀疑是主板 bios 只能识别 /EFI/BOOT/bootx64.efi 又搜了下, 发现带上 --removable 就会忽略 bootloader-id 而是在默认目录生成

    即:

    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=EndeavourOS --removable
    

    我尝试过删掉/EFI/BOOT/目录, 并不能启动

    有没有大佬科普下是不是我理解错了.

    5 条回复    2023-03-15 20:13:36 +08:00
    webcape233
        1
    webcape233  
       2023-03-15 06:38:39 +08:00 via iPhone
    做个 livecd ,里面挂上各种分区,然后创建 grub ,就像安装时那样,岂不简单
    jqtmviyu
        2
    jqtmviyu  
    OP
       2023-03-15 06:48:54 +08:00
    @webcape233 试过了, 就是在 livecd 里挂分区, 用 arch-chroot 进去重新整, 没搞好
    webcape233
        3
    webcape233  
       2023-03-15 07:24:06 +08:00 via iPhone
    arch-chroot 后 pacstrap /mnt base linux linux-firmware 这个尝试覆盖安装下呢,
    另外 fstab 步骤没看到,arch-chroot 前 genfstab -U /mnt > /mnt/etc/fstab 。 如果使用了 lvm 分区需要激活 lvm2 hooks 。
    kokutou
        4
    kokutou  
       2023-03-15 08:32:20 +08:00 via Android
    fstab
    grub
    firmware
    jqtmviyu
        5
    jqtmviyu  
    OP
       2023-03-15 20:13:36 +08:00
    @webcape233
    过了一天, 左思右想, 又对比了下 OC 引导的文件, 终于发现问题了.
    关键是还是出在 grub-install 这里:

    ```
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=EndeavourOS
    ```

    它会在 `/boot/efi` 也就是 /dev/sda1 里创建一个 /EFI/EndeavourOS/grubx64.efi, 而不是去更新 /EFI/BOOT/bootx64.efi

    我的解决方法是

    ```
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=BOOT
    ```

    然后进 pe, 把 grubx64.efi 改成 bootx64.efi, 再用 DG 分区工具重新添加 efi 启动项, 启动分区指向 /dev/sda2

    我怀疑是主板 bios 只能识别 /EFI/BOOT/bootx64.efi 又搜了下, 发现带上 --removable 就会忽略 bootloader-id 而是在默认目录生成

    即:
    ```
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=EndeavourOS --removable
    ```

    有没有大佬科普下是不是我理解错了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.