Linux

與 ext4 結合的透明壓縮文件系統

  • June 14, 2017

我正在嘗試使用 ext4 文件系統測試需要壓縮儲存的項目,因為我使用的應用程序依賴於 ext4 功能。

是否有任何生產/穩定的解決方案可以在 ext4 上進行透明壓縮?

我試過的:

Ext4 over ZFS 卷啟用壓縮。這實際上產生了不利影響。我嘗試創建一個啟用了 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

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

LessFS: 是否可以將 Lessfs 與 ext4 結合使用?我還沒有嘗試過,但會對使用者洞察力感興趣。

一個主要問題:不是真正的透明度

我看到 fusecompress 的一個問題是配額。例如,如果我在文件系統上啟用壓縮,我希望我的系統從壓縮中受益,而不一定是最終使用者。如果我為使用者啟用 1GB 的配額,壓縮率為 1.5,他們將能夠上傳 1.5GB 的數據,而不是 1GB 的數據,並且系統會從壓縮中受益。這似乎也顯示在 df -h 上。有沒有解決方案讓壓縮對配額透明?

在 Linux 上使用 ZFS作為捲管理器,並為傳統文件系統提供額外的保護和功能。這包括將塊級快照、複製、重複數據刪除、壓縮和高級記憶體引入 XFS 或 ext4 文件系統。

有關另一種解釋,請參見:https ://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/。

在我最常見的案例中,我利用 ZFS zvol 功能在現有 zpool 上創建稀疏卷。可以像普通 ZFS 文件系統一樣設置 zvol 的屬性。此時,您可以設置壓縮類型、卷大小、記憶體方法等屬性。

創建這個 zvol 為 Linux 提供了一個塊設備,可以使用您選擇的文件系統對其進行格式化。使用fdiskparted創建您的分區和mkfs完成的捲。

掛載它,你就擁有了一個由 zvol 及其所有屬性支持的文件系統。


這是我的工作流程…

創建一個由四個磁碟組成的 zpool:

您需要ashift=12針對您正在使用的磁碟類型的指令。在這種情況下,zpool 名稱為“vol0”。

zpool create -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 文件系統屬性:

請為新的 ZFS 安裝使用lz4壓縮算法。一直開著也沒關係。

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

引用自:https://serverfault.com/questions/617648