Аккуратное обновление Debian

обновление DebianВ свете выхода нового дистрибутива Debian, возможно, кто-то захочет обновить свой старенький, но всё ещё поддерживаемый Debian до стабильной ветки. Часто бывает, что простым apt-get dist-upgrade систему обновить не получается или есть желание обновить не весь софт, оставив, например, старую версию GNOME или php5. В этой заметке я расскажу, как сделать процесс обновления максимально безболезненным.

Предполагается, что были выполнены рекомендации по подготовке системы к обновлению отсюда: https://www.debian.org/releases/stable/amd64/release-notes/ch-upgrading.ru.html

В самом простом случае достаточно добавить в /etc/apt/sources.list строки:

deb http://ftp.ru.debian.org/debian wheezy main contrib non-free
deb http://ftp.debian.org/debian/ wheezy-updates main contrib non-free
deb http://security.debian.org/ wheezy/updates main contrib non-free

Однако, если в списке указано больше репозитариев, можно сделать следующее:

root@server:~# grep squeeze /etc/apt/sources.list | sed -e 's/squeeze/wheezy/;' >> /etc/apt/sources.list.d/wheezy.list

Создаем файл, если его ещё нет, /etc/apt/preferences.d/01pinning. Пишем туда примерно следующее:

Package: *
Pin: release a=squeeze
Pin-Priority: 800

Package: *
Pin: release a=wheezy
Pin-Priority: 600

ВАЖНО! Если выставить Pin-Priority для релиза выше 1000, то система будет устанавливать пакеты ТОЛЬКО из него, игнорируя другие значения меньше 1000!

Выполняем обновление списка пакетов:

root@server:~# aptitude update

В первую очередь обновим aptaptitude и dpkg:

root@server:~# aptitude -fVt wheezy install apt aptitude dpkg --full-resolver
	Следующие НОВЫЕ пакеты будут установлены:
	aptitude-common{a} [0.6.8.2-1] gcc-4.7-base{a} [4.7.2-5] libapt-pkg4.12{a} [0.9.7.9+deb7u1] libboost-iostreams1.49.0{a} [1.49.0-3.2] libept1.4.12{a} [1.0.9]
	liblzma5{a} [5.1.1alpha+20120614-2] libtinfo5{a} [5.9-10] multiarch-support{a} [2.13-38]
	Следующие пакеты будут обновлены:
	apt [0.8.10.3+squeeze1 -> 0.9.7.9+deb7u1] aptitude [0.6.3-3.2+squeeze1 -> 0.6.8.2-1] dpkg [1.15.8.13 -> 1.16.12] libstdc++6 [4.4.5-8 -> 4.7.2-5] zlib1g [1:1.2.3.4.dfsg-3 -> 1:1.2.7.dfsg-13]
	РЕКОМЕНДУЮТСЯ следующие пакеты, но автоматически они установлены НЕ БУДУТ:
	apt-xapian-index aptitude-doc-cs aptitude-doc-en aptitude-doc-es aptitude-doc-fi aptitude-doc-fr aptitude-doc-it aptitude-doc-ja libparse-debianchangelog-perl
	5 пакетов обновлено, 8 установлено новых, 0 пакетов отмечено для удаления, и 299 пакетов не обновлено.
	Необходимо получить 9 179 kB архивов. После распаковки 3 832 kB будет занято.
	Следующие пакеты имеют неудовлетворённые зависимости:
	python-apt: Зависит: libapt-pkg4.10 который является виртуальным пакетом.
	apt-utils: Зависит: libapt-pkg4.10 который является виртуальным пакетом.
	libept1: Зависит: libapt-pkg4.10 который является виртуальным пакетом.
	Следующие действия разрешат зависимости:
	
	Удалить следующие пакеты:
	1) apt-listchanges
	2) apt-utils
	3) libept1
	4) python-apt
	
	Оставить следующие зависимости неразрешёнными:
	5) debconf рекомендует apt-utils (>= 0.5.1)
	
	
	Принять данное решение? [Y/n/q/?]

Такой вариант нас не устраивает, поэтому нажимаем n и Enter, пока система не предложит удовлетворяющее нас решение. В данном случае такое:

Следующие действия разрешат зависимости:
	
	Удалить следующие пакеты:
	1) libept1
	
	Установить следующие пакеты:
	2) libapt-inst1.5 [0.9.7.9+deb7u1 (stable)]
	3) libdb5.1 [5.1.29-5 (stable)]
	4) libpython2.7 [2.7.3-6 (stable)]
	5) libssl1.0.0 [1.0.1e-2 (stable)]
	6) python2.7 [2.7.3-6 (stable)]
	7) python2.7-minimal [2.7.3-6 (stable)]
	
	Обновить следующие пакеты:
	8) apt-utils [0.8.10.3+squeeze1 (now, oldstable) -> 0.9.7.9+deb7u1 (stable)]
	9) libapache2-mod-python [3.3.1-9+b1 (now, oldstable) -> 3.3.1-9+b3 (stable)]
	10) libexpat1 [2.0.1-7+squeeze1 (now, oldstable) -> 2.1.0-1+deb7u1 (stable)]
	11) python [2.6.6-3+squeeze7 (now, oldstable) -> 2.7.3-4+deb7u1 (stable)]
	12) python-apt [0.7.100.1+squeeze1 (now, oldstable) -> 0.8.8.2 (stable)]
	13) python-minimal [2.6.6-3+squeeze7 (now, oldstable) -> 2.7.3-4+deb7u1 (stable)]
	14) python-support [1.0.10 (now, oldstable) -> 1.0.15 (stable)]
	
	
	
	Принять данное решение? [Y/n/q/?] y

Пришло время приступить к непосредственно попакетному обновлению:

root@server:~# for pkg in $(aptitude search ~S~i~Aoldstable | grep -Ev '^i A' | awk '{print$2}'); do aptitude -fVrt wheezy install $pkg --full-resolver; done

При этом обновляются только неавтоматически установленные пакеты. Процесс долгий, но интересный. Придётся руками разрешать зависимости.

Финальный штрих, обновляем необновленные автоматически установленные пакеты:

root@server:~# for pkg in $(aptitude search ~S~i~Aoldstable | grep -E '^i A' | awk '{print$3}'); do aptitude -sfVrt wheezy install $pkg+M --full-resolver; done

Если что-то пошло не так, починить систему можно командой:

root@server:~# aptitude -f install

Всё вышенаписанное актуально и для Ubuntu, только нужно изменить имена релизов. Например, squeeze и oldstable на raring, а wheezy на saucy.

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