Я пытаюсь сделать быстрые резервные копии только списков ACL в больших файловых системах GNU / Linux. Расширенные разрешения на самом деле не нужны.
Я провожу 4 небольших теста на небольшом разделе, чтобы оценить прошедшее время (в секундах) и полученные размеры файлов (мегабайты).
getfacl -R -p /backup/dir > out_file
: 58.715 с (36 МБ)find /backup/dir -printf "%m %u:%g %p \n" > out_file
: 54.053 с (27 МБ)find /backup/dir -printf "%m %p \n" > out_file
: 0,763 с (26 МБ)ls -laR /backup/dir > out_file
: 4.865 с (20 МБ)Так ls
это лучшее решение, если нужна группа user: group.
В идеале out_file должно выглядеть так:
755 user:group /full/path/to/dir
744 user:group /full/path/to/file
...
Но насколько я знаю, получение полного пути к файлу из ls
требует дополнительных команд, которые замедлят процесс. Речь идет об очень больших файловых системах.
Нет лучшего (более быстрого / эффективного) инструмента, чем ls
справиться с этим?
Почему find
так сильно замедляются при получении информации о пользователе: группе по сравнению с ls
?
В качестве плюса ls
может также обрабатывать экранирование специальных символов в именах файлов (с -b
вариант).
Решено: (спасибо @shodanshok) Впервые после sync
:
getfacl -n -R -p /backup/dir > out_file
: 19.561 сек (36 МБ)Но второй раз запускаем ту же команду:
getfacl -n -R -p /backup/dir > out_file
: 2.496 с (36 МБ)По моему опыту, getfacl
может быть привязан к ЦП процессом разрешения имени пользователя. Попробуйте добавить -n
переключатель, например выдача getfacl -n -R -p /backup/dir > out_file
Во время тестов обратите особое внимание на кеш inode / dentry, так как он может легко исказить ваш синхронизированный тест. Перед каждым тестом выполните следующую команду, чтобы очистить оба кеша: sync; echo 3 > /proc/sys/vm/drop_caches