注意事项和假设
必须在同一主机或者同一服务器系列类型和架构上使用新/拆分池。
即:如果源 rpool 是在 T5120 上导入和拆分的,则新池也必须用于相同的服务器类型 (T5xx0)。
on it road.com
拆分 rpool示例
- 验证 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
这篇文章使用了双向镜像的例子,尽管除了用于创建新池的磁盘之外,三向镜像的过程没有什么不同。
- 根据 zpool 的手册页,除非指定了设备,否则池中的最后一个设备将用于创建新池。
无论确保选择正确的设备,最佳做法是指定设备。
# zpool split rpool newrpool c7t1d0
- 默认情况下,一旦拆分完成,使用“zpool split”创建的任何新池都会自动导出。
新池不会出现在“zpool 列表”中。
# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT rpool 67.5G 26.1G 41.4G 38% 1.00x ONLINE
- 使用“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
- 临时导入池“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
- 挂载“menu.conf”和“grub.cfg”文件所在的顶级文件系统。
# zfs mount -vO -o mountpoint=/newrpool newrpool
- 编辑 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
- 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
- 每个条目都具有相同的名称(无法使用 grub-mkconfig 命令更改它)。
必须从 /newrpool/boot/grub/grub.cfg 手动删除 rpool 的冗余条目以避免引导混淆。
使 grub.cfg 文件可写。
# chmod u+w /newrpool/boot/grub/grub.cfg
- 删除以粗体突出显示的 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 ###
- 再次将文件设为只读。
# chmod u-w /newrpool/boot/grub/grub.cfg
- 将新的 grub.cfg 推送到磁盘。
# bootadm install-bootloader -P newrpool
- 挂载根文件系统 (/)。
# 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
- 删除 zpool.cache 文件。
该文件维护导入的 ZFS 池的磁盘视图,并在启动时读取以填充核心 ZFS 存储池配置,而无需通过扫描和读取呈现给主机的所有磁盘来延迟启动。
删除此文件的目的是确保我们扫描所有磁盘并在系统从“newrpool”引导时使用新池“newrpool”的配置重新创建此文件。
# rm /newrpool/etc/zfs/zpool.cache
- 编辑 vfstab 并更改交换设备的池名称和任何其他引用 rpool 的条目。
# grep rpool /newrpool/etc/vfstab /dev/zvol/dsk/newrpool/swap - - swap - no
- 创建 /reconfigure 文件以在下次从“newrpool”引导系统时执行重新配置重新引导。
# touch /newrpool/reconfigure
- 更新 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
- 卸载新池的文件系统并导出池。
# cd / # zfs unmount /newrpool # umount /newrpool # zpool export newrpool
- 重新启动系统。
在 BIOS 屏幕上,使用 (F8) 选择启动磁盘。
使用适合我们系统的正确步骤来选择和更改引导设备。
我们可能需要进入磁盘控制器固件菜单(Adaptec、LSI 等)来更改引导设备优先级顺序。
默认引导设备的 GRUB 菜单尚未修改,因此不会显示“newrpool”。
# reboot -p
- 当系统进入 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”启动.
- 仔细观察引导是否有任何错误或者警告。
如果系统启动并显示没有错误的登录提示,请继续。
如果系统进入维护模式和/或者出现任何 SMF 错误,请停止并解决。
可以使用 zpool split 命令将镜像 ZFS 存储池快速克隆为备份池。
我们可以使用此功能拆分镜像根池,但在我们执行一些添加步骤之前,拆分的池不可引导。
由于架构之间的 OBP 与 GRUB 不同,SPARC 与 x86/x64 的某些所需操作不同。
本文重点介绍在 x86/x64 架构中拆分 rpool 所需的步骤。
日期:2020-09-17 00:15:28 来源:oir作者:oir