Archive for the 'opensolaris' Category

古いopensolarisとsi3124はやっぱり駄目

気づいたら年が明けた。 twitterやfacebookやらに情報を投げるようにしていると全然blogがかけなくなってしまうのは良くない傾向、ちょっとアウトプット先について見直したりするべきかもしれない。

さて、昨年末からうちのNASがそろそろ不調だなぁと思っていたところ、突然panicで落ちてしまって上がらなくなってきてしまった。シングルユーザモードでなら起動したので、dumpadmでクラッシュログを出すようにしてもう一度クラッシュするのを待って、クラッシュした後再度シングルユーザモードで/var/crash/マシン名/vmdump.0 (0のところは数字) ができているのを確認。savecore -vf /var/crash/マシン名/vmdump.0 /var/crash/ 的なことをしてvmcore.0とunix.0を生成する。 vmcore.0とunix.0ができたら、mdb -k vmcore.0 unix.0などしてmdbを起動してログを見る。シングルユーザモードだとmdbのページャが動かないので、頭に TERM=vt100;などとつけてやると良い感じ。

ログを一通りあさってみると、どうもrecursive mutex_enterなどというログが出ているのを見つける。調べてみると、 http://dlc.sun.com/osol/on/downloads/b136/on-changelog-b136.html このあたりで、

BUG/RFE:6786704recursive mutex_enter from si3124:si_tran_reset_dport caused by bus reset

と、これっぽい問題が解決されている様子。うちのNASはopensolaris snv_134でそのままにしていたせいでこの問題を見事に踏み抜いたようだ。

ここからが面倒で、opensolaris snv_134などという古いものをそのままにしていたせいで、opensolaris.orgはもう無くなっているし、openindianaのhow to upgradeの通りに試してみてもpython関係の依存関係かエラーでアップグレードもできない。

そこで、大変おすすめできないのだけど、下記の方法でドライバを差し替えた。

** 以下の方法はうっかりすべてのデータを失うおそれもあります。 **

  1. とりあえずopenindianaのlive DVDを落としてくる
  2. VMWareでそのlive DVDから起動する
  3. /kernel/drv/amd64/si3124をどうにかして取り出す(私は自分のサーバにアップロード)
  4. シングルユーザモードで起動した状態で、壊れたサーバの/kernel/drv/amd64/si3124に書き込む。元ファイルは念のためバックアップを取る
  5. 再起動

ちなみに、openindiana147のドライバで置き換えたところ、クラッシュまで一瞬時間が延びた気がするがやはり駄目。そこで最新のopenindiana151a8のドライバで置き換えたところ、クラッシュしなくなりアクセスできるようになった。つまり、si3124のドライバは最新のものでどうやらこの辺のバグをついにfixしきったということのようだ。

おそろしいことに、そのあとscrubをかけたところ、チェックサムエラーが山のように・・・。片っ端からディスクがDEGRADEしていって、最終的に全部の玉がDEGRADEしてしまったときの体調の悪さといったら、思い出すだに恐ろしい。

それでもzfsは全部のディスクからがんばってパリティを再生成してどうにかこうにかファイルを保全しようとしてくれる。もちろん欠損したファイルもすべてわかる。欠損したファイルはzpool status -v tankと-vオプションをつければ一覧で得ることができるので、こういうことになった方はチェックしてみると良いだろう。

・・新年そうそうものすごく胃の痛い思い、ちょっとお祓いにでも行ってくることを検討したくなる。

そんなこんなで、全然更新していませんがunos.bizは死んだわけではないです。今年もよろしくお願いいたします。

openindianaとFreeBSDのzfs互換性

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

zfs久々に試す

前からどうしようと思っていたNASのリプレイスのため、いくつか試験してみたのでメモ。環境はさっきダウンロードしてきたOpenIndiana(io_148) x86/64bitをVMWare上で動かした物。c2t0d0が起動ディスクで、c2t1d0, c2t2d0, c2t5d0が200MBの玉、c2t3d0, c2t4d0, c2t6d0が400MBの玉。連番じゃないのはちょっとミスしたからで他意はない。

容量制限したスライスでpool

市販されているHDDは、1TBと書いてあっても1TB(1 * 1000 * 1000 * 1000 * 1000 bytes)ではなくてそれよりいくらか多いのが普通だ。そのため、HDDをそのまま全容量でつかっていると、故障などの際に簡単に入れ替えられなくなる。それどころか違うインタフェイスに繋いだだけでそうなることもあるので(なっているので)、そうならないように容量制限したスライスを切って、スライスでRAIDZ1を組んでみる。

formatする

root@solaris:~# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c2t0d0 <VMware,-VMware Virtual -1.0  cyl 4093 alt 2 hd 128 sec 32>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c2t1d0 <VMware,-VMware Virtual S-1.0-204.80MB>
          /pci@0,0/pci15ad,1976@10/sd@1,0
       2. c2t2d0 <VMware,-VMware Virtual S-1.0-204.80MB>
          /pci@0,0/pci15ad,1976@10/sd@2,0
       3. c2t3d0 <VMware,-VMware Virtual S-1.0-409.60MB>
          /pci@0,0/pci15ad,1976@10/sd@3,0
       4. c2t4d0 <VMware,-VMware Virtual S-1.0-409.60MB>
          /pci@0,0/pci15ad,1976@10/sd@4,0
       5. c2t5d0 <VMware,-VMware Virtual S-1.0-204.80MB>
          /pci@0,0/pci15ad,1976@10/sd@5,0
       6. c2t6d0 <VMware,-VMware Virtual S-1.0-409.60MB>
          /pci@0,0/pci15ad,1976@10/sd@6,0
Specify disk (enter its number): 1
selecting c2t1d0
[disk formatted]


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> p


PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        expand - expand label to use whole disk
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition> print
Current partition table (original):
Total disk sectors available: 402979 + 16384 (reserved sectors)

Part      Tag    Flag     First Sector      Size      Last Sector
  0        usr    wm               256   196.66MB       403012    
  1 unassigned    wm                 0        0            0    
  2 unassigned    wm                 0        0            0    
  3 unassigned    wm                 0        0            0    
  4 unassigned    wm                 0        0            0    
  5 unassigned    wm                 0        0            0    
  6 unassigned    wm                 0        0            0    
  8   reserved    wm            403013     8.00MB       419396    

partition> 0
Part      Tag    Flag     First Sector      Size      Last Sector
  0        usr    wm               256   196.66MB       403012    

Enter partition id tag[usr]: 
Enter partition permission flags[wm]: 
Enter new starting Sector[256]: 
Enter partition size[402757b, 403012e, 196mb, 0gb, 0tb]: 150mb
partition> print
Current partition table (unnamed):
Total disk sectors available: 402979 + 16384 (reserved sectors)

Part      Tag    Flag     First Sector      Size      Last Sector
  0        usr    wm               256   150.00MB       307455    
  1 unassigned    wm                 0        0            0    
  2 unassigned    wm                 0        0            0    
  3 unassigned    wm                 0        0            0    
  4 unassigned    wm                 0        0            0    
  5 unassigned    wm                 0        0            0    
  6 unassigned    wm                 0        0            0    
  8   reserved    wm            403013     8.00MB       419396    

partition> label
Ready to label disk, continue? y

partition> quit

以下省略。とりあえず200MBの玉のなかに150MBのs0スライスを作った。

zpool作成

上記の玉3本でraidz1を作る

root@solaris:~# zpool create tank raidz1 c2t1d0s0 c2t2d0s0 c2t5d0s0
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            c2t1d0s0  ONLINE       0     0     0
            c2t2d0s0  ONLINE       0     0     0
            c2t5d0s0  ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zfs list tank
NAME                     USED  AVAIL  REFER  MOUNTPOINT
tank                     144K   258M  40.0K  /tank

特に問題なく作れたようだ。150MB*3でうち1本がパリティなので300MB弱程度あればいいはずなので若干容量が少ないが管理データだろうと思っておく。

ディスク丸ごと使ったディスクをスライスにreplace

zfsでは構成しているディスクを入れ替え(replace)が出来る。条件は容量が等しいか大きいか。元々丸ごとディスクで定義してあったものをスライスに持って行ければ自宅NASのリプレイスが簡単になる。早速試す。下記作業の前にc2t3d0, c2t4d0, c2t6d0のs0はすべて350MBにして作っておいてある。長いので省略。

root@solaris:~# zpool create tank raidz1 c2t1d0 c2t2d0 c2t5d0
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0
            c2t5d0  ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   120K   352M  40.0K  /tank

これで200MB*3のraidz1ができる。丸ごとHDDで構成した普通の作り。これをそれぞれc2t[3,4,6]d0s0にreplaceしていく。

root@solaris:~# zpool replace tank c2t1d0 c2t3d0s0
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: resilvered 55K in 0h0m with 0 errors on Tue Jun 28 18:54:39 2011
config:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            c2t3d0s0  ONLINE       0     0     0
            c2t2d0    ONLINE       0     0     0
            c2t5d0    ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zpool replace tank c2t2d0 c2t4d0s0
root@solaris:~# zpool replace tank c2t5d0 c2t6d0s0
root@solaris:~# zpool status tank
  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
root@solaris:~# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   138K   351M  40.0K  /tank

これで入れ替えは出来たが容量が変わらない。zpoolのautoexpand(自動容量拡張)プロパティを一度ONにしてやる必要がある。デフォルトはoffにしておいたほうが勝手に容量が変わらないので不慮の事故を防げるだろう。

root@solaris:~# zpool set autoexpand=on tank
root@solaris:~# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   158K   658M  40.0K  /tank
root@solaris:~# zpool set autoexpand=off tank
root@solaris:~# zpool status tank
  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

これで若干のresilverとともに移行が完了した。

本番での適用

この検証結果を適用したい本番サーバは1TBのHDD(WD10EADS)が10本ささっていて、うち8本でraidz2構成になっているサーバだが、この検証で安心してディスクリプレイスが可能になった。ひとまずリプレイス時には3TBクラスのHDDを購入の上、スライスを3*10^12bytesに切ってreplaceしていくと良さそうだ。Oracleに買収されて今後のzfs開発がどうなるかわからないが、他に代替のないファイルシステムである以上今後も使っていくことになるだろう。今後もzfsが消えないで無償で提供され続けることを期待したい。