Обновляем пакеты в стабильном дистрибутиве (debian way)

The answer you entered to the math problem is incorrect.

Как вы уже наверно заметили в 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, и можем наслаждаться новыми пакетами.



Добавлено с подсказки от посмотреть профиль aim:
будьте внимательны с этими пакетами, тк за ними не следят ребята из
security team, и пакеты с критическими уязвимостями могут находиться
длительное время без изменений.

И исправлена моя тупость с непониманием его комментария:
Default-Release изменён с etch-backports на etch. И теперь приоритет
стабильного репозитория будет выше(для просмотра приоритетов, можно
воспользоваться командой "apt-cache policy"). А для установки пакетов
из backports, придётся воспользоваться командой "aptitude -t
etch-backports [package]")




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

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";" если продолжает появляться, увеличиваем.


и парочка alias'ов



alias pkg="aptitude"

alias spkg="sudo aptitude"

alias spkgi="sudo aptitude -R install"

alias spkgu="sudo aptitude safe-upgrade"

alias spkgr="sudo aptitude remove"

alias spkgp="sudo aptitude purge"

alias spkgd="sudo apt-get build-dep"

alias pkgc="apt-listchanges"

alias pkgb="apt-listbugs"



Источник:  http://habrahabr.ru/blog/linux/33514.html



Комментарии

Отправить комментарий

Пример: 1+1, ответ: 2
Содержание этого поля является приватным и не предназначено к показу.

Ñòàðí/A>