交换分区
现在swap分区可以随时放在online下。
如果它已经存在,我们需要删除它。
# swap -l swapfile dev swaplo blocks free /dev/dsk/c1t0d0s1 30,1 8 1548280 1548280
# swap -d /dev/dsk/c1t0d0s1
创建 2 个子镜像:
# metainit d21 1 1 c1t0d0s1 d21: Concat/Stripe is setup # metainit d22 1 1 c1t1d0s1 d22: Concat/Stripe is setup
使用第一个子镜像创建镜像
# metainit d20 -m d21 d20: Mirror is setup
现在将剩余的子镜像添加到镜像
# metattach d20 d22 d20: submirror d22 is attached
检查同步状态:
# metastat -c d20 d20 m 756MB d21 d22 (resync-17%) d21 s 756MB c1t0d0s1 d22 s 756MB c1t1d0s1
我们需要手动更改交换元设备的 /etc/vfstab 条目,以便在重新启动后保持不变。
/dev/dsk/c1t0d0s1 - - swap - no to: /dev/md/dsk/d20 - - swap - no
还使用我们为交换创建的新元设备再次添加交换
# swap -a /dev/md/dsk/d20
不要忘记将交换设置为转储设备
# dumpadm -d swap Dump content: kernel pages Dump device: /dev/md/dsk/d20 (swap) Savecore directory: /var/crash/onitroad Savecore enabled: yes Save compressed: on
查看当前正在被root分区使用的磁盘。
# df -h / Filesystem size used avail capacity Mounted on /dev/dsk/c1t0d0s0 6.9G 2.9G 3.9G 43% /
要查看可用磁盘,包括根磁盘 c1t0d0 :
# format Searching for disks...done AVAILABLE DISK SELECTIONS: 0. c1t0d0 /pci@0,0/pci15ad,1976@10/sd@0,0 1. c1t1d0 /pci@0,0/pci15ad,1976@10/sd@1,0 Specify disk (enter its number): ^C
所以我们还有一个与 c1t0d0 大小相同的磁盘 c1t1d0。
我会使用这两个磁盘在 SVM 下进行根磁盘镜像和封装。
将分区表从根目录复制到镜像磁盘。
第一步是将根磁盘的确切分区表复制到镜像磁盘。
最简单的方法是使用 fmthard。
fmthard 所做的只是简单的将prtvtoc 生成的分区表拷贝到镜像盘上。
在复制分区表之前,请确保在第 7 个切片上创建一个 100 MB 的分区,以便拥有状态元数据库副本。
创建 100MB 分区并标记磁盘后,开始将分区表复制到镜像磁盘。
# prtvtoc /dev/rdsk/c1t0d0s2 | fmthard -s - /dev/rdsk/c1t1d0s2
创建状态数据库
状态数据库包含所有卷、热备件和磁盘集的配置和状态信息。
为了提供冗余,我们创建了多个状态数据库副本,称为状态数据库副本。
现在,在丢失任何状态数据库副本的情况下,SVM 使用多数共识算法确定有效的状态数据库副本。
根据该算法,在启动时需要至少(一半 + 1)可用才能将它们中的任何一个视为有效。
每个副本大约需要 4 MB 的大小。
如果我们要镜像根磁盘,最好在每个磁盘上创建 3 个。
现在让我们在每个磁盘上创建 3 个副本。
# metadb -afc 3 c1t0d0s7 c1t1d0s7 -c -> Specifies the number of replicas to be placed on each device. Default is 1 -f -> force the creation when there is no state database replicas already present. -a -> Attach a new database device.
要查看我们刚刚创建的新状态数据库副本:
# metadb flags first blk block count a u 16 8192 /dev/dsk/c1t0d0s7 a u 8208 8192 /dev/dsk/c1t0d0s7 a u 16400 8192 /dev/dsk/c1t0d0s7 a u 16 8192 /dev/dsk/c1t1d0s7 a u 8208 8192 /dev/dsk/c1t1d0s7 a u 16400 8192 /dev/dsk/c1t1d0s7
在镜像磁盘上安装引导块
对于基于 UFS 的文件系统:
# installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c1t1d0s0
设置 OBP 变量
现在我们需要更新OBP变量来指定root和镜像引导设备。
首先查看rootdisk和镜像磁盘的物理设备名称。
让我们看看我们如何使用 OS eeprom 命令来做到这一点。
# ls -l /dev/dsk/c1t0d0s0 lrwxrwxrwx 1 root root 46 Nov 16 12:35 /dev/dsk/c1t0d0s0 -> ../../devices/pci@0,0/pci15ad,1976@10/sd@0,0:a # ls -l /dev/dsk/c1t1d0s0 lrwxrwxrwx 1 root root 46 Nov 16 12:35 /dev/dsk/c1t1d0s0 -> ../../devices/pci@0,0/pci15ad,1976@10/sd@1,0:a
在 OBP 中设置 rootdisk 和 mirrordisk 别名
# eeprom "nvramrc=devalias rootdisk /devices/pci@0,0/pci15ad,1976@10/sd@0,0:a mirrordisk /devices/pci@0,0/pci15ad,1976@10/sd@1,0:a"
设置引导设备的顺序
# eeprom boot-device="rootdisk mirrordisk"
将 use-nvramrc 设置为 true 以启用 nvramrc 变量。
# eeprom "use-nvramrc?=true"
如果需要,我们还可以在 OK 提示符下设置别名:
ok> nvalias rootdisk /devices/pci@0,0/pci15ad,1976@10/sd@0,0:a mirrordisk /devices/pci@0,0/pci15ad,1976@10/sd@1,0:a ok> setenv boot-device rootdisk mirrordisk
根分区
现在让我们为根卷创建 2 个子镜像。
# metainit -f d11 1 1 c1t0d0s0 d11: Concat/Stripe is setup # metainit -f d12 1 1 c1t1d0s0 d12: Concat/Stripe is setup
这里 1 1 分别指定了 numstripes(元设备中单个条带的数量)和宽度(构成条带的切片数量)。
现在让我们创建镜像 d10,它将具有子镜像 d11 和 d12
# metainit d10 -m d11 d10: Mirror is setup
现在我们必须使用 metaroot 命令封装根磁盘,该命令将更新 /etc/system 和 /etc/vfstab 文件。
为安全起见,备份正在更新的文件。
# cp /etc/vfstab /etc/vfstab.bak # cp /etc/system /etc/system.bak
# metaroot d10
如果你仔细检查 /etc/system 文件,你会发现另外的一行:
rootdev:/pseudo/md@0:0,10,blk
我们还会发现根文件系统的条目替换为:
dev/md/dsk/d10 /dev/md/rdsk/d10 / ufs 1
现在 metaroot 需要重新启动才能生效。
但是在我们重新启动系统之前,我们需要在 /etc/system 文件中再添加一项以绕过多数共识算法。
这使我们能够从单个磁盘启动,这可能是生产中许多情况下的要求,例如修补系统等。
条目是:
set md:mirrored_root_flag = 1
现在我们可以重新启动系统。
# shutdown -i6 -g0 -y
重新启动后,我们可以将另一个子镜像 d12 添加到镜像 d10 并将数据从 d11 同步到 d12.
# metattach d10 d12
同步将立即开始。
要检查镜像的状态:
# metastat d10 d10: Mirror Submirror 0: d11 State: Okay Submirror 1: d12 State: Resyncing Resync in progress: 8 % done Pass: 1 Read option: roundrobin (default) Write option: parallel (default) Size: 14643200 blocks (7.0 GB) d11: Submirror of d10 State: Okay Size: 14643200 blocks (7.0 GB) Stripe 0: Device Start Block Dbase State Reloc Hot Spare c1t0d0s0 0 No Okay Yes d12: Submirror of d10 State: Resyncing Size: 14643200 blocks (7.0 GB) Stripe 0: Device Start Block Dbase State Reloc Hot Spare c1t1d0s0 0 No Okay Yes Device Relocation Information: Device Reloc Device ID c1t0d0 Yes id1,sd@n6000c297a7eb5c765e13f7ce11a25a61 c1t1d0 Yes id1,sd@n6000c299599de680b94c732ecfef6f03