web-dev-qa-db-ja.com

どの初期化スクリプトがzramを起動するかを検出する方法は?

マシンのロックアップにつながるzramのバグ のため、zramを無効にする必要がありました。

dpkg --purge zram-config/etc/rc.localからの参照をコメントアウトするとうまくいくと思いましたが、モジュール(およびその不吉なdmesg警告Buffer I/O error on device zram0, logical block 257912)がロードされ続けます。

Zramの/etc/init/etc/init.dをgrepしましたが、一致するものはありませんでした。 mkswapを再定義して、それがどのように呼び出されたかを記録しました(mkswapが保護されたメモリに触れると「バッファエラー」が発生するため)-驚いたことに、呼び出しがありませんでした。そのため、zramの構成(mkswap + swaponを呼び出す)を把握できません。

ロードを停止するためにzram.koを壊すことにしました。しかし、どの特定の初期化スクリプトがそれをロードするのかを理解したいと思います。何か案は?

どのinitまたはスタートアップスクリプトがzramを構成するかを追跡する方法についての答えを探していることに注意してください-バグはすでに修正されている可能性があり、いくつかの方法でzramを無効にできるなど、そのような答えはオフになります-トピック。

3
dan3

これを試してください(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

最後から2番目は犯人で、最後の1つは呼び出しパラメータを示しています。スクリプト/etc/init/zram-config.confは、コアごとに1つのzramデバイスを作成することを望んでいます。上記のものは、50%の単一のzramデバイスを作成しています。

/dev/zramの最後のセクターが不良であることを確認できます。これはおそらく1つずつのバグです。 zramとデフォルト設定を備えたシステムは、そのセクターを使用しようとするとクラッシュします。私が見るオプション:

  1. swapoff /dev/zram0/etc/rc.localに追加します(最も基本的)。

  2. Zramをブラックリストに登録します(ただし、これは最初にアンロードされますか?最初のramdriveにロードされているためです)。

    それ以外の場合、zramを使用する場合は、-cを関連するmkswapに追加し、最後のセクター以外ですべてが機能することを期待する必要があります。参照: この投稿

  3. Initrdイメージ内から-csbin/compcache-enableに追加して再パックします(カーネルのアップグレードで失われます)。

  4. -c/etc/init/zram-config.confに追加します。 swapoffの前にrmmodmodprobeも必要です。これは、実行時にzramがすでに設定されているため、サイズの設定が失敗するためです。

今のところ3を選択しましたが、dmesgはまだこれらのバッファーI/Oエラーで汚染されています。クラッシュを監視しますが、少なくともそれらがどこから来たかはわかっています。

2
Matei David