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で怒られるのだと思われる。