お茶漬けぶろぐ

ArchLinux+btrfsでストレージを組む練習

NASていうかbtrfsを使う練習。

今は自宅内NASとして2TB*4で作ったRAID10なストレージをそのまま使っているのだけど、容量を大きくしたいというのと、組んだまま6年も使い続けているので、組み直したいという話。
同じようにRAID10で組み直すのも芸がないし、容量の変更に対応できるような構成にしたい。当初はZFSを検討していたのだけど、ライセンス的に面倒だし、Linuxのファイルシステム「Btrfs」を5年間使用した記録 - GIGAZINEとかによると、構成の変更が視野に入っているならbtrfsのほうが良さそう。

というわけでbtrfsを使う練習をしてみる。

取り敢えず4本一挙に買うお金が無いので、2本で構成→後からお金があるタイミングで4本に増やす、みたいなのを想定。
ただし、システムのパーティションは素直に組んで、NAS用ストレージだけbtrfsにする。
・ストレージ1本で構成
・1本追加してRAID1にする(メタデータもRAID1)
・1本壊れた想定で、差し替える
・2本追加して、4本で構成する
・1本壊れた想定で、差し替える
・1本を大容量のものに差し替える

ArchLinuxセットアップ

何はともあれ実験環境のセットアップ。物理マシン(物理ストレージ)を用意するのは面倒なので、仮想マシンで。
2020.04.01なISOを読ませて起動して、以下つらつらと構成。

// それっぽくパーティショニング
# fdisk /dev/sda
// マウントとpacstrap
# mount /dev/sda2 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot
# pacstrap /mnt base base-devel linux linux-firmware
// fstab生成とchroot
# genfstab -U /mnt >> /mnt/etc/fstab
# arch-chroot /mnt
// タイムゾーン、ロケール、ホスト名、パスワード
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# vi /etc/locale.gen
# locale-gen
# cat hostname > /etc/hostname
# pacman -S vim
# vim /etc/hosts
# passwd
// ネットワーク
# pacman -S dhcpcd
# systemctl enable dhcpcd.service
// ブートローダ
# pacman -S grub
# grub-install --target=i386-pc --recheck /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg
// 再起動
# exit
# umount -R /mnt
# reboot

お次は一般ユーザの作成。

// 一般ユーザの作成
# useradd -m tea
# passwd tea
# ln -s /usr/bin/vim /usr/bin/vi
# visudo
# su tea
$ sudo whoami

ストレージ1本で構成

デフォルトで入ってるストレージは/dev/sdaとして認識されている。ここにストレージを追加したところ、/dev/sdbとして認識されたので、これ1本で構成してみよう。

$ sudo pacman -S btrfs-progs
$ sudo mkfs.btrfs -L tank /dev/sdb
$ sudo sh -c "echo UUID=`ls -l /dev/disk/by-uuid/ | grep sdb | awk '{print $9}'` /mnt btrfs rw,relatime 0 0 >>/etc/fstab"
$ sudo mount -a
$ btrfs filesystem df /mnt
Data, single: total=8.00MiB, used=0.00B
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=112.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B

取り敢えずの作成とマウントはできたっぽい。snapshotはsubvolume単位で作成するので、subvolumeも触ってみる。

$ sudo btrfs subvolume create /mnt/sv1
$ sudo chown tea:tea /mnt/sv1
$ cd /mnt/sv1
// てきとうにファイルを作成
$ dd if=/dev/zero of=/mnt/sv1/data bs=10M count=1
$ ls -l
-rw-r--r-- 1 tea tea 10485760 Apr 28 03:56 data
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=128.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// snapshotを作成する
$ sudo btrfs subvolume snapshot /mnt/sv1 /mnt/sv1.snap
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=144.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// subvolume内をいじる
$ rm data
// snapshotは残っている
$ ls /mnt/sv1.snap/
data
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=144.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// 弄ったsubvolumeにsnapshotを差し替える
$ sudo btrfs subvolume delete /mnt/sv1
$ sudo btrfs subvolume snapshot /mnt/sv1.snap /mnt/sv1
$ ls /mnt/sv1/
data

subvolumeのsnapshotをとって、それからまるっと書き戻す、みたいなことができるようになった。

1本追加してRAID1にする(メタデータもRAID1)

$ sudo btrfs device add /mnt/sdc /mnt
$ sudo btrfs filesystem show /mnt
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.20MiB
        devid    1 size 1.00GiB used 238.38MiB path /dev/sdb
        devid    2 size 1.00GiB used 0.00B path /dev/sdc
// まずbalance
$ sudo btrfs balance start /mnt
// metadataがDUPなのでRAID0に変更ついでにbalance
$ sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
$ btrfs filesystem df /mnt
Data, RAID1: total=416.00MiB, used=10.12MiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=208.00MiB, used=160.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
$ sudo btrfs filesystem show /mnt
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.30MiB
        devid    1 size 1.00GiB used 656.00MiB path /dev/sdb
        devid    2 size 1.00GiB used 656.00MiB path /dev/sdc

usedが増えすぎてる気がしてならない…が、dconvertmconvertを外してbalanceしても240.00MiBと448.00MiBなので、似たようなものか?raid1指定して再度balanceすると使用量が同じになったので間違っていなさそう(ふんいき)

1本壊れた想定で、差し替える

仮想マシンの設定でHDDを1本取り除いておく(そのままだと起動できないので、fstabから自動マウントしないようにしておくか、マウントオプションにdegradedを追加しておく)

$ sudo btrfs filesystem show
warning, device 1 is missing
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.30MiB
        devid    2 size 1.00GiB used 656.00MiB path /dev/sdc
        *** Some devices missing
// 強引にmount
$ sudo mount -o degraded /dev/sdb /mnt
// デバイスを取り除く
$ sudo btrfs device delete missing /mnt
ERROR: error removing device 'missing': unable to go below two devices on raid1

RAIDを組んでいる時に、必要台数を下回ることはできないエラー。RAID1なら2台を下回ってはいけない。Using Btrfs with Multiple Devices - btrfs Wikiによると、とにかく1台追加してからdeleteしろとのこと。

$ sudo btrfs device add /dev/sdb /mnt
$ sudo btrfs device delete missing /mnt
$ sudo btrfs balance start /mnt
$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 416.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 416.00MiB path /dev/sdb

2本追加して、4本で構成する

あとはもう同じようにやるだけ。

$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 416.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 416.00MiB path /dev/sdb
$ sudo btrfs device add /dev/sdd /dev/sde /mnt
$ sudo btrfs balance start /mnt
$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 288.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 288.00MiB path /dev/sdb
        devid    4 size 1.00GiB used 416.00MiB path /dev/sdd
        devid    5 size 1.00GiB used 416.00MiB path /dev/sde

同じ使用量のセットが2つあるのでうまくいってそう。

1本壊れた想定で、差し替える

今や4台あるので、btrfs device delete missingして、差し替えのストレージをbtrfs device addするだけ。

1本を大容量のものに差し替える

$ btrfs filesystem usage /mnt
WARNING: cannot read detailed chunk info, per-device usage will not be show, run as root
Overall:
    Device size:                   4.00GiB
    Device allocated:              1.38GiB
    Device unallocated:            2.62GiB
    Device missing:                4.00GiB
    Used:                         20.66MiB
    Free (estimated):              1.71GiB      (min: 1.71GiB)
~以下略~
$ btrfs device delete /dev/sdc /mnt
$ btrfs device add /dev/sdf /mnt
$ btrfs filesystem usage /mnt
WARNING: cannot read detailed chunk info, per-device usage will not be show, run as root
Overall:
    Device size:                  11.00GiB
    Device allocated:              1.69GiB
    Device unallocated:            9.31GiB
    Device missing:               11.00GiB
    Used:                         20.78MiB
    Free (estimated):              5.21GiB      (min: 5.21GiB)
~以下略~

Device missingは何を表しているのだろうかな~

取り敢えず使うぶんにはこんくらいあればいいんだろうかな、実際に使うときには、定期的にsnapshotとるとか、色々とメンテが必要なんだろうなとは思いつつ、今回はおしまい

どうでも良いが、モニタの液晶とパネルの間に、小さい虫が入ってしまったようで、ず~~~っと画面中でうろうろ動き回っていてつらい。分解するのもしんどいしなぁ。どうするかなぁ

https://twitter.com/ottyajp/status/1254671439183048704

< WindowsでChromiumをビルドする

3変数の鶴亀算 >