Bir şeyler ters giderse, apt-get yükseltme işlemini geri alabilir miyim?


53

Bir şeyi başlatmadan önce, aptitude upgradeveya bir apt-get upgradeşeyi ayarlamak, böylece sisteminizi "uygun" duruma "kolayca" geri çevirebilmeniz için bir şey yanlış giderse, fiili güncellemeden önce olduğu bir yol var mı?

Örneğin, işlem sırasında yükseltilen paketlerin eski sürümlerini yeniden yükleyin.

(EDIT) Birkaç ipucu : etckeeperÖrneğin, bir paketi apther apttaktığında veya kaldırdığında bilgilendirilmesi için biraz kanca kullandığını biliyorum . Sanırım yeni yüklenen paketin listesini ve onları aptönbellekten ( /var/cache/apt/archives) yeniden yükleyebilmek için önceki sürüm numaralarını kaydedebilecek bir tür komut dosyası olabilir . Ayrıca checkinstalldosya değişikliklerini takip edebilen ...

Bunu düzgün bir şekilde nasıl elde edeceğiniz hakkında bir ayrıntı var mı?


Apt'nin yerleşik bir şeye sahip olduğunu bilmiyorum, şu anda kurulu olan paket numaralarını vb. Takip etmek zorunda kalacaksınız.
Anthon

Yanıtlar:


46

Şimdi sadece buna bir cevap bulmak zorundaydım, çünkü apt-get upgradebir Debian sunucusundaki sonuncusu en son çekirdeği bir meşgul kutusunun ötesine çizmeyi imkansız hale getirdi, zfs kök bölümünü monte etmeyi başaramadı. En azından eski bir çekirdek hala önyüklenebilir, ancak diğer yazılımlarla uyumlu değildi. Böylece bir geri alma ihtiyacı.

Kısa cevap - aşağıdaki komutu kullanabilirsiniz:

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

İstediğinizi yaparsanız kaldırın -sve tekrar çalıştırın. İşte bu düzgün çalışmasını sağlamak için attığım adımlar:

  1. /var/log/dpkg.logSadece bugünün güncellemesinden ayrılmak için geçici olarak kestim

  2. Minik senaryoyu yüklü apt-historygelen burada içine ~/.bashrckaçmış

    $ 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. Bu, içine beslenerek geri dönülecek şekilde biçimlendirilmiş sürümlü paketlerin güzel bir listesini sağlar apt-get install. Bu listeyi bir metin editöründe gerektiği gibi kesin ve ardından çalıştırın ( -sönce dry-run için):

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

Apt beklenen düşüşler hakkında uyarır. Bu geri dönüşün bir sonraki yükseltme ile üzerine yazılmasını önlemek için, orijinal sorun çözülene kadar paketlerin sabitlenmesi gerekir. Örneğin: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
}

Bu kaynakları bulmak güzel! Mükemmel cevap!
L0j1k

1
apt-history rollbackKomut gibi bir şeyle değiştirilebilir awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor,

Aşağıdaki uzantı ile, sadece belirtilen tarihin yükseltmeleri ile eşleşir (bu nedenle daha önce günlüğü değiştirmenize gerek yoktur):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator

1
Dpkg.log dosyasını düzelttikten sonra, mesaj bulamadığım bir sürü sürüm alıyorum E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Raspian için Debian Stretch kullanıyorum.
dps

7

Günlük dosyaları /var/log/apt/history.logve açıklamanız /var/log/apt/term.logiçin en yakın şeyler:

Yeni kurulan paketlerin listesini ve önceki sürüm numaralarını kaydedebilecek bir tür komut dosyası olabilir.

history.logaptAşağıdaki biçimde yapılan her işlemin bir özet listesini verir :

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

Özellikle, yeni kurulan paketlerin veya kaldırılan paketlerin bir listesini verir. Ek olarak, term.logeylem sırasında terminalde gerçekte ne göründüğünü gösterir, böylece paketlerin eski ve yeni sürümlerini gösterir. Benim rastgele bir örnek 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) 

aptOtomatik olarak geri dönmeyi denemek önerilmez, ancak günlükleri kullanırsanız, başarısız eylemin apteylemleriyle çakışan bir şey , örneğin tutarsız bir dpkg veritabanı gibi bir şey bozmadıkça, manuel olarak yapılması mümkün olmalıdır . Bu durumda, devam etmeden önce sorunu çözmeniz gerekecektir.


4

Hayır, apt o kadar kolay değil.

En iyi seçenek, bazı anlık görüntü türleridir. Bir tür VM kullanıyorsanız, dosya sistemi anlık görüntülerini lvm / zfs / btrfs aracılığıyla veya örnek görüntülerden alır.

Diğer tek seçenek, öncesi ve sonrası kurulu paketlerin (dpkg -l) envanterini almaktır. "Geri almak" istemeniz durumunda, önceki sürümü açıkça yüklemeniz gerekir.


Tam sürümünü biliyorum, ancak apt reddediyor: apt install openssl=1.0.2g-1ubuntu4.12sonuç E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Daha yeni yükselttim 1.0.2g-1ubuntu4.13ve bunun şu anda bazı CORS / CSP sorunlarına neden olup olmadığını merak ediyorum
Csaba Toth

Artık depoda olmayabilir.
bahamat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.