geli と ZFS で 4k ブロックサイズ2016年03月23日 11時49分49秒

geli は FreeBSD での暗号化デバイス。ZFS と共にも用いると思う。ZFS を利用するときには 4K ブロックにて読み書きをして負荷を減らすと推奨する事も多い。大概は、geom_nop を用いて一時的にデバイスのブロックサイズを 4096 バイトと偽って zpool を作成する。

geli はそれ自体でブロックサイズを調整出来る。init 時に -s オプションでバイト数を指定できる。ZFS を 4k ブロックにするためには geli init -s 4096 とすれば良い。

ggatec デバイスをスワップに使うとデッドロックを起こす2016年02月04日 13時08分55秒

FreeBSD の更新時に ggate が気になる様に普段から ggate は色々と使っている。公開先が一台のホストのみで、パーティション全てを占有でネットワーク越しに使うのなら NFS よりも断然早い。

実験の意味もあって今回 ggatec でインポートしたデバイスを swapon をして、スワップに使っていた。これはかなり危ない。ggatec のプロセスもスワップアウトしてしまうらしく、状況によっては復帰不可能になる。

第一段階の症状として、ggatec がスワップアウトしてしまう事。そうすると、pagein が出来なくなる。ggatec がメモリに戻らないと pagein が出来ないのだが、デバイスにアクセスする ggatec プロセスが、そのデバイス上に。そのような状態なると、swap pager が読み込みを待ち続けるので、以下のようなエラーがコンソールに出される。

swap_pager: indefinite wait buffer: bufobj: 0, blkno: xxxxxxxxxxx, size 4096

この状態になった時に、運良くシェルやログイン等がスワップアウトしていなくて、利用可能な状態であれな、ggatec rescue にて、ggate デバイスを復帰することが出来ると、何とか回復することが出来る。

しかし、運悪く既に全てのシェルとターミナルがスワップアウトしていると、残念ながら復旧は不可能。スワップをメモリに呼び戻す為に必要なプロセスが、スワップデバイス上にある為に、まさにデッドロック。

手も足も出ない状況でも、nfs サーバとしては機能していた。nfsd にはスワップアウトされない特別な仕掛けがしてあるのかも知れない。

buildworld が NFS や NULLFS でおかしい2015年09月01日 13時03分00秒

最近、11-CURRENT を頻繁に追いかけるようになっているので、buildworld と buildkernel はよく行なっている。複数のホストでコンパイル等を行なう事も増えてきた。

この時、/usr/src や /usr/obj が NFS や NULLFS だと、buildworld 時に、必ず toolchain が再コンパイルされるされるようだ。/usr/obj/usr/src/tmp ディレクトリに作られるコンパイラやらリンカ等、buildworld と buildkernel に必要なプログラムが。機能限定版の様だが llvm 等大物もある。

buildkernel には toolchain の作成は直に含まれないので、直接的な影響は無い。

もし、buildworld を別ホストで行なう場合は、nfs で export するよりも、ggated と ggatec でデバイス自体を渡し、ufs としてマウントした方が良いようだ。

ggatec が FreeBSD 10 RELEASE で故障中2015年07月03日 12時19分29秒

FreeBSD GEOM の ggatec/ggated が 10 系で壊れている。未初期化によるバグだ。新しく加えられた hast 用の引数に予期されない値があることにより、ggated が接続を拒否する。

どうも amd64 では再現しないようだが、i386 では使いものにならない。未初期化によるバグの典型で再現性に環境や利用状況に依存している。ggatec 側で正しく初期化を行って、接続要求を行う事により修正できる。

どうも、10.2 RELEASE に向けて修正が取り込まれるようだ。

FreeBSD の geom gate が壊れているみたいだ2014年12月22日 03時47分37秒

FreeBSD 10.0 RELEASE に上げたあたりから GEOM GATE の ggatec と ggated が使えなくなっているようだ。

永らくあれこれとパッチを取り込みかつ、己の変更も加えていた ggate を使っていた。9.0 RELEASE に上げたときに、GEOM に大幅な変更が加えられていたので、手元の変更が素直には適応できず、諦めて素のものに変えていた。

そんなわけで、素の ggate を使ったのは、それこそ七年近く前の ggate が安定しないの頃なので、果たして素のものが正しく動いていたのかさえ把握していない。

とりあえず、ggatec が以下のエラーを出して異常終了する。


ioctl(/dev/ggctl): Invalid argument.

なお、ggate はバージョン互換が無いので、異なったバージョンを通信させると上のエラーが出る。ここでは両方とも同じリリースを使っているので当てはまらないので、何らかの別の問題があるのだろう。

GELI の書き込みエラーを ZFS が処理をした2014年05月17日 08時06分06秒

現在、FreeBSD 8.4-RELEASE で ZFS を利用中。ZFS は GEOM ELI の上に作られている。

GELI に書き込みエラーがあった。


GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749073825792, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749073956864, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074087936, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074219008, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074350080, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074481152, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074612224, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074743296, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074874368, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749073694720, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749073825792, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749073956864, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074743296, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749074874368, length=131072)]
GEOM_ELI: Crypto WRITE request failed (error=5). da0.eli[WRITE(offset=749073694720, length=131072)]

心配でデータを調べたところ、表だった問題はない。

zpool status で調べたところ、問題を感知し対応処理を行ったとある。


% zpool status
  pool: zfs
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: resilvered 34K in 0h0m with 0 errors on Sun May 18 04:27:00 2014
config:

        NAME                    STATE     READ WRITE CKSUM
        zfs                     ONLINE       0     5     0
          da0.eli               ONLINE       0     5     0

errors: No known data errors

FreeBSD 9.0-BETA でデバイスが見えない2011年10月02日 14時14分09秒

9.0-BETA2 を試しているが、FreeBSD 7.2 以来使っているディスクのパーティションが認識されなくなった。既に随分前の事なのでどうやってパーティションを作ったかは覚えていない。gpt で作ったような気がする。

% ls -sld /dev/da1*
0 crw-r-----  1 root  operator    0, 182 Oct  1 22:10 /dev/da1

取り合えず、gpt と gpart で試してみる。


# gpt show /dev/da1
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34   785149101      1  GPT part - FreeBSD legacy
   785149135   680000000      2  GPT part - FreeBSD ZFS
  1465149135          32         Sec GPT table
  1465149167           1         Sec GPT header
# gpart show /dev/da1
=>        63  1465149105  da1  MBR  (698G)
          63  1465149105       - free -  (698G)

この様に gpt はパーティションを表示してくれるが gpart は何も分らないようだ。そこで、man gpart をすると、options GEOM_PART_GPT というものがあるらしい。

% grep PART /usr/src/sys/i386/conf/*
DEFAULTS:options        GEOM_PART_BSD
DEFAULTS:options        GEOM_PART_EBR
DEFAULTS:options        GEOM_PART_EBR_COMPAT
DEFAULTS:options        GEOM_PART_MBR
MINI:options    GEOM_PART_GPT           # GUID Partition Tables.
XEN:options     GEOM_PART_GPT           # GUID Partition Tables.
debug:options   GEOM_PART_GPT           # GUID Partition Tables.

みると、GENERIC カーネルには含まれない様だ。GEOM_PART_GPT を追加して、カーネルを再構築したら見られるようになった。

% ls -sld /dev/da1*
0 crw-r-----  1 root  operator    0, 182 Oct  1 23:10 /dev/da1
0 crw-r-----  1 root  operator    0, 184 Oct  1 23:10 /dev/da1p2
0 crw-r-----  1 root  operator    0, 183 Oct  1 23:10 /dev/da1s1

ちょっと気になったことがあるのでもう一度調べてみる。


% ls -sld /sbin/gp*t
26 -r-xr-xr-x  17 root  wheel  24764 Oct  1 22:35 /sbin/gpart
36 -r-xr-xr-x   1 root  wheel  36388 Jan  4  2010 /sbin/gpt

gpt のバイナリは古い FreeBSD からの物だった。

GEOM ggcomp2011年04月19日 17時54分17秒

数年前に調べた時に見つけた GEOM の ggcomp クラス。GEOM を用いてデバイスを圧縮するのが目的。今現在でも FreeBSD の GEOM の中にデバイスを圧縮する物は無い。

残念ながら、実用にならない。デバイス生成時に圧縮率の予想値を渡さなければいけない。その予想値を元に、現在割り当てられているデバイスにどれだけ入るかが計算されデバイス容量が決定する。その為、圧縮率の大きく異なるものが入れられない。

そんなわけで、今現在でもファイルを圧縮して書き込みたいのなら zfs しかない。しかし、zfs は zfs で余計な物が大量に必要になるので、読み書き可の単純なファイルシステムは無い。

ディスクが壊れた2010年10月25日 12時14分55秒

ラップトップ機から抜きだし、USB インターフェースに繋いでいた IBM の DTCA-24090 が遂に壊れた。4090MB で、Jul-98 と書いてある。

ここ二、三年酷使してきて、まだ壊れないものかと思ってはいたが、いざ壊れると悲しいものがある。

FreeBSD の buildworld を頻繁に行ない、GEOM journal を実験したり、容量が少ないのをどうにかするために、ZFS の圧縮を利用したりと、かなり酷使したハードディスクだった。gpt/gpart などもこれで色々と試した。

最後は呆気ないものだった。急に USB を差し込んでも、回転しなくなった。繋いだ瞬間にプシュン、プシュンとなったあと何も起きない。デバイスとして認識もされない。一応、USB 変換器の故障もあり得るので他のディスクを繋げたら問題なく回った。やはり、ハードディスクだったみたいだ。

FreeBSD で ZFS と共に GELI を使う2010年07月21日 04時59分27秒

FreeBSD でディスクの暗号化と言えば GELI。GEOM_ELI が正式なモジュールの名前になっている。

geli init で -a を使うと更に、データの整合性も調べられるようになる。データのハッシュ値を保存して、もしデータの破損が確認される。なお、-a オプションを使わないとこの機能は有効にはならない。ただ、データの有効性を調べるだけなので、壊れてしまったら直すことは出来ない。raid3 や mirror などの別の方法でデータ破損に備える必要がある。

そのため、zfs を暗号化するために、geli を用いるのであれば、百害あって一利無しとなる。zfs では、最初からデータの整合性の確認は有効になっていて、破損していても raid-z や mirror では、しっかりと対処してくれる。