ZFSルート、もうちょっと続く

先日のエントリでは、

  • disk0にUFSでSolaris 10 10/08をインストール
  • Live Upgradeをインストール
  • disk1にZFSルート用のZFS環境構築
  • Live Upgradeでdisk1のZFS上にSolaris 10をコピー ( BE名はzfs )
  • disk1からSolarisをブート = ZFSルートでブート成功

で終わっていた。

まだdisk0にはUFS環境が残っているし、disk1ではなくdisk0から起動するようにしたいね。
というわけで、もうちょっと作業をしてみる。
方針としては

  • disk0のUFSで作られたBEを削除
  • 空っぽのdisk0を用意する
  • disk0をdisk1のミラーとしてZFSルートのプールに組み込む
  • disk0にブートローダをインストール

という感じ。

disk0のUFSで作られたBEを削除

削除する前の確認

# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
ufs                        yes      no     no        yes    -
zfs                        yes      yes    yes       no     -
#

実際の削除。今までブートしていた環境のためか、「-f」が必要だった。

# ludelete -f ufs
System has findroot enabled GRUB
Updating GRUB menu default setting
Changing GRUB menu default setting to <0>
Saving existing file </boot/grub/menu.lst> in top level dataset for BE <zfs> as <mount-point>//boot/grub/menu.lst.prev.
File </etc/lu/GRUB_backup_menu> propagation successful
Successfully deleted entry from GRUB menu
Determining the devices to be marked free.
Updating boot environment configuration database.
Updating boot environment description database on all BEs.
Updating all boot environment configuration databases.
Boot environment <ufs> deleted.
#

削除されたか確認してみる

# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
zfs                        yes      yes    yes       no     -
#

というわけで、OK.


しかし、これにてBEは消えるけどディスクからデータが消えた訳ではない。
また今回の環境だと、disk0のブートローダが呼び出されているのだが、削除したことにより変更が反映されなくなっているので、そのまま次のdisk0にZFS環境を作ってもわけがわからなくなる。

空っぽのdisk0を用意する

新しいディスクを用意するなり、formatやfdiskできれいさっぱり、どれでもOK。
ただし、ディスク容量はdisk1と同じにすること。

disk0をdisk1のミラーとしてZFSルートのプールに組み込む

今までZFSに割り当てられていたディスクはdisk0であるc0d1 (実際にはパーティションを切ってあってc0d1s0)だけだった。

# zpool status
 プール: rpool
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

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

エラー: 既知のデータエラーはありません
#

空っぽにしたdisk0 (c0d0の中のc0d0s0)を既存のプール「rpool」に追加する。

# zpool attach rpool c0d1s0 c0d0s0
#

ミラーとして追加されたディスクdisk0は自動で既存のディスクdisk1と同期化される。

# zpool status
  プール: rpool
 状態: ONLINE
状態: 1つまたは複数のデバイスの再同期化が進行中です。
        プールはおそらく縮退状態で動作を継続します。
アクション: 再同期化が完了するまでお待ちください。
 スクラブ: resilver が 0h1m で進行中、12.09% 完了、0h13m 開始待ち
構成:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0d1s0  ONLINE       0     0     0
            c0d0s0  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
#

しばらく待っていると同期化も終わり、ミラー構成のできあがり、と。

# zpool status
  プール: rpool
 状態: ONLINE
 スクラブ: Mon Nov 24 17:30:50 2008
 上で 0 エラーが発生した 0h9m のあとの resilver completed構成:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0d1s0  ONLINE       0     0     0
            c0d0s0  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
#

disk0にブートローダをインストール

ディスクをミラーしても、ブートローダまではミラーされないので、単にミラーしただけでは追加したディスクからぶーとできない。
なので、ブートローダをインストールする必要がある。
これはZFSだけでなくUFSの時代もそうだったし、x86/SPARC環境に関わらず必要。但しx86/SPARCブートローダそのものは異なり、インストールコマンドも異なる。
マニュアルBooting From a Alternate Disk in a Mirrored ZFS root Pool


今回はx86環境なのでinstallgrubコマンドを使う。SPARC環境だとinstallbootコマンドね。最後のディスクの生デバイスは間違えないように注意。

# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0d0s0
stage1 written to partition 0 sector 0 (abs 16065)
stage2 written to partition 0, 265 sectors starting at 50 (abs 16115)
#

という感じで、UFSにインストールして完全にZFSルートな環境に移行できたわけです。パチパチ。