opensolarisが、というよりはsolarisが守銭奴様に買収されて久しい。

うちはファイルサーバにopensolarisを使っているのだが、この際solarisの一番安いライセンスが現実的な値段であればO社と契約しようかとも思ったのだが、だいぶ非現実的な価格だったこともあって契約に至らず、かといってopensolarisは状況が状況で、ということで移行先に悩んでいた。

移行先はいくつかあるが、その中でも一番手間無くすっと移行できそうなのがopenindiana。出た当初はちょっと手間が要りそうな気配ではあったが今はだいぶ手軽に使える模様、VM上で色々テスト中だ。

ところでうちは昔はよくFreeBSDを使っていた。しばらく使わなくなってしまっていたが、zfsのOS間互換がどれくらい効くのか知りたくて、FreeBSD9-RC1を入れてみた。試すのは、zfsのアレイを相互のOS間で入れ替えて使えるのか、だ。

まず環境。openindianaについては先日の記事の通り。あの後、pkg image-update –be-name solaris-151として、openindiana 151aにアップデートしたがその程度の違い。いずれも、zfs version5とzfs pool version28がサポートされている。

FreeBSDは、0.5GBのSCSIディスクを3台追加(/dev/da1, /dev/da2, /dev/da3)してから、それぞれにfdiskで500MBのスライス(partition type=191(=0xbf, Solaris(new)))を作成した。それぞれ/dev/daNs1となっている。こんな感じ。

freebsd# fdisk /dev/da1
******* Working on device /dev/da1 *******
parameters extracted from in-core disklabel are:
cylinders=512 heads=64 sectors/track=32 (2048 blks/cyl)

parameters to be used for BIOS calculations are:
cylinders=512 heads=64 sectors/track=32 (2048 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 191 (0xbf),(Solaris x86 (new))
    start 32, size 1023968 (499 Meg), flag 0
	beg: cyl 0/ head 1/ sector 1;
	end: cyl 499/ head 63/ sector 32
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>

これで、

freebsd# zpool create tank raidz1 /dev/da1s1 /dev/da2s1 /dev/da3s1

してやって、このようにzpoolを作ることが出来る。

freebsd# zpool status tank
  pool: tank
 state: ONLINE
 scan: scrub repaired 0 in 0h0m with 0 errors on Wed Nov  2 16:25:18 2011
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    da1s1   ONLINE       0     0     0
	    da2s1   ONLINE       0     0     0
	    da3s1   ONLINE       0     0     0

errors: No known data errors

ここからが本番。これでFreeBSD側をシャットダウンして(*)、openindiana側のディスクとしてこれら3本のディスクを追加。openindiana側を起動する。でおもむろにimportしてみると。

root@solaris:~# zpool import
  pool: tank
    id: 7276812488085196296
 state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
        the '-f' flag.
   see: http://www.sun.com/msg/ZFS-8000-EY
config:

        tank           ONLINE
          raidz1-0     ONLINE
            c2t8d0p1   ONLINE
            c2t9d0p1   ONLINE
            c2t10d0p1  ONLINE

他のシステムで使ってるよって怒られてしまう(exportを忘れたためか)が、指示の通り名前を指定してimportしてみると、すでにtankという名前のzpoolがあるのでまたも怒られてしまう。で、新しい名前も指定してやると、こうなる。

root@solaris:~# zpool import -f tank tankbsd
root@solaris:~# zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c2t0d0s0  ONLINE       0     0     0

errors: No known data errors

  pool: tank
 state: ONLINE
  scan: resilvered 63K in 0h0m with 0 errors on Tue Jun 28 18:55:01 2011
config:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            c2t3d0s0  ONLINE       0     0     0
            c2t4d0s0  ONLINE       0     0     0
            c2t6d0s0  ONLINE       0     0     0

errors: No known data errors

  pool: tankbsd
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Wed Nov  2 16:25:18 2011
config:

        NAME           STATE     READ WRITE CKSUM
        tankbsd        ONLINE       0     0     0
          raidz1-0     ONLINE       0     0     0
            c2t8d0p1   ONLINE       0     0     0
            c2t9d0p1   ONLINE       0     0     0
            c2t10d0p1  ONLINE       0     0     0

errors: No known data errors

この通り。中にあったデータもとりあえずファイルの中身は問題なく扱うことが出来た。uid/gidもそのまま、日付時刻も同じ。ちなみに、この状態でopenindianaをシャットダウンして(*)、FreeBSD側を起動(まだ同じdiskはマウントしている)すると、このパーティションのマウントに失敗する。もう一度FreeBSD側でimportしてやれば読むことは可能だ。

結論としては、どうやらあまり凝ったことをしなければ、openindianaとFreeBSDの間でzpoolを移行することはさして難しくない、ということになるだろう。参考になれば幸い。

–追記(2011/11/04)

よく見たら、インポート後にopenindiana側で見た玉のディスク名がc2t8d0p1とかになっていることに気がついた。論理ディスク名はここにあるように、c[論理コントローラ番号]t[論理バスターゲット番号]d[ドライブ番号]となって、その後ろにs[スライス番号]もしくはp[fdiskバーティション番号]が付く。うっかり癖でfdiskパーティション(FreeBSDのfdiskだとスライスって書いてあるのがややこしい)を切ったのが原因だったわけで、適当にopenindianaで試したときのようにs0になるように切りたければ、use entire diskしておきつつdisklabelで末尾がaのFreeBSDパーティション(これがsolarisだとスライス)を作っておけばいいんじゃなかろうか。そうなるとda1s1aとかになるはず。そのうち暇が出来て必要になったら検証してみよう。

(*)どっちもexportを忘れた。だからいちいちimportで怒られるのだと思われる。

Something to say?