Filesystems

如何遷移 ZFS 文件系統以使用壓縮?

  • December 31, 2014

問題在底部。

我有幾個ZFS文件系統我想使用ZFS壓縮,但是由於啟用壓縮只會影響寫入文件系統的新數據,所以我想寫一個可以遷移文件系統的腳本,所以所有數據都被壓縮了。

這是我的測試嘗試

du -h /tmp/dump.txt

zfs create -p tank3/xtest1/fs
cp /tmp/dump.txt /tank3/xtest1/fs
zfs list | grep xtest

zfs create tank3/xtest2
zfs set compression=lzjb tank3/xtest2
zfs inherit compression tank3/xtest2

zfs snapshot tank3/xtest1/fs@snap
zfs send tank3/xtest1/fs@snap | zfs receive tank3/xtest2/fs
zfs get compression tank3/xtest2/fs
zfs list | grep xtest

zfs destroy -r tank3/xtest1
zfs destroy -r tank3/xtest2


echo "test 2"

zfs create tank3/xtest2
zfs set compression=lzjb tank3/xtest2
zfs list | grep xtest

cp /tmp/dump.txt /tank3/xtest2
zfs list | grep xtest
zfs get compressratio tank3/xtest2

zfs destroy -r tank3/xtest2

這使

344M    /tmp/dump.txt
tank3/xtest1                          575K  6.38T   288K  /tank3/xtest1
tank3/xtest1/fs                       288K  6.38T   288K  /tank3/xtest1/fs
NAME             PROPERTY     VALUE     SOURCE
tank3/xtest2/fs  compression  off       default
tank3/xtest1                          344M  6.38T   304K  /tank3/xtest1
tank3/xtest1/fs                       344M  6.38T   344M  /tank3/xtest1/fs
tank3/xtest2                          344M  6.38T   288K  /tank3/xtest2
tank3/xtest2/fs                       344M  6.38T   344M  /tank3/xtest2/fs
test 2
tank3/xtest2                          288K  6.38T   288K  /tank3/xtest2
tank3/xtest2                          288K  6.38T   288K  /tank3/xtest2
NAME          PROPERTY       VALUE  SOURCE
tank3/xtest2  compressratio  1.00x  -

在第一個測試中,我預計複製會在創建時壓縮數據,tank3/xtest2/fs但新創建的文件系統在使用發送/接收接縫時不會繼承壓縮。

在測試 2 中,我看不到 344MB 文件佔用任何空間。

據我所知,壓縮不起作用。

問題

為什麼我會看到這些奇怪的結果?

我應該如何遷移未壓縮的文件系統進行壓縮?

更新

添加compressratio了顯示未進行壓縮的屬性。dump.txt可以壓縮到 190MB。

儘管dump.txt事實證明它是高度可壓縮的,但由於某種原因,zfs 不會壓縮它。

用其他數據再次重做我的實驗,事實證明發送/接收會壓縮數據。在這裡,我在 zpool 上設置了壓縮,因此所有文件系統都會繼承它。我在這裡也使用了 Linux,但這沒關係。

# dd if=/dev/zero of=/mnt/dat0/zpool1 bs=1M count=1000
# dd if=/dev/zero of=/mnt/dat0/zpool2 bs=1M count=1000
# service zfs-fuse restart
# zpool create zpool1 /mnt/dat0/zpool1 
# zpool create zpool2 /mnt/dat0/zpool2
# zfs set compression=on zpool1
# zfs create zpool1/fs1
# zfs create zpool2/fs2
# cp -r /etc/ /var/log /zpool2/fs2/
# zfs snapshot zpool2/fs2@snap
# zfs send zpool2/fs2@snap | zfs receive zpool1/fs2
# zfs get compressratio zpool1/fs2
NAME        PROPERTY       VALUE  SOURCE
zpool1/fs2  compressratio  4.75x  -

複製數據。

就這些。

您的範例中有很多缺失的輸出,但這沒關係。將數據移動到壓縮文件系統中唯一需要做的就是通過複製、移動或填充新文件系統來重寫數據。

通過在池級別啟用壓縮來避免將來出現問題,以便新文件系統繼承它。另外,使用lz4壓縮標誌。一般比較好

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