#author("2023-10-05T02:35:05+00:00","default:sysosa","sysosa") #author("2023-10-14T15:03:19+00:00","default:sysosa","sysosa") &color(red){せいさくちゅう}; btrfsの本家様 [[https://btrfs.readthedocs.io/en/latest/>+https://btrfs.readthedocs.io/en/latest/]] &size(10){旧サイト [[https://btrfs.wiki.kernel.org/index.php/Main_Page>+https://btrfs.wiki.kernel.org/index.php/Main_Page]]}; 透過的ファイル圧縮やスナップショット機能を有するファイルシステム. zfsみたいにストレージプールから切り出してファイルシステムにすることができる. &size(10){LVMでも同様だけどファイルシステム自体で行うことが違いかな. LVMはその上にファイルシステムを作る事になりますからね}; ここでは &color(orangered){''RockyLinux 9''}; btrfsのボリューム作成、透過的圧縮について記す ***RockyLinuxで btrfs [#n4d585b3] CentOS7の場合は追加パッケージで使えてたのですが、RockyLinux9ではパッケージが提供されていないです. なのでカーネルから調整するとかになる. ここでは ELRepo リポジトリで提供している OS のパッケージを入れて btrfs 対応にしてみたいと思います #code(nonumber){{ [root@rockylinux9 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@rockylinux9 ~]# dnf install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm -y [root@rockylinux9 ~]# dnf --enablerepo=elrepo-kernel install kernel-ml kernel-ml-core kernel-ml-devel kernel-ml-devel-matched kernel-ml-modules kernel-ml-modules-extra kernel-ml-tools kernel-ml-tools-libs kernel-ml-tools-libs-devel -y [root@rockylinux9 ~]# reboot }} これでOSのupdateは完了 次にbtrfsの関連コマンドを入れます. こちらはコンパイルですね. #code(nonumber){{ [root@rockylinux9 ~]# git clone https://github.com/kdave/btrfs-progs [root@rockylinux9 ~]# dnf --enablerepo=crb,devel install python3-sphinx e2fsprogs-devel libblkid-devel uuid-devel libuuid-devel libgudev-devel python3-devel lzo-devel libaio-devel liburing-devel [root@rockylinux9 ~]# cd btrfs-progs [root@rockylinux9 btrfs-progs]# ./autogen.sh Generate build-system by: aclocal: aclocal (GNU automake) 1.16.2 autoconf: autoconf (GNU Autoconf) 2.69 autoheader: autoheader (GNU Autoconf) 2.69 automake: automake (GNU automake) 1.16.2 Now type './configure' and 'make' to compile. [root@rockylinux9 btrfs-progs]# [root@rockylinux9 btrfs-progs]# ./configure : : btrfs-progs: v6.5.2 libbtrfs: 0.1.2 (deprecated) libbtrfsutil: 1.2.0 prefix: /usr/local exec prefix: ${prefix} bindir: ${exec_prefix}/bin libdir: ${exec_prefix}/lib includedir: ${prefix}/include pkgconfigdir: ${libdir}/pkgconfig compiler: gcc CFLAGS: -g -O1 -Wall -D_FORTIFY_SOURCE=2 LDFLAGS: programs: yes shared libraries: yes static libraries: yes documentation: yes doc generator: sphinx backtrace support: yes btrfs-convert: yes (ext2) zstd support: yes lzo support: yes fsverity support: yes Python bindings: yes Python interpreter: /usr/bin/python crypto provider: builtin libudev: yes zoned device: yes Type 'make' to compile. [root@rockylinux9 btrfs-progs]# make; make test; make install }} ***mkfs.btrfs [#te10eee2] 可能ならばOSのsystem領域から btrfs にしてみたいが、ここらはディストリビューター側で用意されるか否かになる. RockyLinuxは未対応. なので追加したストレージデバイスに対して btrfs でフォーマットしてみる #code(nonumber){{ [root@rockylinux9 ~]# cat /etc/redhat-release Rocky Linux release 9.2 (Blue Onyx) [root@rockylinux9 ~]# cat /proc/version Linux version 6.5.5-1.el9.elrepo.x86_64 (mockbuild@391cbd5c70a749809f5fdc4e883d88ef) (gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4), GNU ld version 2.35.2-37.el9) #1 SMP PREEMPT_DYNAMIC Sat Sep 23 12:43:41 EDT 2023 [root@rockylinux9 ~]# cat /proc/partitions major minor #blocks name 8 0 167772160 sda 8 1 51200 sda1 8 2 2097152 sda2 8 3 524288 sda3 8 4 165097472 sda4 8 16 33554432 sdb 8 32 67108864 sdc 11 0 9234624 sr0 [root@rockylinux9 ~]# }} 使うコマンドは mkfs.btrfs です. デバイスのパーティションを切るかどうかですが、分けないのでそのまま使います. ここでは2つの領域(/dev/sdbと/dev/sdc)に対して行います #code(nonumber){{ [root@rockylinux9 ~]# mkfs.btrfs /dev/sdb [root@rockylinux9 ~]# mkfs.btrfs /dev/sdc btrfs-progs v6.5.2 btrfs-progs v6.5.2 See https://btrfs.readthedocs.io for more information. See https://btrfs.readthedocs.io for more information. NOTE: several default settings have changed in version 5.15, please make sure NOTE: several default settings have changed in version 5.15, please make sure this does not affect your deployments: this does not affect your deployments: - DUP for metadata (-m dup) - DUP for metadata (-m dup) - enabled no-holes (-O no-holes) - enabled no-holes (-O no-holes) - enabled free-space-tree (-R free-space-tree) - enabled free-space-tree (-R free-space-tree) Label: (null) Label: (null) UUID: 7bd97407-be95-43d7-96b4-b45fbb02f70b UUID: 8187f7c7-aabf-419b-8096-0340b08cb479 UUID: cc0a221b-f8bf-4b28-83dc-bc4d150744f3 UUID: 76136264-670c-45da-a597-3cb6bcdd7286 Node size: 16384 Node size: 16384 Sector size: 4096 Sector size: 4096 Filesystem size: 32.00GiB Filesystem size: 64.00GiB Filesystem size: 64.00GiB Filesystem size: 32.00GiB Block group profiles: Block group profiles: Data: single 8.00MiB Data: single 8.00MiB Metadata: DUP 256.00MiB Metadata: DUP 1.00GiB Metadata: DUP 1.00GiB Metadata: DUP 256.00MiB System: DUP 8.00MiB System: DUP 8.00MiB SSD detected: yes SSD detected: yes Zoned device: no Zoned device: no Incompat features: extref, skinny-metadata, no-holes, free-space-tree Incompat features: extref, skinny-metadata, no-holes, free-space-tree Runtime features: free-space-tree Runtime features: free-space-tree Checksum: crc32c Checksum: crc32c Number of devices: 1 Number of devices: 1 Devices: Devices: ID SIZE PATH ID SIZE PATH 1 32.00GiB /dev/sdb 1 64.00GiB /dev/sdc 1 64.00GiB /dev/sdb 1 32.00GiB /dev/sdc [root@rockylinux9 ~]# [root@rockylinux9 ~]# }} &size(10){UUIDは「btrfs filesystem show /dev/sdb」とかでも表示される}; ストレージのサイズの違いで、「Metadata」のサイズが異なるようです. ***LABEL [#m5a0690c] ext4なら e2label、xfsなら xfs_admin で設けられるが、btrfsの場合は「btrfs」コマンドで設けれる. &size(10){/etc/fstabに記載方法としてUUIDもいいがそのデバイスが何であるかと明示した方がいいのでLABELを使ってます}; #code(nonumber){{ [root@rockylinux9 ~]# btrfs filesystem label /dev/sdb cryo [root@rockylinux9 ~]# btrfs filesystem show Label: 'cryo' uuid: 7bd97407-be95-43d7-96b4-b45fbb02f70b Total devices 1 FS bytes used 160.00KiB devid 1 size 32.00GiB used 536.00MiB path /dev/sdb Label: 'cryo' uuid: cc0a221b-f8bf-4b28-83dc-bc4d150744f3 Total devices 1 FS bytes used 144.00KiB devid 1 size 64.00GiB used 2.02GiB path /dev/sdb Label: none uuid: 8187f7c7-aabf-419b-8096-0340b08cb479 Label: none uuid: 76136264-670c-45da-a597-3cb6bcdd7286 Total devices 1 FS bytes used 144.00KiB devid 1 size 64.00GiB used 2.02GiB path /dev/sdc devid 1 size 32.00GiB used 536.00MiB path /dev/sdc [root@rockylinux9 ~]# }} ***mount [#l77244be] mkfs.btrfsでフォーマットしたHDDをシステムにマウントします。 透過的圧縮を使うなら「-o compress=」を使います. 圧縮アルゴリズムが複数あって zstd がいいみたい. 付随する数値は圧縮レベルです. &size(10){数値が高いと圧縮を強めようとしますが、CPU時間をより消費します}; 参照先: [[https://btrfs.readthedocs.io/en/latest/Compression.html>+https://btrfs.readthedocs.io/en/latest/Compression.html]] #code(nonumber){{ [root@rockylinux9 ~]# mkdir /cryo [root@rockylinux9 ~]# mount -t btrfs -o compress=zstd:3 /dev/sdb /cryo (あるいは) [root@rockylinux9 ~]# mount -t btrfs -o compress=zstd:3 LABEL=cryo /cryo [root@rockylinux9 ~]# mount |grep "/dev/sdb" /dev/sdb on /cryo type btrfs (rw,relatime,seclabel,compress=zstd:3,ssd,space_cache=v2,subvolid=5,subvol=/) [root@rockylinux9 ~]# }} ***サブボリューム [#o04bdf78] 後述のスナップショットを作成する際に便利かな /cryoの中に raw と progress のディレクトリを生やします. マウントポイント(/cryo)を含んで指定します. #code(nonumber){{ [root@rockylinux9 ~]# btrfs subvolume create /cryo/raw Create subvolume '/cryo/raw' [root@rockylinux9 ~]# btrfs subvolume create /cryo/progress Create subvolume '/cryo/progress' [root@rockylinux9 ~]# df -t btrfs Filesystem 1K-blocks Used Available Use% Mounted on /dev/sdb 33554432 5952 33012736 1% /cryo [root@rockylinux9 ~]# ls -l /cryo/ total 0 drwxr-xr-x. 1 root root 0 Oct 5 10:18 progress drwxr-xr-x. 1 root root 0 Oct 5 10:18 raw [root@rockylinux9 ~]# btrfs subvolume list /cryo -t ID gen top level path -- --- --------- ---- 257 17 5 raw 258 17 5 progress [root@rockylinux9 ~]# }} 削除はdeleteを交えて行う. 削除対象のsubvolumeにデータがあっても即座に削除されるので注意. &size(10){警告なし}; #code(nonumber){{ [root@rockylinux9 ~]# btrfs subvolume create /cryo/sample Create subvolume '/cryo/sample' [root@rockylinux9 ~]# btrfs subvolume delete /cryo/sample Delete subvolume (no-commit): '/cryo/sample' [root@rockylinux9 ~]# }} ***スナップショット [#kb731030] 前段のサブボリュームは単にmkdirでフォルダを作っているように見えるが、スナップショットの作成においてはそこが起点となる. #code(nonumber){{ [root@rockylinux9 ~]# echo abc > /cryo/progress/proteinA [root@rockylinux9 ~]# btrfs subvolume snapshot /cryo/progress /cryo/progress/@GMT-`TZ=GMT date +%Y.%m.%d-%H.%M.%S` Create a snapshot of '/cryo/progress' in '/cryo/progress/@GMT-2023.10.05-01.34.07' [root@rockylinux9 ~]# [root@rockylinux9 ~]# echo def >> /cryo/progress/proteinA }} そうしてproteinAの中身をチェック #code(nonumber){{ [root@rockylinux9 ~]# cat /cryo/progress/proteinA abc def [root@rockylinux9 ~]# [root@rockylinux9 ~]# cat /cryo/progress/@GMT-2023.10.05-01.34.07/proteinA abc [root@rockylinux9 ~]# }} スナップショットの削除 #code(nonumber){{ [root@rockylinux9 ~]# btrfs subvolume delete /cryo/progress/@GMT-2023.10.05-01.34.07/ Delete subvolume (no-commit): '/cryo/progress/@GMT-2023.10.05-01.34.07' [root@rockylinux9 ~]# }} このスナップショットとsambaのshadow_copy機能を組み合わせると「以前のバージョン」が使えます [[samba/btrfs]]