今回の目標は、

  • 前使っていたOSとZFSで書いたデータが入っているディスク達をクリアし、 新しい環境 (ArchLinux + Btrfs) に付け替える。
  • ディスクは、Btrfs の機能を使い、既存のファイルシステムに追加する。
  • さらに、LZO による圧縮を行う。

本稿は OpenIndiana+ZFSからArchLinux+BTRFSに移行した の続きである。

Btrfs ファイルシステムへディスクを追加する

まずは、現状の確認。

house という名前のファイルシステムがあり、 その配下にある house/library というサブボリュームを /house/library にマウントしている。

それで、 house はいま /dev/sda5/dev/sdb1 の RAID1 構成になっている。

[root@fg-arch ~]# btrfs filesystem show
Label: 'house'  uuid: 962205ef-673e-4b93-be7e-58bd23d68095
	Total devices 2 FS bytes used 2.29TiB
	devid    1 size 2.61TiB used 2.29TiB path /dev/sda5
	devid    2 size 2.73TiB used 2.29TiB path /dev/sdb1

ここに、新たに3台のディスクを追加する。

追加するのは、/dev/sdc ちゃんと、/dev/sdd くんと、/dev/sde くん。

[root@fg-arch ~]# fdisk -l
Disk /dev/sdc: 186.3 GiB, 200049647616 bytes, 390721968 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000423fc

Device     Boot Start       End   Sectors   Size Id Type
/dev/sdc1  *    16065 390716864 390700800 186.3G bf Solaris

Disk /dev/sde: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: DE142FFF-739B-BCC9-A4FA-F54D69C08A15

Device          Start        End    Sectors  Size Type
/dev/sde1         256 5860516750 5860516495  2.7T Solaris /usr & Apple ZFS
/dev/sde9  5860516751 5860533134      16384    8M Solaris reserved 1

Disk /dev/sdd: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: AAF3C798-87D9-CCE0-8E63-D3560A5174D5

Device          Start        End    Sectors  Size Type
/dev/sdd1         256 5860516750 5860516495  2.7T Solaris /usr & Apple ZFS
/dev/sdd9  5860516751 5860533134      16384    8M Solaris reserved 1

いずれも、いま書き込まれている分はもう消して構わないので、 いったんまっさらにしてから Btrfs のファイルシステムを作る。

パーティションを作って(各ディスクとも1パーティションにした)、

[root@fg-arch ~]# gdisk /dev/sdc
[root@fg-arch ~]# gdisk /dev/sdd
[root@fg-arch ~]# gdisk /dev/sde
[root@fg-arch ~]# partprobe

ファイルシステム作成。

[root@fg-arch ~]# mkfs.btrfs -f /dev/sdc1
[root@fg-arch ~]# mkfs.btrfs -f /dev/sdd1
[root@fg-arch ~]# mkfs.btrfs -f /dev/sde1

作ったパーティション達を house に加える。

[root@fg-arch ~]# btrfs device add -f /dev/sdc1 /dev/sdd1 /dev/sde1 /house/library

そして、Btrfs 状態確認。

house に空のデバイスが増えた!

[root@fg-arch ~]# btrfs filesystem show
Label: 'house'  uuid: 962205ef-673e-4b93-be7e-58bd23d68095
	Total devices 5 FS bytes used 2.29TiB
	devid    1 size 2.61TiB used 2.29TiB path /dev/sda5
	devid    2 size 2.73TiB used 2.29TiB path /dev/sdb1
	devid    3 size 186.31GiB used 0.00B path /dev/sdc1
	devid    4 size 2.73TiB used 0.00B path /dev/sdd1
	devid    5 size 2.73TiB used 0.00B path /dev/sde1

なんともイケていなそうなRAID構成ではある。

それはともかく、追加分 (/dev/sdc1, /dev/sdd1, /dev/sde1) に データが書き込まれていないので、 既存分 (/dev/sda5, /dev/sdb1) から振り分けたい。

勇気?を出してバランス。

[root@fg-arch ~]# btrfs balance /house/living
WARNING:

	Full balance without filters requested. This operation is very
	intense and takes potentially very long. It is recommended to
	use the balance filters to narrow down the balanced data.
	Use 'btrfs balance start --full-balance' option to skip this
	warning. The operation will start in 10 seconds.
	Use Ctrl-C to stop it.
10 9 8 7 6 5 4 3 2 1
Starting balance without any filters.

AM1:30 くらいからはじめたが、AM3:30 にはまだ終わってなかった。 そのあと寝たり外出したりしたので、いつ終わったのか定かでない。

完了すると、次のようにメッセージが出てくる。

Done, had to relocate 2347 out of 2347 chunks

ちなみに、バランス実行中に Ctrl+C で止めたり、システムが落ちても大丈夫らしい。

The balance operation is cancellable by the user. The on-disk state of the filesystem is always consistent so an unexpected interruption (eg. system crash, reboot) does not corrupt the filesystem. Manpage/btrfs-balance

バランスされたか確認する。

[root@fg-arch ~]# btrfs filesystem show
Label: 'house'  uuid: 962205ef-673e-4b93-be7e-58bd23d68095
	Total devices 5 FS bytes used 2.29TiB
	devid    1 size 2.61TiB used 1.06TiB path /dev/sda5
	devid    2 size 2.73TiB used 1.14TiB path /dev/sdb1
	devid    3 size 186.31GiB used 0.00B path /dev/sdc1
	devid    4 size 2.73TiB used 1.19TiB path /dev/sdd1
	devid    5 size 2.73TiB used 1.19TiB path /dev/sde1

バランスされた。

元々 2.29TiB x 2台 = 5.58TiB だったものが、 1.06TiB + 1.14TiB + 1.19TiB x 2 に分散されている。

  • /dev/sda5 の容量が少ないので、データも他のディスクと比べて少なく割り振られた。
  • /dev/sdb1 もそれに引っぱられて減ったと思っておく。
  • /dev/sdd1, /dev/sde1 は同じデータ量になった。
  • /dev/sdb1 にはまったくデータが振られなかった。容量が少なすぎて戦力外とみなされたか?。

ファイル圧縮を有効化する

今回は LZO で圧縮を行う。

まずは、LZO 圧縮モードでマウントし直す。

[root@fg-arch ~]# vi /etc/fstab

LABEL=house	/house/library	btrfs	defaults,relatime,subvol=library,compress=lzo,space_cache	0 0
LABEL=house	/house/living	btrfs	defaults,relatime,subvol=living,compress=lzo,space_cache	0 0

[root@fg-arch ~]# mount -o remount /house/living
[root@fg-arch ~]# mount -o remount /house/library

これで、次回以降の書き込みで圧縮が行なわれるようになる。

ただし既存のデータについては圧縮されない。 btrfs fi defrag を使い、手動で圧縮させることにした。

[root@fg-arch ~]# find /house/library -xdev -type f -exec btrfs fi defrag '{}' \;

とここまでやったが、圧縮実行後にデータ量の変化はなかった。

うーん…?

今回はここまで。

参考情報