growfs on md device2006年03月27日 07時16分23秒

/usr/obj を mdconfig で設定したファイルを使ってマウントしていた。最初は 1.5GB を作ったが、make world と freesbie をやっていたら、容量が足りない。困ったのである。dump | restore か tar | tar をやろうかとも思ったが、面倒臭い。

そこで、ふと思い出したのが growfs。Google で検索して、最初に出てきた英語のサイトを流して見ると、ずいぶん複雑そう。man growfs を見てみると、

Before starting growfs the disk must be labeled to a bigger size using bsdlabel(8). If you wish to grow a file system beyond the boundary of the slice it resides in, you must re-size the slice using fdisk(8) before running growfs.
とある。

まずは、ファイルの拡張から始める。もちろん、普通はバックアップをしっかり取ること、しかし、今回は全て消えても少ししか悲しくないので、やらない。


# dd if=/dev/zero of=/usr/obj.md seek=1499 bs=1M count=1
# ls -ls /usr/obj.md
1504272 -rw-r--r--  1 root  wheel  1572864000 Mar 25 22:43 /usr/obj.md

元は、上記のようにして作ったファイル。以下のようにして拡張する。seek を絶対つけること。seek を使うことで、既存の場所を飛ばし、EOF を更にその後につけることで、ファイルを大きくする。seek をつけ忘れると、全てのものが消えるので要注意。

# dd if=/dev/zero of=/usr/obj.md seek=2499 bs=1M count=1
# ls -ls /usr/obj.md
1505328 -rw-r--r--  1 root  wheel  2621440000 Mar 25 22:45 /usr/obj.md

mdconfig を使い /dev/md3 に。fdisk をやってみると、アラ不思議。勝手にデバイスサイズが拡張されています。mdconfig が自動的に調整したみたいです。

# fdisk /dev/md3
fdisk: invalid fdisk partition table found
******* Working on device /dev/md3 *******
parameters extracted from in-core disklabel are:
cylinders=318 heads=255 sectors/track=63 (16065 blks/cyl)

parameters to be used for BIOS calculations are:
cylinders=318 heads=255 sectors/track=63 (16065 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 5108607 (2494 Meg), flag 80 (active)
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 317/ head 254/ sector 63
The data for partition 2 is:

The data for partition 3 is:

The data for partition 4 is:


# bsdlabel /dev/md3
bsdlabel: /dev/md3: no valid label found

bsdlabel は特に作らずに /dev/md? を使っていたので、bsdlabel /dev/md3 で、何も見つからないのは予想済。さて、man growfs によると、growfs を使う前に bsdlabel でパーティションを大きくしなければいけないとのこと。bsdlabel が無いので出来ません。

普段は、newfs -U /dev/md3 等とやり、サイズを自動的に取得し、問題なくできていたのです。今回も /dev/md3 は拡張後のサイズになっています。man growfs には、特に違反していない。また、man growfs では -s の所に

This value defaults to the size of the raw partition specified in special (in other words, growfs will enlarge the file system to the size of the entire partition).
とある。恐らく特にオプションも無しで、期待通りの事が出来そう。そこで、

# growfs /dev/md3
We strongly recommend you to make a backup before growing the Filesystem

 Did you backup your data (Yes/No) ? Yes
new file systemsize is: 1280000 frags
Warning: 227424 sector(s) cannot be allocated.
growfs: 2389.0MB (4892576 sectors) block size 16384, fragment size 2048
        using 13 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
        with soft updates
super-block backups (for fsck -b #) at:
 3387328, 3763680, 4140032, 4516384

# mount /dev/md3 /usr/obj
# df /usr/obj
/dev/md3          2369246  1067236 1112472    49%    /usr/obj

問題なく完了。あまりにも呆気無く完了。バックアップを取りましたかの質問に正直に答えて、退場を一度くらいましたが、二度目は嘘をつきました。

まとめると、dd でファイルを拡張し、growfs。とっても簡単でした。