如何检测哪个启动脚本启动 zram?

如何检测哪个启动脚本启动 zram?

由于一个zram 漏洞导致机器死机,我不得不禁用 zram。

我认为dpkg --purge zram-config评论任何参考都/etc/rc.local可以解决问题,但模块(及其不祥的 dmesg 警告Buffer I/O error on device zram0, logical block 257912)不断被加载。

我已经 grep/etc/init/etc/init.dzram,但没有找到匹配项。我甚至重新定义了mkswap日志,记录了它的调用方式(因为当 mkswap 接触受保护的内存时会发生“缓冲区错误”)——令人惊讶的是,我没有收到任何调用。所以我搞不清楚是什么配置了 zram(调用 mkswap + swapon)。

我已经尝试打破它zram.ko来停止它的加载。但我仍然想弄清楚哪个特定的初始化脚本加载了它。有什么想法吗?

请注意,我正在寻找有关如何追踪哪个 init 或启动脚本配置 zram 的答案——我非常清楚该错误可能已被修复,您可以通过多种方式禁用 zram 等,而这些答案会偏离主题。

答案1

尝试这个(调整 initrd 位置):

$ mkdir /tmp/x
$ cd /tmp/x
$ zcat /boot/initrd.img-3.8.0-31-generic | cpio -i
$ grep -lR zram .
./scripts/init-top/compcache
./lib/modules/3.8.0-31-generic/kernel/drivers/staging/zram/zram.ko
./lib/modules/3.8.0-31-generic/modules.dep
./lib/modules/3.8.0-31-generic/modules.dep.bin
./lib/modules/3.8.0-31-generic/modules.order
./sbin/compcache-enable
./etc/udev/rules.d/80-compcache.rules

倒数第二个是罪魁祸首,最后一个显示调用参数。该脚本/etc/init/zram-config.conf希望为每个核心创建一个 zram 设备,上面的脚本正在创建一个具有 50% 的 zram 设备。

我可以确认最后一个扇区是坏的/dev/zram,可能是 off-by-1 错误。具有 zram 和默认设置的系统在尝试使用该扇区时会崩溃。我看到的选项:

  1. 添加swapoff /dev/zram0/etc/rc.local(最基本)。

  2. 黑名单 zram(但是这会先卸载它吗?因为它是在初始 ramdrive 中加载的)。

    否则,如果您想使用 zram,则必须添加-c到相关的mkswap,并希望获得最好的结果,即除了最后一个扇区之外,一切都能正常工作。参考:这个帖子

  3. 在 initrd 映像内添加并重新-c打包(内核升级时丢失)。sbin/compcache-enable

  4. -c在 中添加。在 之前/etc/init/zram-config.conf还需要一个swapoffand ,因为运行时 zram 已经设置好了,所以设置大小会失败。rmmodmodprobe

我目前选择了 3,但dmesg仍然受到那些 Buffer I/O 错误的污染。我会留意崩溃,现在至少我知道它们来自哪里。

答案2

我更喜欢关闭 ZRAM,因为我已经使用磁盘分区进行交换。我在一台机器上使用 13.10,在另一台机器上使用 12.0.4。

我建议对 进行另一种可能的更改/etc/init/zram-config.conf,以完全停止 zram 交换。假设您使用默认运行级别 2,请更改以下行:

start on runlevel [2345]

start on runlevel [345]

我已在 上使用过同样的技巧/etc/init/tty1.conf,为 留下启动控制台消息view.r

相关内容