device path が変わった pool を import

Solaris 11 EA (Early Adopter) というのが出てました。ほぼ snv_173 そのもののようです。

先日、自宅のサーバ (Solaris11 Express, snv_151a) の BIOS とかを firmware してたら突然死亡して、せっかくだし EA release にしようと新規インストールしました。新しめの Intel on-board NIC である 82579V (pci8086,201b) にもちゃんと e1000g で動いていました。

ただ、 LSI MegaRaid SAS 9240-i8 が imraid_sas で認識されているもののディスクが見えない。 snv_151a のときに LSI から落としてきた imr_sas もダメでした。 JBOD じゃなくて virtual disk 作んないとダメかな? あとで余裕あるときに調べようと思っています。

で、ちょっとハマったメモ。

import

まともに export もせずに死んで OS だけ入れ替えたので、import しようとすると以下のとおり。

ichii386@oscar:~$ sudo zpool import 
  pool: tank
    id: 4765092275615549508
 state: UNAVAIL
status: The pool was last accessed by another system.
action: The pool cannot be imported due to damaged devices or data.
   see: http://www.sun.com/msg/ZFS-8000-EY
config:

        tank         UNAVAIL  missing device
          raidz1-0   ONLINE
            c1t0d0   ONLINE
            c1t3d0   ONLINE
            c1t1d0   ONLINE
            c1t2d0   ONLINE
        cache
          c1t1d0
ichii386@oscar:~$ sudo zpool import tank
cannot import 'tank': pool may be in use from other system, it was last accessed by oscar (hostid: 0x894ca0) on Wed Sep 28 12:24:59 2011
use '-f' to import anyway
ichii386@oscar:~$ sudo zpool import -f tank
The devices below are missing, use '-m' to import the pool anyway:
            16845364573619796447 [log]

cannot import 'tank': one or more devices is currently unavailable

device path が変わった

何が起きているかというと、OS 入れ替えに伴いケーブル差し替えをしたので、以下のように device path (の numbering) が変わったのでした。

device snv_151a 時代 snv_173 入れた後
hdd1 c2t0d0 c1t0d0
hdd2 c2t1d0 c1t3d0
hdd3 c2t2d0 c1t1d0
hdd4 c2t3d0 c1t2d0
log c1t0d0 なし
cache c1t2d0 なし

log, cache がなしになってるのは、 imraid_sas がうまくいかない都合です。

import -m (retry)

書いてあるとおりに -m を使って import すると、次のようになりました。

ichii386@oscar:~$ zpool status tank
  pool: tank
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
        invalid.  Sufficient replicas exist for the pool to continue
        functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-4J
  scan: none requested
config:

        NAME                    STATE     READ WRITE CKSUM
        tank                    DEGRADED     0     0     0
          raidz1-0              ONLINE       0     0     0
            c1t0d0              ONLINE       -     -     -
            c1t3d0              ONLINE       -     -     -
            c1t1d0              ONLINE       -     -     -
            c1t2d0              ONLINE       -     -     -
        logs
          16845364573619796447  FAULTED      0     0     0  was /dev/dsk/c1t0d0s0
        cache
          c1t1d0                FAULTED      -     -     -  corrupted data

errors: No known data errors

logs も cache もないので、これをなんとか消してやりたい。 logs は 1684... という数字を使って

ichii386@oscar:~$ sudo zpool remove tank 16845364573619796447

とすれば消えてくれるんですけど、 cache のほうは c1t1d0 が raidz1-0 に入ってると認識されてうまくいきません。

ichii386@oscar:~$ sudo zpool remove tank c1t1d0
cannot remove c1t1d0: only inactive hot spares, cache, top-level, or log devices can be removed

zdb

logs とおなじように device path じゃなくて数字 (guid) を指定したらうまくいきそうなんですけど、これはどうやって調べればいいんだ? ということで、 zdb の出番です。

しかし、たんに zdb tank しても、 cache の情報は出てくれませんでした。

ichii386@oscar:~$ sudo zdb tank

MOS Configuration:
        version: 31
        name: 'tank'
        state: 0
        txg: 1382933
        pool_guid: 4765092275615549508
        timestamp: 1317327582
        hostid: 4887412
        hostname: 'oscar'
        vdev_children: 1
        vdev_tree:
            type: 'root'
            id: 0
            guid: 4765092275615549508
            children[0]:
                type: 'raidz'
                id: 0
                guid: 3650509394302283806
                nparity: 1
                metaslab_array: 29
                metaslab_shift: 35
                ashift: 9
                asize: 4000766230528
                is_log: 0
                create_txg: 4
                children[0]:
                    type: 'disk'
                    id: 0
                    guid: 9100254656495358846
                    path: '/dev/dsk/c1t0d0s0'
                    devid: 'id1,sd@SATA_____WDC_WD10TPVT-00U_____WD-WX21A31P4321/a'
                    phys_path: '/pci@0,0/pci8086,201b@1f,2/disk@0,0:a'
                    whole_disk: 1
                    create_txg: 4
                children[1]:
                    type: 'disk'
                    id: 1
                    guid: 1408779724253808096
                    path: '/dev/dsk/c1t3d0s0'
                    devid: 'id1,sd@SATA_____WDC_WD10TPVT-00U_____WD-WX51A31U8925/a'
                    phys_path: '/pci@0,0/pci8086,201b@1f,2/disk@3,0:a'
                    whole_disk: 1
                    create_txg: 4
                children[2]:
                    type: 'disk'
                    id: 2
                    guid: 11558871919403241941
                    path: '/dev/dsk/c1t1d0s0'
                    devid: 'id1,sd@SATA_____WDC_WD10TPVT-00U_____WD-WXE1A21S3853/a'
                    phys_path: '/pci@0,0/pci8086,201b@1f,2/disk@1,0:a'
                    whole_disk: 1
                    create_txg: 4
                children[3]:
                    type: 'disk'
                    id: 3
                    guid: 17021081150085051024
                    path: '/dev/dsk/c1t2d0s0'
                    devid: 'id1,sd@SATA_____WDC_WD10TPVT-00U_____WD-WX41A31J8285/a'
                    phys_path: '/pci@0,0/pci8086,201b@1f,2/disk@2,0:a'
                    whole_disk: 1
                    create_txg: 4
(以下略)

man zdb すればわかりますが、これはふつうのユーザは使っちゃダメよらしいので、 http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/zdb/zdb.c を眺めて何とかならんかなー、と考えると、 "l2cache" という文字列がみえる。

そこで以下を試したところ、上手いこと行きました。

ichii386@oscar:$ sudo zdb -M l2cache tank

MOS L2 Caches:
        l2cache[0]:
            type: 'disk'
            guid: 10032807697961866673
            path: '/dev/dsk/c1t1d0s0'
            devid: 'id1,sd@SATA_____INTEL_SSDSC2MH25__LNEL119500KC250DGN/a'
            phys_path: '/pci@0,0/pci8086,201b@1f,2/disk@1,0:a'
            whole_disk: 1
ichii386@oscar:$ sudo zpool remove tank 10032807697961866673
ichii386@oscar:$ zpool status tank
  pool: tank
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on older software versions.
  scan: resilvered 54.5K in 0h0m with 0 errors on Fri Sep 30 07:02:18 2011
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c1t0d0  ONLINE       -     -     -
            c1t3d0  ONLINE       -     -     -
            c1t1d0  ONLINE       -     -     -
            c1t2d0  ONLINE       -     -     -

errors: No known data errors

感想

なんてとこで、snv_173 の話はちょこちょこ書いていいのかなー。