在 /etc/default/grub 中编辑操作系统名称 - 操作系统名称从哪里读取?

在 /etc/default/grub 中编辑操作系统名称 - 操作系统名称从哪里读取?

入口在哪里

GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian

取自哪里的名字?

这就是为什么这不是“如何在 grub 启动菜单中安全地更改操作系统名称?”的重复:

我已经知道,可以通过注释来更改 GRUB 启动菜单中分配给操作系统的名称

GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian

并将条目替换为

GRUB_DISTRIBUTOR="Some other name"

(用引号括起来)。

我发现的所有解释都只是说:

GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian -

“此行只是检索菜单项中的名称。” 很公平!但我想知道:此命令从哪里检索实际名称?名称必须以纯文本形式包含在某个文件中!

答案1

如果我strace命令lsb_release -i -s...

strace -o strace.out lsb_release -i -s

我发现(从输出文件中strace.out)它正在读取/etc/lsb-release

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

的输出lsb_release -i -sUbuntu

重定向2> /dev/null会将命令中的任何错误发送到数据遗忘

该操作符||的意思是当(且仅当)第一个命令失败时,才执行第二个命令:

first command || second command

因此,如果lsb_release -i -s出现错误,错误将转到/dev/null并执行命令echo Debian。输出为Debian

总结一下:

如果lsb_release -s -i能提供当前系统的名称,则使用该名称并显示输出。如果没有,则将其命名为“Debian”

该文件/etc/default/grub用于生成 GRUB ( /boot/grub/grub.cfg)update-grub调用时读取的配置文件,因此在挂载真实根文件系统时会读取该文件。

您必须sudo update-grub在编辑文件后运行才能使任何更改生效。

答案2

lsb_release是用于获取 Linux 发行版和版本(发行号)的内部命令。您可以复现该命令的工作原理以及它从何处获取信息。

在终端类型cat /proc/version

Linux version 4.7.3-040703-generic (kernel@tangerine) (gcc version 6.2.0 20160901 (Ubuntu 6.2.0-3ubuntu11) ) #201609070334 SMP Wed Sep 7 07:36:45 UTC 2016

Ubuntu出现在 /proc/version 中,但与 grub 菜单上的显示方式不同。因此我们继续...

现在输入cat /etc/issue

Ubuntu 16.04.1 LTS \n \l

这是哪里lsb_release可能会获取 Linux 发行版,因为Ubuntu 16.04.1 LTS就是在我的 grub 菜单上显示的内容。

在间接影响变量之前$GRUB_DISTRIBUTOR(在你的问题中引用)通过强制/etc/问题改为不同的常量,考虑以下代码/etc/grub.d/05_debian_theme

set_default_theme(){
    case $GRUB_DISTRIBUTOR in
        Tanglu|Ubuntu|Kubuntu)
            # Set a monochromatic theme for Tanglu/Ubuntu.
            echo "${1}set menu_color_normal=white/black"
            echo "${1}set menu_color_highlight=black/light-gray"

改变Ubuntu我的酷炫 Linux可能会出现在菜单上,但主题和颜色的内部 grub 代码可能会被破坏。更不用说 grub 内部以及您的其他应用程序和操作系统外部可能破坏的所有其他“东西”。

编辑1:

正如我今天早上了解到的显示 Linux 版本的命令然后发现@Zanna 上面已经给出了一个很好的答案,命令lsb_release从 检索文本/etc/lsb-release

相关内容