我在 BTRFS 文件系统上安装了 Arch、Ubuntu 和 GRUB2。我知道 GRUB 由于各种充分的原因无法写入 BTRFS,因此无法将环境变量保存到/boot/grub/grubenv
.
我在磁盘的开头和结尾有未使用的空间(由于对齐),并且我相信 BTRFS 文件系统也有某种“任意存储”区域。
有什么方法可以将 GRUB 配置为使用这些区域中的任何一个来存储持久环境变量,而不是尝试(但失败)使用该/boot/grub/grubenv
文件?
答案1
save_env 和 load_env 可选地采用参数 --file 。
如果您在 /etc/grub.d 中搜索 00_header,您可以在顶部设置一个变量,如下所示:
GRUBENV =“(hd0,msdos1)/grubenv”
以及下面第一回声节:
grubenv="$GRUBENV"
然后你就可以找到一个load_env并制作它
load_env --文件“\${grubenv}”
并搜索所有 save_env 并将其更改为
save_env --文件“\${grubenv}”
... 将 grubenv 从 /boot/grub/grubenv 复制到 /mnt/myfatpart (在上面的例子中,无论您在哪里挂载 (hd0,0))
更新grub
例子:
...
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
# Akua - grubenv doesn't survive on ZFS
GRUBENV="(hd0,msdos1)/grubenv"
...
if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then
GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi
cat << EOF
# Akua - grubenv doesn't survive on ZFS
grubenv="$GRUBENV"
# Akua
if [ -s "\${grubenv}" ]; then
set have_grubenv=true
# Akua
load_env --file "\${grubenv}"
fi
...
akua@blackbird:~ 09:08 /
$ grep grubenv /etc/grub.d/00_header
# Akua - grubenv doesn't survive on ZFS
GRUBENV="(hd0,msdos1)/grubenv"
# Akua - grubenv doesn't survive on ZFS
grubenv="$GRUBENV"
if [ -s "\${grubenv}" ]; then
set have_grubenv=true
load_env --file "\${grubenv}"
save_env --file "\${grubenv}" prev_entry
save_env --file "\${grubenv}" next_entry
save_env --file "\${grubenv}" next_entry
save_env --file "\${grubenv}" saved_entry
save_env --file "\${grubenv}" prev_saved_entry
save_env --file "\${grubenv}" saved_entry
if [ -n "${have_grubenv}" ]; then if [ -n "${partuuid}" ]; then
save_env --file "${grubenv}" prev_entry
save_env --file "${grubenv}" initrdfail
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env --file "\${grubenv}" recordfail; fi; fi