カテゴリー
FreeBSD

FreeBSDでブート時にZFS上の/usrがマウントできない場合の対処

長年使っているFreeBSDマシンは、以下のような構成だった。

  • OS: FreeBSD 12.3-RELEASE
  • ブートデバイス: USBメモリ (BIOSとGPT)
  • ルートファイルシステム: 上記USBメモリ上のUFSパーティション
  • 他のファイルシステム(/usr, /var等): HDDでRAIDZを組んだzpoolの中

なお、/boot/loader.confに’zfs_load=”YES”‘、/etc/rc.confに’zfs_enable=”YES”‘は記述済みである。

このマシンの構成を、以下のように変更した。

  • OS: 変更なし
  • ブートデバイス: NVMeのSSD (EFIとGPT)
  • ルートファイルシステム: 上記SSD上のUFSパーティション
  • 他のファイルシステム: 変更なし

ブートデバイスを適切に(EFIを使用するように)設定し、ルートファイルシステムをdump + restoreでコピーして再起動したのだが、再起動後にブートが止まってしまった。

ブート時の画面表示を確認すると、カーネルは実行されているのだが、以下のようなエラーが出ていた(ブート時の画面表示は、ScrLkキーでスクロールを止めた後、PgUpキーで遡れる)。

mount: /usr: unknown special file or file system

その周辺の挙動を探っていくと、上記エラーログが出てしばらくしてから、HDD(/usrが入っているzpoolを構成するHDD)が認識されている画面表示が出ていた。

また、シングルユーザーモードで起動し、手動で”zfs mount -a”を実行すると、実行する頃にはHDDが認識されているので、正常にマウントできる。

このことから、ブート時にzpool内の/usrをマウントしようとする際に、まだHDDが認識されていないので、/usrがマウントできずにエラーになっているのではないか? と考えた。

いろいろググっていると、MLのアーカイブを発見した。

「mount -p」の結果を/etc/fstabに書き加えれば良いらしい。

試してみると確かに正常にマウントできてブートが進む。画面表示から推測すると、/etc/fstabを処理する際には、書かれているFSがマウントできない場合は、マウントできるまでリトライするらしい。

今回の場合、起動に必須なのは/usrだけなので、/etc/fstabに以下の記述だけを加えることにした。

# to avoid mounting /usr before ada0 attached.
raidtank/usr /usr zfs rw,noatime,nfsv4acls    0 0

再起動したところ、「mount -p」の全結果を書いていたときと同様に、正常にブートが進んだ。ただし1点不明なことがある(後述)。

以下余談。起動時の/etc/rc.d/*の起動順と、「残りのzfsのマウント」の話。

ブート時のzpool内のzfsのマウントは、/etc/rc.d/zfsで行われる。このファイルの中には、「BEFORE: FILESYSTEMS」の記述がある。

また、/etc/rc.d/FILESYSTEMS(何も実行せず、依存関係のみが書いてある)には「REQUIRE: mountcritlocal」の記述がある。

さらに、/etc/rc.d/mountcritlocalの中では「mount -a」が実行される。「mount -a」が失敗した場合、しばらく待ってからリトライする処理もスクリプト内に書かれている。

以上をまとめると、HDDの認識が遅い場合、ブート時のファイルシステムのマウントは以下のようになる。

  1. /etc/rc.d/zfsを実行する。(“zfs mount -a”を実行する。ただし、まだHDDが認識されていないのでマウントに失敗する)
  2. /etc/rc.d/mountcritlocalを実行する。(“mount -a”を実行する。HDDが認識されるまでリトライする)
  3. (タイミングや実行スクリプトは不明だが、zpool内の残りのzfsをマウントする)

上記3.を実行する仕組みが不明なので、引き続き調査していきたい。

カテゴリー
FreeBSD

zvol内のNTFSデータをマウントする方法

FreeBSDのzpoolの機能であるzvolを使ってボリュームを作り、そのボリュームをiSCSIを使ってWindowsマシンに公開しています。ボリュームの中のデータをFreeBSDから取得したい時の方法を調べたのでメモします。

要点は2つ。

  • zvolのディスクイメージをマウントしたい場合は、ボリュームをsnapshot→cloneした上でvolmode=geomを使う
  • NTFSのマウントには、ntfs-3g (fusefs-ntfsパッケージ) を使う

zvolのディスクイメージをマウントする方法

zvolをマウントするには、GEOMベースのツールが使えるように、ボリュームのプロパティを volmode=geom にする必要があります。

ただプロパティを変えただけではダメで、変えた後に再起動するか、snapshotを作った上でcloneし、cloneする際にプロパティを指定する必要があります。今回は後者で。

# zfs snapshot raidtank/iscsi/windows_disk@snap
# zfs clone -o volmode=geom raidtank/iscsi/windows_disk@snap raidtank/iscsi/windows_disk_clone

ここまでやると、 /dev/zvol/raidtank/iscsi/windows_disk_clonep* ができます(ボリューム内のディスクラベルに応じて)。

NTFSのボリュームをマウントする方法

NTFSのボリュームをマウントするには、fusefs-ntfsにあるntfs-3gを使います。

fusefs-ntfsをインストールしたら、

# ntfs-3g -o ro /dev/zvol/raidtank/iscsi/windows_disk_clonep2 /mnt

なお、fusefs-ntfsのインストール後に、/usr/sbin/mount_ntfs-3gというシンボリックリンクを手動で作った場合でも、「mount -t ntfs-3g (以下略)」ではなぜか失敗します(zvolだから?)。

参考文献

カテゴリー
FreeBSD PC

sendmail + spfmilter でSPFを有効活用する

メール関係の技術で、「SPF (Sender Policy Framework)」というのがあります。これは、「あるドメインからメールを出すはずのIPアドレスを、ドメイン管理者が設定する。メール受信側では、その設定を見て、なりすましかそうでないかの判断材料にする」という仕組みです。

今回、sendmail環境でSPFを使用する「spfmilter」というソフトを入れてみました。FreeBSD (9.3-RELEASE) で行っています。

(1/20) configureの引数を追加しました(manがインストールされるディレクトリの修正)。

(1/20) spfmilter_flagsの記述を追加しました(root権限でなくても動作することを確認)。

カテゴリー
FreeBSD PC

LTOドライブを買った

日々増大するアニメ録画に対応するために、テープドライブ(LTO)を購入しました。

今まで(約3年間)はタイトルごとにBlu-Ray DiscにBDAVフォーマットで焼いて待避していたのですが、メリットとデメリットがあります。

  • (メリット) 民生用の機械に突っ込めば見られる。
  • (デメリット) BD-R DLの場合、50GBづつしか待避できない。
  • (デメリット) BDXLの場合、100GBづつ待避できるが、メディアが高い。
  • (デメリット) それなりにメディアがかさばる。

テープドライブの最近の主流は「LTO (Linear Tape-open)」という規格です。最新のLTO-6規格では、VHSテープ半分ぐらいのテープカートリッジ1本に、2.5TB(BD-R DL 50枚分)のデータが入ります。値段がこなれているLTO-4規格でも、800GB入ります。

テープドライブを導入した場合、以下のようになります。

  • (メリット) LTO4の場合、一度に800GB待避できる。メディアもあまりかさばらない。
  • (デメリット) 録画データを見るときはPCが必要。一度HDDにコピーしてから再生という手間がかかる。
  • (デメリット) 初期投資がかかる。LTOドライブと、対応するインターフェースカード(SASなど)

さまざまな事を考え、導入することにしました。

カテゴリー
FreeBSD PC

IIJmioのFiberAccess/NFとIPv4固定プロバイダを併用する

ネットワーク環境を更新したのでメモ書きします。

    • フレッツ光で、IIJmioのFiberAccess/NFと、別のプロバイダ(IPv4固定)を併用する設定を行います。
    • IIJmioのDS-Liteを使用する設定を行います。
    • IPv4のデフォルトゲートウェイをDS-Liteに向けて、かつ固定IPアドレスに対する接続の応答を正常に扱えるようにします。
    • FreeBSDによる設定を扱います。
    • ひかり電話無しでの設定に特化しています。
    • mioひかりでも同じ設定が使えます。