on it road .com

交换分区

现在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
SVM root封装和镜像

查看当前正在被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
日期:2020-09-17 00:15:28 来源:oir作者:oir