ユーザ用ツール

サイト用ツール


サイドバー

最新の10件
一覧
linux:filesystem:f2fs

mkfs.f2fs -O compression に失敗する

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月

https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git/commit/?id=fdd47b2ea7677119328c32bd159b7c200fd70212

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/ )があったので発表して聞いてみた

コメント

Kenichiro MATOHARA, 2021/02/23 22:57, 2021/02/23 23:53

Linux 5.11+f2fs-toolsのdevでも少し試してみましたが見た目の容量はこれまでと変わらない感じでした.

$ sudo LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH mkfs/mkfs.f2fs -f -l f2fs -O extra_attr,compression /tmp/f2fs.img

        F2FS-tools: mkfs.f2fs Ver: 1.14.0 (2021-02-23)

Info: Disable heap-based policy
Info: Debug level = 0
Info: Label = f2fs
Info: Trim is enabled
Info: Enable Compression
Info: Segments per section = 1
Info: Sections per zone = 1
Info: sector size = 512
Info: total sectors = 262144 (128 MB)
Info: zone aligned segment0 blkaddr: 512
Info: format version with
  "Linux version 5.11.0 (matoken@t430s) (gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2) #1 SMP Mon Feb 22 21:02:55 JST 2021"
Info: [/tmp/f2fs.img] Discarding device
Info: Overprovision ratio = 20.000%
Info: Overprovision segments = 25 (GC reserved = 18)
Info: format successful
$ sudo LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH mount -o compress_algorithm=zstd,compress_extension=ext /tmp/f2fs.img /mnt
$ grep f2fs /etc/mtab
/dev/loop21 /mnt f2fs rw,lazytime,relatime,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,compress_extension=ext,compress_mode=fs 0 0
$ sudo chmod 777 /mnt
$ dd if=/dev/zero of=/mnt/100M.ext bs=1M count=100
dd: error writing '/mnt/100M.ext': No space left on device
62+0 records in
61+0 records out
64933888 bytes (65 MB, 62 MiB) copied, 0.0429949 s, 1.5 GB/s 
$ rm /mnt/100M.ext
$ dd if=/dev/zero of=/mnt/50M.ext bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB, 50 MiB) copied, 0.0360251 s, 1.5 GB/s 
$ df /mnt
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/loop21       129024 116800     12224  91% /mnt
$ sudo ./tools/f2fs_io/f2fs_io get_cblocks /mnt/50M.ext
9600
$ echo 9600*512 | bc
4915200
$ sudo ./tools/f2fs_io/f2fs_io getflags /mnt/50M.ext
get a flag on /mnt/50M.ext ret=0, flags=compression
Lizard, 2020/10/10 01:43

同じ状況にあり、一日使って色々と調査していましたが、ひとつの答えにたどり着いたのでシェアしたいと思い書き込みます。

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が使われる模様) ・ 後から作成されるファイルやディレクトリは親ディレクトリの属性を引き継ぐ。アンマウント、リマウントしても属性は維持される。

Kenichiro MATOHARA, 2020/10/11 23:39

Lizardさん情報ありがとうございます. 圧縮は効いたんですね,手元ではディスク容量を少し越えるくらいのデータ(圧縮効率のいい0だけのファイル)を書き込んでみて容量不足のエラーになったのでうまく行っていない感じです. 手順を確認しながら再度試してみようと思います.

コメントを入力. Wiki文法が有効です:
   _  __  _   __  __  __   ___    __  ___
  | |/_/ | | / / / / / /  / _ \  /  |/  /
 _>  <   | |/ / / /_/ /  / ___/ / /|_/ / 
/_/|_|   |___/  \____/  /_/    /_/  /_/
 
linux/filesystem/f2fs.txt · 最終更新: 2020/10/05 01:37 by matoken