Как заполнить неиспользуемую часть образа файловой системы btrfs нулями?

Aug 20 2020

Это для гостевой Linux под VMware Workstation.

Я пробовал использовать vmware-toolbox-cmd disk shrink /btrfs, который монтируется как compress=zstd,noatime,nodiratime,space_cache,ssd,discard. Однако изображение просто увеличено до максимального размера и не может быть уменьшено.

Кажется, что сжатый btrfs не будет записывать нулевой файл как нули.

Я обнаружил, что есть несколько патчей ioctl для нулевого заполнения в https://lwn.net/ml/linux-btrfs/aed736d257f7e91cf3b0cf4d1fdfc247212d8bf7.1524233244.git.dsterba@suse.com/.

Как я могу позвонить BTRFS_CLEAR_OP_ZERO_NOUNMAPиз гостевого Linux?

Ответы

1 damian101 Sep 08 2020 at 21:24

Насколько мне известно, нет прямого способа заполнить неиспользуемое пространство файловой системы Btrfs нулями. Тем не менее, вы можете достичь того же, просто заполнив файловую систему с нуля , заполненными файлы , а затем удалить их, sfill это один из способов сделать это: sfill -llz \dev\X. Sfill является частью инструментария безопасного удаления:https://github.com/GIJack/secure_delete.

Но, как вы заметили, это не будет работать с включенным сжатием файловой системы, потому что нет ничего проще, чем сжать кучу нулей. Чтобы заставить ее работать, вам придется перемонтировать файловую систему без опции монтирования compress = zstd. Или установите флаг отсутствия сжатия для корня вашей файловой системы Btrfs с помощью btrfs property set <object> compression "", если ваша система находится в подтомах Btrfs, вам сначала нужно смонтировать корень файловой системы. В настоящее время этот флаг можно удалить только с помощью chattr -c.

Образы VMWare не сжимаются автоматически, но есть способы уменьшить их.