В свете выхода нового дистрибутива 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: 800Package: *
Pin: release a=wheezy
Pin-Priority: 600
ВАЖНО! Если выставить Pin-Priority для релиза выше 1000, то система будет устанавливать пакеты ТОЛЬКО из него, игнорируя другие значения меньше 1000!
Выполняем обновление списка пакетов:
root@server:~# aptitude update
В первую очередь обновим apt, aptitude и 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.