与 ext4 结合的透明压缩文件系统

与 ext4 结合的透明压缩文件系统

我正在尝试测试一个需要使用 ext4 文件系统进行压缩存储的项目,因为我使用的应用程序依赖于 ext4 功能。

是否有任何适用于 ext4 透明压缩的生产/稳定解决方案?

我已尝试过:

ZFS 卷上的 Ext4启用压缩。这实际上产生了不利影响。我尝试创建一个启用 lz4 压缩的 ZFS 卷,并在 /dev/zvol/ 上创建一个 ext4 文件系统……但 zfs 卷显示实际使用量是原来的两倍,而且压缩似乎没有任何效果。

# du -hs /mnt/test
**1.1T**    /mnt/test
# zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
pool       15.2T  2.70G   290K  /pool
pool/test  15.2T  13.1T  **2.14T**  -

ZFS 创建命令

zpool create pool raidz2 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde2 /dev/sdf1 /dev/sdg1 /dev/sdh2 /dev/sdi1
zfs set recordsize=128k pool
zfs create -p -V15100GB pool/test
zfs set compression=lz4 pool/test
mkfs.ext4 -m1 -O 64bit,has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink /dev/zvol/pool/test

Fuse压缩: 似乎可以工作,但不是 100% 稳定。正在寻找替代方案。

LessFS: 是否可以将 Lessfs 与 ext4 结合使用?我还没有尝试过,但对用户见解很感兴趣。

一个主要问题:缺乏真正的透明度

我发现 fusecompress 的一个问题是配额。例如,如果我在文件系统上启用了压缩,我希望我的系统从压缩中受益,而不一定最终用户受益。如果我为用户启用了 1GB 的配额,压缩率为 1.5,他们将能够上传 1.5GB 的数据,而不是 1GB 的数据和系统从压缩中受益。这似乎也在 df -h 上显示出来。有没有解决方案可以让压缩对配额透明?

答案1

我用Linux 上的 ZFS作为卷管理器和为传统文件系统提供额外保护和功能的手段。这包括引入块级快照、复制、重复数据删除、压缩和高级缓存到 XFS 或 ext4 文件系统。

看:https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/寻求另一种解释。

在我最常见的用例中,我利用 ZFS zvol 功能在现有 zpool 上创建稀疏卷。该 zvol 的属性可以像普通 ZFS 文件系统一样设置。此时,您可以设置压缩类型、卷大小、缓存方法等属性。

创建此 zvol 会向 Linux 呈现一个块设备,可以使用您选择的文件系统进行格式化。使用fdiskparted创建您的分区和mkfs完成的卷。

安装它之后您实际上就拥有了一个由 zvol 支持并具有其所有属性的文件系统。


这是我的工作流程...

创建一个由四个磁盘组成的 zpool:
您需要ashift=12使用与所用磁盘类型相关的指令。在本例中,zpool 名称为“vol0”。

zpool 创建 -o ashift=12 -f vol0 镜像 scsi-AccOW140403AS1322043 scsi-AccOW140403AS1322042 镜像 scsi-AccOW140403AS1322013 scsi-AccOW140403AS1322044

设置初始 zpool 设置:
我将其设置autoexpand=on为 zpool 级别,以防我用更大的驱动器替换磁盘或扩展池ZFS 镜像设置。我通常不使用 ZFS raidz1/2/3,因为它们性能较差,而且无法扩展 zpool。

zpool set autoexpand=on vol0

设置初始 zfs 文件系统属性:
请使用lz4压缩算法适用于新安装的 ZFS。可以一直保持开启状态。

zfs set compression=lz4 vol0
zfs set atime=off vol0

创建 ZFS zvol:
对于 Linux 上的 ZFS,使用较大的块大小非常重要。-o volblocksize=128k在这里绝对必不可少。该-s选项会创建一个稀疏的 zvol,并且在需要之前不会占用池空间。如果您对数据非常了解,您可以在这里过度使用。在这种情况下,我在池中有大约 444GB 的可用磁盘空间,但我向 XFS 展示了一个 800GB 的卷。

zfs create -o volblocksize=128K -s -V 800G vol0/pprovol

分区 zvol 设备:
对于第一个 zvol 应该是 /dev/zd0;对于后续 zvol 应该是 /dev/zd16、/dev/zd32 等

fdisk /dev/zd0 # (create new aligned partition with the "c" and "u" parameters)

创建并挂载文件系统:
在新创建的分区 /dev/zd0p1 上执行 mkfs.xfs 或 ext4。

mkfs.xfs -f -l size=256m,version=2 -s size=4096 /dev/zd0p1

使用 获取 UUIDblkid并进行修改/etc/fstab

UUID=455cae52-89e0-4fb3-a896-8f597a1ea402 /ppro       xfs     noatime,logbufs=8,logbsize=256k 1 2

挂载新的文件系统。

mount /ppro/

结果...

[root@Testa ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde2        20G  8.9G  9.9G  48% /
tmpfs            32G     0   32G   0% /dev/shm
/dev/sde1       485M   63M  397M  14% /boot
/dev/sde7       2.0G   68M  1.9G   4% /tmp
/dev/sde3        12G  2.6G  8.7G  24% /usr
/dev/sde6       6.0G  907M  4.8G  16% /var
/dev/zd0p1      800G  398G  403G  50% /ppro  <-- Compressed ZFS-backed XFS filesystem.
vol0            110G  256K  110G   1% /vol0

ZFS 文件系统列表。

[root@Testa ~]# zfs list
NAME           USED  AVAIL  REFER  MOUNTPOINT
vol0           328G   109G   272K  /vol0
vol0/pprovol   326G   109G   186G  -   <-- The actual zvol providing the backing for XFS.
vol1           183G   817G   136K  /vol1
vol1/images    183G   817G   183G  /images

ZFS zpool 列表。

[root@Testa ~]# zpool list -v
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vol0   444G   328G   116G    73%  1.00x  ONLINE  -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322043      -      -      -         -
    scsi-AccOW140403AS1322042      -      -      -         -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322013      -      -      -         -
    scsi-AccOW140403AS1322044      -      -      -         -

ZFS zvol 属性(注意referencedcompressratio并且volsize)。

[root@Testa ~]# zfs get all vol0/pprovol
NAME          PROPERTY               VALUE                  SOURCE
vol0/pprovol  type                   volume                 -
vol0/pprovol  creation               Sun May 11 15:27 2014  -
vol0/pprovol  used                   326G                   -
vol0/pprovol  available              109G                   -
vol0/pprovol  referenced             186G                   -
vol0/pprovol  compressratio          2.99x                  -
vol0/pprovol  reservation            none                   default
vol0/pprovol  volsize                800G                   local
vol0/pprovol  volblocksize           128K                   -
vol0/pprovol  checksum               on                     default
vol0/pprovol  compression            lz4                    inherited from vol0
vol0/pprovol  readonly               off                    default
vol0/pprovol  copies                 1                      default
vol0/pprovol  refreservation         none                   default
vol0/pprovol  primarycache           all                    default
vol0/pprovol  secondarycache         all                    default
vol0/pprovol  usedbysnapshots        140G                   -
vol0/pprovol  usedbydataset          186G                   -
vol0/pprovol  usedbychildren         0                      -
vol0/pprovol  usedbyrefreservation   0                      -
vol0/pprovol  logbias                latency                default
vol0/pprovol  dedup                  off                    default
vol0/pprovol  mlslabel               none                   default
vol0/pprovol  sync                   standard               default
vol0/pprovol  refcompressratio       3.32x                  -
vol0/pprovol  written                210M                   -
vol0/pprovol  snapdev                hidden                 default

答案2

您还需要在 ext4 文件系统上启用 discard。如果不启用 discard,zfs 不会在文件被删除时回收空间。这最终会导致 ext4 文件系统报告的内容与 zfs 卷报告的内容之间存在较大的空间差异。

相关内容