Bisakah saya mengembalikan upgrade apt-get jika terjadi kesalahan?

53

Apakah ada cara, sebelum memulai suatu aptitude upgradeatau apt-get upgrade, untuk mengatur sesuatu sehingga Anda dapat "dengan mudah" mengembalikan sistem Anda ke keadaan "apt" itu sebelum peningkatan yang sebenarnya, jika terjadi kesalahan?

Misalnya, instal ulang versi lama paket yang ditingkatkan selama proses.

(EDIT) Beberapa petunjuk : Saya tahu bahwa etckeepermisalnya menggunakan beberapa pengait aptsehingga diberitahukan setiap kali aptmenginstal atau menghapus instalan sebuah paket. Saya kira mungkin ada beberapa jenis skrip yang dapat menyimpan daftar paket yang baru diinstal dan nomor versi mereka sebelumnya untuk dapat menginstalnya kembali dari aptcache ( /var/cache/apt/archives). Ada juga checkinstallyang dapat melacak modifikasi file ...

Adakah detail tentang bagaimana mencapainya dengan benar?

Totor
sumber
Saya tidak tahu bahwa apt memiliki sesuatu seperti itu dibangun, Anda harus melacak nomor paket yang saat ini diinstal dll. IMHO lebih mudah hanya untuk mengembalikan cadangan kemarin jika diperlukan.
Anthon

Jawaban:

46

Saya baru saja harus mencari jawaban untuk ini, karena yang terakhir apt-get upgradepada server Debian membuatnya tidak mungkin untuk boot kernel terbaru di luar kotak sibuk, gagal me-mount partisi root zfs. Setidaknya kernel yang lebih lama masih bisa boot, tetapi tidak kompatibel dengan perangkat lunak lain. Maka dari itu perlu adanya rollback.

Jawaban singkatnya - Anda dapat menggunakan perintah berikut:

$ apt-get -s install $(apt-history rollback | tr '\n' ' ')

jika itu melakukan apa yang Anda inginkan hapus -sdan jalankan lagi. Berikut langkah-langkah yang saya ambil agar ini berfungsi dengan baik:

  1. Saya sementara memangkas saya /var/log/dpkg.loguntuk meninggalkan hanya upgrade hari ini

  2. Saya menginstal skrip kecil apt-historydari sini ke ~/.bashrcdan berlari

    $ apt-history rollback > rollback.txt
    ...
    libzfs2:amd64=0.6.4-4~wheezy 
    zfsutils:amd64=0.6.4-4~wheezy 
    zfs-initramfs:amd64=0.6.4-4~wheezy
    ...
    
  3. Ini memberikan daftar paket versi yang diformat dengan baik untuk digulung kembali dengan memasukkannya ke dalamnya apt-get install. Pangkas daftar ini sebagaimana yang diperlukan dalam editor teks dan kemudian jalankan (dengan -suntuk dry-run pertama):

    $ apt-get -s install $(cat rollback.txt | tr '\n' ' ')
    $ apt-get install $(cat rollback.txt | tr '\n' ' ')
    

Apt akan memperingatkan tentang downgrade yang diharapkan. Untuk mencegah rollback ini ditimpa oleh pemutakhiran berikutnya, paket-paket perlu disematkan, sampai masalah asli diselesaikan. Misalnya dengan:apt-mark hold zfsutils libzfs2 ...


function apt-history(){
    case "$1" in
      install)
            cat /var/log/dpkg.log | grep 'install '
            ;;
      upgrade|remove)
            cat /var/log/dpkg.log | grep $1
            ;;
      rollback)
            cat /var/log/dpkg.log | grep upgrade | \
                grep "$2" -A10000000 | \
                grep "$3" -B10000000 | \
                awk '{print $4"="$5}'
            ;;
      *)
            cat /var/log/dpkg.log
            ;;
    esac
}
ChrisW
sumber
Senang menemukan sumber daya itu! Jawaban bagus!
L0j1k
1
The apt-history rollbackperintah dapat diganti dengan sesuatu seperti awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor
Dengan ekstensi berikut, ini hanya cocok dengan peningkatan tanggal yang ditentukan (jadi tidak perlu mengubah log sebelumnya):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator
1
Setelah memotong dpkg.log saya mendapatkan banyak versi pesan tidak ditemukan, yaitu E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Saya menggunakan Debian Stretch untuk Raspian.
dps
7

File log /var/log/apt/history.logdan /var/log/apt/term.loghal-hal terdekat yang tersedia untuk deskripsi Anda:

Saya kira mungkin ada beberapa jenis skrip yang dapat menyimpan daftar paket yang baru diinstal dan nomor versi mereka sebelumnya

history.logmemberikan daftar ringkasan dari setiap tindakan yang aptdilakukan dalam format berikut:

Start-Date: 2013-06-21  16:05:05
Commandline: apt-get install rdiff-backup
Install: python-pyxattr:i386 (0.5.0-3, automatic), rdiff-backup:i386 (1.2.8-6), python-pylibacl:i386 (0.5.0-3, automatic
), librsync1:i386 (0.9.7-7, automatic)
End-Date: 2013-06-21  16:05:42

Secara khusus, ini memberikan daftar paket yang baru diinstal, atau paket yang dihapus. Selain itu, term.logmenunjukkan apa yang sebenarnya muncul di terminal selama aksi, sehingga akan menunjukkan versi lama dan baru dari paket. Sampel acak dari saya history.log:

Preparing to replace gnupg 1.4.10-4 (using .../gnupg_1.4.10-4+squeeze1_i386.deb) ...
Unpacking replacement gnupg ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 changed doc-base file(s)...
Registering documents with scrollkeeper...
Setting up gnupg (1.4.10-4+squeeze1) 

Mencoba untuk memutar kembali aptsecara otomatis tidak disarankan, tetapi jika Anda menggunakan log, maka harus dimungkinkan untuk melakukannya secara manual kecuali jika tindakan yang gagal telah merusak sesuatu yang mengganggu apttindakan, misalnya database dpkg yang tidak konsisten. Dalam hal ini, Anda harus memperbaiki masalah sebelum melanjutkan.

Faheem Mitha
sumber
4

Tidak, apt tidak membuat itu mudah.

Pilihan terbaik adalah beberapa jenis snapshot. Entah filesystem snapshots melalui lvm / zfs / btrfs atau instance snapshots jika Anda menggunakan semacam VM.

Satu-satunya pilihan lain adalah melakukan inventarisasi paket yang diinstal (dpkg -l) sebelum dan sesudah. Jika Anda ingin "memutar kembali", Anda harus menginstal versi sebelumnya secara eksplisit.

bahamat
sumber
Saya tahu versi persisnya, tetapi apt menolak: apt install openssl=1.0.2g-1ubuntu4.12menghasilkan E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Saya baru saja meningkatkan ke 1.0.2g-1ubuntu4.13dan saya bertanya-tanya apakah itu menyebabkan beberapa masalah CORS / CSP sekarang
Csaba Toth
Mungkin tidak lagi di repositori.
bahamat