以前、SMB 2.0 以降を使う Samba サーバの共有フォルダを対象にして Windows のイメージバックアップを取ろうとするとSparse File の関係でバックアップが取れたり取れなかったりするという問題がありました。
同じような問題がOmniOS(illumos) でも発生していたので困っていました。
OmniOS は Open Solaris の系譜なので、ファイル共有は Samba ではなくKernel 内蔵の smb です。
というわけで、Linux のSamba と同じテクニックは使えず、原因も Sparse File ではありません。
† まず、結論から
いつも通り、解決するための結論から書いて置きます。
以下のようなコマンドで zfs 共有のnbmand
(Non Blocking mandatory locks)*1*2 プロパティをon
にしてやります。
どうもこのnbmand
というプロパティがoff
だとクライアントがファイルをうまくロックすることができず、これが原因になっていたようです。nbmand
のデフォルトはoff
ですし、おそらくパフォーマンス等に対するペナルティもあると思われるので、今回はバックアップに使う共有でだけon
にしています。Open Solaris の時からnbmand
はcross-protocol locking (例えば NFS と SMB を同時に使う)が必要な時だけon
にする必要がある*3という認識だったのですが、どうやらちょっと僕の認識が間違っていたようです。これまでoff
でもファイルサーバとしては特に問題になる挙動に当たったことがなかったのですが、このあたり近日中に詳しく調べてみたいと思います。
† 実際に発生するエラー
実際にバックアップを取ろうとすると発生するエラーは以下のような感じです。
10 年くらい増強しながら使い続けてきた仕事場のファイルサーバがさすがにやばくなってきたので、新しい構成に入れ替えました。
筐体は年初くらいに届いていたのですが、結局忙しくて 2 ヶ月くらい放置モードでした。
今回のサーバ構成はこんな感じ。
OS や構成的には安定したものを選んでいるのと、移行は zfs のsend
/recv
を使ったので特に苦戦しませんでした。
シーケンシャルなスループットは現状で 4~5Gbps (SSD 未搭載なので)くらいなので、普通にファイルサーバとして使うには十分な性能です。
とりあえず動くようになったので、今後は SSD を搭載したりメモリ増やしたりする予定です。
† HBA からはカーネルの warning が出るけど・・・
起動するたびにポートが 21 個あるとか言ってますが、何なんでしょうね?
Broadcom HBA 9400-16e のポートは miniSAS HD × 4 で、MiniSAS HD 1 ポートあたり SAS 4 ポートなので物理的にも 16 ポートしか存在しないはずなので、mpt_sas1
のバグでしょうか。
ひとまず実害はないようなので無視することにします。
zpool のディスクが 1 つ壊れてしまったので、zpool replace
で交換しようとしたら見慣れないエラーが出たのでメモ。
これは512B セクタで作った zpool に 4kB セクタのディスクを追加したときにこのエラーが発生するようです。
ちなみにashift
値のデフォルトは 512B セクタのときashift=9
、4KB セクタの時ashift=12
です。
パフォーマンスの問題を除いて 4kB セクタのディスクと 512B セクタの混在は問題にならないようなので、今回は強制的にashift=9
を指定して replace することにしました。
† 参考
Can't replace drive in older array because of ashift differences? (ashift=9 vs 12) : zfs
Yes, it is absolutely safe.
It's not ideal, as the messages you've seen indicate, but the only disadvantage is that of speed: ashift=12 will (probably) be faster.
OmniOS CE も昨年11月にアップデートされた r151036 からrsyslog
が使えるようになっています*1。
というわけで、syslogd
からrsyslogd
に切り替えを行ってみました。
切り替え方法は Oracle が公開しているSolaris 11.3*2と同様の方法で問題ありませんでした。
OmniOS bloody をインストールしているマシンをpkg update
しようとしたら、The following packages all deliver file actions
というエラーが出てアップデートさせてくれなくて困ったので、忘れないうちに対応方法をメモ。
パッケージ名が変わっているものがあると、コンフリクトしたような感じになるみたいですね。
以下のスレッドにあるとおり、pkg のキャッシュをリフレッシュしたら問題なくアップデートできました。
Update of OmniOS bloody fails due to Python package conflict | Topicbox
Can you try again after doing an explicit package refresh?
% pfexec pkg refresh --full
% pfexec pkg update -f
Omnios の設定を変更して rsh から root でログインしようとしたら、「Not on system console」と怒られてしまいました。
どうも Solaris ではセキュリティ強化のためにコンソール以外からの root ログインが認められていないようです。
対応方法はオフィシャルなマニュアルにありますが、以下にあるとおり安易な設定変更は止めた方が良さそうです。今回の対象のマシンは外部からアクセスできず、rsh のトラフィックが流れるネットワークも他のマシンから見えないようにあらかじめ分離してあるという条件が揃っているので、ログインを許可する設定に変更しました。
Not on system console (主要メッセージの手引き)
対処方法
一般ユーザーとしてそのシステムにログインし、su(1M) を実行してスーパーユーザーになります。どの端末からもスーパーユーザーとしてログインできるようにするには、/etc/default/login の CONSOLE 行をコメントにします (ただし、セキュリティ上の理由から、この方法は推奨しません)。
ファイルサーバに使っている OmniOS の入ったマシン上で DTrace を使って smb へのアクセスをリアルタイムに見てみました。
OmniOS CE は元々は OpenSolaris ということもあって DTrace が使えるので、こういうことはやろうと思えばすぐにできることは知っていたんですが、使われている言語がちょっと特殊なのでこれまで重い腰が上がらなかったんですよね。今回は[Dtrace SMB-related snippets] All things SMB #tags: smb, dtrace, io に掲載されている smb-read-write-lat-by-path.d を少し改造させてもらいました。
smb-read-write-lat-by-path-rt.d
実際にこれを走らせたときのログはこんな感じ。
これでファイルサーバの負荷やレイテンシをリアルタイムに見ることができるようになりました。
zfs の send/recv で旧サーバから新サーバにスナップショット転送しようとしたら 、何度やっても以下のようなエラーを吐いて失敗するファイルシステムがあるので困ってしまいました。
イヤな予感がしてふと zpool の状態を確認してみてびっくり。
Permanent error とか言われていました。。。。
どうもこれが問題の原因のようです。
そもそも zfs って checksum を勝手に照合しているからファイルの不整合って起きないんじゃ・・・と思っていましたが、破損が検出できるだけで壊れるときは壊れるんですね。
最近、電源の事故があってブッチリ切れたりしましたから、そのときかなぁとは思います。
こうなってしまうと破損したファイルは諦めるしかなく、当該のファイルやスナップショットを削除することで send/recv ができるようになります。
† 参考
HP Smart Array P420i を HBA モードで使っていると、OpenIndiana からは ディスクが認識できません。
これは標準でインストールされているcpqary3 ドライバが HBA モードに対応していないためです。
これをなんとかする方法がないかと思って調べてみたら、同じ illumos 系のSmartOS にHBA モードに対応した smrt というドライバ*1を発見。
ただ、SmartOS は OpenIndiana や OmniOS と違って、Zones や KVM を備えた仮想化ホストなので、Global Zone にソフトウェアをあれこれインストールして使うことは想定されておらず、実際にサーバとして使うためにはそのための環境を構築しなければならないという問題があります。
そんなわけで、SmartOS に載っている smrt ドライバを OpenIndiana にインストールして使えるようにしてみたのでメモ。
[OpenIndiana で HP Smart Array P420i を使う の続きを読む]ssh 経由だと zfs send/recv がかなり遅いので、暗号化されていない rsh を使ったデータの受送信に挑戦してみました。
mbuffer を使ったやり方*1 もあるんですが、受信送信サーバの両方で操作が必要なのであまりスマートじゃないんですよね。
以下、設定メモ。
[OmniOS で rsh を有効にする の続きを読む]