Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Debian пакеты. Анатомия и сборка.
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Alexander Koshelev
November 07, 2012
Programming
85
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
ChromeでローカルLLM
ryu1013
0
190
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
800
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
150
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
0
110
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.4k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
380
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
240
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
250
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
160
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
590
最近”作らせてる” ローカルAIアプリの話
akit37
0
530
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
360
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Context Engineering - Making Every Token Count
addyosmani
9
1.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
YesSQL, Process and Tooling at Scale
rocio
174
15k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
960
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
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 Вопросы?