Leap 42.3 无法保留多版本内核

以前往为使用高版本影子梭(双s),添加了 hillwood 的源,这个源里有高版本的内核,更新系统时也自动安装了。由于没有相应的显卡内核模块,导致进不了图形界面。

别名 : http-download.opensuse.org-5e352983
名称 : home:hillwood
URI : Index of /repositories/home:/hillwood/openSUSE_Leap_42.3

经女王指点,关闭了 hillwood 的源,dup 后能正常使用。发现一个新问题,就是只能保存最新的内核,其它都自动删除了。保留旧版本内核是以防万一。我曾通过“软件管理”手动安装了两个旧版本的内核,但在自动更新后又没了。 又经过测试,发现,在进入桌面后1分钟多点,/boot 目录里非当前使用的内核都会被删除,不论版本比当前使用的内核高或低。

搜索到此文
Installing Multiple Kernel Versions
https://doc.opensuse.org/documentation/leap/reference/html/book.opensuse.reference/cha.tuning.multikernel.html

要使用多版本,请不要使用更新工具(例如YaST在线更新或更新程序小程序)
/etc/zypp/zypp.conf 里的多版本要设置成下面这样,且不能注释该行。我看了,里面是下面这样,且没注释。
multiversion = provides:multiversion(kernel)

请问,这是什么原因?如何解决?

先谢!

为什么你们这么需要高版本内核 但又不上风滚草呢?

你看下 /etc/zypp/zypp.conf 的这个选项:multiversion.kernels = latest,latest-1,running

最关键的是这个选项的注释:Note: This entry is not evaluated by libzypp, but by the purge-kernels service (via /sbin/purge-kernels).

也就是说 openSUSE 存在自动删除无用内核的脚本。脚本肯定是要通过 systemd service 来跑的,我又看了下 /usr/lib/systemd/system/purge-kernels.service,里面这行值得注意:

ConditionPathExists=/boot/do_purge_kernels

这个脚本只有 /boot/do_purge_kernels 存在才会运行。

我觉得不存在别的会删除内核的东西了,你看一下是不是你有那个 do_purge_kernels 文件或者你的那个 zypper 选项被你改了。

先谢!:pray:
我已经爬上床了,明天再操作。

补充

@marguerite

  1. /etc/zypp/zypp.conf 里的这个选项:multiversion.kernels = latest,latest-1,running 和你的一样。
  2. 没有 /boot/do_purge_kernels 这个脚本
systemctl status purge-kernels.service
● purge-kernels.service - Purge old kernels
   Loaded: loaded (/usr/lib/systemd/system/purge-kernels.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
Condition: start condition failed at 三 2018-10-24 10:52:54 CST; 41min ago
           ConditionPathExists=/boot/do_purge_kernels was not met


/usr/lib/systemd/system/purge-kernels.service

[Unit]
Description=Purge old kernels
After=local-fs.target
ConditionPathExists=/boot/do_purge_kernels

[Service]
Type=oneshot
Nice=19
IOSchedulingClass=idle
ExecStartPre=/bin/rm -f /boot/do_purge_kernels
ExecStart=/sbin/purge-kernels

[Install]
WantedBy=multi-user.target

@hillwood 大佬,我曾用过你的源,请问,是否添加了什么删除内核的东西?

我那是安装别人的ss,没注意,自动安装了他自己编译的新内核。我自己是要保存旧内核的。

@cangjing 你这样,安装一个内核,重启,等到那个内核被删除了,然后运行一下 sudo journalctl -b 把内容贴到 paste.kde.org 然后发过来。我觉得就算有这种自动删除内核的服务,无外乎也就是 cron 和 systemd service 两种运行方式,知道是什么删的就好办了。

https://paste.kde.org/papchzeqn/tbsr5c
不懂选择什么格式,高亮不好。

是 purge-kernels 这个脚本搞的
https://paste.kde.org/ptbcnskfa

求女王帮忙看看上边那些 debug 是什么?或还有什么不对的地方。谢谢

/usr/lib/linux-boot-probes/
50mounted-tests mounted

/usr/lib/linux-boot-probes/mounted:
40grub 40grub2 50lilo 90fallback

并没有。我也是因为 VPS 上的 42.3 需要新版内核才自己打的包。

1赞

@cangling

你的 purge-kernels.service 的状态是什么:

$ systemctl status purge-kernels
● purge-kernels.service - Purge old kernels
Loaded: loaded (/usr/lib/systemd/system/purge-kernels.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Condition: start condition failed at Wed 2018-10-24 16:48:45 CST; 4h 21min ago

@marguerite

systemctl status purge-kernels
● purge-kernels.service - Purge old kernels
Loaded: loaded (/usr/lib/systemd/system/purge-kernels.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Condition: start condition failed at 四 2018-10-25 14:19:56 CST; 9min ago
ConditionPathExists=/boot/do_purge_kernels was not met

purge-kernels 服务是启用状态,我把服务禁用了,安装了一个旧版内核,重启后没有删除。

重启后发现 /boot 目录里多了个 名为 do_purge_kernels 的空文件,
这个你之前提到的满足 purge-kernels 服务执行的条件,应该是执行时删除了,所以之前没发现。

@cangling

你这么做实际上是不对的,因为 purge-kernels.service 发行版默认就是 enabled 的,现在禁用可以了,下次升级又出来了。

现在是要找到是什么创建了 /boot/do_purge_kernels 这个文件导致这个服务运行的

我删除了 /boot/do_purge_kernels ,用 zypper 手动安装了一个旧版本的内核,又出现了 /boot/do_purge_kernels 这个文件。

搜索到这个

purge-kernels script
https://forums.opensuse.org/showthread.php/465259-purge-kernels-script

8楼

I disagree with your proposition. Purge-kernels is part of the mkinitrd package. The script cleans up the /boot directory following a decision to over-ride the default kernel package behaviour (which would otherwise remove old versions). This has nothing to do with the kernel-devel and kernel-source packages.

那个帖子的楼主说,他将 “multiversion-kernels = latest,latest-1,latest-2,running”
多了一个 last-2,保留两个内核。

我的情况是,用旧内核启动时,会把新的也删除,只保留正在使用的。

你的问题出在这儿:

https://build.opensuse.org/package/view_file/Kernel:stable/kernel-default/post.sh?expand=1

# Flag to trigger /etc/init.d/purge-kernels on next reboot (fate#312018)
touch /boot/do_purge_kernels

装完新内核就会建立这个文件。

如果你的 /etc/zypp/zypp.conf 那行要是没有注释掉的话,应该就是 /sbin/purge-kernels 这个脚本本身的问题。

你可以在装完新内核之后,运行下 /sbin/purge-kernels --test 看看结果是什么样的?

我安装了最新的内核 kernel-default-4.4.159-73.1.x86_64
/etc/zypp/zypp.conf 这两行没有注释掉,我加了个 latest-2,依然全部删除。
multiversion = provides:multiversion(kernel)
multiversion.kernels = latest,latest-1,latest-2,running

$ /sbin/purge-kernels --test
Removed:
kernel-default-4.4.138-59.1.x86_64
kernel-default-4.4.140-62.2.x86_64
kernel-default-4.4.143-65.1.x86_64
kernel-default-4.4.155-68.1.x86_64

purge-kernels 脚本
https://paste.kde.org/ptbcnskfa

purge-kernels -test
(strace -o strace-fx-$(date +%Y-%m-%d_%H-%M).txt -vTtte trace=all ./purge-kernels -test)
https://paste.kde.org/phmefjuq5
不知道怎么记录perl的执行过程,这个记录好像没意义。

你把我改过的 purge-kernels 下载下来:https://paste.kde.org/pgysygtyr/amzp2z

然后:

chmod +x purge-kernels
./purge-kernels --test

然后把调试输出的结果发出来我看看。

我改过的版本主要加上了一些调试输出,便于我理解程序抓 bug 的。perl 的语法比较奇怪,变量是 $,数组是 @,而 hash 是 %。写是不会去写的,但是加点 debug code 还是能做到的。

加密的,密码呢?

https://paste.kde.org/pjmbfentc

不好意思,时间长不用 paste.kde.org 了,它把我 identity.kde.org 的密码自动填充了 :joy:

./purge-kernels_marguerite --test

https://paste.kde.org/p1tfhqxrn/fzusst

我调试输出里有 两个 4.14 的信息,就在 zypp.conf 里这一行加了个 latest-3,
multiversion.kernels = latest,latest-1,latest-2,latest-3,running

再测试,结果如下
https://paste.kde.org/pbzwazqjl/mamc36

看样子,虽然禁用了 hillwood 的源,也删除了 4.14 的内核,但还有残留,影响了脚本的判断。
不知怎么删除,烦劳女王指点:pray:t5:

你注意去删 kernel-default 本身了,而 kernel-default-devel 和 kernel-devel 的多版本没删。

sudo zypper se -v kernel-default-devel
sudo zypper se -v kernel-devel

的结果发来看看。然后用 zypper rm -u kernel-devel-4.14.7-2.1.noarch.rpm kernel-default-devel-4.14.7-2.1.x86_64.rpm 这样的完全命令去删。把 4.14.9 和 4.14.7 都干掉,再运行我的脚本,看最后是不是 nothing to do。

我们这供电线路检修,白天停电,要等晚上了。

@marguerite

zypper se -v kernel
https://paste.kde.org/pdsjg61dd/apr6pa

zypper rm kernel
https://paste.kde.org/pibupnurb/lmyd7s

直接删除包失败,去掉 .rpm 后缀会自动纠正。
kernel-devel-4.14.7-2.1 删除了。
kernel-devel-4.14.9-2.1 提示要删除包括显卡驱动在内的8个包,我没动。