ニュース

SDカード障害後のホームサーバー再構築:NixOSサバイバル物語

Raspberry Pi 4BのホームサーバーがmicroSDカードの故障でダウン。筆者はNixOS、zram、古いHDDによるbtrfs RAID1、宣言的サブボリューム管理で再構築する。

July 19, 2026· 1 min read
SDカード障害後のホームサーバー再構築:NixOSサバイバル物語

Raspberry Pi 4Bのホームサーバーが、何年もの24時間稼働の末にmicroSDカードの故障でダウンした。NixOSを運用していた筆者は、この障害を耐久性と冗長性に焦点を当てた再構築の機会と捉え、その全プロセスを記録した。

根本原因はmicroSDカードの故障で、停電が最後の一撃を与えた可能性が高い。筆者は書き込みを最小限に抑える対策をほとんど講じておらず、カードは長年ルートファイルシステムとしてマウントされていた。実際の損失は.torrentファイルとサービスキャッシュのみで、いずれも簡単に再生成可能だった。真の教訓は、SDカードはサーバーの長期ルートファイルシステム用途には適さないということだ。

SDカードへの書き込みを最小化

新しい構成では、microSDへのスワップの代わりにzramをスワップに使用する。zramはRAM内に圧縮ブロックデバイスを作成し、はるかに高速でカードの摩耗を防ぐ。筆者はさらに/tmpをRAMディスクとして設定し、journaldのログをメモリに保存するよう構成した(storage = "volatile")。ルートファイルシステムはnoatimeでマウントし、アクセス時刻の更新による書き込みを防止する。

{
  zramSwap.enable = true;
  boot.tmp.useTmpfs = true;
  services.journald.storage = "volatile";
  fileSystems."/" = {
    device = "/dev/disk/by-label/takodachi";
    fsType = "ext4";
    options = [ "noatime" ];
  };
}

流用ドライブによるBtrfs RAID1

AI需要で高騰した市場で新しいハードウェアを購入する代わりに、筆者は2台の古い2.5インチHDD(500GBと320GB)をbtrfs RAID1プールに流用した。プール名は「ponkotsu」(日本語で「がらくた」)。btrfsを選んだ理由は、サブボリューム、オンライン拡張、異なるサイズのドライブ対応といった柔軟性にある。

sudo mkfs.btrfs --data raid1 --metadata raid1 --label ponkotsu /dev/sdX /dev/sdY

NixOSによる宣言的サブボリューム管理

筆者はautosubvolというカスタムNixOSモジュールを作成し、サービスごとにbtrfsサブボリュームを宣言的に管理する。各サブボリュームには独自のsystemdマウントユニットが割り当てられ、サポートするサービスに依存関係が結び付けられる。これにより設定がクリーンに保たれ、初回起動時にサブボリュームが自動的に作成される。

{
  services.autosubvol = {
    enable = true;
    disks.ponkotsu = {
      device = "/dev/disk/by-uuid/<pool uuid>";
      subvolumes.immich = {
        mountPoint = "/var/lib/immich";
        mountOptions = [ "noatime" ];
        requiredBy = [ "immich-server.service" ];
      };
    };
  };
}

Resticとsops-nixによるバックアップ

バックアップは、sops-nix(シークレット管理)とrestic nixpkgsモジュールを橋渡しするNixモジュールで処理される。各サービスのデータディレクトリはS3バケットにバックアップされ、日次、週次、月次のスナップショットを保持するための整理ルールが設定される。筆者はさらに/var/cache用のサブボリュームを作成し、揮発性データをSDカードから分離した。

{
  internal.backups.restic.immich = {
    paths = [ "/var/lib/immich" ];
    exclude = [
      "/var/lib/immich/encoded-video"
      "/var/lib/immich/thumbs"
    ];
    pruneOpts = [
      "--keep-daily 7"
      "--keep-weekly 4"
      "--keep-monthly 3"
    ];
  };
}

このアプローチは実用的だ:手持ちのものを活用し、すべてを自動化し、SDカードは消耗品と割り切る。完全なNixOS設定とautosubvolモジュールは筆者のGitリポジトリで公開されている。