2012年12月17日月曜日

btrfsを実際に触ってみた

最近話題のbtrfsを弄ってみました

btrfsをカーネルに組み込む

btrfsは現在EXPERIMENTALなので注意して利用してください、HDDを初期化しますのでご自分の責任において実行してください、責任はとれませんのでご注意を...

カーネルでbtrfsが使えるように設定する、実行環境はGentoo Linuxなので他のディストリビューションの方はその通りにやってください
Kernel: Linux karky7 3.6.5-gentoo #9 SMP
Arch:   Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz GenuineIntel GNU/Linux

カーネルオプションを設定、カーネル組み込み、モジュールでもいいのでfilesystemのオプションを設定してカーネルをコンパイルしておく、rebootを忘れずに
File systems  --->
    <M> Btrfs filesystem (EXPERIMENTAL) Unstable disk format

カーネルオプション画像






モジュールで作成した場合は以下のようにmodprobeでカーネルに読み込んでおく
karky7 ~ # modprobe btrfs
karky7 ~ # lsmod | grep btrfs
btrfs                2061160  0
zlib_deflate           44485  1 btrfs
karky7 ~ # dmesg
...
...
Btrfs loaded
モジュールが読み込まれていることを確認


btrfsユーティリティプログラムをビルドする

btrfs関連のコマンドを利用するため以下のパッケージをインストールする
karky7 ~ # emerge -pv sys-fs/btrfs-progs
..
..
Calculating dependencies... done!
[ebuild   R    ] sys-fs/btrfs-progs-0.19.11  0 kB
...
...
karky7 ~ # emerge sys-fs/btrfs-progs

btrfsを構築する

まず、/dev/sdbをbtrfsに初期化する、オプションは

  • L: ラベル
  • m: metadataの保存アルゴリズムにraid10を使用
  • d: dataの保存アルゴリズムにraid10を使用


でメタデータとデータの冗長性を確保する、/dev/sdb1、/dev/sdb2、/dev/sdc1、/dev/sdc2、はそれぞれ100GBのスライスで作ってある
karky7 ~ # mkfs.btrfs -L bt1 -m raid10 -d raid10 /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdc2

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

adding device /dev/sdb2 id 2
adding device /dev/sdc1 id 3
adding device /dev/sdc2 id 4
fs created label bt1 on /dev/sdb1
        nodesize 4096 leafsize 4096 sectorsize 4096 size 400.00GB
Btrfs Btrfs v0.19
karky7 ~ #


btrfsの情報を見る

karky7 ~ # btrfs filesystem show --all-devices
Label: 'bt1'  uuid: 2dcc9b0a-f838-414b-aa38-069043e65709
        Total devices 4 FS bytes used 28.00KB
        devid    2 size 100.00GB used 2.01GB path /dev/sdb2
        devid    1 size 100.00GB used 2.03GB path /dev/sdb1
        devid    4 size 100.00GB used 2.01GB path /dev/sdc2
        devid    3 size 100.00GB used 2.01GB path /dev/sdc1

Btrfs Btrfs v0.19
karky7 ~ #

btrfsをマウントする

karky7 ~ # mkdir /mnt/btrfs
karky7 ~ # mount -t btrfs /dev/sdb1 /mnt/btrfs

subvolumeを作成

karky7 ~ # btrfs subvolume create /mnt/btrfs/dir1
Create subvolume '/mnt/btrfs/dir1'
karky7 ~ # btrfs subvolume create /mnt/btrfs/dir2
Create subvolume '/mnt/btrfs/dir2'
karky7 ~ # ls -l /mnt/btrfs/
total 0
drwxr-xr-x 1 root root 0 Nov  4 23:06 dir1
drwxr-xr-x 1 root root 0 Nov  4 23:06 dir2
karky7 ~ #
とりあえずディレクトリができるだけ


Snapshotをとってみる

ファイルを/mnt/btrfs/dir1に適当においてからスナップショットをとってみる、dir1のスナップがdir1_snapディレクトリに出来る
karky7 ~ # cp /etc/*.conf /mnt/btrfs/dir1/
karky7 ~ # ls /mnt/btrfs/dir1
GeoIP.conf            dhcpcd.conf         eix-sync.conf    gai.conf        host.conf    ltrace.conf  mdadm.conf   nsswitch.conf  rc.conf      rsyncd.conf   tmux.conf
ca-certificates.conf  dispatch-conf.conf  etc-update.conf  genkernel.conf  idmapd.conf  make.conf    mke2fs.conf  ntp.conf       redis.conf   sandbox.conf  whois.conf
colord.conf           e2fsck.conf         fuse.conf        gentwoo.conf    ld.so.conf   man.conf     nscd.conf    prelink.conf   resolv.conf  sysctl.conf
karky7 ~ #
karky7 ~ # btrfs subvolume snapshot /mnt/btrfs/dir1 /mnt/btrfs/dir1_snap
Create a snapshot of '/mnt/btrfs/dir1' in '/mnt/btrfs/dir1_snap'
karky7 ~ #
karky7 ~ # ls -l /mnt/btrfs/
total 0
drwxr-xr-x 1 root root 708 Nov  4 23:10 dir1
drwxr-xr-x 1 root root 708 Nov  4 23:10 dir1_snap
drwxr-xr-x 1 root root   0 Nov  4 23:06 dir2
karky7 ~ # ls /mnt/btrfs/dir1_snap/
GeoIP.conf            dhcpcd.conf         eix-sync.conf    gai.conf        host.conf    ltrace.conf  mdadm.conf   nsswitch.conf  rc.conf      rsyncd.conf   tmux.conf
ca-certificates.conf  dispatch-conf.conf  etc-update.conf  genkernel.conf  idmapd.conf  make.conf    mke2fs.conf  ntp.conf       redis.conf   sandbox.conf  whois.conf
colord.conf           e2fsck.conf         fuse.conf        gentwoo.conf    ld.so.conf   man.conf     nscd.conf    prelink.conf   resolv.conf  sysctl.conf
karky7 ~ #

ちなみにReadonlyなsnapshopもとれる
karky7 ~ # btrfs subvolume snapshot -r /mnt/btrfs/dir1 /mnt/btrfs/dir1_readonly_snap
Create a readonly snapshot of '/mnt/btrfs/dir1' in '/mnt/btrfs/dir1_readonly_snap'
karky7 ~ # echo 'Kakikomeruka?' > /mnt/btrfs/dir1_readonly_snap/kakiko.txt
-su: [f:id:cantimerny:20121105004411g:plain]/mnt/btrfs/dir1_readonly_snap/kakiko.txt: Read-only file system
karky7 ~ #

削除したファイルを戻す場合はcpやrsyncで行うらしい、zfs rollback的なコマンドがあればいいなとも思ったがzfsと若干扱いが違うので良とする
karky7 ~ # rm /mnt/btrfs/dir1/*
karky7 ~ # ls /mnt/btrfs/dir1/
karky7 ~ # ls /mnt/btrfs/dir1_readonly_snap/
GeoIP.conf            dhcpcd.conf         eix-sync.conf    gai.conf        host.conf    ltrace.conf  mdadm.conf   nsswitch.conf  rc.conf      rsyncd.conf   tmux.conf
ca-certificates.conf  dispatch-conf.conf  etc-update.conf  genkernel.conf  idmapd.conf  make.conf    mke2fs.conf  ntp.conf       redis.conf   sandbox.conf  whois.conf
colord.conf           e2fsck.conf         fuse.conf        gentwoo.conf    ld.so.conf   man.conf     nscd.conf    prelink.conf   resolv.conf  sysctl.conf
karky7 ~ # cp /mnt/btrfs/dir1_readonly_snap/* /mnt/btrfs/dir1/


サイズを確認する

karky7 ~ # btrfs file df /mnt/btrfs/
Data, RAID10: total=10.00GB, used=1.40MB
Data: total=8.00MB, used=0.00
System, RAID10: total=16.00MB, used=4.00KB
System: total=4.00MB, used=0.00
Metadata, RAID10: total=9.00GB, used=184.00KB
Metadata: total=8.00MB, used=0.00
karky7 ~ #
karky7 ~ # df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          201G  133G   58G  70% /
/dev/root       201G  133G   58G  70% /
tmpfs           3.9G  288K  3.9G   1% /run
rc-svcdir       1.0M   88K  936K   9% /lib64/rc/init.d
cgroup_root      10M     0   10M   0% /sys/fs/cgroup
udev             10M     0   10M   0% /dev
shm             3.9G  136K  3.9G   1% /dev/shm
/dev/sdb1       400G  3.2M  382G   1% /mnt/btrfs
karky7 ~ #
btrfs file df /mnt/btrfs/とdf -hの出力が違う、そもそもtotal=10.00GBとかどこの領域をさしているのか分からない、あとで調べる


リサイズしてみる

減らす事はないと思うが一様やってみる、広げられればいいと思うが、出来ればsubvolumeに大して容量を設定したいような気がする...zfs create -V 2G rpool/dir1みたいな
karky7 ~ # df -h
Filesystem      Size  Used Avail Use% Mounted on
...
karky7 ~ # btrfs filesystem resize -10G /mnt/btrfs
Resize '/mnt/btrfs' of '-10G'
karky7 ~ # df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sdb1       390G  3.7M  342G   1% /mnt/btrfs
karky7 ~ # btrfs filesystem resize max /mnt/btrfs
Resize '/mnt/btrfs' of 'max'
karky7 ~ # df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sdb1       400G  3.7M  382G   1% /mnt/btrfs
karky7 ~ #


デバイスを外してみる

これがいかない、実行手順が悪いのか分からないが後で調べる
karky7 ~ # btrfs fi show
Label: 'bt1'  uuid: 2dcc9b0a-f838-414b-aa38-069043e65709
        Total devices 4 FS bytes used 1.83MB
        devid    4 size 100.00GB used 8.51GB path /dev/sdc2
        devid    3 size 100.00GB used 8.51GB path /dev/sdc1
        devid    2 size 100.00GB used 8.51GB path /dev/sdb2
        devid    1 size 100.00GB used 8.53GB path /dev/sdb1

Btrfs Btrfs v0.19
karky7 ~ #
karky7 ~ # btrfs device delete /dev/sdc1 /mnt/btrfs
ERROR: error removing the device '/dev/sdc1' - Invalid argument


基本的な機能を試してみました、やはりCOWやsnapshotなど結構ありがたい機能が揃っています。Stableのリリースまでには結構重宝しそうな機能になるとおもいます。
今度はbtrfsをrootファイルシステムにしてGentooをインストールしたいという、野望が...出来なかった機能は後で調べます

0 件のコメント:

コメントを投稿