Debian系统降级方法

手底下的服务器因为python版本要求, 需要更新的python版本, 就设置了testing源, 通过testing源升级到了高版本. 可问题来了, 发现这个升级带来了底层库文件的升级(如libc), 出了稳定的目的, 决定通过其它方式来搞定应用要求, 而升级过的服务器要降回去低版本的python, 重装太麻烦了, 我选择了apt降级.

apt升级系统是多么方便, 但如果反过来, 降级是一件痛苦的事情

Debian APT降级系统思路

需要先说明, APT并没有直接提供完善的降级命令. 而所谓的降级系统的本质, 就是系统所有软件版本回到我们需要的版本, 那么通过apt命令, 对所有系统中的软件, 强制的安装为我们需要的版本, 是不是就能完成降级的目的呢?

降级思路: 所有升级过的软件包, 降到我们需要版本

降级之路

  1. 首先设置正确的APT源: 修改/etc/apt/sources.list
    没有正确的APT源, 一切降级都是空谈, 必须设置为需要降级到的系统版本对应的源. 不要设想通过离线的deb包来完成降级, 依赖关系和软件包的数量会让人抓狂的

    设置好APT源之后, 需要执行一次aptitude update

  2. 安装辅助工具: apt-show-versions, 找出需要降级的软件包列表

    aptitude install apt-show-versions

    这个软件会列出系统内所有软件的版本, 同时会给出该软件是否比当前源的版本新, 输出如下

    ...
    xfsprogs/wheezy uptodate 3.1.7+b1
    xkb-data/wheezy uptodate 2.5.1-3
    xml-core/wheezy uptodate 0.13+nmu2
    xz-utils/wheezy uptodate 5.1.1alpha+20120614-2
    zlib1g/wheezy uptodate 1:1.2.7.dfsg-13
    zlib1g-dev/wheezy uptodate 1:1.2.7.dfsg-13
    • uptodate则表明该软件的版本与线上源的版本一致
    • newer则表明该软件的版本比线上源的版本新

    找出版本比当前源版本新的软件包, 这些就是升级之后的软件名

    # apt-show-versions | grep 'newer than version in archive'
    libc-bin 2.13-38+deb7u3 newer than version in archive
    libc-dev-bin 2.19-7 newer than version in archive
    libc6 2.19-7 newer than version in archive
    libc6-dev 2.19-7 newer than version in archive
    libpython2.7 2.7.8-1 newer than version in archive
    linux-image-3.2.0-4-amd64 3.2.60-1+deb7u1 newer than version in archive
    linux-libc-dev 3.2.60-1+deb7u1 newer than version in archive
    locales 2.19-7 newer than version in archive
    multiarch-support 2.13-38+deb7u3 newer than version in archive
    python2.7 2.7.8-1 newer than version in archive
    python2.7-dev 2.7.8-1 newer than version in archive
    python2.7-minimal 2.7.8-1 newer than version in archive
    task-english 3.20 newer than version in archive
    
    ## 找出需要降级的软件包名称
    # apt-show-versions | awk '/newer than version in archive/{print $1}'
    libc-bin
    libc-dev-bin
    libc6
    libc6-dev
    libpython2.7
    linux-image-3.2.0-4-amd64
    linux-libc-dev
    locales
    multiarch-support
    python2.7
    python2.7-dev
    python2.7-minimal
    task-english
  3. 通过apt-cache获取软件包的当前版本和线上源版本: 例如查看python2.7这个包

    # apt-cache policy python2.7
    python2.7:
     Installed: 2.7.8-1
     Candidate: 2.7.8-1
     Version table:
    *** 2.7.8-1 0
           100 /var/lib/dpkg/status
        2.7.3-6+deb7u2 0
           990 http://mirrors.163.com/debian/ wheezy/main amd64 Packages

    可以看到, 当前安装版本为2.7.8, 而线上源的版本为2.7.3

  4. 强制安装软件包的指定版本: 指定安装需要的版本

    aptitude install <PACKAGE>=<VERSION>

    如果一个个软件包的降级, 直到全部降级到正确的版本, 那么就可以完成我说的系统降级了, 不过说起来美好, 实际做起来并不顺利, 先不说数量多的问题, 如果单个包逐步降级, 比较容易出现依赖关系错误而出错的, 通过写几句简单的脚本, 可以快速完成所有工作

  5. 批量降级

    # aptitude install $(apt-cache policy `apt-show-versions | awk '/newer/{print $1}'` | awk  '/^[^ ]/{split($1,a,":");printf a[1]"="};/\/var\/lib\/dpkg\/status/{j=1;next};j{printf $1" ";j=0}END{printf "\n"}')
  6. 其它问题
    多数的软件包是可以正常降级的, 但总会有一些软件包比较顽固, 降级时出现错误, 如python2.7-minimal的降级操作, 依赖库libc等已经成功降回去, 但在python2.7-minimal这里却降级失败, 总是提示PYTHONHOME变量错误,导致python2.7相关包都无法降级, 同时也无法运行python2.7

    我实在没找出原因, 但我最后尝试了离线deb包的方式, 成功搞定了我的问题

    ## 下载指定软件包的deb包, 如python2.7-minimal
    # apt-get download python2.7-minimal
    # dpkg -i python2.7-minimal_2.7.3-6+deb7u2_amd64.deb
    # apt-get -f install
2014-07-18 15:321771
  • Adam2014-10-11 15:08

    Hi 您好 我尝试订阅您的博客 但是您的RSS源有问题, 无法订阅....