Обновляем пакеты в стабильном дистрибутиве (debian way)
Оригинал статьи: http://habrahabr.ru/blog/linux/33514.html
a также: http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.ru.html#s-apt-show-versions
PbuilderHowto
Как вы уже наверно заметили в ubuntu, а тем более в debian, после выхода стабильного релиза, обновление пакетов происходит только в случае обнаружения критических ошибок. Это особенно заметно, когда обновление програмы которое вы так долго ждали, выходит спустя несколько дней после выхода вашего любимого дистрибутива. Но как вы уже догадываетесь – это нас не остановит.
Существует множество способов решения этой проблемы, поэтому сейчас мы все и рассмотрим
Готовые пакеты(backports)
Это конечно же самый простой способ, достаточно настроить репозитории, но здесь не всегда есть то в чём мы так нуждаемся.
backports для debian
getdeb для ubuntu
Добавляем в /etc/apt/sources.list deb http://www.backports.org/debian etch-backports main contrib non-free Добавляем дополнительные настройки для apt'а в /etc/apt/apt.conf.d/00default: APT::Default-Release “etch”; Теперь делаем update, и можем наслаждаться новыми пакетами.
apt-pinning
Отличный способ узнать, как зависимости пакетов умеют портить жизнь.
Для начала открываем /etc/apt/sources.list и добавляем в него более свежие репозитории.
deb http://mirror.yandex.ru/debian stable main non-free contrib deb http://mirror.yandex.ru/debian testing main non-free contrib deb http://mirror.yandex.ru/debian unstable main non-free contrib
Обычно, чем новее репозиторий – из того и будут ставиться пакеты. Но мы можем это изменить и для этого нужно создать файл /etc/apt/preferences
Package: * Pin: release a=stable Pin-Priority: 700 Package: * Pin: release a=testing Pin-Priority: 650 Package: * Pin: release a=unstable Pin-Priority: 600
Далее делаем aptitude update
Установка новых пакетов происходит как обычно aptitude -R install [package]. Если пакет существует в stable, то он выгружается из него,если же нет, то пытается найти этот же пакет сначала в testing, потом в unstable.
Если пакет находится одновременно в stable и unstable, но мы хотим использовать версию из unstable, то
$ sudo aptitude -R install [package]/unstable – установит unstable версию пакета, и попробует разрулить все зависимости с помощью пакетов из stable. Если по каким-то причинам не получается разруливать, то выдаётся полный полный отчёт о проблемах и предлагаются способы её решить.
$ sudo aptitude -R -t unstable install [package] – установит unstable версию пакета, и попробует разруливать все зависимости с помощью пакетов из unstable.
Для дополнительной информации, можно почитать apt_preferences
pbuilder
Ну вот мы и добрались до самого интересного и самого трудного решения наших проблем, скомпилируем свои бэкпорты(мы ведь уже поставили линукс, разве нам ещё страшны какие-то трудности?)
pbuilder – это небольшой скрипт, который автоматически создаёт chroot окружение, устанавливает необходимые пакеты для компиляции в нём, собирает .deb пакет и подчищает всё за собой. А нам остаётся лишь установить то что мы насобирали.
Первое что нам понадобится, это конечно же сам pbuilder. Устанавливаем его командой
$ sudo aptitude -R install pbuilder
Теперь нам предстоит настроить эту утилитку, буржуйские туториалы почему-то советовали производить все настройки в /etc/pbuilderrc. Но я предпочёл сохранять эти настройки в home директории, так что забываем о существовании того файла, и создаём ~/.pbuilderrc
Первое что нам предстоит выбрать – это внутри какого окружения мы будем собирать наши пакеты, так как мы сейчас уничтожаем миф о том что в дэбиане сплошное старьё, то будем собирать внутри stable.
И первая строчка, которая помещается в конфиг
DISTRIBUTION=etch
Далее нам нужно добавить из какого репозитория будут ставиться пакеты
MIRRORSITE=http://mirror.yandex.ru/debian
Так же можно ставить из локального DVD репозитория. Для этого я скопировал все 3dvd iso’шника и примонтировал в /mnt/debian/1 /mnt/debian/2 и /mnt/debian/3 и добавил в конфиг
MIRRORSITE=file:///mnt/debian/1 OTHERMIRROR="deb file:///mnt/debian/2 etch main contrib|deb file:///mnt/debian/3 etch main contrib"
Теперь нам нужно создать директории, в которых будут храниться временные пакеты, наш маленький локальный репозиторий и кэш пакетов, которые будут выгружаться для chroot окружений.
В моём случае это были директории:
/mnt/storage/packages - здесь будет хранится всё что связано с pbuilder'ом /mnt/storage/packages/repository - локальный репозиторий, из которого потом будем ставить наши собраные пакеты /mnt/storage/packages/repository/dists /mnt/storage/packages/repository/pool /mnt/storage/packages/repository/pool/nuit /mnt/storage/packages/repository/pool/nuit/main /mnt/storage/packages/repository/pool/nuit/main/binary-i386 /mnt/storage/packages/pbuilder - файлы, которые относятся к внутреней работе pbuilder'а /mnt/storage/packages/pbuilder/build /mnt/storage/packages/pbuilder/aptcache /mnt/storage/packages/pbuilder/hooks - дополнительные скрипты, которые выполняются в определёный момент работы pbuilder'а
Прописываем какие userid и username будут использоваться внутри chroot окружения
# the username and ID used by pbuilder, inside chroot. Needs fakeroot, really BUILDUSERID=1000 BUILDUSERNAME=nuit
И список точек, которые нужно примонтировать внутри chroot окружения(в моём случае /mnt/storage нужен для того чтобы туда сливались результаты после сборки пакетов, /mnt/debian/* как локальные репозитории и /home с пользовательскими настройками):
BINDMOUNTS="/mnt/storage /mnt/debian/1 /mnt/debian/2 /mnt/debian/3 /home"
Ну и оставшиеся опции:
BASETGZ=/mnt/storage/packages/pbuilder/base.tgz
BUILDPLACE=/mnt/storage/packages/pbuilder/build/
BUILDRESULT=/mnt/storage/packages/repository/pool/
APTCACHE="/mnt/storage/packages/pbuilder/aptcache/"
APTCACHEHARDLINK="yes"
HOOKDIR="${HOME}/sys/pbuilder/hooks"
USEPROC=yes
USEDEVPTS=yes
USEDEVFS=no
# make debconf not interact with user
export DEBIAN_FRONTEND="noninteractive"
DEBEMAIL=""
BUILDSOURCEROOTCMD="fakeroot"
PBUILDERROOTCMD="sudo"
PBUILDERSATISFYDEPENDSCMD="/usr/lib/pbuilder/pbuilder-satisfydepends"
DEBBUILDOPTS=""
APTCONFDIR=""
DEBOOTSTRAPOPTS="--variant=buildd"
export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin"
export SHELL=/bin/bash
export debian_chroot="pbuild$$"
DEBOOTSTRAP="debootstrap"
PKGNAME_LOGFILE_EXTENTION="_$(dpkg --print-architecture).build"
PKGNAME_LOGFILE=""
Собираем chroot окружение
$ sudo pbuilder create --distribution etch
Это займёт некоторое время, будет установлен минимальный набор софта и библиотек, которые нужны дэбиану с помощью debootstrap и всё запакуется в base.tgz
Теперь чтобы собрать исходники deb пакетов, достаточно написать
sudo pbuilder build [package].dsc
Но где же брать исходники пакетов?
Сейчас мы научимся находить исходники deb пакетов и разруливать проблемы, которые для нас создали разработчики пакетов и зачем-то добавляют в зависимости для сборки версии пакетов, которых нет в stable.
Специально для любителей Gentoo – зачем хранить информацию по сборке каждого пакета на компьютере? Смотрите как это элегантно сделали в debian’е
Для начала разберём что же из себя представляет исходник deb пакета.
- .orig.tar.gz – исходники програмы, без изменений
- .diff.gz – патч, который накладывается на .orig, содержит скрипты по сборке исходников в .deb
- .dsc – дополнительная информация о пакете
Разные исходники можно найти на просторах интернета, но сейчас мы рассмотрим нахождение их в testing репозиториях. Добавляем в sources.list новый репозиторий, и обновляем его.
deb-src http://mirror.yandex.ru/debian testing main non-free contrib
Создаём директорию, в которой будут лежать исходники, например ~/packages/src/, заходим в неё и выкачиваем исходники нужного нам пакета
$ sudo apt-get source [package]
Есть ещё способ с помощью команды dget, указываем на ссылку с .dsc файлом и он выкачивает все остальные файлы. Находить нужные пакеты можно на http://packages.debian.org
E: Could not satisfy build-dependency.
Если вдруг при сборке пакета, вы увидели эту строчку, не надо пугаться. Поднимаем взгляд немного повыше и смотрим с какой из зависимостей возникли проблемы.
Чтобы разрулить эту проблему, нам придётся собрать свою собственную версию, в этом так же ничего сложного.
Для начала с помощью специальной команды распаковываем пакет и применяем к нему патчи из .diff’а, и перемещаем в отдельную директорию
$ dpkg-source -x [package].dsc $ mv [package] [package]-nuit
Находим внутри директорию debian и там файл control, открываем его и в строке Build-Depends исправляем проблемную зависимость на более старую версию, которая имеется в stable. Иногда придётся исправлять ещё и строчку Depends, но с ней как правило меньше проблем.
Остаётся лишь дописать что мы изменили в changelog и изменить номерок версии, делается это командой
$ dch -i
Что-то вроде этого
[package] ([package-version]) unstable; urgency=low * Changed [название пакета версию которого поправили] version dependency to [и на какую версию подправили]
Потом распаковываем оригинал, чтобы сгенерировать новый .diff.gz
$ tar -zxf [package].orig.tar.gz
И собираем наш новый пакет
$ dpkg-source -b ./[package]-nuit ./[package].orig
Локальный репозиторий
После сборки пакетов, мы конечно можем их установить с помощью dpkg, но это опять начнёт создавать неприятности, aptitude будет плохо справляться со своими обязаностями итд. Так что нам ничего не остаётся, как создать локальный репозиторий для наших пакетов.
Надеюсь что все директории мы уже создали, когда ставили pbuilder, остаётся лишь добавить небольшой скрипт в /mnt/storage/packages/update-repo.sh
#!/bin/sh cd /mnt/storage/packages/repository ls -1 pool | sed 's/_.*$/ priority section/' | uniq > override mkdir -p ./dists/nuit/main/binary-i386/ apt-ftparchive packages . | gzip -9 > ./dists/nuit/main/binary-i386/Packages.gz dpkg-scansources . | gzip -9 > ./dists/nuit/main/binary-i386/Sources.gz apt-ftparchive -o 'APT::FTPArchive::Release::Origin=nuit' release . > ./dists/nuit/main/binary-i386/Release #ls -1 pool | sed 's/_.*$/ priority section/' | uniq > override #mkdir -pv ./dists/nuit/main/binary-i386/ #dpkg-scanpackages pool override ./ | gzip -9 > ./dists/nuit/main/binary-i386/Packages.gz #touch ./dists/nuit/main/binary-i386/Release
Сделаем его исполняемым
$ chmod +x /mnt/storage/packages/update-repo.sh
И будем запускать его, когда нам понадобится обновить репозиторий, например после сборки нового пакета с помощью pbuilder’а.
Далее прописываем file:///mnt/storage/packages/repository nuit main в /etc/apt/sources.list и выдыхаем…
P.S.
Пользователи ubuntu надеюсь без проблем поймут где подставить feisty/gutsy вместо etch итд
Есть ещё несколько способов для совсем недомашнего пользователя, и такой пользователь скорее всего уже сам брал в руки книжки по Debian.
И напоследок несколько советов, которые возможно кому-нибудь пригодятся:
aptitude vs apt-get
Те кто использует debian etch и ещё не заметили что apt-get не отслеживает какие пакеты были установлены зависимостями, чтобы потом автоматически удалять их, когда они больше никем не используются, тем пора обратить на это внимание, или замусоривание системы с каждым годом будет нарастать. Конечно если поставить более свежую версию apt-get или пользоваться ubuntu последними версиями, то вы этого не заметите. Но раз уже это вас не убеждает, то вот цитата с сайта debian “Note that aptitude is the preferred program for package management from console both for package installations and package or system upgrades.”
Конечно же существуют решения, которые помогают подчищать систему в таких случаях, например deborphan. Но я предпочитаю изначально держать всё под контролем.
aptitude -R
Многие возможно не замечают, но aptitude с изначальными настройками тянет за собой не только зависимости, но и рекоммендованые пакеты, но мы ведь сами знаем что хотим устанавливать.
E: Dynamic MMap ran out of room
Добавляем в /etc/apt/apt.conf.d/00Cache “APT::Cache-Limit “33554432″;” если продолжает появляться, увеличиваем.
Оригинал статьи: http://habrahabr.ru/blog/linux/33514.html
a также: http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.ru.html#s-apt-show-versions
Нет комментариев
Комментирование закрыто.