この記事は「はてなエンジニア Advent Calendar 2021」の13日目の記事です。
昨日は id:papix の 『Perlで @EXPORT を @EXPORT_OK に置き換える』でした。
目次
時に、2021年の師走のしわにて
ああ年末。巷ではなんかウイルスの新作が登場したり、一年の振り返りエントリが書かれたり、来たる2022年に向けてさまざまな活動が行われている。
そんな中、自分はどういったアドベントカレンダーを書くべきなのか。それを考えていたとき、自宅サーバがぶっ壊れてしまった。
自分は、テレビの録画とか、写真といった雑多なファイルの置き場としてファイルサーバを運用しており、それを自宅のキッチンに置いているのだが、先日OSのアップデートをやっていたとき、操作元の母艦であるWindowsがハングしてしまい、そのままシステムの共有ライブラリのフォーマットが狂ってしまい、Vimすら起動しなくなってしまい、気付いたときには死んでいた。
死んでいます。ほとんどの実行ファイルが動かないので/rescue以下のバイナリを使います。これらは静的リンクされており、システムが損傷してもたいてい動くように設計されています。 pic.twitter.com/kojGgVDwf6
— 茶色ぼさねこ (@windymelt) 2021年12月13日
このアドベントカレンダー記事は、ぶっ壊れたシステムを直そうとした男の物語。
FreeBSDのぶっ壊れたZFS修復RTA、はーじまーるよ〜
— 茶色ぼさねこ (@windymelt) 2021年12月13日
退避しつつ再インストールするRTAが始まる
しょうがないので、こうなったら再インストールするしかない。幸いにも、写真といったデータの類いはシステムとは完全に切り離したドライブで保存していたので、それは温存しながらFreeBSD自体をインストールしなおす、という作戦にする。
— 茶色ぼさねこ (@windymelt) 2021年12月13日
マルチユーザモードではそもそもログイン用のプログラムがまともに動かない状態なので、シングルユーザモードかつセーフモードで起動する。
FreeBSDはこういうときなんか頑丈なのでよいですね pic.twitter.com/wZ73CdwoUS
— 茶色ぼさねこ (@windymelt) 2021年12月13日
方針としては、設定ファイルなどをバックアップしてから、システムディスクだけ置換する形でFreeBSDを再インストールします。データ用zpoolはシステムとは切り離してある(俺GJ!)ので、再インストール後はzpool importすれば回復する、という目論見です。システムのスナップを撮っとけばよかった。
— 茶色ぼさねこ (@windymelt) 2021年12月13日
自宅サーバではZFSというファイルシステムを用いていた。これは管理性の良さに定評があって、むずかしい操作をしなくてもスナップショットをとったり、別のサーバに移行したりできる。
ZFSはデータ管理の最大単位としていくつかのドライブを束ねたzpoolというものを使っていて、これはディスク自体にメタデータがあるのでOSが入れ替わっても読み込むことができる。 現状はシステム用のzpoolとデータ用のzpoolとが分かれていたので、大惨事は避けられた、という状態である。
エンジニアの家にはたいてい野良スティックがいくつか落ちているので、これを使います。 pic.twitter.com/LOmxpvvoDi
— 茶色ぼさねこ (@windymelt) 2021年12月13日
とはいえ設定ファイルは脱出させたいので、家に落ちていたUSBディスクに内容を退避させる。
ちゃんと認識した。 pic.twitter.com/8yLnXYgVes
— 茶色ぼさねこ (@windymelt) 2021年12月13日
無事ディスクを認識したところで、newfs
してファイルシステムを作成しようとする。後に分かることだが、実はこれは罠だった。
newfsします。 pic.twitter.com/9WUz3KsBpw
— 茶色ぼさねこ (@windymelt) 2021年12月13日
ちまちまコピーしています。 pic.twitter.com/kP5hS4R1BJ
— 茶色ぼさねこ (@windymelt) 2021年12月13日
設定ファイルをちまちまコピーしていく。
zpoolの様子を見る
データプールは普通に生きてるので、これは残します。つまりada123は消しちゃだめ。ada0がシステムディスクなのでこれだけ消してよい。 pic.twitter.com/4uZTu11Cjf
— 茶色ぼさねこ (@windymelt) 2021年12月13日
システムだけがぶっ壊れたので、データのzpoolは無事なはず、ということを確認するためにzpool import
を発行して様子を見る。ちゃんとRAIDが組まれた状態で認識されている。
データ用のzpoolに使われているのは ada1
、ada2
、ada3
の3つなので、これらは再インストールの標的にせずに温存することにした。
ガバる
ラズパイにさっきのUSBドライブをつないで移し替える。UFS2って読み込めたっけ、という気持ちになる pic.twitter.com/pu2OsQenD3
— 茶色ぼさねこ (@windymelt) 2021年12月13日
ところでnewfs
するとUFS2でディスクがフォーマットされるのだが、実はこれはラズパイでは読み込めない!!
そしてここで俺はオリジナルチャートを発動。しょうがないのでいったんディスクの中身をtar
してtmpfsに置き、その間にUSBディスクをnewfs_msdos
を使ってFAT32でフォーマットした。
なんかうまくいかないのでnewfs_msdosした。
— 茶色ぼさねこ (@windymelt) 2021年12月13日
こうしてWindowsでも読み込めるようになったので、Windowsの母艦にデータを移したあと、このUSBドライブをFreeBSD13のインストールメディアにする。
今度はfreebsdのイメージを焼いていく。 pic.twitter.com/FNFYWzmhih
— 茶色ぼさねこ (@windymelt) 2021年12月13日
利便性のためにも、たぶんUSBディスクは2つくらいあったほうが良いと思う。
FreeBSD13のインストール
ポチポチ pic.twitter.com/0Bx8CrqeBk
— 茶色ぼさねこ (@windymelt) 2021年12月13日
USBから起動させてFreeBSDのインストールを開始する。最近のインストーラは親切なので、ウィザード形式でZFSの設定も行うことができる。ここではシステムドライブとして、データ用zpoolでは使われていないada0
をシステム用zpoolに割り当てる。これ以外には難しい箇所はなし。
無事再インストールしたのでシステムにデータボリュームを認識させよう。 pic.twitter.com/WAHpmKeV0l
— 茶色ぼさねこ (@windymelt) 2021年12月13日
新システムでもちゃんとデータ用zpoolを認識したのでzpool import (zpool名)
としてインポートする。
あとはSSHできるための最低限の設定(networkなど)をUSBドライブから復元する。
なんとかバックアップを新マシンにダウンロードできた。 pic.twitter.com/7hrsgJ5jZq
— 茶色ぼさねこ (@windymelt) 2021年12月13日
ここからはSSHで操作する。
sambaインストールしてpdbeditでユーザ追加したら完了。
— 茶色ぼさねこ (@windymelt) 2021年12月13日
ひとまずファイルサーバとしての機能が復元したら仮完了としようと思っていたので、pkg install samba413
としてSambaサーバをインストールする。
また同じようにUSBディスクからsambaまわりの設定を復元し、pdbedit
を使ってSamba用のユーザを作成したところ、無事母艦からSambaでファイルを閲覧できるようになった。
完走した感想ですが・・・
だいたい4時間かかりました。途中でUFS2を使ってUSBディスクをフォーマットしてしまったのが痛かったですね。BSD系ではないOSではあまりUFSはサポートされていないのです。
以下のような教訓が得られました。
- OSとデータはディスクレベルで完全に隔離しておいたほうがよい
- 今回はこれが功を奏して復旧を行うことができました。
- OS部分は定期的なスナップショットを作成したほうがよい
- ZFS用のスナップショット自動化ツールがあるので、導入してみます。OSの設定はそんなに変化しないので、スナップショットの負担はあまり大きくない。
- そもそもアップデート前にもスナップショットとるべきだった
- これは完全にポカでした。
- 必要に応じてjailするとよい
- たとえば、Sambaシステムだけ隔離すると、その設定でいろいろおかしくなっても他に影響を与えないし、Jail単位でスナップショットもとれます。
iocage
というツールがあります。
- FreeBSDはこういうエマージェンシーに強い気がする
/rescue
の存在もそうですが、頑健思想という感じで組み立てられているのでファイルサーバといった用途にはちょうどよいですね。たまにライブラリ古かったり、Docker(これはLinuxの基盤に依存してる)が動かないといった問題もありますが。
皆様も自宅サーバの破壊には気を付けてくださいね。
結語
くぅ~疲れましたwこれにて完了です!自宅サーバはたまにこういう事が起こりますが、それだけシステムにも詳しくなっていきます。自分は普段の仕事ではクラウドで生活していますが、その裏側でどういったことが起こるのかといった事を知っておくと、普段の暮らしも息づいて見えてきてなかなか楽しいものです。なにより、滅茶苦茶にしても200万円請求されるといったことがないので、のびのび壊すことができます。なにかあったらSSHすればよいのです。まあ、今回はSSHすらできなくなりましたが…………
明日は、 id:utgwkk さんです。よろしく!