2014年2月19日水曜日

btrfs の RAID0 からディスクデバイス削除してみる。

btrfs ではソフトウェア RAID が構成できます。
そして、オンラインでファイルシステムへのディスク追加、削除ができてしまいます。

現在、/fs02 にマウントされているファイルシステムは btrfs でフォーマットされています。
10GBのディスク 2つで RAID0 を構成していますが、
そのうちの一つ(/dev/sdd)を削除してみます。
[root@ovnfs3 fs02]# mount | grep /fs02
/dev/sde on /fs02 type btrfs (rw)
[root@ovnfs3 fs02]# btrfs filesystem show /fs02
Label: '/fs02'  uuid: d1a7982b-b9cb-49ac-aaba-3b4945b389bf
        Total devices 2 FS bytes used 10.05GB
        devid    2 size 10.00GB used 7.01GB path /dev/sde
        devid    1 size 10.00GB used 7.03GB path /dev/sdd

Btrfs v0.20-rc1

RAID0 でファイルシステム作成してあるので、
構成するディスクの容量をあわせて、使用することができます。
※冗長構成ではないです。

今の時点では、ファイルシステムを半分以上使用しています。
※1つのディスクだけではデータが収まらない状態です。
[root@ovnfs3 fs02]# df -h /fs02
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde         20G   11G  8.0G  56% /fs02

ディスク削除のあとでファイルが開けることを確認するために、
テストファイルを置いておきます。(ただのテキストファイルです)
[root@ovnfs3 fs02]# cat -n /fs02/test.f
     1  test file
     2   test file
     3    test file

わざと容量不足になる状態でデバイス削除を試みてみました。
これは期待通り、空き領域不足で失敗します。
[root@ovnfs3 fs02]# btrfs device delete /dev/sdd /fs02
ERROR: error removing the device '/dev/sdd' - No space left on device

/var/log/messages ファイルを見ると
下記のような感じでデータを移動している様子が見られます。
Feb 18 23:44:55 ovnfs3 kernel: btrfs: relocating block group 12922650624 flags 9
Feb 18 23:45:08 ovnfs3 kernel: btrfs: found 6 extents
Feb 18 23:45:10 ovnfs3 kernel: btrfs: found 6 extents
Feb 18 23:45:10 ovnfs3 kernel: btrfs: relocating block group 10775166976 flags 9
Feb 18 23:47:20 ovnfs3 kernel: btrfs: found 34 extents
Feb 18 23:47:26 ovnfs3 kernel: btrfs: found 34 extents
Feb 18 23:47:26 ovnfs3 kernel: btrfs: relocating block group 37748736 flags 12
Feb 18 23:47:30 ovnfs3 kernel: btrfs: found 3368 extents
Feb 18 23:47:30 ovnfs3 kernel: btrfs: relocating block group 20971520 flags 10
Feb 18 23:47:30 ovnfs3 kernel: btrfs: relocating block group 12582912 flags 1
Feb 18 23:47:31 ovnfs3 kernel: btrfs: found 3 extents
Feb 18 23:47:31 ovnfs3 kernel: btrfs: found 3 extents
Feb 18 23:47:31 ovnfs3 kernel: btrfs: relocating block group 4194304 flags 4
Feb 18 23:47:32 ovnfs3 kernel: btrfs: found 1969 extents
Feb 18 23:47:32 ovnfs3 kernel: btrfs: relocating block group 0 flags 2
Feb 18 23:47:33 ovnfs3 kernel: btrfs: found 1 extents

空き容量が十分であれば、RAID を構成するディスクを削除できます。
ためしにファイルを削除して空き容量を作ってから、
もう一度 /fs02 から、/dev/sdd を 削除してみます。
[root@ovnfs3 fs02]# rm -rf /fs02/data1
[root@ovnfs3 fs02]# df -h /fs02
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde         20G  3.4G   17G  17% /fs02

今度は削除できました。
/fs02 の情報を表示しても /dev/sdd が表示されなくなりました。
[root@ovnfs3 fs02]# btrfs device delete /dev/sdd /fs02
[root@ovnfs3 fs02]# btrfs filesystem show /fs02
Label: '/fs02'  uuid: d1a7982b-b9cb-49ac-aaba-3b4945b389bf
        Total devices 1 FS bytes used 3.35GB
        devid    2 size 10.00GB used 7.25GB path /dev/sde

Btrfs v0.20-rc1

全体容量が半分に減っていますが、
/fs02 に置いてあるテストファイルは開けました。
[root@ovnfs3 fs02]# df -h /fs02
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde         10G  3.4G  6.4G  35% /fs02
[root@ovnfs3 fs02]# cat -n /fs02/test.f
     1  test file
     2   test file
     3    test file

ファイルシステムをマウントしたままでも、
ディスク削除によってファイルシステムも縮小できてしまいました。

以上、btrfs からデバイスを削除してみる話でした。

2014年2月16日日曜日

btrfs コマンド の「failed to open /dev/fd0」を気にならなくする・・・


btrfs コマンドで、なぜか頻繁に /dev/fd0(FDD)のエラーが表示されます。
しかし、このエラーが表示されていてもコマンドが異常終了したりはしていません。

同じコマンドでも、オプション指定によって出たり・・・
[root@ovnfs3 ~]# btrfs filesystem show /fs02
failed to open /dev/fd0: No such device or address
Label: '/fs02'  uuid: d1a7982b-b9cb-49ac-aaba-3b4945b389bf
        Total devices 2 FS bytes used 10.05GB
        devid    2 size 10.00GB used 7.01GB path /dev/sde
        devid    1 size 10.00GB used 7.03GB path /dev/sdd

Btrfs v0.20-rc1

出なかったりします。
[root@ovnfs3 ~]# btrfs filesystem show --all-devices
Label: '/fs01'  uuid: a0833497-61c0-44c2-a5bc-3e51b8c04f4b
        Total devices 2 FS bytes used 3.35GB
        devid    1 size 40.00GB used 3.03GB path /dev/sdb
        devid    2 size 40.00GB used 3.01GB path /dev/sdc

Label: '/fs02'  uuid: d1a7982b-b9cb-49ac-aaba-3b4945b389bf
        Total devices 2 FS bytes used 10.05GB
        devid    1 size 10.00GB used 7.03GB path /dev/sdd
        devid    2 size 10.00GB used 7.01GB path /dev/sde

Btrfs v0.20-rc1

strace コマンドで見てみると、
エラーが出る方は /proc/partitions にあるデバイスをオープンしようとしていそうですが・・・
[root@ovnfs3 ~]# strace -e open btrfs filesystem show /fs02 2>&1 | cat -n
     1  open("/etc/ld.so.cache", O_RDONLY)      = 3
     2  open("/lib64/libuuid.so.1", O_RDONLY)   = 3
     3  open("/lib64/libblkid.so.1", O_RDONLY)  = 3
     4  open("/lib64/libm.so.6", O_RDONLY)      = 3
     5  open("/lib64/libz.so.1", O_RDONLY)      = 3
     6  open("/usr/lib64/liblzo2.so.2", O_RDONLY) = 3
     7  open("/lib64/libpthread.so.0", O_RDONLY) = 3
     8  open("/lib64/libc.so.6", O_RDONLY)      = 3
     9  open("/proc/partitions", O_RDONLY)      = 3
    10  open("/dev/fd0", O_RDONLY)              = -1 ENXIO (No such device or address)
    11  failed to open /dev/fd0: No such device or address
    12  open("/dev/sr0", O_RDONLY)              = 4
    13  open("/dev/sda", O_RDONLY)              = 4
    14  open("/dev/sda1", O_RDONLY)             = 4
    15  open("/dev/sda2", O_RDONLY)             = 4
    16  open("/dev/sda3", O_RDONLY)             = 4
    17  open("/dev/sdb", O_RDONLY)              = 4
    18  open("/dev/sdc", O_RDONLY)              = 4
    19  open("/dev/sdd", O_RDONLY)              = 4
    20  open("/dev/sde", O_RDONLY)              = 4
    21  open("/proc/partitions", O_RDONLY)      = 3
    22  Label: '/fs02'  uuid: d1a7982b-b9cb-49ac-aaba-3b4945b389bf
    23          Total devices 2 FS bytes used 10.05GB
    24          devid    2 size 10.00GB used 7.01GB path /dev/sde
    25          devid    1 size 10.00GB used 7.03GB path /dev/sdd
    26
    27  Btrfs v0.20-rc1

エラーが出ないほうは、最初から /dev 配下のデバイスをオープンしようとしていて
/proc/partitions は読んでいなそう・・・
[root@ovnfs3 ~]# strace -e open btrfs filesystem show --all-devices 2>&1 | cat -n
     1  open("/etc/ld.so.cache", O_RDONLY)      = 3
     2  open("/lib64/libuuid.so.1", O_RDONLY)   = 3
     3  open("/lib64/libblkid.so.1", O_RDONLY)  = 3
     4  open("/lib64/libm.so.6", O_RDONLY)      = 3
     5  open("/lib64/libz.so.1", O_RDONLY)      = 3
     6  open("/usr/lib64/liblzo2.so.2", O_RDONLY) = 3
     7  open("/lib64/libpthread.so.0", O_RDONLY) = 3
     8  open("/lib64/libc.so.6", O_RDONLY)      = 3
     9  open("/dev", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
    10  open("/dev/ram9", O_RDONLY)             = 4
    11  open("/dev/ram5", O_RDONLY)             = 4
    12  open("/dev/ram6", O_RDONLY)             = 4
(以下略)

/proc/partitions の内容は下記です。
[root@ovnfs3 ~]# cat /proc/partitions
major minor  #blocks  name

   2        0          4 fd0
  11        0    3794060 sr0
   8        0   10485760 sda
   8        1     204800 sda1
   8        2    1048576 sda2
   8        3    9231360 sda3
   8       16   41943040 sdb
   8       32   41943040 sdc
   8       48   10485760 sdd
   8       64   10485760 sde

使用していない floppy のモジュールが読み込まれているので、
それを削除すればエラーは出ません。
[root@ovnfs3 ~]# lsmod | grep fl
zlib_deflate           21991  1 btrfs
floppy                 65361  0 ★これを削除する。
[root@ovnfs3 ~]# rmmod floppy
[root@ovnfs3 ~]# lsmod | grep fl
zlib_deflate 21991 1 btrfs ★floppy は表示されなくなった。
[root@ovnfs3 ~]# cat /proc/partitions
major minor  #blocks  name

  11        0    3794060 sr0 ★先頭にあった fd0 がなくなった。
   8        0   10485760 sda
   8        1     204800 sda1
   8        2    1048576 sda2
   8        3    9231360 sda3
   8       16   41943040 sdb
   8       32   41943040 sdc
   8       48   10485760 sdd
   8       64   10485760 sde

fd0 のエラーも出なくなります。
[root@ovnfs3 ~]# btrfs filesystem show /fs02
Label: '/fs02'  uuid: d1a7982b-b9cb-49ac-aaba-3b4945b389bf
        Total devices 2 FS bytes used 10.05GB
        devid    2 size 10.00GB used 7.01GB path /dev/sde
        devid    1 size 10.00GB used 7.03GB path /dev/sdd

Btrfs v0.20-rc1

以上、fd0 のエラーはあまり気にならなくなりました・・・

2014年2月5日水曜日

Btrfs にラベルを付けてみる。

Btrfs を使い始めてみましたが、
これで ソフトウェア RAID を構成するとなんとなく悩ましい気がします。

たとえば /dev/sdb と /dev/sdc で RAID0 を構成すると、
/dev/sdb でも /dev/sdc でも、どちらを指定してもマウントできます。
fstab ファイルにも、どちらかを記載しておけばマウントできます。
※最近の Oracle Linux では、デフォルトだと fstab でも UUID が使われています。
[root@ovnfs3 ~]# cat /etc/oracle-release
Oracle Linux Server release 6.5

[root@ovnfs3 ~]# cat /etc/fstab
UUID=e35804ed-5eca-4a97-9415-1d07158e297d /     ext4    defaults        1 1
UUID=fddf4134-4067-48fb-a8de-a61b790ebbdb /boot ext4    defaults        1 2
UUID=f5d199da-3fec-4c76-bdb2-8d0d9ed7256a swap  swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sdb                /fs01                   btrfs   defaults        0 0
/dev/sdd                /fs02                   btrfs   defaults        0 0

Btrfsファイルシステムの一覧を表示したときも
デバイスが増えてきたら、わかりづくなりそうな予感がします。
※下の例だと、RAID0 のファイルシステムが2つ(Diskは2つづつ)あります。
[root@ovnfs3 ~]# btrfs filesystem show --all-devices
Label: none  uuid: a0833497-61c0-44c2-a5bc-3e51b8c04f4b
        Total devices 2 FS bytes used 3.35GB
        devid    1 size 40.00GB used 3.03GB path /dev/sdb
        devid    2 size 40.00GB used 3.01GB path /dev/sdc

Label: none  uuid: 685f8baf-52a7-473f-90f1-0738511cd837
        Total devices 2 FS bytes used 1.03MB
        devid    1 size 10.00GB used 2.03GB path /dev/sdd
        devid    2 size 10.00GB used 2.01GB path /dev/sde

Btrfs v0.20-rc1

ファイルシステムへのラベル付与

普段は、私はファイルシステムにラベルを付けないのですが、
ちょっとわかりやすくしたいと思ってラベルを付けてみました。

マウントしたままデバイス名を指定してラベルをつけようとしたら、
(期待通り)エラーになりました。
/dev/fd0 のエラーが気になります・・・
[root@ovnfs3 ~]# btrfs filesystem label /dev/sdd /fs02
failed to open /dev/fd0: No such device or address
ERROR: dev /dev/sdd is mounted, use mount point
Btrfs をマウントしたままでも、
マウントポイントを指定したらラベル付けができてしまいました。
ちょっとわかりやすくなった気がします。
[root@ovnfs3 ~]# btrfs filesystem label /fs01 /fs01
[root@ovnfs3 ~]# btrfs filesystem label /fs02 /fs02
[root@ovnfs3 ~]# btrfs filesystem show --all-devices
Label: '/fs01'  uuid: a0833497-61c0-44c2-a5bc-3e51b8c04f4b
        Total devices 2 FS bytes used 3.35GB
        devid    1 size 40.00GB used 3.03GB path /dev/sdb
        devid    2 size 40.00GB used 3.01GB path /dev/sdc

Label: '/fs02'  uuid: 685f8baf-52a7-473f-90f1-0738511cd837
        Total devices 2 FS bytes used 1.03MB
        devid    1 size 10.00GB used 2.03GB path /dev/sdd
        devid    2 size 10.00GB used 2.01GB path /dev/sde

Btrfs v0.20-rc1

ちなみに、ラベル付けのコマンドラインの、
一番後ろで指定しているのがラベルです。
[root@ovnfs3 ~]# btrfs filesystem | grep label
    btrfs filesystem show [--all-devices] [<uuid>|<label>]
    btrfs filesystem label [<device>|<mountpoint>] [<newlabel>]
        Get or change the label of a filesystem

ラベルを指定してでマウント

一度アンマウントして、
[root@ovnfs3 ~]# umount /fs01
[root@ovnfs3 ~]# umount /fs02
[root@ovnfs3 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  2.7G  5.5G  33% /
tmpfs           498M     0  498M   0% /dev/shm
/dev/sda1       190M   54M  126M  31% /boot

「-L」 でラベルを指定してマウントします。
当然ながら、結局、見た目は変わりません。
[root@ovnfs3 ~]# mount -L /fs01 /fs01
[root@ovnfs3 ~]# mount -L /fs02 /fs02
[root@ovnfs3 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  2.7G  5.5G  33% /
tmpfs           498M     0  498M   0% /dev/shm
/dev/sda1       190M   54M  126M  31% /boot
/dev/sdb         80G  3.4G   75G   5% /fs01
/dev/sdd         20G  1.1M   18G   1% /fs02

fstab もラベル指定にしてみました。
[root@ovnfs3 ~]# cat /etc/fstab
UUID=e35804ed-5eca-4a97-9415-1d07158e297d /     ext4    defaults        1 1
UUID=fddf4134-4067-48fb-a8de-a61b790ebbdb /boot ext4    defaults        1 2
UUID=f5d199da-3fec-4c76-bdb2-8d0d9ed7256a swap  swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=/fs01             /fs01                   btrfs   defaults        0 0
LABEL=/fs02             /fs02                   btrfs   defaults        0 0

fstab を上記のように編集したあとに一度アンマウントして、
[root@ovnfs3 ~]# umount /fs01 /fs02
[root@ovnfs3 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  2.7G  5.5G  33% /
tmpfs           498M     0  498M   0% /dev/shm
/dev/sda1       190M   54M  126M  31% /boot

マウントします。マウントされました。
[root@ovnfs3 ~]# mount -a
[root@ovnfs3 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  2.7G  5.5G  33% /
tmpfs           498M     0  498M   0% /dev/shm
/dev/sda1       190M   54M  126M  31% /boot
/dev/sdb         80G  3.4G   75G   5% /fs01
/dev/sdd         20G  1.1M   18G   1% /fs02

以上、Btrfs にラベルを付けてみる話でした・・・