2012年6月9日土曜日

FreeBSD: ディスクサイズ増加に対応する

KVM仮想環境のディスクサイズを拡張した際に、ゲストOSのFreeBSD 9.0-RELEASEで行った対応です。
GPTの場合(FreeBSD 9ではデフォルト)、メタデータの更新が必要です。

※注意: ディスクパーティションを操作するため、パーティションの破壊によるファイル消失や起動不能になるといった問題が発生する可能性があります。
実際の操作に当たってはバックアップ等の対策をとったうえで“慎重”に。
また、パラメータは自分の環境に合わせて読み替えてください。(パラメータの意味が理解できない場合は危険なのでやめておきましょう)
この記事の手順で問題が発生しても責任を負いかねますのでご了承ください。

概要


libretta ALBOTを動作させているABLENET VPSの増強があり、最下位プランのV0でもディスクサイズが20GBから50GBに増えました。
増えた分の空き領域をOSから使えるようにしました。




現状確認

まずは、gpartコマンドを使用して現状を確認します。
gpart listコマンドで一覧を表示します。

# gpart list
Geom name: da0
modified: false
state: CORRUPT
fwheads: 255
fwsectors: 63
last: 39062466
first: 34
entries: 128
scheme: GPT
Providers:
1. Name: da0p1
   Mediasize: 65536 (64k)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 17408
   Mode: r0w0e0
   rawuuid: 9f249166-633c-11e1-9c88-525400c8e81a
   rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f
   label: (null)
   length: 65536
   offset: 17408
   type: freebsd-boot
   index: 1
   end: 161
   start: 34
2. Name: da0p2
   Mediasize: 16106127360 (15G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 82944
   Mode: r1w1e1
   rawuuid: 9bb4b597-633d-11e1-9c88-525400c8e81a
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 16106127360
   offset: 82944
   type: freebsd-ufs
   index: 2
   end: 31457441
   start: 162
3. Name: da0p3
   Mediasize: 3893362688 (3.6G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 3221308416
   Mode: r1w1e0
   rawuuid: a1720f7e-633d-11e1-9c88-525400c8e81a
   rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 3893362688
   offset: 16106210304
   type: freebsd-swap
   index: 3
   end: 39061665
   start: 31457442
Consumers:
1. Name: da0
   Mediasize: 50000000000 (46G)
   Sectorsize: 512
   Mode: r2w2e3
da0のサイズが50,000,000,000Byte(46GB)になっています。
続いて、gpart showコマンドでディスクのパーティションを確認。
# gpart show da0
=>      34  39062433  da0  GPT  (46G) [CORRUPT]
        34       128    1  freebsd-boot  (64k)
       162  31457280    2  freebsd-ufs  (15G)
  31457442   7604224    3  freebsd-swap  (3.6G)
  39061666       801       - free -  (400k)
空き領域が400kByteしかありません。
ディスクサイズの増加が反映していないようです。

メタデータの更新


FreeBSDのオンラインマニュアルでgpartの項目を見てみると、「リカバリング」の項目にディスクサイズの変更についてに記述がありました。

デバイスのサイズが (例えば、ボリューム拡張) を変更したなら、セカンダリGPT ヘッダは、もはや最後のセクタに位置づけられません。これは、メタデータの不正ではありませんが、プライマリ GPT の任意の不正が、パーティションテーブルを失うことになるので、危険です。この問題は、次のメッセージでカーネル によって報告されます: 
GEOM: provider: the secondary GPT header is not in the last LBA.
翻訳: セカダリ GPT ヘッダが最後の LBA にありません。
現状がこの説明と一致しているか確認するため、ログを見てみます。

# grep GEOM /var/log/messages
May 29 15:39:55 albot kernel: GEOM: da0: the secondary GPT header is not in the last LBA.
一致してます。
マニュアルに書かれてているgpart recoverコマンドで復旧を試みます。

# gpart recover da0
da0 recovered
結果は...

# gpart show da0
=>      34  97656183  da0  GPT  (46G)
        34       128    1  freebsd-boot  (64k)
       162  31457280    2  freebsd-ufs  (15G)
  31457442   7604224    3  freebsd-swap  (3.6G)
  39061666  58594551       - free -  (28G)
 空き容量が28GBになりました。正しく反映されたようです。

パーティションの作成とフォーマット

つづいて、パーティションを作成します。

# gpart add -t freebsd-ufs da0
da0p4 added
# gpart show da0
=>      34  97656183  da0  GPT  (46G)
        34       128    1  freebsd-boot  (64k)
       162  31457280    2  freebsd-ufs  (15G)
  31457442   7604224    3  freebsd-swap  (3.6G)
  39061666  58594551    4  freebsd-ufs  (28G)
新しいパーティション“4”が作成されました。空き領域全体が割り当てられました。
続いてnewfsコマンドでフォーマット。
UFS2フォーマットでsoft-updates、soft-update journalingeを有効にします。

# newfs -U -O2 -j /dev/da0p4
/dev/da0p4: 28610.6MB (58594544 sectors) block size 32768, fragment size 4096
        using 39 cylinder groups of 740.00MB, 23680 blks, 47360 inodes.
        with soft updates
super-block backups (for fsck -b #) at:
 192, 1515712, 3031232, 4546752, 6062272, 7577792, 9093312, 10608832, 12124352, 13639872,
 15155392, 16670912, 18186432, 19701952, 21217472, 22732992, 24248512, 25764032,
 27279552, 28795072, 30310592, 31826112, 33341632, 34857152, 36372672, 37888192,
 39403712, 40919232, 42434752, 43950272, 45465792, 46981312, 48496832, 50012352,
 51527872, 53043392, 54558912, 56074432, 57589952
Using inode 4 in cg 0 for 33554432 byte journal
newfs: soft updates journaling set

フォーマット完了。
あとは、任意のエントリポイントにマウントして使うだけです。

物理的なハードウェアでは起こらないHDDそのもののサイズが変化するという事態に対応することになりました。

2TB越えのHDDの問題だと気に止めていなかったGPTが普通に使われていてビックリしました。最初fdiskコマンドでパーティションがみられなくて「何事が起きた!?」と冷や汗をかきました。
今回は、期せずGPTの扱い方も勉強できてラッキー。
この記事が参考になれば幸いです。

1 件のコメント:

  1. 仮想マシンのディスクサイズ拡張をしたはいいがその後は…と情報を漁っていたところ、この記事に助けられました。

    ありがとうございます!

    返信削除