web-dev-qa-db-ja.com

圧縮を使用するようにZFSファイルシステムを移行するにはどうすればよいですか?

一番下の質問。

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に圧縮できます。

2
Jasmine Lognnes

たとえ 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  -
0
Jasmine Lognnes

データをコピーします。

以上です。

あなたの例にはたくさんの欠落した出力がありますが、それは問題ではありません。データを圧縮ファイルシステムに移動するために必要なのは、データをコピーするか、移動するか、新しいファイルシステムにデータを入力することによってデータを書き換えることだけです。

プールレベルで圧縮を有効にして、新しいファイルシステムに継承されるようにすることで、将来の状況で問題を回避します。また、lz4圧縮フラグを使用します。 一般的には良いです

5
ewwhite