Зачем миру еще один rsync и почему он появился в OpenBSD
Представьте: вы работаете с инструментом, который стал стандартом индустрии еще в 90-х. Речь про rsync. Он быстрый, надежный, он есть везде. Но если вы заглянете в исходники оригинального rsync, то увидите огромный пласт кода под лицензией GPL, накопленный за десятилетия. В какой-то момент разработчики OpenBSD решили, что им нужен инструмент с тем же алгоритмом, но написанный с нуля, с акцентом на безопасность и под свободной лицензией ISC. Так появился openrsync.
Это не просто клон. Это попытка переосмыслить классический протокол, выкинуть лишнее и заставить его работать в жестких рамках безопасности современной ОС.
Что это за проект
openrsync — это независимая реализация протокола rsync. Если вам нужно синхронизировать файлы между серверами, но вы по каким-то причинам не хотите тащить в систему тяжеловесный GNU rsync или вам критична лицензия BSD, этот проект — ваш кандидат.
Интересно, что openrsync создавался не как забава, а для конкретной задачи: валидации RPKI (Resource Public Key Infrastructure). Проекту rpki-client требовался надежный способ скачивания сертификатов по протоколу rsync, и они решили написать свою реализацию вместо использования системной. Сейчас код уже перекочевал в основную ветку OpenBSD, а в этом репозитории лежит портабельная версия, которую можно собрать под Linux или macOS.
Как он работает под капотом
Если вы когда-нибудь задумывались, почему rsync такой быстрый, то дело в «блочном обмене». Вместо того чтобы перекачивать файл целиком, клиент и сервер сравнивают куски (блоки) файла.
- Приемник делит свой (старый) файл на блоки.
- Для каждого блока считаются два хеша: быстрый (Adler-32) и медленный (MD4).
- Хеши отправляются отправителю.
- Отправитель «прокатывает» свое окно хеширования по файлу. Если быстрый хеш совпал, он проверяет медленный.
- Если совпадение найдено, вместо данных передается просто индекс блока. Если нет — летят «сырые» байты.
В openrsync алгоритм выбора размера блока довольно забавный: берется квадратный корень из размера файла, округляется до ближайшего множителя восьмерки, но не меньше 700 байт. Почему именно так? Автор честно пишет в документации: «по неизвестным причинам». Обожаю такую искренность в README.
Безопасность прежде всего
Главная фишка openrsync — это не скорость и не лицензия, а параноидальный подход к безопасности. В OpenBSD версии используются системные вызовы pledge и unveil.
unveil буквально ослепляет процесс: после старта программа видит только ту директорию, в которую идет синхронизация. Даже если в коде найдется уязвимость, атакующий не сможет выйти за пределы папки назначения. Для тех, кто привык запускать rsync от рута (что само по себе риск), это отличная страховка.
В портабельной версии под Linux таких механизмов из коробки меньше (автор называет состояние безопасности в Linux «бардаком»), но сама архитектура кода с разделением на разные процессы для отправителя и получателя минимизирует риски.
Практические моменты
Собрать проект на Linux очень просто:
./configure
make
sudo make install
При этом openrsync спокойно живет рядом с обычным rsync, они не конфликтуют. Можно даже заставить их работать в паре:
rsync --rsync-path=openrsync src/* remote_host:dst
Но тут есть нюанс. openrsync поддерживает только подмножество аргументов оригинальной утилиты. Если у вас в скриптах наворочены сложные фильтры и специфические флаги — скорее всего, их придется переписывать. С другой стороны, если вам нужны базовые -lrtp (ссылки, рекурсия, время, права), то разницы вы не заметите.
Итог: стоит ли переходить
На мой взгляд, openrsync — проект специфический. Он идеально подойдет вам в двух случаях:
- Вы строите максимально защищенную систему (особенно на базе OpenBSD) и хотите минимизировать количество GPL-кода и потенциальных дыр.
- Вам нужна легкая реализация протокола rsync для встраивания в свое приложение на C — благо тут всего около 10 тысяч строк кода, в которых реально разобраться за вечер.
Если же ваша работа завязана на сложных скриптах автоматизации, обкатанных годами на стандартном rsync v3.2+, то openrsync может показаться слишком аскетичным. Но как пример того, как нужно писать системный софт с оглядкой на безопасность, этот проект — просто учебник. заслуживающий места в «звездах» на GitHub.
