CentOS 7はgrub.cfgのカーネルメニュー項目を間違ってソートしますか?

CentOS 7はgrub.cfgのカーネルメニュー項目を間違ってソートしますか?

CentOS 7システムでは、グルーブメニュー項目の予期しない順序が見つかりました。

次のカーネルをインストールします。

$ ls /boot/vmlinuz* -ltr
Jun 30 14:17 /boot/vmlinuz-3.10.0-123.el7.x86_64
Nov  6 16:14 /boot/vmlinuz-3.10.0-123.9.3.el7.x86_64
Nov 23 17:12 /boot/vmlinuz-0-rescue-c61cbe0918ab45e0927fb5d31cf45f98

バージョンスキームを解釈すると、バージョン「3.10.0-123.9.3.el7」が「3.10.0-123.el7」よりも大きくなります。これはmtimeファイルとも一致し、uname -a出力とも一致します。

3.10.0-123.el7.x86_64     Mon Jun 30 12:09:22 UTC 2014
3.10.0-123.9.3.el7.x86_64 Thu Nov 6  15:06:03 UTC 2014

ただし、/boot/grub2/grub.cfg別のコマンドを使用してください。

$ grep vmlinuz-3 /boot/grub2/grub.cfg | sed 's/root=.*//'
linux16 /vmlinuz-3.10.0-123.el7.x86_64 
linux16 /vmlinuz-3.10.0-123.9.3.el7.x86_64

ああ?

システムはいくつかの追加のカーネルパラメータを取得するため、以下をgrub.cfg使用して明示的に再構築されます。

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

どちらがいいですか?正式な方法- マニュアルに記載されているとおりです。

この整列は、次のようにして行われる。

/etc/grub.d/10_linux
  -> /usr/share/grub/grub-mkconfig_lib
     -> version_find_latest()
        -> version_test_gt()

これはgrub2-mkconfigのよく知られたバグですか?

しかし、これに関するバグレポートが見つかりません。

驚くべきことに、他のCentOS 7システム(やはり最新)では、grub.cfgの順序が正確です。

$ grep vmlinuz /boot/efi/EFI/centos/grub.cfg | sed 's/root=.*//'
linuxefi /vmlinuz-3.10.0-123.9.3.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.9.2.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.8.1.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.6.3.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.el7.x86_64 
linuxefi /vmlinuz-0-rescue-48235f1ad5c943c3a7dfd1551a1fc5b8 

2つのシステムの違いは、grub2-mkconfig2番目のシステムでは手動で実行されなかったことです。

実際に手動で実行すると、順序も間違っています。

# grub2-mkconfig -o del.cfg
# grep vmlinuz del.cfg | sed 's/root=.*//' 
linuxefi /vmlinuz-3.10.0-123.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.9.3.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.9.2.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.8.1.el7.x86_64 
linuxefi /vmlinuz-3.10.0-123.6.3.el7.x86_64 
linuxefi /vmlinuz-0-rescue-48235f1ad5c943c3a7dfd1551a1fc5b8

yum updateその後、カーネルをインストールして更新すると、インストールスクリプトが実行されないようですgrub-2-mkconfig -o /boot/efi/EFI/centos/grub.cfggrub.cfgでは、カーネルパッケージのインストール中にどのように再生成できますか?

答え1

これはよく知られたエラーです。

カーネルパッケージの更新方法を確認するには、次のようにgrub.cfgスクリプトを表示できます。

$ yum whatprovides /boot/vmlinuz-3.10.0-123.9.3.el7.x86_64
kernel-3.10.0-123.9.3.el7.x86_64 : The Linux kernel
[..]
$ rpm -q --scripts kernel-3.10.0-123.9.3.el7.x86_64

これは/usr/sbin/new-kernel-pkg呼び出されていることを示します。汚い

解決策

(RHEL / CentOSで修正されるまで)

--- /usr/share/grub/grub-mkconfig_lib.orig 2014-06-30 18:16:11.000000000 +0200
+++ /usr/share/grub/grub-mkconfig_lib 2014-11-26 17:38:57.814000000 +0100
@@-255,13 +255,24 @@

 バージョン_検索_最新()
 {
- version_find_latest_a=""
- 私は「$@」について
- version_test_gt "$i" "$version_find_latest_a"の場合。
- version_find_latest_a="$i"
-fi
- 完成した
- エコ「$version_find_latest_a」
+#https://bugzilla.redhat.com/show_bug.cgi?id=1124074のソリューション
+# 'grub2-mkconfigソートエラー'
+{
+「$@」の場合。
+ $i をエコーし​​ます。
+完了| grep -v 構造ソート -V |
+「$@」の場合。
+ $i をエコーし​​ます。
+完了| grep構造の整列 -V |
+} |ヘッド-n 1
 }

答え2

実際に問題を解決した2つのbugzilla.redhat.comのバグパッチを投稿しました。 maxschlepzigのパッチは正解に非常に近いですが、正解ではありません。私のパッチは彼のパッチに基づいています。

答え3

カーネルをインストールした後に何が起こったのかを判断する方法は、rpm+--scriptsスイッチを使用すると次のようになると思います。

はい

$ rpm --scripts -q kernel-$(uname -r)
postinstall scriptlet (using /bin/sh):

if [ `uname -i` == "x86_64" -o `uname -i` == "i386" ] &&
   [ -f /etc/sysconfig/kernel ]; then
  /bin/sed -r -i -e 's/^DEFAULTKERNEL=kernel-smp$/DEFAULTKERNEL=kernel/' /etc/sysconfig/kernel || exit $?
fi
preuninstall scriptlet (using /bin/sh):
/bin/kernel-install remove 3.16.6-203.fc20.x86_64 /boot/vmlinuz-3.16.6-203.fc20.x86_64 || exit $?
posttrans scriptlet (using /bin/sh):
/bin/kernel-install add 3.16.6-203.fc20.x86_64 /boot/vmlinuz-3.16.6-203.fc20.x86_64 || exit $?

これはいくつかの部分に分かれています。インストール後辞書の削除郵便集配員。カーネルのインストールと削除を実行するツールは、次のスクリプトです。

/bin/kernel-install add <kernel label> </path/to/boot/vmlinuz-...> || exit $

このスクリプトの所有者は誰ですか?

このスクリプトはkernel-installSystemdの一部です。

$ rpm -qf /bin/kernel-install 
systemd-208-28.fc20.x86_64

関連情報