はんだ付けされたRAMの呪い
The Curse of Soldered RAM (blog.hardill.me.uk)
要約
現代のノートパソコンで増えているRAMのはんだ付けは、故障時の修理を困難にし、買い替えを余儀なくさせるという問題があります。筆者は、はんだ付けされたRAMを持つLenovo X1 Carbonで発生したRAMエラーに直面し、Linuxカーネルのmemmapオプションを使用して問題のあるメモリ領域を回避することで、一時的な延命措置を講じました。
全文翻訳
はんだ付けされたRAMの呪い
現代のノートパソコンにおけるRAMのはんだ付けというトレンドは、特に価格高騰と品不足が続く現在の状況では、本当に邪悪です。
私は通常、個人的なものと仕事用のものの2台のノートパソコンを使い、物事を分離しようと試み、一日の終わりに仕事用を「オフィス」に置いておけるようにしています。2021年に現在の仕事用ラップトップを入手した際にもブログに書きました。
このLenovo X1 Carbonは素晴らしかったのですが、最近になってブラウザタブのクラッシュが格段に増え、時折ルートファイルシステムが読み取り専用になるという、あまり役に立たない現象が発生しました。
Oct 15 23:33:35 razor-crest kernel: BTRFS warning (device dm-0): csum failed root 257 ino 166754 off 5859786752 csum 0x31019647 expected csum 0x6d009929 mirror 1
Oct 15 23:33:35 razor-crest kernel: BTRFS error (device dm-0): bdev /dev/mapper/luks-571c7357-a343-49f3-993c-167c8c5dcec6 errs: wr 0, rd 0, flush 0, corrupt 3856936704, gen 0
これらの障害によりRAMエラーの可能性を疑い、Ventoy USBスティックにmemtest86+のブートイメージを追加して起動しました。
Memtest86+
このツールは、可能な限りすべての物理メモリアドレスに多くのパターンを書き込み、それを読み戻す、非常に最小限のOSを起動します。読み戻した値が書き込んだものと一致しない場合、問題があることを意味します。
実行し続けると、一部のエラーは断続的にしか現れないため、複数パスを実行します。しかし、この場合はほとんどすぐに大量のエラーが表示されました。
過去であれば、これは簡単な修理でした。出力結果があれば、どのDIMMが故障しているかを特定するのに十分でした。最悪の場合でも、一つを取り外して再度テストを実行し、バイナリサーチを行うことができました。特定できれば、交換用DIMMを注文する(あるいはアップグレードの機会を得る)だけで済みました。
しかし、さらに薄いラップトップ(DIMMソケットは約6mmの厚さを追加するため)を求める探求、そしておそらくは故障した場合に新しいラップトップを購入する必要が生じるように意図的に設計されているためか、ほとんどのラップトップではRAMがマザーボードに直接はんだ付けされています(FrameWorkのような例外はあります)。ボールグリッドアレイチップの交換に熟練していない限り、交換は現実的な選択肢ではありません。
5年間の減価償却と技術の進歩を考えると、新しいラップトップを見つける時期かもしれませんが、このLenovo X1 Carbonをまだ非常に有能なマシンであり、個人的なラップトップとして使用しているさらに古いDell XPS 13を置き換えることができるため、稼働させ続ける方法がないか見てみたいです。
交換については後日ブログに書きます。
Memmap
新しいラップトップが届くのを待つ間、もう少し安定させられる方法がないか考えてみました。
少し調査したところ、Linuxカーネルに渡して、不良セクタの使用を回避できるようにする2つのオプションが見つかりました。
- badram
- memmap
badramは、通常Debian/Ubuntuベースのディストリビューションにのみ含まれるツリー外のパッチであることが判明しました。私はこのマシンでFedoraを使用しているので、それは機能しませんでした。
memmapはコアカーネル機能なので、Fedoraでも利用できるはずです。カーネルコマンドラインに、length$offsetの形式でメモリアドレスと長さのリストを指定する必要があります。
Memtest86+は、正しい形式(badramとmemmapの両方)を出力し、ファイルに保存することもできますが、Ventoy USBスティックに入れたisoイメージでは動作させることができなかったため、画面の写真を撮るという手段に訴えました。
[画像: Memtest86+の出力画面の写真]
その後、手動で転記する必要がありましたが、それは「楽しかった」です。
カーネルコマンドライン引数を追加するためのすべてのドキュメントには、/etc/default/grubファイルを編集し、値をGRUB_CMDLINE_LINUXエントリに追加してからgrub2-mkconfig -o /boot/grub2/grub.cfgを実行するように記載されています。
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.luks.uuid=luks-571c7357-a343-49f3-993c-167c8c5dcec6 rhgb quiet memmap=$(memmap_val) memmap=0x30$0x3fe90140,0x48$0x3fe90b08,0x48$0x3fe90ba8,0x48$0x3fe916a8,0xf0$0x3fe91c00,0x90$0x3fe92560,0xf0$0x3fe92f00,0x50$0x3fe93200,0x90$0x3fe93260,0xf0$0x3fe93800,0xf0$0x3fed4300,0x70$0x3fed4900,0x70$0x3fed4980,0xf0$0x3fed5400,0xf0$0x3fed5e00,0xf0$0x3fed6700,0xf0$0x3fed6d00,0xf0$0x3fed7000,0x30$0x3fed7a00,0xb0$0x3fed7a40"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
これを試しましたが、マシンを再起動すると起動に失敗しました。
grub画面に到達し、起動しようとしていたカーネルコマンドラインを表示させることができましたが、memmapエントリの$0がgrub2-mkconfigによって置き換えられているように見えました。これは、古典的な環境変数置換($0は通常、実行されているスクリプトの名前です)のように見えます。
類似の問題を説明しているRedHatのバグを見つけ、値を変数として追加するという解決策がありました。
# grub2-editenv /boot/grub2/grubenv set memmap_val='0x30$0x3fe90140,0x48$0x3fe90b08,0x48$0x3fe90ba8,0x48$0x3fe916a8,0xf0$0x3fe91c00,0x90$0x3fe92560,0xf0$0x3fe92f00,0x50$0x3fe93200,0x90$0x3fe93260,0xf0$0x3fe93800,0xf0$0x3fed4300,0x70$0x3fed4900,0x70$0x3fed4980,0xf0$0x3fed5400,0xf0$0x3fed5e00,0xf0$0x3fed6700,0xf0$0x3fed6d00,0xf0$0x3fed7000,0x30$0x3fed7a00,0xb0$0x3fed7a40'
/etc/default/grubを以下のように変更します。
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.luks.uuid=luks-571c7357-a343-49f3-993c-167c8c5dcec6 rhgb quiet memmap=$(memmap_val)"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
そして、再度grub2-mkconfig -o /boot/grub2/grub.cfgを実行します。
今度は正しく起動し、/proc/cmdlineで正しい値を確認できます。
BOOT_IMAGE=(hd0,gpt2)/vmlinuz-7.2.11-200.fc44.x86_64 root=UUID=869b183b-b858-40e5-8da7-e923dd367c2a ro rootflags=subvol=root rd.luks.uuid=luks-571c7357-a343-49f3-993c-167c8c5dcec6 rhgb quiet memmap=0x30$0x3fe90140,0x48$0x3fe90b08,0x48$0x3fe90ba8,0x48$0x3fe916a8,0xf0$0x3fe91c00,0x90$0x3fe92560,0xf0$0x3fe92f00,0x50$0x3fe93200,0x90$0x3fe93260,0xf0$0x3fe93800,0xf0$0x3fed4300,0x70$0x3fed4900,0x70$0x3fed4980,0xf0$0x3fed5400,0xf0$0x3fed5e00,0xf0$0x3fed6700,0xf0$0x3fed6d00,0xf0$0x3fed7000,0x30$0x3fed7a00,0xb0$0x3fed7a40
新しいラップトップが届くまで、そしておそらくそれ以降もしばらくは、これを機能させ続けるために、memmapの値を含むテキストファイルをUSBスティックに作成し、再インストールした場合に再適用できるようにしました。
次のタスクは、必要なものをすべてバックアップしたことを確認し、次にbtrfs check --fixを実行して、ファイルシステムのメタデータを整理できるかどうかを確認することです。