HOME / コンピュータTips / Solaris / zfs / zfsboot / マニュアルセットアップ

Date: 2019/12/06 |  このエントリーをはてなブックマークに追加  |  Tags: zfsboot zfs boot manual setup x86 Solaris opensolaris Nevada ZFSブート

zfsブートの手動セットアップ(x86環境用)
Manual Setup to boot ZFS on x86 (a script version is here).

注意:現時点で、古いmountroot setupで構築したzfs rootで動いているのなら、ここに記載された方法で、自分自身の手でnew bitを設定すること。~Note: If your system is running on a zfs root based on the old mountroot setup, you may manually transition to the new bits by following this.

訳注:このページは、下記のページをかなりてきとうに意訳したものです。

  • http://www.opensolaris.org/os/community/zfs/boot/zfsboot-manual/

1. Nevada 62(snv_62)以降のOSであることを確認
ZFS Boot bits is available in snv_62.

Nevada 62(snv_62)以降のOSであることを確認すること。

2. rootpoolの準備

ZFSのpoolとしてrootpoolを準備する。Prepare the disk for a ZFS rootpool.

ブート用のrootpoolは、ディスクデバイス全体か、そのスライス、mirrorボリュームしか設定してはいけない。ディスク全体をrootpoolにしたい場合は、スライスを作成し、SMIラベルを付けなくてはならない(例:c0d0s0) A rootpool can be a single disk device, or a device slice, or in a mirrored configuration. If you use a whole disk for a rootpool, you must use a slice notation (e.g. c0d0s0) so that it is labeled with an SMI label.

注:つまりEFI型やc0d0全体をrootpoolにしてはいけないということ。

3. rootpoolの作成

ZFS boot用のZPOOLを作成し、さらにroot用にzfsを作成する。このファイルシステムはmountpointをlegacyとし、/zfsbootディレクトリにマウントする。再起動の時にマウントできるように、/etc/vfstabも変更しておくこと。Create a ZFS rootpool, a root filesystem, mount the root filesystem on /zfsroot, and update /etc/vfstab to mount /zfsroot upon reboot.

下記は実際の入力例である。この例では、ZFS boot用のZPOOLとしてデバイスc0d0s3にrootpoolを作成し、rootボリュームにzfsでrootpool/rootfsを作成した。mountpointをlegacyとし、/zfsbootディレクトリにマウントを行っている。なお、rootpool/rootfsは、デフォルトのファイルシステム名である。Through out the Instruction examples, we use 'rootpool' for the pool name created on 'c0d0s3', and 'rootpool/rootfs' as the ZFS default boot filesystem name.

zpool create rootpool c0d0s3
zfs create rootpool/rootfs
zfs set mountpoint=legacy rootpool/rootfs
mkdir /zfsroot
mount -F zfs rootpool/rootfs /zfsroot

/etc/vfstabに下記のエントリを追加すること。add this entry in /etc/vfstab:

rootpool/rootfs - /zfsroot zfs - yes -

4. UFS ROOTファイルシステム上のデータをZFS ROOTファイルシステム上に移植する
Populate the UFS root content to the ZFS root filesystem:

UFS rootファイルシステム上のファイルのすべてを、新しく作ったZFS rootファイルシステム上にコピーする。Copy all of the files in the UFS root filesystem to the newly created ZFS root filesystem.

下記のコマンドではマウントポイントを越えずに、rootファイルシステムにあるファイルだけをコピーできる。このコマンドは30分を越える時間がかかるので、注意すること。The following command does this without crossing mountpoints. This command will take on the order of 30 minutes, give or take.

上記の理由から、もし、/usr,/varなど別のファイルシステムも同じようにコピーしたい場合は、それぞれを同じようにコマンドを入力してコピーを行うこと。Note, this will not cross mountpoints, if /usr, /var, or other filesystems are on other mountpoints, they will need to be copied over following this command.

cd /
find . -xdev -depth -print | cpio -pvdm /zfsroot

自動生成するディレクトリ・ファイルのいくつかは、このコピーではコピーされない。下記のツールを実行して、ディレクトリ・ファイルを作成すること。The directory structure for several auto generated filesystems need to be created. Run this script to create them.

filethisscript.sh;

''実行例'

./thisscript.sh /zfsroot

次に、/devicesファイルシステムをコピーする。/devicesは、devfsの疑似ファイルシステムで、ufs上にマウントされて動作する。Populate the /devices filesystem. /devices is a devfs pseudo filesystems which sits on top of a ufs backing store.

システムブート時、/deviceはマウントされて、以後、基礎として動作する。同じようなものに、/devがある。これらは基礎として動作しているので、下記のようにコピーを行う。&size(5){When a system is booted, /devices is mounted on top of this backing store and hides the underlying ufs backing store. Same to the /dev filesystem. To get at the underlying files, do the following:}

mount -F lofs -o nosub / /mnt
(cd /mnt; tar cvf - devices dev ) | (cd /zfsroot; tar xvf -)
umount /mnt

5. ZFS rootファイルシステムの最終設定
Complete the ZFS root filesystem setup:

ZFSブート後に、既存のUFSルートファイルシステムをマウントさせたい場合は、ufsrootというディレクトリをZFS上に作成しておく。If you would like to have your UFS root filesystem mounted while booted of ZFS, make a directory named "ufsroot" on your ZFS filesystem. This will be used to mount your UFS root filesystem when booted off of ZFS.

mkdir /zfsroot/ufsroot

再起動後に、新しいZFSルートファイルシステムが/としてマウントされ、UFS ルートファイルシステムが、/ufsrootとしてマウントされるように、ZFSルートファイルシステム上のvfstab(/zfsroot/etc/vfstab)を編集する。Swapなどのスライスはそのまま利用するため、そのままにしておく。Edit /zfsroot/etc/vfstab to modify mount entries for your new ZFS root and UFS root. Make sure your UFS root is not mounted on “/”. You should already have a swap slice set aside. The added entries should look similar to the following:

/zfsroot/etc/vfstabに下記の編集を行うこと。

rootpool/rootfs - / zfs - no -
/dev/dsk/c0d0s0 /dev/rdsk/c0d0s0 /ufsroot ufs - yes -

また、このZFSのルートファイルシステム(rootpool/rootfs)が、デフォルトのzfsブートファイルシステムになるように、プール(rootpool)に設定しておく。Set this filesystem to be the default ZFS boot filesystem:

zpool set bootfs=rootpool/rootfs rootpool

起動時のboot_archiveに、zfsのマウント情報を含めるため、/zfsroot/boot/solaris/filelist.ramdiskの中に、etc/zfs/zpool.cacheを追加し、boot_archiveを作成する。Edit /zfsroot/boot/solaris/filelist.ramdisk to include “etc/zfs/zpool.cache”, then update the boot archive for the ZFS root:

(add "etc/zfs/zpool.cache" into filelist.ramdisk)

echo etc/zfs/zpool.cache >> /zfsroot/boot/solaris/filelist.ramdisk
/usr/sbin/bootadm update-archive -R /zfsroot

6. GRUBの設定
Setup GRUB to boot off of the ZFS root filesystem:

GRUBからZFSブートできるように設定する。

/zfsroot/boot/grub/menu.lstを、新しく起動するzfsルートファイルシステムのあるzpool上の所定のディレクトリにコピーする。Copy /zfsroot/boot/grub/menu.lst to your top level filesystem since that is where GRUB will read the menu.lst from:

zpoolのマウントディレクトリが/rootpollだった場合(assuming rootpool is mounted on /rootpool)

mkdir -p /rootpool/boot/grub
cp /zfsroot/boot/grub/menu.lst /rootpool/boot/grub

/rootpool/boot/grub/menu.lstを編集し、ZFS bootさせたいエントリにあるunixプログラムの後ろに-B [ZFSは存在しません]-BOOTFSを追加する。通常、unixプログラムは、kernel行に設定されている。下記の例を参照のこと。Edit /rootpool/boot/grub/menu.lst to include an entry for this ZFS boot filesystem by appending '-B [ZFSは存在しません]-BOOTFS' after the unix program. Your entry should look something like this:

例1:オプションが何もないケース

title Solaris ZFS
kernel$ /platform/i86pc/kernel/unix -B $ZFS-BOOTFS
module$ /platform/i86pc/boot_archive

例2:unixプログラムにオプションが存在するケース(下記は、シリアルコンソールの例)

title Solaris ZFS
kernel$ /platform/i86pc/kernel/unix -B $ZFS-BOOTFS,console=ttya
module$ /platform/i86pc/boot_archive

上記の例は、いずれもrootpoolbootfsプロパティに設定した値、rootpool/rootfsから起動する。This entry boots from the default ZFS boot filesystem 'rootpool/rootfs' defined in the 'bootfs' pool property of the 'rootpool' assuming rootpool is the default boot device.

もし、rootpoolがデフォルトのブートデバイスでない場合、rootコマンドによって、ZFS rootpoolからブートするように設定する必要がある。下記の例では、UFSがスライス0(a)にインストールされ、ZFSがスライス3(d)にインストールされている場合の例である。&size(5){If rootpool is not the default boot device, you can use 'root' command to redirect the boot device to the ZFS rootpool. Your entry could look something like this, assuming the UFS root is on slice 0 (default boot device) and ZFS root is on slice 3 of c0d0:}

例3:ブートのroopoolがc0d0s3にインストールされている場合の設定例。

title Solaris ZFS
root (hd0,0,d)
kernel$ /platform/i86pc/kernel/unix -B $ZFS-BOOTFS
module$ /platform/i86pc/boot_archive

この例では、ZFSのブートファイルシステムであるrootpool/rootfsの名前は、rootpool上のbootfsプロパティには設定済みであり、rootpool自体はc0d0s3に格納されている。This entry boots from the default ZFS boot filesystem 'rootpool/rootfs' defined in the 'bootfs' pool property of the 'rootpool' on c0d0s3.

rootコマンドは次のようなフォーマットである。

root (hdx,y,z)
xディスク識別番号(disk identifier)
yパーティション番号(partition number)0-3
zスライス番号(slice number)a-h(s0-s7に対応)

The root entry has the following format (hdx,x,x) where the first entry in the tuple is the disk identifier, the second entry is the partition number (0-3), and the third entry is the slice number (a-h), where a is slice 0 and h is slice 7.

grubのrootコマンドは、installgrubコマンドによって指示されていれば、必ずしも必要としない。この方法は7に記載する。The root command is not needed if your boot environment is on the disk slice given to the installgrub command. See step #7 for more information.

1つのzpool上に複数のzfsブート可能なファイルシステムがあった場合、bootfsコマンド(bootfs <pool/fs>)で指定することができる。下記がその例である。&size(5){There can be multiple bootable filesystems in a single pool. You can override the default boot filesystem name by using a GRUB command 'bootfs <pool/fs>'. Put it before the kernel command. Example:}

例3:別のzfsブートファイルシステムとして、rootpool/rootfsを指定した場合

title Solaris ZFS
bootfs rootpool/rootfs2
kernel$ /platform/i86pc/kernel/unix -B $ZFS-BOOTFS
module$ /platform/i86pc/boot_archive

フェイルセーフモードは次の通りとなる。-B [ZFSは存在しません]-BOOTFSが必要ないことに注意。&size(5){For the failsafe mode, use the following entry in menu.lst:}

kernel /boot/platform/i86pc/kernel/unix
module /boot/x86.miniroot

7. GRUBのインストール
Install the new bootloader.

grubは、installgrub(1M)コマンドで、インストールできる。パラメタとして、stage1,stage2ファイルを指定し、ブート先のローデバイス名を設定する(新しいファイルシステムは/zfsroot/boot/grub/にある)。下記はその例である。The grub bootloader is installed via a utility called installgrub(1M). It takes, as its parameters, a pointer to stage1 and stage2 (available in your newly bfu'd filesystem at /zfsroot/boot/grub/) and the raw device containing a boot environment.Installgrub will install stage1 and stage2 on the boot area of a disk partition. The raw device indicates where the root is. The examples below show how to installgrub on a system which has the ZFS rootpool.

例1:ZFS roopoolがc0d0s3、UFS rootがc0d0s0と、同じインストールされている場合
ZFS rootpool (c0d0s3) and UFS root (c0d0s0) are on the same disk:

installgrub /zfsroot/boot/grub/stage1 /zfsroot/boot/grub/stage2 /dev/rdsk/c0d0s3

このようにインストールし、下記のようなエントリをmenu.lstに記載すると、c0d0s3上のrootpoolから、OSが起動する。Then, the following entry will boot off the default boot filesystem from the rootpool on c0d0s3:

title Solaris Default-ZFS
kernel$ /platform/i86pc/kernel/$ISADIR/unix -B $ZFS-BOOTFS
module$ /platform/i86pc/boot_archive

例2:ZFS rootpoolがc1d0s0、UFS rootがc0d0s0と、異なったディスクにインストーされている場合
ZFS rootpool (c1d0s0) and UFS root (c0d0s0) are on a different disk:

installgrub /zfsroot/boot/grub/stage1 /zfsroot/boot/grub/stage2 /dev/rdsk/c1d0s0

この場合、BIOSで起動デバイスをc1d0へと変更する必要がある。その上で、同じディスク上のmenu.lstの起動シーケンスに入る。Change the boot device in BIOS to be c1d0, then the same Default-ZFS menu.lst entry will boot off the default bootfs from the rootpool on c1d0s0:

8.リブート
Reboot.

起動後、ZFS Boot環境にGRUBメニューから選択することを忘れずに。ブートディスクを変えた場合は、その設定も忘れないようにすること。Remember to select your ZFS Boot environment from the GRUB menu or change the boot device in the BIOS.

注意:再起動前にzpool exportは行わないこと!(Note: Do Not export the rootpool before rebooting.)