Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Debian пакеты. Анатомия и сборка.
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Alexander Koshelev
November 07, 2012
Programming
79
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Debian пакеты. Анатомия и сборка.
Alexander Koshelev
November 07, 2012
More Decks by Alexander Koshelev
See All by Alexander Koshelev
Продвинутое использование Celery
daevaorn
2
8.5k
Препарирование работы асинхронного кода
daevaorn
2
12k
Other Decks in Programming
See All in Programming
Deep dive into the select statement (GopherCon UK)
jespino
0
150
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
120
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
250
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
550
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
3.8k
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
390
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
310
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
Oxlintはいいぞ(続)
yug1224
1
480
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
240
Press start. Python's next generation.
willingc
PRO
3
250
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.8k
Featured
See All Featured
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
GraphQLとの向き合い方2022年版
quramy
50
15k
Test your architecture with Archunit
thirion
2
2.4k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
260
Side Projects
sachag
455
43k
30 Presentation Tips
portentint
PRO
1
380
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
260
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
510
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
Debian пакеты Анатомия и сборка Александр Кошелев
Вопросы • Что такое пакет? • Как собираются пакеты? •
Какие есть инструменты для сборки пакетов? • Как пакеты собирают в Яндексе?
Disclaimer • Результат исследований • Личный опыт • Личное мнение
(оценочные суждения) • Debian = Ubuntu
Анатомия пакета • A Package is a specific piece of
software which the system can install and uninstall • Дебиановский «пакет»: • Source package • Binary packages
Из source в binary
Из source в binary
Из source в binary package
Из source в binary package
Из source в binary package_1 package
Из source в binary package_1 package_2 package
Из source в binary package_1 package_2 package_3 package
Из source в binary package_1 package_2 package_3 ... package
Binary package • <package>_<ver>_<arch>.deb • Простой ar архив • Полезный
контент + метаинформация • То что непосредственно ставится на машины
Внутри *.deb • debian-binary – текстовый файл с номером версии
билд системы (2.0) • control.tar.gz – метаинформация и maintainer scripts • data.tar.gz – слепок файловой системы
Метаинформация • Название – Name • Версия – Version •
Архитектура – Architecture • Разработчик – Maintainer • Описание – Description • Зависимости – Depends/Conflicts/ Provides/Replaces/Suggests/
Maintainer scripts • Скрипты, запускающиеся в разные моменты процесса установки/удаления
пакета • preinst – до установки • postinst – после установки • prerm – до удаления • postrm – после удаления
Source package • <package>_<ver>.tar.gz – архив с деревом исходников •
<package>_<ver>.dsc – метаинформация • <package>_<ver>_<arch>.changes
*.changes • Метаинформация • Описание бинарных пакетов • Чексуммы пакетов
• PGP подпись
Source package (non-native) • <package>_<ver>.orig.tar.gz – оригинальный архив исходников из
upstream • <package>_<ver>.diff.tar.gz – разница между оригинальными исходниками и дебианизированными
Native vs non-native • Native пакет содержит в себе как
дебианизацию, так и код • Non-native содержит в себе только дебианизацию и отдельно код из upstream
Сборка Создание из дерева исходников готовых пакетов
Внутри debian/ • control – метаинформация • Описание source package
• Описание всех binary packages • changelog – лог изменений • rules – скрипт, создающий файловую структуру бинарных пакетов
debian/rules • Скрипт, делающий основную работу по сборке бинарных пакетов
• Обычно Makefile • Исполняемый файл • Принимает один аргумент – таргет
Таргеты
Таргеты • clean – очистка артефактов сборки
Таргеты • clean – очистка артефактов сборки • build –
сборка бинарника
Таргеты • clean – очистка артефактов сборки • build –
сборка бинарника • binary – раскладка в пакеты
Таргеты • clean – очистка артефактов сборки • build –
сборка бинарника • binary – раскладка в пакеты • binary-arch
Таргеты • clean – очистка артефактов сборки • build –
сборка бинарника • binary – раскладка в пакеты • binary-arch • binary-indep
Таргеты
Таргеты • clean – от текущего пользователя
Таргеты • clean – от текущего пользователя • build –
от текущего пользователя
Таргеты • clean – от текущего пользователя • build –
от текущего пользователя • binary – от root’а (благодаря fakeroot)
Таргеты • clean – от текущего пользователя • build –
от текущего пользователя • binary – от root’а (благодаря fakeroot) • binary-arch – от root’а
Таргеты • clean – от текущего пользователя • build –
от текущего пользователя • binary – от root’а (благодаря fakeroot) • binary-arch – от root’а • binary-indep – от root’а
debian/rules на Python
debian/rules на Python
dh_make • Bootstrap для нового пакета • Создает debian директорию
по заданному шаблону
Инструменты сборки • dpkg-buildpackage • debuild • pbuilder
dpkg-buildpackage • Правильно запускает debian/rules • Создает source package •
Подписывает получившиеся пакеты
Debhelper • Набор скриптов (хелперов) для создания паката • Оперирующих
в контексте всей сборки • Оперирующих конкретным бинарным пакетом • Обычно написаны на perl
debian/rules
Хелперы • dh_builddeb • dh_clean • dh_compress • dh_fixperms •
dh_gencontrol • dh_install • dh_installcatalogs • dh_installchangelogs • dh_installcron • dh_installdeb • dh_installdebconf • dh_installdirs • dh_installdocs • dh_installemacsen • dh_installexamples • dh_installinfo • dh_installinit • dh_installlogcheck • dh_installlogrotate • dh_installman • dh_installmenu • dh_installmime • dh_installpam • dh_installudev • dh_link • dh_lintian • dh_makeshlibs • dh_md5sums • dh_perl • dh_shlibdeps • dh_strip
Что делает хелпер? • Настраивает своё окружение • Итерируется по
всем бинарным пакетам • Подгружает конфиг (если есть) • Делает полезную работу
dh_install • Один из основых хелперов • Копирует файлы из
дерева исходников в бинарный пакет • Конфиг в <package>.install
<package>.install
Common Debian Build System (CDBS) • Набор отдельных Makefile’ов делающих
определенные действия • Нужные кусочки подключаются в debian/rules через include
debian/rules
Концепция • Собрать большой Makefile из нескольких маленьких кусочков •
Добавляет дополнительные таргеты (в том числе для каждого из бинарных пакетов) • Пакеты собираются последовательно • Classes & Rules
Последовательная сборка
Последовательная сборка package_1
Последовательная сборка package_1 dh_1
Последовательная сборка package_1 dh_1 dh_2
Последовательная сборка package_1 dh_1 dh_2 dh_3
Последовательная сборка package_1 dh_1 dh_2 dh_3 ...
Последовательная сборка package_1 dh_1 dh_2 dh_3 ...
Последовательная сборка package_1 dh_1 dh_2 dh_3 ...
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ...
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ...
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ... package_3
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ... package_3 dh_1
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ... package_3 dh_1 dh_2
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ... package_3 dh_1 dh_2 dh_3
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ... package_3 dh_1 dh_2 dh_3 ...
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ... package_3 dh_1 dh_2 dh_3 ...
Последовательная сборка package_1 dh_1 dh_2 dh_3 ... package_2 dh_1 dh_2
dh_3 ... package_3 dh_1 dh_2 dh_3 ... ...
Classes • makefile.mk • cmake.mk • python-distutils.mk • perlmodule.mk
Rules • debhelper.mk • simple-patchsys.mk • git.mk
Достоинства CDBS • Поддержка различных policy • Простые пакеты собирать
легко
Недостатки CDBS • Сложные пакеты собирать трудно • Важен порядок
следования include’ов • Создает над-фреймворк сборки • Нужно знать набор переменных и таргетов • Сильно искажает реальнй процесс сборки
Недостатки CDBS • Сложно внедрить в произвольное место конвейера сборки
свою логику
CDBS в Яндексe • yandex-git-cdbs • yandex-svn-cdbs • yandex-hg-cdbs •
yandex-verstka-cdbs • yandex-lego-cdbs
git.mk (yandex-git-cdbs)
dh7 • Debhelper версии >= 7 • Магический скрипт dh
• Конкурент CDBS
debian/rules
Концепция • Единая точка входа – dh • Пакеты собираются
параллельно • Наглядность • Процесс сборки прозрачен • Процесс сборки контролируем в любых границах
dh – диспетчер хелперов dh_1 dh_2 dh_3 ... dh dh_4
dh_5 dh_6 ... dh_7 dh_8 dh_9 ... target_1 target_2 target_3
Параллельная сборка
Параллельная сборка dh_1
Параллельная сборка dh_1 pkg_1
Параллельная сборка dh_1 pkg_1 pkg_2
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ...
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ...
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ...
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ...
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ...
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ... dh_3
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ... dh_3 pkg_1
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ... dh_3 pkg_1 pkg_2
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ... dh_3 pkg_1 pkg_2 pkg_3
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ... dh_3 pkg_1 pkg_2 pkg_3 ...
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ... dh_3 pkg_1 pkg_2 pkg_3 ...
Параллельная сборка dh_1 pkg_1 pkg_2 pkg_3 ... dh_2 pkg_1 pkg_2
pkg_3 ... dh_3 pkg_1 pkg_2 pkg_3 ... ...
Sequence addons • Perl модули • Позволяют добавить/исключить хелперы из
конвейера • Подключаются опцией --with • Лежат в /usr/share/perl5/Debian/ Debhelper/Sequence
dh_ycssjs
Build System Classes • Определеют систему сборки • По сути
тоже самое что Classes в CDBS • Подключаются опцией --buildsystem
Переопределение • Любой таргет или хелпер можно переопределить • Конкретный
хелпер можно исключить из конвейера • Конкретному хелперу можно добавить параметры
Переопределение
Пишем свой хелпер • Используем perl библиотеку – Debian::Debhelper •
Настраиваем окружение и парсим аргументы через init() • Итерируемся по всем бинарным пакетам • Читаем опциональный конфиг
yandex-debhelper • Набор яндексовых хелперов • Хелперы сделаны правильно •
Поддерживают dh7
dh_environment • Раскладывает файлы в зависимости от окружения (yandex-environment) •
Конфиг <package>.environment
dh_nginx • Кладет конфиг для Nginx • Конфиг <package>.nginx
dh_ycssjs • Билдит статику с посмощью ycssjs • Конфиг <package>.ycssjs
dh_gunicorn • Кладет конфиг init-скрипта для запуска WSGI приложений под
Gunicorn • Конфиг <package>.gunicorn
dh_nodeinit • Кладет конфиг init-скрипта для запуска Node.js приложений •
Конфиг <package>.node
Другие хелперы в Яндексе • dh_versions (yandex-dh-versions) • dh_clearvcs •
yandex-dh-make-ystatic • yandex-dh-make-ywww
От CDBS к dh7 • debian/rules сократился на 2/3 (благодаря
sequence addons) • Сборка стала быстрее • Процесс сборки стал нагляднее и более контролируемым На примере Поиска по Интранету
Intrasearch
Intrasearch
Intrasearch
Intrasearch
Intrasearch
Intrasearch
Intrasearch
Скорость сборки
Скорость сборки real 2m9.672s user 1m35.675s sys 0m23.154s
Скорость сборки real 2m9.672s user 1m35.675s sys 0m23.154s
Скорость сборки real 2m9.672s user 1m35.675s sys 0m23.154s real 1m33.441s
user 1m2.330s sys 0m13.830s
Выводы
Ресурсы • Debian Policy – http://www.debian.org/ doc/debian-policy/ • Debian New
Maintainers’ Guide – http://www.debian.org/doc/manuals/maint- guide/ • Ubuntu Packaging Guide – https:// wiki.ubuntu.com/PackagingGuide/Complete
Fin Вопросы?