由于一个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.d
zram,但没有找到匹配项。我甚至重新定义了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 和默认设置的系统在尝试使用该扇区时会崩溃。我看到的选项:
添加
swapoff /dev/zram0
到/etc/rc.local
(最基本)。黑名单 zram(但是这会先卸载它吗?因为它是在初始 ramdrive 中加载的)。
否则,如果您想使用 zram,则必须添加
-c
到相关的mkswap
,并希望获得最好的结果,即除了最后一个扇区之外,一切都能正常工作。参考:这个帖子在 initrd 映像内添加并重新
-c
打包(内核升级时丢失)。sbin/compcache-enable
-c
在 中添加。在 之前/etc/init/zram-config.conf
还需要一个swapoff
and ,因为运行时 zram 已经设置好了,所以设置大小会失败。rmmod
modprobe
我目前选择了 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
。