btrfsの本家様 https://btrfs.wiki.kernel.org/index.php/Main_Page
透過的ファイル圧縮やスナップショット機能を有するファイルシステム。CentOS 7で標準として使用可能
ここではこのbtrfsのボリューム作成、透過的圧縮について記す
btrfs/RAID
btrfsツール †
CentOS 7では標準で btrfs-progs パッケージがインストールされ
/usr/sbin/btrfs
/usr/sbin/btrfs-convert
/usr/sbin/btrfs-debug-tree
/usr/sbin/btrfs-find-root
/usr/sbin/btrfs-image
/usr/sbin/btrfs-map-logical
/usr/sbin/btrfs-select-super
/usr/sbin/btrfs-show-super
/usr/sbin/btrfs-zero-log
/usr/sbin/btrfsck
/usr/sbin/btrfstune
/usr/sbin/fsck.btrfs
/usr/sbin/mkfs.btrfs
らが利用可能である
mkfs.btrfs †
HDDにパーティションを設けるか(/dev/sdb1)、設けないでそのまま(/dev/sdb)使うか迷う。
btrfsは、複数のHDDを記憶域プールのような場所に置いて、必要な分だけ切り出して使うことができるので、下地のHDDにパーティションを設けることにあまり意味はないと思っている。ここではパーティションを設けずそのまま使うことにした。
フォーマットは、mkfs.btrfsを使う。
*既に別の規格でフォーマットされたHDDには-fフラグで強制的にフォーマットを行う
[root@btrfs ~]# mkfs.btrfs -f /dev/sdb
btrfs-progs v4.4.1
See http://btrfs.wiki.kernel.org for more information.
Label: (null)
UUID: 944de19b-85a8-4c7b-86c6-18cf2fbfbc09
Node size: 16384
Sector size: 4096
Filesystem size: 8.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 417.56MiB
System: DUP 12.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 1
Devices:
ID SIZE PATH
1 8.00GiB /dev/sdb
[root@btrfs ~]#
次にmount
シングルボリュームで †
mkfs.btrfsでフォーマットしたHDDをシステムにマウントします。
この際、透過的圧縮のオプションとして、zlib、lzoがある
参照:https://btrfs.wiki.kernel.org/index.php/Compression
マシンへのマウントは mount コマンドなら下記のようにする
[root@btrfs ~]# mkdir /home1
[root@btrfs ~]# mount -t btrfs -o compress=lzo,rw /dev/sdb /home1
[root@btrfs ~]# mount |grep "/dev/sdb"
/dev/sdb on /home1 type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=5,subvol=/)
[root@btrfs ~]#
/etc/fstabへの記述は
/dev/sdb /home1 btrfs compress=lzo,rw,defaults 0 0
とするか、UUIDを指定したいのなら、そのUUIDはbtrfsコマンドで得られる。
[root@btrfs ~]# btrfs filesystem show /dev/sdb
Label: none uuid: 944de19b-85a8-4c7b-86c6-18cf2fbfbc09
Total devices 1 FS bytes used 192.00KiB
devid 1 size 8.00GiB used 843.12MiB path /dev/sdb
[root@btrfs ~]# cat /etc/fstab
:
UUID=944de19b-85a8-4c7b-86c6-18cf2fbfbc09 /home1 btrfs compress=lzo,rw,defaults 0 0
[root@btrfs ~]#
mountオプションはここを参照 https://btrfs.wiki.kernel.org/index.php/Mount_options
デフォルトで透過的圧縮が有効で、compress=zlibが適用さているそうな。
透過的圧縮 †
2種の圧縮方法(zlib、lzo)と無圧縮でそれぞれマシンにmountしてみる。
そこにファイルを置いて圧縮状況を見てみた
[root@btrfs ~]# mount -t btrfs -o compress=zlib /dev/sdb /home1
[root@btrfs ~]# mount -t btrfs -o compress=lzo /dev/sdc /home2
[root@btrfs ~]# mount -t btrfs -o compress=no /dev/sdd /home3
[root@btrfs ~]# mount
:
/dev/sdb on /home1 type btrfs (rw,relatime,seclabel,compress=zlib,space_cache,subvolid=5,subvol=/)
/dev/sdc on /home2 type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=5,subvol=/)
/dev/sdd on /home3 type btrfs (rw,relatime,seclabel,space_cache,subvolid=5,subvol=/)
[root@btrfs ~]#
ファイルを置く前の状況
[root@btrfs ~]# df -t btrfs
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/sdb 8388608 16704 7532352 1% /home1
/dev/sdc 8388608 16704 7532352 1% /home2
/dev/sdd 8388608 16704 7532352 1% /home3
[root@btrfs ~]#
各/homeにAERSの四半期データ(総量 6.21 GB, data.tar)をコピーしてみた
[root@btrfs ~]# df -t btrfs
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/sdb 8388608 6519080 1043256 87% /home1
/dev/sdc 8388608 5580424 1984216 74% /home2
/dev/sdd 8388608 6549240 1012776 87% /home3
[root@btrfs ~]#
すると zlib を適用している /home1 が無圧縮(/home3)とほぼ変わらない値になった。lzoの/home2は多少圧縮が効いた様である。
一枚のファイル(data.tar)でほぼディスクを埋めるような場合は圧縮が失敗するのだろうか。。
そこで強制的に圧縮を行わせるオプションに変更して
[root@btrfs ~]# umount /home1 /home2
[root@btrfs ~]# mount -t btrfs -o compress-force=zlib /dev/sdb /home1
[root@btrfs ~]# mount -t btrfs -o compress-force=lzo /dev/sdc /home2
[root@btrfs ~]# mount
:
/dev/sdb on /home1 type btrfs (rw,relatime,seclabel,compress-force=zlib,space_cache,subvolid=5,subvol=/)
/dev/sdc on /home2 type btrfs (rw,relatime,seclabel,compress-force=lzo,space_cache,subvolid=5,subvol=/)
/dev/sdd on /home3 type btrfs (rw,relatime,seclabel,space_cache,subvolid=5,subvol=/)
再度data.tarをコピーしてみた
[root@btrfs ~]# df -t btrfs
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/sdb 8388608 1756636 5812164 24% /home1
/dev/sdc 8388608 2772060 4798404 37% /home2
/dev/sdd 8388608 6549240 1012776 87% /home3
[root@btrfs ~]#
zlibも圧縮が効いた様である。
lzoもオプション変更でより圧縮が効いた様であるが、1枚のファイルに対する圧縮率が状況によって変化するのか?
留意 一応、compress=zlib/lzoのままで手動で圧縮を掛けることはできるみたいだが、、
[root@btrfs ~]# btrfs filesystem defragment -r -v -czlib /home1
としても変化なかった
透過的圧縮(小さめなファイルにて) †
8GBのHDDに対して6GBの1枚ファイルを置くのではなく、data.tarを展開して配置してみた(ファイル数: 2073; ディレクトリ数:84 )圧縮オプションは、「compress」を使います
/dev/sdb on /home1 type btrfs (rw,relatime,seclabel,compress=zlib,space_cache,subvolid=5,subvol=/)
/dev/sdc on /home2 type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=5,subvol=/)
/dev/sdd on /home3 type btrfs (rw,relatime,seclabel,space_cache,subvolid=5,subvol=/)
その結果、
[root@btrfs ~]# df -t btrfs
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/sdb 8388608 2353108 5220012 32% /home1
/dev/sdc 8388608 2776352 4799360 37% /home2
/dev/sdd 8388608 6549240 1012776 87% /home3
[root@btrfs ~]#
といけた。これはテキストファイルだけだけど、半分以上に圧縮されるみたい。
透過的圧縮(MRCファイルで) †
mrcファイル200枚(6.25GB)をそれぞれに移してみた
「compress」
[root@btrfs ~]# df -t btrfs
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/sdb 8388608 4550376 3024568 61% /home1
/dev/sdc 8388608 6589984 976416 88% /home2
/dev/sdd 8388608 6586144 976416 88% /home3
[root@btrfs ~]#
「compress-force」なら
[root@btrfs ~]# df -t btrfs
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/sdb 8388608 4550408 3024568 61% /home1
/dev/sdc 8388608 6590112 976416 88% /home2
/dev/sdd 8388608 6586144 976416 88% /home3
[root@btrfs ~]#
となった。compressの規定である zlib が最良であった
(めも)ファイル削除 †
btrfsでファイル削除を行って df コマンドを叩くと、減ってないように見えるときがある。
どうやら瞬時には反映されないようで多少待ちます。