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
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
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
440
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
260
Hono + Inertia + React で LP を構築した話
oukayuka
2
170
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
510
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.7k
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
720
Cloudflare is Agents
chimame
0
180
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
650
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
380
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.8k
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
400
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
22k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
RailsConf 2023
tenderlove
30
1.5k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
360
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
The Limits of Empathy - UXLibs8
cassininazir
1
620
Documentation Writing (for coders)
carmenintech
77
5.5k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
480
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Abbi's Birthday
coloredviolet
3
9.5k
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 Вопросы?