SDカード障害後のホームサーバー再構築:NixOSサバイバル物語
Raspberry Pi 4BのホームサーバーがmicroSDカードの故障でダウン。筆者はNixOS、zram、古いHDDによるbtrfs RAID1、宣言的サブボリューム管理で再構築する。
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/sdYNixOSによる宣言的サブボリューム管理
筆者は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リポジトリで公開されている。
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。