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

use*_*918 29 linux zfs filesystems compression 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**  -
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Fusecompress: 似乎可以工作,但不是 100% 稳定。寻找替代品。

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

一个主要问题:不是真正的透明度

An issue I saw with fusecompress was quotas. For example, if I enabled compression on the filesystem, I would want my system to benefit from the compression, not necessarily the end user. If I enabled a quota of 1GB for a user, with a compression ratio of 1.5, they would be able to upload 1.5GB of data, rather than 1GB of data and the system benefiting from the compression. This also appeared to show on df -h. Is there a solution to have compression transparent to quotas?

eww*_*ite 31

在 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 create -o ashift=12 -f vol0 mirror scsi-AccOW140403AS1322043 scsi-AccOW140403AS1322042 mirror scsi-AccOW140403AS1322013 scsi-AccOW140403AS1322044

设置初始 zpool 设置:
autoexpand=on在 zpool 级别进行设置,以防我用更大的驱动器替换磁盘或在ZFS 镜像设置中扩展池。由于性能不佳且无法扩展 zpool,我通常不使用 ZFS raidz1/2/3。

zpool set autoexpand=on vol0
Run Code Online (Sandbox Code Playgroud)

设置初始 zfs 文件系统属性:
请为新的 ZFS 安装使用lz4压缩算法。一直开着也没关系。

zfs set compression=lz4 vol0
zfs set atime=off vol0
Run Code Online (Sandbox Code Playgroud)

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

zfs create -o volblocksize=128K -s -V 800G vol0/pprovol
Run Code Online (Sandbox Code Playgroud)

分区zvol设备:
应该是/ dev / ZD0用于第一zvol;的/ dev / zd16,的/ dev / zd32等用于后续zvols

fdisk /dev/zd0 # (create new aligned partition with the "c" and "u" parameters)
Run Code Online (Sandbox Code Playgroud)


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

mkfs.xfs -f -l size=256m,version=2 -s size=4096 /dev/zd0p1
Run Code Online (Sandbox Code Playgroud)

获取 UUIDblkid并修改/etc/fstab.

UUID=455cae52-89e0-4fb3-a896-8f597a1ea402 /ppro       xfs     noatime,logbufs=8,logbsize=256k 1 2
Run Code Online (Sandbox Code Playgroud)

挂载新的文件系统。

mount /ppro/
Run Code Online (Sandbox Code Playgroud)

结果...

[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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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      -      -      -         -
Run Code Online (Sandbox Code Playgroud)

ZFS zvol 属性(注意referenced,compressratiovolsize)。

[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
Run Code Online (Sandbox Code Playgroud)

  • @MichaelHampton 主要是为了对齐和一致性。此外,如果我扩展基础卷,我想要灵活性。这里有几个抽象层。这类似于使用`/dev/sdb` 与`/dev/sdb1` 的争论。 (3认同)
  • @MichaelHampton 顺便说一句,这些天,我不再分区......尤其是虚拟机。 (2认同)