注意事项和假设

必须在同一主机或者同一服务器系列类型和架构上使用新/拆分池。
即:如果源 rpool 是在 T5120 上导入和拆分的,则新池也必须用于相同的服务器类型 (T5xx0)。

on  it road.com

拆分 rpool示例

  1. 验证 rpool 的当前状态。
    至少它应该是一面镜子。
    根据可用设备的数量或者所需的最终目标,可能会添加另外的(第三个)镜像并用于创建新的 rpool。
# zpool status rpool
  pool: rpool
 state: ONLINE
  scan: resilvered 26.1G in 0h16m with 0 errors on Mon Mar 24 20:51:13 2014
config:
        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c7t0d0  ONLINE       0     0     0
            c7t1d0  ONLINE       0     0     0

这篇文章使用了双向镜像的例子,尽管除了用于创建新池的磁盘之外,三向镜像的过程没有什么不同。

  1. 根据 zpool 的手册页,除非指定了设备,否则池中的最后一个设备将用于创建新池。
    无论确保选择正确的设备,最佳做法是指定设备。
# zpool split rpool newrpool c7t1d0
  1. 默认情况下,一旦拆分完成,使用“zpool split”创建的任何新池都会自动导出。
    新池不会出现在“zpool 列表”中。
# zpool list
NAME    SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool  67.5G  26.1G  41.4G  38%  1.00x  ONLINE
  1. 使用“zpool import”确认新池是用正确的设备创建的。
# zpool import
  pool: newrpool
    id: 6439596171322377858
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
        newrpool  ONLINE
          c7t1d0  ONLINE
  1. 临时导入池“newrpool”,使用不同的安装点,以便在使用池之前修改关键文件。
    以下导入池并设置临时挂载点,但不挂载任何数据集。
# mkdir /newrpool
# zpool import -N -R /newrpool newrpool
# zfs list -r newrpool
NAME                        USED  AVAIL  REFER  MOUNTPOINT
newrpool                   26.8G  39.6G  4.58M  /newrpool/newrpool
newrpool/ROOT              2.09G  39.6G    31K  legacy
newrpool/ROOT/solaris      2.09G  39.6G  1.95G  /newrpool
newrpool/ROOT/solaris/var   138M  39.6G   136M  /newrpool/var
newrpool/VARSHARE            59K  39.6G    59K  /newrpool/var/share
newrpool/dump              20.6G  40.2G  20.0G  
newrpool/export              98K  39.6G    32K  /newrpool/export
newrpool/export/home         66K  39.6G    32K  /newrpool/export/home
newrpool/export/home/jack    34K  39.6G    34K  /newrpool/export/home/jack
newrpool/swap              4.13G  39.7G  4.00G
  1. 挂载“menu.conf”和“grub.cfg”文件所在的顶级文件系统。
# zfs mount -vO -o mountpoint=/newrpool newrpool
  1. 编辑 menu.conf 文件以将 bootfs 属性值更改为指向新池名称“newrpool”。
# cp /newrpool/boot/grub/menu.conf /newrpool/boot/grub/menu.conf_bkp
# vi /newrpool/boot/grub/menu.conf
# This file is modified without notice.
# DO NOT EDIT THIS FILE DIRECTLY. CHANGES MAY NOT BE PRESERVED.
# Changes to this file can be made indirectly via bootadm(1M) subcommands.
#
[global]
console = text
timeout = 30
[meta]
order = SolarisDiskBootInstance|0
[SolarisDiskBootInstance|0]
kernel = /platform/i86pc/kernel/amd64/unix
title = Oracle Solaris 11.1
default = True
bootfs = newrpool/ROOT/solaris
fstype = zfs
boot_archive = /platform/i86pc/amd64/boot_archive
  1. Solaris 11.1 引入了 GRUB 1.99 (GRUB2),它的工作方式与 Solaris 10 和 11.0 上使用的 GRUB v0.97 非常不同。
    GRUB2 在磁盘中搜索具有特定 UUID 的引导环境。
    'zpool split' 命令不会更新此 UUID,因此必须手动更新。
    即使更改了引导磁盘顺序,GRUB 仍可能使用旧的 rpool,因为 rpool 和 newrpool 具有相同的 UUID。
    grub.cfg 中有两个条目,一个用于 64 位操作系统,另一个用于 32 位。
# cp -p /newrpool/boot/grub/grub.cfg /newrpool/boot/grub/grub.cfg_bkp
search --no-floppy --fs-uuid --set=root a7df389a817b7ae1
--- and --
if [ "$target" = "i386_pc" ]; then
        search --no-floppy --fs-uuid --set=root_newrpool a7df389a817b7ae1

更新 UUID 后,使用 grub-mkconfig 命令为 grub.cfg 中的每个池生成一个 grub 条目。

# /usr/lib/grub2/bios/sbin/grub-mkconfig -o /newrpool/boot/grub/grub.cfg
  1. 每个条目都具有相同的名称(无法使用 grub-mkconfig 命令更改它)。
    必须从 /newrpool/boot/grub/grub.cfg 手动删除 rpool 的冗余条目以避免引导混淆。
    使 grub.cfg 文件可写。
# chmod u+w /newrpool/boot/grub/grub.cfg
  1. 删除以粗体突出显示的 rpool 的相关条目。
# cat /newrpool/boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /usr/lib/grub2/bios/etc/grub.d and settings from /usr/lib/grub2/bios/etc/default/grub
#
### BEGIN /usr/lib/grub2/bios/etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi
function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}
function load_video {
true
}
if loadfont "/@/boot/grub/unicode.pf2" ; then
  set gfxmode="auto"
  load_video
  insmod gfxterm
fi
terminal_output gfxterm
set timeout=5
### END /usr/lib/grub2/bios/etc/grub.d/00_header ###
### BEGIN /usr/lib/grub2/bios/etc/grub.d/10_solaris ###
menuentry "Oracle Solaris 11.1" {
        insmod part_msdos
        insmod part_sunpc
        insmod part_gpt
        insmod zfs
        search --no-floppy --fs-uuid --set=root 595e0a9970a2c682
        zfs-bootfs /ROOT/solaris/@/ zfs_bootfs
        load_video
        set kern=/platform/i86pc/kernel/amd64/unix
        echo -n "Loading ${root}/ROOT/solaris/@$kern: "
        $multiboot /ROOT/solaris/@/$kern $kern -B $zfs_bootfs
        insmod gzio
        echo -n "Loading ${root}/ROOT/solaris/@/platform/i86pc/amd64/boot_archive: "
        $module /ROOT/solaris/@/platform/i86pc/amd64/boot_archive
}
if [ "$target" = "i386_pc" ]; then
        search --no-floppy --fs-uuid --set=root_newrpool 595e0a9970a2c682
        if [ -s "($root_newrpool)/@/boot/grub/menu.lst" ]; then
                submenu "Legacy GRUB Menu (from root pool newrpool)" "($root_newrpool)/@/boot/grub/menu.lst" {
                        extract_legacy_entries_source ""
                }
        fi
fi
menuentry "Oracle Solaris 11.1" {
        insmod part_msdos
        insmod part_sunpc
        insmod part_gpt
        insmod zfs
        search --no-floppy --fs-uuid --set=root a7df389a817b7ae1
        zfs-bootfs /ROOT/solaris/@/ zfs_bootfs
        load_video
        set kern=/platform/i86pc/kernel/amd64/unix
        echo -n "Loading ${root}/ROOT/solaris/@$kern: "
        $multiboot /ROOT/solaris/@/$kern $kern -B $zfs_bootfs
        insmod gzio
        echo -n "Loading ${root}/ROOT/solaris/@/platform/i86pc/amd64/boot_archive: "
        $module /ROOT/solaris/@/platform/i86pc/amd64/boot_archive
}
if [ "$target" = "i386_pc" ]; then
        search --no-floppy --fs-uuid --set=root_rpool a7df389a817b7ae1
        if [ -s "($root_rpool)/@/boot/grub/menu.lst" ]; then
                submenu "Legacy GRUB Menu (from root pool rpool)" "($root_rpool)/@/boot/grub/menu.lst" {
                        extract_legacy_entries_source ""
                }
        fi
fi
### END /usr/lib/grub2/bios/etc/grub.d/10_solaris ###
### BEGIN /usr/lib/grub2/bios/etc/grub.d/41_custom ###
if [ -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /usr/lib/grub2/bios/etc/grub.d/41_custom ###
  1. 再次将文件设为只读。
# chmod u-w /newrpool/boot/grub/grub.cfg
  1. 将新的 grub.cfg 推送到磁盘。
# bootadm install-bootloader -P newrpool
  1. 挂载根文件系统 (/)。
# zfs mount -vO -o mountpoint=/newrpool newrpool/ROOT/solaris
# cd /newrpool
# ls
bin       devices   home      kernel    mnt       opt       root      share     tmp       ws
boot      etc       homedir   lib       net       platform  rpool     shared    usr       xfn
dev       export    import    media     nfs4      proc      sbin      system    var
  1. 删除 zpool.cache 文件。
    该文件维护导入的 ZFS 池的磁盘视图,并在启动时读取以填充核心 ZFS 存储池配置,而无需通过扫描和读取呈现给主机的所有磁盘来延迟启动。
    删除此文件的目的是确保我们扫描所有磁盘并在系统从“newrpool”引导时使用新池“newrpool”的配置重新创建此文件。
# rm /newrpool/etc/zfs/zpool.cache
  1. 编辑 vfstab 并更改交换设备的池名称和任何其他引用 rpool 的条目。
# grep rpool /newrpool/etc/vfstab
/dev/zvol/dsk/newrpool/swap        -               -               swap    -       no
  1. 创建 /reconfigure 文件以在下次从“newrpool”引导系统时执行重新配置重新引导。
# touch /newrpool/reconfigure
  1. 更新 newrpool 的引导存档。
# bootadm update-archive -v -R /newrpool
cannot find: /newrpool/etc/cluster/nodeid: No such file or directory
cannot find: /newrpool/etc/devices/mdi_ib_cache: No such file or directory
    changed /newrpool/etc/devices/mdi_scsi_vhci_cache
cannot find: /newrpool/etc/devices/retire_store: No such file or directory
cannot find: /newrpool/etc/rtc_config: No such file or directory
updating /newrpool/platform/i86pc/boot_archive
Unable to extend /newrpool/platform/i86pc/boot_archive... rebuilding archive
Successfully created /newrpool/platform/i86pc/boot_archive
updating /newrpool/platform/i86pc/amd64/boot_archive
Unable to extend /newrpool/platform/i86pc/amd64/boot_archive... rebuilding archive
Successfully created /newrpool/platform/i86pc/amd64/boot_archive
  1. 卸载新池的文件系统并导出池。
# cd /
# zfs unmount /newrpool
# umount /newrpool
# zpool export newrpool
  1. 重新启动系统。
    在 BIOS 屏幕上,使用 (F8) 选择启动磁盘。
    使用适合我们系统的正确步骤来选择和更改引导设备。
    我们可能需要进入磁盘控制器固件菜单(Adaptec、LSI 等)来更改引导设备优先级顺序。
    默认引导设备的 GRUB 菜单尚未修改,因此不会显示“newrpool”。
# reboot -p
  1. 当系统进入 GRUB 菜单时,按“e”查看/编辑 GRUB 命令。

验证在“search -no-floppy -fs-uuid -set=root 595e0a9970a2c682”行菜单上看到的 UUID 与“newrpool”的预期 UUID 匹配。
如果它与原始 rpool 的 UUID 匹配,则系统是从错误的磁盘引导的,或者步骤 12 失败。
解决方法是手动更改 UUID,按 F10 或者 Ctrl-X 启动系统,然后在步骤 20 之后重新运行步骤 12 中的 bootadm 命令。
通过仅手动更改 UUID,系统将从“newrpool”启动.

  1. 仔细观察引导是否有任何错误或者警告。
    如果系统启动并显示没有错误的登录提示,请继续。
    如果系统进入维护模式和/或者出现任何 SMF 错误,请停止并解决。
如何在 solaris 11 (x86/x64) 中使用“zpool split”来拆分 rpool

可以使用 zpool split 命令将镜像 ZFS 存储池快速克隆为备份池。
我们可以使用此功能拆分镜像根池,但在我们执行一些添加步骤之前,拆分的池不可引导。
由于架构之间的 OBP 与 GRUB 不同,SPARC 与 x86/x64 的某些所需操作不同。
本文重点介绍在 x86/x64 架构中拆分 rpool 所需的步骤。

日期:2020-09-17 00:15:28 来源:oir作者:oir