[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GRUB2 Behavior Question
From: |
Matt Sickler |
Subject: |
Re: GRUB2 Behavior Question |
Date: |
Thu, 26 Mar 2020 14:33:06 +0000 |
Thanks for the info John.
Here's some more background into our setup. It's a semi-embedded system (ie,
no "system admin" - all admin has to be handled by our programs/scripts) that
is installed on hundreds/thousands of devices around the world (so manually
doing things is possible but very expensive).
For the most part, we're using stock Debian 8 (Jessie). There's a slight
modification to the grub scripts in /etc/grub.d. The change is I added
sourcing my own script just after it sources the "grub-mkconfig_lib" library.
The contents of the new script is:
make_system_path_relative_to_its_root ()
{
"${grub_mkrelpath}" "$1" | sed -e 's,/@[^/]*,/@,'
}
I wrote this quite a few years ago, so I don't remember *how* it works, but I
remember it was required for a reason that I'll get to shortly.
Since we're using btrfs for the filesystem, we have it setup where the
linux-root (I'll use this to refer to what linux mounts at /) is actually a
subvolume.
The root of the btrfs filesystem has these things in it:
@ A symlink to the subvolume we want to boot into
boot A symlink to "/@/boot"
@deb8 One of our linux-root subvolumes
@deb10 Another of our linux-root subvolumes (Really, the linux-root
subvolumes could be named anything.)
In all the linux-root's, /etc/fstab has this: UUID=... / btrfs
defaults,subvol=@ 0 1
The patch to grub that I mentioned at the top of the email is to prevent grub
from "resolving" the @ symlink to the real subvolme path when generating the
/boot/grub/grub.cfg file.
So our generated grub.cfg would end up with entries like this: linux
/@/boot/vmlinuz-3.16.0-9-amd64 root=UUID=06307c88-ee37-4a15-ada7-83bf6d8c2955
ro single rootflags=subvol=@
(Without my patch, the path would be /@deb10/boot/vmlinuz-... instead.)
Now here's where the problem starts. In the @deb8 subvolume, linux-3.16... is
installed and in the @deb10 subvolume, linux-4.19... is installed. The
/@deb8/boot/grub/grub.cfg and /@deb10/boot/grub/grub.cfg files are both correct.
However, if grub-install is run while booted into the @deb10 subvolume, if we
"switch" back to @deb8 (by changing that @ symlink and rebooting) when grub
starts up it uses the config from /@deb10/boot/grub/grub.cfg instead of the one
we'd expect (from /@deb8/boot/grub/grub.cfg<mailto:/@deb8/boot/grub/grub.cfg>).
I'm not at all up to speed how grub actually executes at boot, but I'm aware
there are executable bits "outside" of the filesystem (in the MBR or
somewhere?). My theory is those pieces hold an inode number of
/boot/grub/grub.cfg when grub-install is ran (so that it doesn't need to have
lookup code to find the data given the filepath "/boot/grub/grub.cfg"). Or
maybe some other kind of config caching?
We've found that if we run "update-grub" and "grub-install /dev/sda" whenever
we "switch" snapshots, the problem doesn't occur.
- GRUB2 Behavior Question, Jordon Hofer, 2020/03/25
- Re: GRUB2 Behavior Question, John Little, 2020/03/25
- Re: GRUB2 Behavior Question, John Little, 2020/03/25
- Re: GRUB2 Behavior Question,
Matt Sickler <=
- Re: GRUB2 Behavior Question, Matt Sickler, 2020/03/26
- Re: GRUB2 Behavior Question, Matt Sickler, 2020/03/27
- Re: GRUB2 Behavior Question, John Little, 2020/03/29