Btrfsのファイルシステムにディスクを追加した
今回の目標は、
- 前使っていた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 '{}' \;
とここまでやったが、圧縮実行後にデータ量の変化はなかった。
うーん…?
今回はここまで。