FreeBSD で Read-Only で困ったら(ZFS)

PC-UNIX

[小ネタ]FreeBSD で Read-Only で困ったら(ZFS)

小ネタです。またやらかす可能性があるので、メモしておきます。

トラブルの内容


遭遇トラブル:ファイルシステム異常
おそらくの原因:停電・UPSなどの電源寸断によるシステム急停止
すぐやる対処:fsck でなおるはず

最近システムをまともに触っていないのが仇となって、やらかしました。内容は上の通りです。
古い規格のマシンに旧規格のまま FreeBSD をインストールしたものシステムに慣れていたためか、ZFS で組んだファイルシステムで、トラブったときに一瞬焦りました。


# remount できない

# mount -o rw / できない

FreeBSD の場合は、単に現状が読み取り専用なら


# mount -u /

とやれば書き込みができるようになります。現状が書き込み可能なら同じコマンドで読み込み専用になります。つまり、現状の反対の設定になるということです。

読み込み専用のファイルシステムを書き込み可能にする

ファイルシステムにエラーが生じたときは、システムはファイルシステムの復旧待ちで通常モードでは起動しないことがあります。それでも、シングルユーザーモードで起動して、シェル(通常は sh)を使って、fsck コマンドをたたいてやれば復旧します。これは Windows でいう CHCKDISK(チェックディスク) みたいな機能です。

この場合では、ルートディレクトリ(/)が読み込み専用になるため、そのままでは設定ファイルを書き換えてシステム回復することができません。

そのため、普通は

 bash
mount -o rw /

 bash
mount -w /

として、ルートディレクトリ(/)に書き込めるようにします。
ところが、 ZFS でファイルシステムで組んだ場合は、そのコマンドが通りません。

ZFS root な場合

FreeBSD のファイルシステム( / パーティションを)を ZFS にしている場合は、システムを Single user mode で起動したときに上の mount -o rw や remount / といったコマンドが通りません。

そんな時(ZFS のときは)は、

 bash
# zfs set readonly=off zroot

とコマンドを打ちます。
ただこれだけでした。

ZFS の豆知識

ちなみに ZFS(Zettabyte File System)というのは、UNIX 系の OS で使用されるファイルシステムの一つです。Windows 使いの方は NTFS みたいな流派の一つだと理解しておくといいかと思います。NTFS と大きく違うのは、技術的なことはともかく、まずオープンソースであるという点です。
元々は、Solaris (SunOS) (サンマイクロシステムズ、現在はオラクル)の Unix File System (UFS) の流れにあるファイルシステムです。
128ビット・アドレッシングなどの特徴があり、UFS の次世代ファイルシステムです。オープンソースゆえに、FreeBSD(私が使用しているのは 13.1 REL) でも普通に動きます。

Solaris で使用する方がフル機能が使えるのかなと考えてはいるのですが、FreeBSD で使用した場合はどうなるのか今後検証してみます。ZFS は 128 ビットのファイルシステムですので、ほぼ無限大と言えるようなファイルシステムを構築できます。一つのファイルシステムで何テラバイトまでというような制限がありません。それを利用して、ストレージの仮想化、OS の仮想化ができます。ハードウェアやソフトウェアの障害に強い修復システムがある、セキュリティ管理機能が強力などの特徴もあります。

手っ取り早く言えば、物理的に一台のPCを複数人で同時に自分の専用PCのごとく使用するような、サーバー用途、つまり仮想サーバー構築に適したファイルシステムです。
ストレージの仮想化という言葉がわかりにくいかと思いますが、物理的なHDDなどのストレージや、ディスクの一部を使うパーティション、あるいはもっと小さい単位の実ファイルなどをまとめて、ストレージプールという一つの仮想デバイスを構成できます。この場合、どの物理ディスクにデータがあるなどということを意識する必要はなく、ストレージプールにあるデータという感覚で使えます。
また、ストレージプールには動的に物理デバイスを追加できるのも特徴です。

現状では、SSD などの半導体デバイスはまだ容量は小さめですので、小さめのストレージを次々に追加してまとめて一つに扱いたいというようなことが普通にあります。

終わりに、ファイルシステムを復旧して再起動

ZFS なんて関係なかったよという人は、冒頭のコマンドの後にいつもの呪文を唱えます。
ファイルシステムを復旧コマンドはいつもと同じです。

 bash
fsck -y /dev/ada2s1a(ここは物理的なデバイスを調べて便宜変更)

RECOMMEND

-PC-UNIX
-,