В linux исторически сложилось для архивации использовать tar, это наверное самый многофункциональный инструмент, позволит сохранить все плюс даже то что не нужно.
* для сохранения прав нужен ключ -p
* для сохранения extended attributes нужен ключ --xattrs
* для обнаружения и сохранения информации о дырявых файлах sparse ключ -S
* символические ссылки будут сохранены как ссылки по умолчанию, поведение можно по разному менять опциями (например хранить как файл или к примеру при распаковке пробовать создать hardlink вместо symlink и т.п.)
Упаковывать можно потом полученный tar архив или лучше в процессе, ключ -a автоматически определит архиватор по расширению, чем угодно. Никто не мешает тебе создать архив без его сохранения просто отправляя его в момент создания в никуда:
tar -cjf /dev/stdout . | wc -c
будет сжимать bzip2 (ключ j) текущий каталог с подкаталогами и отправлять его в команду wc, которая просто посчитает его размер в байтах и выведет на экран. Повтори команду поменяв ключ j на J (это xz), z (это gzip) и т.п. и сравнивай полученные размеры (советую попробовать zstd)
p.s. как альтернатива, можно архивировать не файлы а весь раздел, с помощью набора утилит partclone (поддерживает все даже что то типа ntfs) можно создать копию раздела, в котором не будут сохранены сектора, помеченные как свободные, при этом скорость работы утилиты сравнима с dd (а это вообще просто посекторное копирование) и в большинстве случаев позволяет менять размер раздела, на который будет все это восстанавливаться (с ntfs редко но могут возникнуть проблемы при уменьшении)
p.p.s. еще есть фичи-инструменты файловых систем, например у btrfs есть возможность получить в качестве файла разницу между указанными снапшотами, созданными в разное время, и применить его позже, хоть на другой машине... тоже можно считать инструментом для бакапа