分页: 1 / 1

《NetBSD指南-16.3.7.设定内核转储》

发表于 : 2010-03-02 23:24
leo
本例中正常的交换区域是raid0b. 在NetBSD 5.0及更新的版本中如果raid0是一个RIAD级别为1的组(RAID 1),raid0b 可以自动地被用来进行内核转储。

在NetBSD5.0以前的版本中内核转储必须在一个真实的磁盘上进行。因此我们可以不受阻碍地在与raid0b重叠的区域上建立一个转储区域,这里的诀窍是为崩溃时的转储区域计算一个正确的起始偏移量。如果我们在计算时出现一个错误,就会很危险并可能损坏及有用的数据! 当内核将其内存转储跨界写到一个正常的文件系统上时,这个文件系统上的数据会损坏。我们我们在这里必须格外的小心。(本文作者就被一个内核崩溃转储毁了他100+ GB /home 分区!)

首先我们先看一下swap (raid0b)的disklabel以及真实的物理磁盘(wd1).

在i386上:

代码: 全选

  # disklabel raid0

  8 partitions:
  #        size    offset     fstype  [fsize bsize cpg/sgs]
   a:  19015680         0     4.2BSD   1024  8192    64
   b:    525184  19015680     swap
   d:  19540864         0     unused      0     0     0


  # disklabel wd1

  8 partitions:
  #        size    offset     fstype  [fsize bsize cpg/sgs]
   a:  19541025        63     RAID
   c:  19541025        63     unused      0     0
   d:  19541088         0     unused      0     0
   
每个RAID组的组件全有一个由64个块构成的保留区域 (看 RF_PROTECTED_SECTORS 在 <dev/raidframe/raidframevar.h>) 位于其开始处,用于保存内部的RAID结构。

代码: 全选

  # dc
  63              # offset of wd1a
  64              # RF_PROTECTED_SECTORS
  +
  19015680        # offset of raid0b
  +p
  19015807        # offset of swap within wd1
  q

我们现在知道了这个尚未存在的wd1b的真实偏移量是19015807以及它的大小是525184. 接下来我们需要将wd1b加到wd1的disklabel上.

代码: 全选

  # disklabel wd1 > disklabel.wd1
  # vi disklabel.wd1

  8 partitions:
  #        size    offset     fstype  [fsize bsize cpg/sgs]
   a:  19541025        63       RAID
   b:    525184  19015807       swap
   c:  19541025        63     unused      0     0
   d:  19541088         0     unused      0     0

下面我们安装新的disklabel.

代码: 全选

  # disklabel -R -r wd1 disklabel.wd1

在sparc64上:

在sparc64 (和sparc)上, 所有分区必须起始于柱面分界线. 因此, 转储分区的起始点必须移到下一个柱面的边界(译者注:感觉原文的意思是下一个柱面的起始点上), 并且大小会随起始点移动后的位置略有减少:

代码: 全选

  # disklabel raid0

  3 partitions:
  #        size    offset     fstype [fsize bsize cpg/sgs]
   a:  19251200         0     4.2BSD      0     0     0  # (Cyl.      0 -  18799)
   b:    288768  19251200       swap                     # (Cyl.  18800 -  19081)
   c:  19539968         0     unused      0     0        # (Cyl.      0 -  19081)


  # disklabel wd1
  ...
  sectors/cylinder: 1008
  ...
  3 partitions:
  #        size    offset     fstype  [fsize bsize cpg/sgs]
   a:  19541088         0       RAID                     # (Cyl.      0 -  19385)
   c:  19541088         0     unused      0     0        # (Cyl.      0 -  19385)


类似在i386上, 每个RAID组中的组件全有一个64个块构成的保留区域 (看 RF_PROTECTED_SECTORS in <dev/raidframe/raidframevar.h>) 位于其开始处,用于保存内部的RAID结构。我们也不再赘述了, 接下来是上面提到的要点,移动到下一个柱面的边界:

代码: 全选

  # dc
  0               # offset of wd1a
  64              # RF_PROTECTED_SECTORS
  +
  19251200        # offset of raid0b
  +p
  19251264        # offset of swap within wd1
  sa la           # Remember the new offset
  1008 /          # determine cylinder offset
  1 +             # move to next full cylinder boundary
  1008 *p         # convert back to sectors
  19251792        # Our real, cylinder-aligned offset of wd1b
  sb lb la -p     # Determine how far the offset was moved
  528
  sc              # Remember how many sectors we moved the start
  288768          # Size of swap on raid0
  lc -p
  288240          # Our real, smaller swap/dump size of wd1b
  q

我们现在知道了这个尚未存在的wd1b的真正的偏移量是19251792以及大小为288240. 接下来我们将wd1b加到wd1的disklabel.

代码: 全选

  # disklabel wd1 > disklabel.wd1
  # vi disklabel.wd1

  8 partitions:
  #        size    offset     fstype  [fsize bsize cpg/sgs]
   a:  19541088         0       RAID                     # (Cyl.      0 -  19385)
   b:      288240   19251792    swap
   c:  19541088         0     unused      0     0        # (Cyl.      0 -  19385)  

下面我们安装新的disklabel.

代码: 全选

  # disklabel -R -r wd1 disklabel.wd1

为什么(raid0d)的大小 == ((wd1a)的大小 - RF_PROTECTED_SECTORS)? raid0d的大小基于一个RAID组使用的最大的条带容量。 (译者注: Stripe Size(条带容量)在每个磁盘上连续写入数据的总量,也称作“条带深度”。你可以指定每个逻辑驱动器的条带容量从2KB,4KB,8KB一直到128KB。为了获得更高的性能,要选择条带的容量等于或小于操作系统的簇的大小。大容量的条带会产生更高的读取性能,尤其在读取连续数据的时候。而读取随机数据的时候,最好设定条带的容量小一点。 ) 比如, 条带深度为128, raid0d的大小是:

代码: 全选

  # dc
  19541025    # size of wd1a
  64          # RF_PROTECTED_SECTORS
  -
  128         # stripe width
  /p
  152663      # number of stripes
  128         # number of blocks per stripe
  *p
  19540864    # size of raid0d