LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 826|回复: 3

pacman -Syu更新系统之后还能退回到原来的状态吗?

[复制链接]
发表于 2008-5-8 18:12:11 | 显示全部楼层 |阅读模式
如题, 谢谢.
发表于 2008-5-8 19:49:10 | 显示全部楼层
yaourt -Su --downgrade
#reinstall all packages which are marked as "newer than extra or core" in -Su output
#(this is specially for users who experience problems with [testing] and want to revert back to current)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-8 22:14:05 | 显示全部楼层
i'll try it.
thanks a lot
回复 支持 反对

使用道具 举报

发表于 2008-5-9 10:29:47 | 显示全部楼层
http://wiki.archlinux.org/index.php/Pacroll

Pacroll
From ArchWiki
Jump to: navigation, search
[edit] About
Pacroll is a bash shell script to roll back changes made by pacman. It requires root to run and also requires that you have the old version of the package saved in your cache. See Downgrade packages for more about this. Currently, it is limited to rolling back the most recent 'pacman -S[y]u'.

Pacroll is current NOT in a working state

[edit] TODO
Add the ability to download packages, so that they are not required to be in the local cache
Add the ability to select individual packages
Add the ability to roll back more than just the most recent upgrade
Improve upgrade detection (parsing pacman.log)
[edit] Code
#!/bin/bash

###
# Roll back the previous "pacman -Syu"
# Written by Daenyth
#
# Run with pacroll --help for usage
# Requires root to roll back packages
###

VERSION='1.0'
# Where do we store our temp files?
TEMPDIR='/tmp/pacroll'
# A list of packages installed
INSTALLEDPKGS="installed.$$"
# Packages in /var/cache/pacman/pkg
CACHEPKGS="cached.$$"
# Location of pacman.log
export PACLOG='/var/log/pacman.log'
# Location of package cache
PACCACHE='/var/cache/pacman/pkg'
# A list of updated packages which will be rolled back (packagename-version.etc.etc)
ROLLPKGS="rollme.$$"


###
# Declare some functions first
###

# Call this if we hit an error
function die () {
        echo "$1"
        cleanup
        exit
}

# Remove our files from temp storage
function cleanup () {
        cd $TEMPDIR
        rm -f $INSTALLEDPKGS
        rm -f $CACHEPKGS
        rm -f $ROLLPKGS
        rmdir $TEMPDIR # Use rmdir rather than rm -rf because at this point, there should be no files remaining in the directory, so this will alert us if there are for some reason
}

function usage () {
        echo "pacroll version $VERSION - coded by Daenyth"
        echo "Usage: $0"
        echo "Rolls back the most recent 'pacman -Su'"
        echo "This will NOT currently roll back updates done via pacman -S or pacman -U"
        echo "Requires root to roll back packages. The old version of the package must exist in your package cache"
        echo ""
        echo "This software is not guaranteed to run or keep your system safe. Run it at your own risk."
        exit
}

function graceful_close () {
        cleanup
        exit
}

function listpkgs () {
        pacman -Q | sed 's/ /-/' > $INSTALLEDPKGS
        ls $PACCACHE | sed 's/\.pkg\.tar\.gz$//' > $CACHEPKGS
}

function listupdated () {
        tail -n $(expr $(wc -l $PACLOG | awk '{ print $1 }') - $(grep -n 'full system upgrade' $PACLOG | tail -n 1 | cut -d : -f 1)) $PACLOG \
        | grep upgraded \
        | awk '{ print $4 $5 }' \
        | sed 's/(/-/' > $ROLLPKGS
       
}

function rollback () {
        cat $ROLLPKGS | pacman -U
}

###
# Some error checking is a good place to start the program...
###
if [[ $1 == "--help" ]]
        then usage
fi

mkdir -p $TEMPDIR || die "Cannot create $TEMPDIR"
[ -w $TEMPDIR ] || die "Cannot write to $TEMPDIR" # Should never fail, hopefully
[ -r $PACLOG ] || die "Cannot read $PACLOG"
[ -r $PACCACHE ] || die "Cannot read $PACCACHE"


###
# code
###
cd $TEMPDIR

listpkgs
listupdated
# Remove from the update list any packages which we do not have stored in cache.
comm -1 -2 $CACHEPKGS $ROLLPKGS > $ROLLPKGS
# Give us the filename of the packages to be installed
awk '{ print $1 ".plg.tar.gz" }' $ROLLPKGS > $ROLLPKGS

echo ""
echo "Rolling back `wc -l $ROLLPKGS | awk '{ print $1 }'` packages"
echo -n "roceed? (y/n) "
read proceed
if [[ $proceed != "y" ]]
then
        echo "Exiting without rollback"
        exit
fi
rollback
graceful_close
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表