如何迁移 ZFS 文件系统以使用压缩?

如何迁移 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。

答案1

复制数据。

就这些。

您的示例中缺少大量输出,但这并不重要。要将数据移动到压缩文件系统,您唯一需要做的就是通过复制、移动或填充新文件系统来重写数据。

通过在池级别启用压缩以便新文件系统继承该压缩,可以避免将来出现该问题。此外,请使用lz4压缩标志。总体来说比较好

答案2

尽管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  -

相关内容