Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

FreeBSDのZFSファイルサーバ再インストールRTAはーじまーるよー

f:id:Windymelt:20211214023315p:plain
キッチンに乱雑に置かれているサーバ

この記事は「はてなエンジニア Advent Calendar 2021」の13日目の記事です。

qiita.com

昨日は id:papix の 『Perlで @EXPORT を @EXPORT_OK に置き換える』でした。

papix.hatenablog.com

目次

時に、2021年の師走のしわにて

ああ年末。巷ではなんかウイルスの新作が登場したり、一年の振り返りエントリが書かれたり、来たる2022年に向けてさまざまな活動が行われている。

そんな中、自分はどういったアドベントカレンダーを書くべきなのか。それを考えていたとき、自宅サーバがぶっ壊れてしまった。

自分は、テレビの録画とか、写真といった雑多なファイルの置き場としてファイルサーバを運用しており、それを自宅のキッチンに置いているのだが、先日OSのアップデートをやっていたとき、操作元の母艦であるWindowsがハングしてしまい、そのままシステムの共有ライブラリのフォーマットが狂ってしまい、Vimすら起動しなくなってしまい、気付いたときには死んでいた。

このアドベントカレンダー記事は、ぶっ壊れたシステムを直そうとした男の物語。

退避しつつ再インストールするRTAが始まる

しょうがないので、こうなったら再インストールするしかない。幸いにも、写真といったデータの類いはシステムとは完全に切り離したドライブで保存していたので、それは温存しながらFreeBSD自体をインストールしなおす、という作戦にする。

マルチユーザモードではそもそもログイン用のプログラムがまともに動かない状態なので、シングルユーザモードかつセーフモードで起動する。

自宅サーバではZFSというファイルシステムを用いていた。これは管理性の良さに定評があって、むずかしい操作をしなくてもスナップショットをとったり、別のサーバに移行したりできる。

ZFSはデータ管理の最大単位としていくつかのドライブを束ねたzpoolというものを使っていて、これはディスク自体にメタデータがあるのでOSが入れ替わっても読み込むことができる。 現状はシステム用のzpoolとデータ用のzpoolとが分かれていたので、大惨事は避けられた、という状態である。

とはいえ設定ファイルは脱出させたいので、家に落ちていたUSBディスクに内容を退避させる。

無事ディスクを認識したところで、newfsしてファイルシステムを作成しようとする。後に分かることだが、実はこれは罠だった。

設定ファイルをちまちまコピーしていく。

zpoolの様子を見る

システムだけがぶっ壊れたので、データのzpoolは無事なはず、ということを確認するためにzpool importを発行して様子を見る。ちゃんとRAIDが組まれた状態で認識されている。

データ用のzpoolに使われているのは ada1ada2ada3 の3つなので、これらは再インストールの標的にせずに温存することにした。

ガバる

ところでnewfsするとUFS2でディスクがフォーマットされるのだが、実はこれはラズパイでは読み込めない!!

そしてここで俺はオリジナルチャートを発動。しょうがないのでいったんディスクの中身をtarしてtmpfsに置き、その間にUSBディスクをnewfs_msdosを使ってFAT32でフォーマットした。

こうしてWindowsでも読み込めるようになったので、Windowsの母艦にデータを移したあと、このUSBドライブをFreeBSD13のインストールメディアにする。

利便性のためにも、たぶんUSBディスクは2つくらいあったほうが良いと思う。

FreeBSD13のインストール

USBから起動させてFreeBSDのインストールを開始する。最近のインストーラは親切なので、ウィザード形式でZFSの設定も行うことができる。ここではシステムドライブとして、データ用zpoolでは使われていないada0をシステム用zpoolに割り当てる。これ以外には難しい箇所はなし。

新システムでもちゃんとデータ用zpoolを認識したのでzpool import (zpool名)としてインポートする。

あとはSSHできるための最低限の設定(networkなど)をUSBドライブから復元する。

ここからはSSHで操作する。

ひとまずファイルサーバとしての機能が復元したら仮完了としようと思っていたので、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 さんです。よろしく!

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?