Oracle Solaris ZFS 管理ガイド

ZFS ルートプールまたはルートプールのスナップショットを回復する

ここでは、次のタスクを実行する方法について説明します。

ProcedureZFS ルートプールのディスクを置き換える方法

次の理由により、ルートプールのディスクの置き換えが必要になることがあります。

ミラー化ルートプール構成では、代替メディアからの起動を行わずにディスク交換を試みることができます。zpool replace コマンドを使用すれば、障害が発生したデバイスを置き換えることができます。あるいは追加ディスクがある場合には、zpool attach コマンドを使用できます。追加ディスクの接続やルートプールディスクの切り離しの例については、この節に含まれる手順を参照してください。

一部のハードウェアでは、故障したディスクを交換するための zpool replace 操作を試みる前に、ディスクをオフラインにして構成解除する必要があります。次に例を示します。


# zpool offline rpool c1t0d0s0
# cfgadm -c unconfigure c1::dsk/c1t0d0
<Physically remove failed disk c1t0d0>
<Physically insert replacement disk c1t0d0>
# cfgadm -c configure c1::dsk/c1t0d0
# zpool replace rpool c1t0d0s0
# zpool online rpool c1t0d0s0
# zpool status rpool
<Let disk resilver before installing the boot blocks>
SPARC# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t0d0s0
x86# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t9d0s0

一部のハードウェアでは、交換用ディスクの装着後にそのディスクをオンラインにしたり再構成を行ったりする必要がありません。

交換用ディスクからの起動をテストできるように、また、交換用ディスクに障害が発生した場合に既存のディスクから手動で起動できるように、現在のディスクと新しいディスクの起動デバイスのパス名を特定する必要があります。次の手順の例では、現在のルートプールディスク (c1t10d0s0) のパス名は次のとおりです。


/pci@8,700000/pci@3/scsi@5/sd@a,0

交換用起動ディスク (c1t9d0s0) のパス名は次のとおりです。


/pci@8,700000/pci@3/scsi@5/sd@9,0
  1. 交換用ディスク (新しいディスク) を物理的に接続します。

  2. 新しいディスクに SMI ラベルが付けられていてスライス 0 があることを確認してください。

    ルートプールに使用するディスクのラベルを変更する方法については、次のサイトを参照してください。

    http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide

  3. 新しいディスクをルートプールに接続します。

    次に例を示します。


    # zpool attach rpool c1t10d0s0 c1t9d0s0
    
  4. ルートプールのステータスを確認します。

    次に例を示します。


    # zpool status rpool
      pool: rpool
     state: ONLINE
    status: One or more devices is currently being resilvered.  The pool will
            continue to function, possibly in a degraded state.
    action: Wait for the resilver to complete.
     scrub: resilver in progress, 25.47% done, 0h4m to go
    config:
    
            NAME           STATE     READ WRITE CKSUM
            rpool          ONLINE       0     0     0
              mirror-0     ONLINE       0     0     0
                c1t10d0s0  ONLINE       0     0     0
                c1t9d0s0   ONLINE       0     0     0
    
    errors: No known data errors
  5. ディスクの再同期化が完了したら、新しいディスクにブートブロックを適用します。

    次のような構文を使用します。

    • SPARC:


      # installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t9d0s0
      
    • x86:


      # installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t9d0s0
      
  6. 新しいディスクから起動できることを確認します。

    たとえば、SPARC システムの場合、次のような構文を使用します。


    ok boot /pci@8,700000/pci@3/scsi@5/sd@9,0
    
  7. 新しいディスクからシステムが起動した場合は、古いディスクを切り離します。

    次に例を示します。


    # zpool detach rpool c1t10d0s0
    
  8. システムが新しいディスクから自動的に起動するように設定します。そのためには、eeprom コマンドまたは SPARC ブート PROM のsetenv コマンドを使用するか、PC BIOS を再設定します。

Procedureルートプールのスナップショットを作成する方法

回復に利用できるようにルートプールのスナップショットを作成することができます。ルートプールのスナップショットを作成するための最適な方法は、ルートプールの再帰的なスナップショットを実行することです。

次の手順に従って、再帰的なルートプールスナップショットを作成し、そのスナップショットをリモートシステムでプール内のファイルとして保存します。ルートプールで障害が発生した場合には、NFS を使ってリモートデータセットをマウントし、そのスナップショットファイルを受信して作成し直したプール内に格納することができます。代わりに、ルートプールスナップショットをリモートシステムのプール内の実際のスナップショットとして保存することもできます。修復対象のシステムを Solaris OS ミニルートから起動する一方で ssh を構成または rsh を使用する必要があるので、リモートシステムとのスナップショットの送受信は、やや複雑です。

ルートプールスナップショットをリモートで保存して回復する方法、およびルートプールの回復に関する最新情報については、次のサイトを参照してください。

http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide

ファイルまたはスナップショットとしてリモートに格納されたスナップショットの内容を確認することは、ルートプールを回復する際の重要なステップです。プールの構成が変更された場合や Solaris OS をアップグレードした場合など、定期的にいずれかの方法を使ってスナップショットを作成し直すべきです。

次の手順では、zfsBE ブート環境からシステムを起動します。

  1. リモートシステム上で、スナップショットを格納するためのプールとファイルシステムを作成します。

    次に例を示します。


    remote# zfs create rpool/snaps
    
  2. ファイルシステムをローカルシステムと共有します。

    次に例を示します。


    remote# zfs set sharenfs='rw=local-system,root=local-system' rpool/snaps
    # share
    -@rpool/snaps   /rpool/snaps   sec=sys,rw=local-system,root=local-system   "" 
  3. ルートプールの再帰的なスナップショットを作成します。


    local# zfs snapshot -r rpool@0804
    local# zfs list
    NAME                        USED  AVAIL  REFER  MOUNTPOINT
    rpool                      6.17G  60.8G    98K  /rpool
    rpool@0804                     0      -    98K  -
    rpool/ROOT                 4.67G  60.8G    21K  /rpool/ROOT
    rpool/ROOT@0804                0      -    21K  -
    rpool/ROOT/zfsBE           4.67G  60.8G  4.67G  /
    rpool/ROOT/zfsBE@0804       386K      -  4.67G  -
    rpool/dump                 1.00G  60.8G  1.00G  -
    rpool/dump@0804                0      -  1.00G  -
    rpool/swap                  517M  61.3G    16K  -
    rpool/swap@0804                0      -    16K  -
  4. ルートプールのスナップショットをリモートシステムに送信します。

    次に例を示します。


    local# zfs send -Rv rpool@0804 > /net/remote-system/rpool/snaps/rpool.0804
    sending from @ to rpool@0804
    sending from @ to rpool/swap@0804
    sending from @ to rpool/ROOT@0804
    sending from @ to rpool/ROOT/zfsBE@0804
    sending from @ to rpool/dump@0804

ProcedureZFS ルートプールを再作成しルートプールのスナップショットを復元する方法

この手順では、次の条件を前提としています。

手順はすべてローカルシステム上で実行します。

  1. CD/DVD またはネットワークから起動します。

    • SPARC: 次のいずれかのブート方法を選択します。


      ok boot net -s
      ok boot cdrom -s
      

      -s オプションを使用しない場合は、インストールプログラムを終了する必要があります。

    • x86: DVD またはネットワークから起動するオプションを選択します。その後、インストールプログラムを終了します。

  2. リモートのスナップショットのデータセットをマウントします。

    次に例を示します。


    # mount -F nfs remote-system:/rpool/snaps /mnt
    

    ネットワークサービスを構成していない場合は、remote-system の IP アドレスを指定する必要があります。

  3. ルートプールのディスクが置き換えられ、ZFS で使用可能なディスクラベルを含んでいない場合は、ディスクのラベルを変更する必要があります。

    ディスクのラベル変更の詳細は、次の Web サイトを参照してください。

    http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide

  4. ルートプールを再作成します。

    次に例を示します。


    # zpool create -f -o failmode=continue -R /a -m legacy -o cachefile=
    /etc/zfs/zpool.cache rpool c1t1d0s0
    
  5. ルートプールのスナップショットを復元します。

    この手順には時間がかかることがあります。次に例を示します。


    # cat /mnt/rpool.0804 | zfs receive -Fdu rpool
    

    -u オプションを使用すると、復元されたアーカイブは zfs receive 処理の完了時にマウントされません。

  6. ルートプールのデータセットが復元されていることを確認します。

    次に例を示します。


    # zfs list
    NAME                        USED  AVAIL  REFER  MOUNTPOINT
    rpool                      6.17G  60.8G    98K  /a/rpool
    rpool@0804                     0      -    98K  -
    rpool/ROOT                 4.67G  60.8G    21K  /legacy
    rpool/ROOT@0804                0      -    21K  -
    rpool/ROOT/zfsBE           4.67G  60.8G  4.67G  /a
    rpool/ROOT/zfsBE@0804       398K      -  4.67G  -
    rpool/dump                 1.00G  60.8G  1.00G  -
    rpool/dump@0804                0      -  1.00G  -
    rpool/swap                  517M  61.3G    16K  -
    rpool/swap@0804                0      -    16K  -
  7. ルートプールの BE に bootfs プロパティーを設定します。

    次に例を示します。


    # zpool set bootfs=rpool/ROOT/zfsBE rpool
    
  8. 新しいディスクに起動ブロックをインストールします。

    SPARC:


    # installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t1d0s0
    

    x86:


    # installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t1d0s0
    
  9. システムを再起動します。


    # init 6
    

Procedureフェイルセーフブートからルートプールのスナップショットをロールバックする方法

この手順では、ルートプールの既存のスナップショットを利用できることを前提としています。この例は、それらはローカルシステム上で使用可能となっています。


# zfs snapshot -r rpool@0804
# zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
rpool                      6.17G  60.8G    98K  /rpool
rpool@0804                     0      -    98K  -
rpool/ROOT                 4.67G  60.8G    21K  /rpool/ROOT
rpool/ROOT@0804                0      -    21K  -
rpool/ROOT/zfsBE           4.67G  60.8G  4.67G  /
rpool/ROOT/zfsBE@0804       398K      -  4.67G  -
rpool/dump                 1.00G  60.8G  1.00G  -
rpool/dump@0804                0      -  1.00G  -
rpool/swap                  517M  61.3G    16K  -
rpool/swap@0804                0      -    16K  -
  1. システムをシャットダウンし、フェイルセーフモードで起動します。


    ok boot -F failsafe
    ROOT/zfsBE was found on rpool.
    Do you wish to have it mounted read-write on /a? [y,n,?] y
    mounting rpool on /a
    
    Starting shell.
  2. ルートプールの各スナップショットをロールバックします。


    # zfs rollback rpool@0804
    # zfs rollback rpool/ROOT@0804
    # zfs rollback rpool/ROOT/zfsBE@0804
    
  3. 再起動してマルチユーザーモードにします。


    # init 6