F2FSに透過圧縮機能があるらしいので試してみようと思ったらうまくいかない
$ sudo mkfs.f2fs -O compression /dev/mapper/loop31p2 Error: Wrong features
compression(LZO/LZ4)はLinux 5.6+,zstd対応はLinux 5.7+
手元のバージョンは5.8.10なので大丈夫なはず?
kernelの .config
未設定だった → # CONFIG_F2FS_FS_COMPRESSION is not set
$ grep -i f2fs /boot/config-`uname -r` CONFIG_F2FS_FS=m CONFIG_F2FS_STAT_FS=y CONFIG_F2FS_FS_XATTR=y CONFIG_F2FS_FS_POSIX_ACL=y CONFIG_F2FS_FS_SECURITY=y # CONFIG_F2FS_CHECK_FS is not set # CONFIG_F2FS_IO_TRACE is not set # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_F2FS_FS_COMPRESSION is not set
Debian pkgのKernelをCONFIGF2FSFS_COMPRESSIONを有効にしてbuildしてみる
$ sudo apt build-dep Linux $ apt source Linux $ cd ../linux-5.8.10 $ cp /boot/config-`uname -r` ./.config $ make xmemuconfig
.config
$ grep -i f2fs ./.config CONFIG_F2FS_FS=m CONFIG_F2FS_STAT_FS=y CONFIG_F2FS_FS_XATTR=y CONFIG_F2FS_FS_POSIX_ACL=y CONFIG_F2FS_FS_SECURITY=y # CONFIG_F2FS_CHECK_FS is not set # CONFIG_F2FS_IO_TRACE is not set # CONFIG_F2FS_FAULT_INJECTION is not set CONFIG_F2FS_FS_COMPRESSION=y CONFIG_F2FS_FS_LZO=y CONFIG_F2FS_FS_LZ4=y CONFIG_F2FS_FS_ZSTD=y CONFIG_F2FS_FS_LZORLE=y
kernel build & install
real 213m16.364s 結構掛かる
$ time make -j`nproc` bindeb-pkg LOCALVERSION=-f2fs
導入と再起動
$ sudo apt install ../linux-image-5.8.10-fsf2_5.8.10-fsf2-1_amd64.deb $ reboot
新しいkernelでフォーマット……
$ sudo mkfs.f2fs -O compress ./j2fstest.img Error: Wrong features
CONFIGF2FSFS_COMPRESSION=y にしたのに? loopback deviceがいけないのかとUSBメモリ(実デバイス)でも試してみたが同じエラー
もしかしてf2fs-toolsが古い?と確認すると圧縮が入ったのは今年の3月で,それの入っているv1.14.0が8月
f2fs-tools: support data compression This patch adds to support compression, introducing '-O compression' option to enable this feature in image.
てことでローカルバージョン古かった
$ dpkg-query -W f2fs-tools f2fs-tools 1.11.0-1.1
f2fs-toolsもbuildすることに
$ sudo apt build-dep f2fs-tools $ git clone https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git $ cd f2fs-tools $ git checkout v1.14.0 $ ./autogen.sh $ ./configure $ make
圧縮オプション付きでフォーマット※他の -O のオプションは man 8 mkfs.f2fs
に載っている
$ sudo LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH mkfs/mkfs.f2fs -f -l f2fs -O compression /dev/sdb1 Info: compression feature should always be enabled with extra attr feature
extra_attrも必要だった
$ sudo LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH mkfs/mkfs.f2fs -f -l f2fs -O extra_attr,compression /dev/sdb1
圧縮オプション付きでマウントもok
$ sudo LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH mount -o compress_algorithm=zstd /dev/sdb1 /mnt compress_algorithm=zstd,compress_log_size=2とか付いてる :) $ mount | grep /mnt /dev/sdb1 on /mnt type f2fs (rw,relatime,lazytime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,alloc_mode=reuse,fsync_mode=posix,compress_algorithm=zstd,compress_log_size=2)
適当に小さくなるデータを書き込んでみる…… 中身0だけのファイルを作ってみたけど圧縮が効いているのかわからない
$ sudo chown `id -u`.`id -g` /mnt $ dd if=/dev/zero of=/mnt/100MB bs=1M count=100 $ ls -l /mnt/100MB $ df /mnt
中身0だけのファイルを作ってみたら溢れた(圧縮が効いてたら溢れないはず)
$ dd if=/dev/zero of=/mnt/4GB bs=4M count=1000 dd: error writing '/mnt/4GB': No space left on device
圧縮が効くとこのくらい小さくなりそうだけど効いていない?
$ dd if=/dev/zero bs=4M count=1000 2>/dev/null | zstd -z - --stdout | wc -c 131515
compress_algorithm を zstd, lzo, lz4 と変えても駄目(それぞれmkfsしなおしている)
ドキュメント見る https://www.kernel.org/doc/Documentation/filesystems/f2fs.txt
To enable compression on regular inode, there are three ways: chattr +c file chattr +c dir; touch dir/file mount w/ -o compress_extension=ext; touch file.ext
mkfsしなおして chattr +c
, compress_extension
共に試してみたけどうまく行かない……
サブディレクトリ以下でもNG(確かなにかの暗号ファイルはサブディレクトリ以下じゃないと駄目だったので)
というあたりで東海道らぐ!ておくれライブフェスティバル( https://tokaidolug.connpass.com/event/189848/ )があったので発表して聞いてみた
コメント
Linux 5.11+f2fs-toolsのdevでも少し試してみましたが見た目の容量はこれまでと変わらない感じでした.
同じ状況にあり、一日使って色々と調査していましたが、ひとつの答えにたどり着いたのでシェアしたいと思い書き込みます。
https://archived.forum.manjaro.org/t/enable-f2fs-compression-in-linux56/127952/8 acaN (9 Apr) Btw, as of now, (experimental) linux56 from manjaro repos already has f2fs compression options (let's hope it'll keep them). Also, current implementation of compression doesn't show anything to user. File sizes and disk usage will remain the same. FS-level optimizations such as “reduced data writes” are the only benefit that you'll get.
現在の圧縮の実装では名目上のファイルサイズもディスク使用量も非圧縮の場合と変化はなく、ディスクに実際に書き込まれるデータが減少するだけ、とのことです。 したがって、圧縮で利益を得るに十分なCPUパワーがあれば、スピード面(とフラッシュメモリの寿命)において効果はあろうけども、現状ではそれが効いているかどうかを簡単に判断する術は無いことになります。 いろいろマウントオプションを変えて同期書き込みのスピードを測ってみたところ、要するにmkfs.f2fs -O extra_attr,compressionで作って、chattr +cとすれば圧縮は有効になるらしく、c属性のついたディレクトリ直下の書き込みは実際に速くなるので、内部的に圧縮は効いていると推測されます。 chattr -R +c <マウントポイント> とすれば当該のF2FS全域にわたって圧縮を有効化できるのではないでしょうか。
補足: ・ 必ずしもマウントオプションcompress_algorithmを指定する必要はない(省略するとデフォルトでLZ4が使われる模様) ・ 後から作成されるファイルやディレクトリは親ディレクトリの属性を引き継ぐ。アンマウント、リマウントしても属性は維持される。
Lizardさん情報ありがとうございます. 圧縮は効いたんですね,手元ではディスク容量を少し越えるくらいのデータ(圧縮効率のいい0だけのファイル)を書き込んでみて容量不足のエラーになったのでうまく行っていない感じです. 手順を確認しながら再度試してみようと思います.