Вопрос внизу.
У меня есть несколько файловых систем 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 -