Назад | Перейти на главную страницу

Как перенести файловую систему 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 я не вижу, что файл размером 344 МБ занимает какое-то место.

Насколько я могу судить, сжатие не работает.

Вопрос

Почему я вижу такие странные результаты?

И как мне перенести несжатую файловую систему в сжатую?

Обновить

Добавлено compressratio свойство, которое показывает, что сжатие не производилось. dump.txt можно сжать до 190 МБ.

Скопируйте данные.

Вот и все.

В ваших примерах много чего не хватает, но это не имеет значения. Единственное, что вам нужно сделать для перемещения данных в сжатую файловую систему, - это переписать данные, скопировав их, переместив или заполнив новую файловую систему.

Избегайте проблемы в будущих ситуациях, включив сжатие на уровне пула, чтобы оно унаследовалось новыми файловыми системами. Также используйте lz4 флаг сжатия. Это вообще лучше.

Даже если 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  -