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-mkconfig
2番目のシステムでは手動で実行されなかったことです。
実際に手動で実行すると、順序も間違っています。
# 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.cfg
。grub.cfg
では、カーネルパッケージのインストール中にどのように再生成できますか?
答え1
これはよく知られたエラーです。
- grub2-mkconfigは無効な順序で起動オプションを生成します(CentOSのバグ0007651)。
- grub2-mkconfigソートエラー(RHELバグ1124074)
- grub2無効なソート(バグ678840 - 修正済み)
カーネルパッケージの更新方法を確認するには、次のように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-install
Systemdの一部です。
$ rpm -qf /bin/kernel-install
systemd-208-28.fc20.x86_64