Grub2/Debian10 在启动时更改根分区

Grub2/Debian10 在启动时更改根分区

我有一个无头 NAS 系统,其系统分区上的磁盘空间不足。它运行 Debian 10,通常通过 OpenMediaVault 5 和 EFI 系统上的 grub2 引导加载程序进行管理。除了 HDD 数据 raid 之外,它还有一个 SSD,其中有 / 和 /boot 分区。我安装了一个额外的 SSD,其中有 /、/boot/EFI 和 /var 分区。我已小心地停止了所有服务并通过 rsync 复制了数据。我修改了新分区的 /etc/fstab,以反映具有新 UUID 的新安装方案(从 blkid 的输出中读取)。我没有修改 BIOS 或引导加载程序。我打算仍然使用原始 SSD 的 /boot 分区进行启动。

到目前为止,grub 已经在 /boot/grub/grub.cfg 文件中检测到了新系统。因此,我将 /etc/default/grub 中的默认条目更改为该条目,运行 grub-mkconfig 并重新启动。但它仍然使用旧系统的第一个条目启动。在无头系统上很难分辨,但至少根据 /proc/cmdline,它看起来像是第一个以旧 UUID 作为 root= 值的条目。但我不知道如何判断这是第一次尝试还是失败后的后备。

我还注意到,运行 grub-mkconfig 后 /boot/grub/grub.cfg 并没有改变。虽然我在 /boot/grub/grub.cfg 文件中看到了根分区的 UUID,但在 /etc/grub.d 结构中的任何地方都看不到旧的和新的 UUID。

我显然还没有完全理解 grub2 的工作原理以及应该如何配置它。有人能给我一些关于这个问题的指导吗,或者给我一些可以帮助我的文档吗?

更新:感谢用户 @user1686 的回答,我通过使用 -o 选项将 grub-mkconfig 的输出重定向到文件中,重新创建了我的 grub.cfg。这接管了 GRUB_DEFAULT 设置。出于某种原因,虽然在条目中多次提到正确的 UUID,但在实际linux =启动命令中它仍然显示旧系统的 UUID。我手动更正了这个问题,最终启动到新系统。/更新

一些相关文件:

blkid 的输出(缩短)

/dev/sdb: UUID="c71b542e-8149-827c-e596-32c80ade181d" TYPE="linux_raid_member"
/dev/sda: UUID="c71b542e-8149-827c-e596-32c80ade181d" TYPE="linux_raid_member"
/dev/sdc1: UUID="EAFD-673A" TYPE="vfat" PARTLABEL="boot"
/dev/sdc2: UUID="533dfffd-ebd1-4be6-8e7b-55489f1ffece" TYPE="ext4" PARTLABEL="system" 
/dev/sdd1: LABEL_FATBOOT="BOOT" LABEL="BOOT" UUID="97CC-45A4" TYPE="vfat" PARTLABEL="boot" 
/dev/sdd2: LABEL="system" UUID="bd04242b-b64d-46e7-97ba-116d3c987c67" TYPE="ext4" PARTLABEL="system"
/dev/sdd3: LABEL="var" UUID="7142881b-3165-4b17-bf20-445e22b0cb03" TYPE="ext4" PARTLABEL="var" 
/dev/md0: UUID="4a432c95-b1ad-4ff6-b10b-66a343f2bfad" TYPE="crypto_LUKS"

/etc/default/grub(旧根分区)

GRUB_DEFAULT=4
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_SUBMENU=y

/boot/grub/grub.cfg

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}
function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
set root='hd2,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  533dfffd-ebd1-4be6-8e7b-55489f1ffece
else
  search --no-floppy --fs-uuid --set=root 533dfffd-ebd1-4be6-8e7b-55489f1ffece
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=C
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=5
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=5
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
        set gfxpayload="${1}"
}
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Debian GNU/Linux, with Linux 4.19.0-14-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.19.0-14-amd64-advanced-533dfffd-ebd1-4be6-8e7b-55489f1ffece' {
        load_video
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_gpt
        insmod ext2
        set root='hd2,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  533dfffd-ebd1-4be6-8e7b-55489f1ffece
        else
          search --no-floppy --fs-uuid --set=root 533dfffd-ebd1-4be6-8e7b-55489f1ffece
        fi
        echo    'Loading Linux 4.19.0-14-amd64 ...'
        linux   /boot/vmlinuz-4.19.0-14-amd64 root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-4.19.0-14-amd64
}
menuentry 'Debian GNU/Linux, with Linux 4.19.0-14-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.19.0-14-amd64-recovery-533dfffd-ebd1-4be6-8e7b-55489f1ffece' {
        load_video
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_gpt
        insmod ext2
        set root='hd2,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  533dfffd-ebd1-4be6-8e7b-55489f1ffece
        else
          search --no-floppy --fs-uuid --set=root 533dfffd-ebd1-4be6-8e7b-55489f1ffece
        fi
        echo    'Loading Linux 4.19.0-14-amd64 ...'
        linux   /boot/vmlinuz-4.19.0-14-amd64 root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro single
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-4.19.0-14-amd64
}
menuentry 'Debian GNU/Linux, with Linux 4.19.0-10-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.19.0-10-amd64-advanced-533dfffd-ebd1-4be6-8e7b-55489f1ffece' {
        load_video
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_gpt
        insmod ext2
        set root='hd2,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  533dfffd-ebd1-4be6-8e7b-55489f1ffece
        else
          search --no-floppy --fs-uuid --set=root 533dfffd-ebd1-4be6-8e7b-55489f1ffece
        fi
        echo    'Loading Linux 4.19.0-10-amd64 ...'
        linux   /boot/vmlinuz-4.19.0-10-amd64 root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-4.19.0-10-amd64
}
menuentry 'Debian GNU/Linux, with Linux 4.19.0-10-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.19.0-10-amd64-recovery-533dfffd-ebd1-4be6-8e7b-55489f1ffece' {
        load_video
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_gpt
        insmod ext2
        set root='hd2,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  533dfffd-ebd1-4be6-8e7b-55489f1ffece
        else
          search --no-floppy --fs-uuid --set=root 533dfffd-ebd1-4be6-8e7b-55489f1ffece
        fi
        echo    'Loading Linux 4.19.0-10-amd64 ...'
        linux   /boot/vmlinuz-4.19.0-10-amd64 root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro single
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-4.19.0-10-amd64
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/30_os-prober ###
        menuentry 'Debian GNU/Linux, with Linux 4.19.0-0.bpo.9-amd64 (on /dev/sdd2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.19.0-0.bpo.9-amd64--bd04242b-b64d-46e7-97ba-116d3c987c67' {
                insmod part_gpt
                insmod ext2
                set root='hd3,gpt2'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt2 --hint-efi=hd3,gpt2 --hint-baremetal=ahci3,gpt2  bd04242b-b64d-46e7-97ba-116d3c987c67
                else
                  search --no-floppy --fs-uuid --set=root bd04242b-b64d-46e7-97ba-116d3c987c67
                fi
                linux /boot/vmlinuz-4.19.0-0.bpo.9-amd64 root=bd04242b-b64d-46e7-97ba-116d3c987c67 ro quiet
                initrd /boot/initrd.img-4.19.0-0.bpo.9-amd64
        }
        menuentry 'Debian GNU/Linux, with Linux 4.19.0-0.bpo.9-amd64 (recovery mode) (on /dev/sdd2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.19.0-0.bpo.9-amd64-root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro single-bd04242b-b64d-46e7-97ba-116d3c987c67' {
                insmod part_gpt
                insmod ext2
                set root='hd3,gpt2'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt2 --hint-efi=hd3,gpt2 --hint-baremetal=ahci3,gpt2  bd04242b-b64d-46e7-97ba-116d3c987c67
                else
                  search --no-floppy --fs-uuid --set=root bd04242b-b64d-46e7-97ba-116d3c987c67
                fi
                linux /boot/vmlinuz-4.19.0-0.bpo.9-amd64 root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro single
                initrd /boot/initrd.img-4.19.0-0.bpo.9-amd64
        }
        menuentry 'Debian GNU/Linux, with Linux 4.19.0-0.bpo.8-amd64 (on /dev/sdd2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.19.0-0.bpo.8-amd64--bd04242b-b64d-46e7-97ba-116d3c987c67' {
                insmod part_gpt
                insmod ext2
                set root='hd3,gpt2'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt2 --hint-efi=hd3,gpt2 --hint-baremetal=ahci3,gpt2  bd04242b-b64d-46e7-97ba-116d3c987c67
                else
                  search --no-floppy --fs-uuid --set=root bd04242b-b64d-46e7-97ba-116d3c987c67
                fi
                linux /boot/vmlinuz-4.19.0-0.bpo.8-amd64 root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro quiet
                initrd /boot/initrd.img-4.19.0-0.bpo.8-amd64
        }
        menuentry 'Debian GNU/Linux, with Linux 4.19.0-0.bpo.8-amd64 (recovery mode) (on /dev/sdd2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.19.0-0.bpo.8-amd64-root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro single-bd04242b-b64d-46e7-97ba-116d3c987c67' {
                insmod part_gpt
                insmod ext2
                set root='hd3,gpt2'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt2 --hint-efi=hd3,gpt2 --hint-baremetal=ahci3,gpt2  bd04242b-b64d-46e7-97ba-116d3c987c67
                else
                  search --no-floppy --fs-uuid --set=root bd04242b-b64d-46e7-97ba-116d3c987c67
                fi
                linux /boot/vmlinuz-4.19.0-0.bpo.8-amd64 root=UUID=533dfffd-ebd1-4be6-8e7b-55489f1ffece ro single
                initrd /boot/initrd.img-4.19.0-0.bpo.8-amd64
        }

### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {
        fwsetup
}
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

/etc/fstab(新的根分区)

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / on new SDD on /dev/sdd2
UUID=bd04242b-b64d-46e7-97ba-116d3c987c67 /               ext4    noatime,nodiratime,errors=remount-ro 0       1
# /boot/efi on /dev/sdd1
UUID=97CC-45A4  /boot/efi       vfat    umask=0077      0       1
# /var on /dev/sdd3
UUID=7142881b-3165-4b17-bf20-445e22b0cb03 /var            ext4    defaults   0    2
tmpfs           /tmp            tmpfs   defaults        0       0
# >>> [openmediavault]
/dev/disk/by-label/data /srv/dev-disk-by-label-data ext4 defaults,nofail,user_xattr,noexec,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0,acl 0 2
# <<< [openmediavault]

答案1

grub-mkconfig 主要用于为当前运行的系统生成 GRUB 配置,因此为了确定根 UUID,它只需查看/文件系统。

因此,如果您需要切换根文件系统,则需要通过root=在 GRUB_CMDLINE_LINUX 中手动指定新参数来覆盖此功能。

(我只需手动编辑 grub.cfg 以获取我想要的 UUID,让它启动,一旦它实际启动,就终于可以返回 grub-mkconfig 了。)

我还注意到运行 grub-mkconfig 后 /boot/grub/grub.cfg 没有改变。

这是意料之中的。实际上你必须告诉程序将其输出写入文件,否则它不会这样做。例如,这是 Debianupdate-grub所做的:

grub-mkconfig -o /boot/grub/grub.cfg

虽然我在 /boot/grub/grub.cfg 文件中看到了根分区的 UUID,但是在 /etc/grub.d 结构中的任何地方都看不到旧的和新的 UUID。

/etc/grub.d 目录不包含配置 – 它包含脚本它试图自动地实时确定配置。它们的输出就是进入 grub.cfg 的内容。

例如,/etc/grub.d/10_linux该脚本负责猜测您当前的根分区 UUID 并输出所有主要菜单项。

相关内容