Bozuk bir dpkg durum dosyasını nasıl yeniden oluştururum?


26

Ne zaman yazsam sudo apt-get removeve Tabotomatik tamamlama için tuşuna bastığımda aşağıdaki mesajı alıyorum:

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

Durum dosyasında 15945 satırında özellikle garip bir şey görmüyorum. Bir mono kütüphane paketinin açıklama alanındaki bir nokta karakteridir ve iki nokta üst üste koymak yardımcı olmuyordu. Nokta içeren çizgiyi kaldırmak da işe yaramadı. Durum eski olan dosyanın üzerine yazılması aynı mesajla sonuçlandı.

Durum dosyasını yeniden oluşturmanın bir yolu var mı?


3
statusDosyayı tamamen yeniden oluşturabileceğinizi sanmıyorum : bu temel bir bilgi kaynağıdır ve çoğu gereksiz olsa da hepsi değildir. Ancak dosyayı el ile onarmak muhtemelen mümkün. Sorunlu hattının etrafında dosyanın bir yığın yayınla, 20-40 hatları en az bir olmak üzere söylemek Package:öncesi ve sonrası çizgi çizgi 15945.
Gilles 'SO dur olma kötülük'

O zamandan beri mono'yu kaldırmayı denedim, ancak tek yaptığı hata olarak bildirilen satır numarasını değiştirmek oldu. Yapıştırma bağlantısını izlerseniz, rahatsız edici satır numarası 25'tir, "Bölüm: python" paste.ubuntu.com/501929
Ramón

Ramón So @, apt-get, dpkgve arkadaşlar hala düzgün çalışan ve otomatik tamamlama ne erroring mi?
Riccardo Murri

Doğru. Otomatik tamamlama kullanılırken yalnızca durum dosyasını ayrıştırmada sorun yaşıyor gibi görünüyor. Aksi takdirde herhangi bir belirgin hata olmadan paketleri kurabilir ve kaldırabilirim.
Ramón

Aynı problemi alıyorum. Apt'ın veritabanının eski bir versiyonunu kör kullanmanın, bu sorunu çözmeden bağımsız olarak burada yapılacak en doğru şey olduğunu sanmıyorum .
Oli

Yanıtlar:


7

Sonunda bu konuda sistemimi düzelttim. Durum dosyasının yedeğini geri yüklemek uzun zamandır sorunum olduğu için işe yaramadı.

Düzeltme, gerçek biçimlendirme kesmelerinin çizilmesini ve manuel olarak düzeltilmesini içerir. Bu göründüğü kadar zor değil.

http://thepcspy.com/read/fixing-dpkg-status-corruption/


Bir çözüm bulmana sevindim, Oli ve paylaştığın için teşekkürler. Benim durumumda, sorunlu Lexmark deb'ine ek olarak, bir Webmin debinin açıklaması da hatalı biçimlendirildi, ancak bu durumda otomatik tamamlama yapılırken ayrıştırma sorunlarına neden olmadı. Tuhaf.
Ramón

3
@Oli lisans sahibi misiniz? Bunu buraya yazabilir misin?
Braiam

Bu doğru, gönderinizi okuduğum için iyi. Ben bir tane missing package namebuldum ve garip bir sebepten dolayı zamanımı boşa harcamamayı daha iyi anladım, Packaga: landscape-commonortografik olarak düzeltilmiş bir hattım vardı ve sorun çözüldü. Mesele şu ki, bu dosyaya hiç dokunmadım, başkası da yoktu. Bir bilgisayar nasıl yazım hatası yapabilir?
Severo Raz

Asıl cevap, burada sadece bağlantı olması gereken bir cevap olmamasından kaçınmak için de [hata: "Paket:" den önce gelmeyen boş bir satırdan oluşuyorsa, o zaman .bu boş satıra bir satır ekleyin ].
Xen2050

20

Daha önce bilinen bir iyi durum dosyasıyla çalışabilmeli ve oradan güncelleme yapabilmelisiniz. Bir yükleme veya güncelleme yaptığınızda, durum dosyası / var / backup altında bir gzip yedeğine kaydedilir . Dizinde bir ls -l dpkg * yapmak şunları gösterir:

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz

Ayrıca status-old adlı / var / lib / dpkg / dizininde oluşturulan dosyanın bir yedeği de var. Dizinde bir ls -l durumu * yapmak şunları gösterir:

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old

Bu nedenle, bir yolsuzluktan kurtulmak için aşağıdakileri yapabilmeniz gerekir:

1. Bozuk durum dosyasını yedekleyin :

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

2. Yeni bir dpkg durum dosyasını yukarıdaki kaynaklardan birinden bir yere kopyalayın:

ya

cp /var/lib/dpkg/status-old /var/lib/dpkg/status

veya

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status

3. Sonra apt-get update komutunu çalıştırın:

sudo apt-get update

Bunu yapmalı.


2
/ Var / backups içinde tutulan durum dosyalarını bilmiyordum. Bu tekrar olması durumunda olması gereken iyi bir bilgidir. Sağol Jim.
Ramón

Ancak eski bir sürümü kullanmak güvenli midir? Yani, elbette bu dosyayı kullanan ve eski paket bilgisine sahip eski bir sürümü kullanan sadece otomatik tamamlama değil, apt gibi bir şey daha, çok daha önemli şeyleri mahvedecek.
Oli

@Oli Emin değilim. Bunu sadece bir kez yapmak zorunda kaldım. Sanırım soruna neden olan uygulamayı yeniden kurmak zorunda kaldım, ama ileriye gitmek işe yaradı. İnternette tüm tavsiyelerde olduğu gibi (ya da en azından internette benden tavsiye), bu benim için çalıştı. Bu mutlaka sizin için çalışacağı anlamına gelmez. Garanti olmadan ve sisteminizde nasıl davranacağı konusunda net bir bilgi olmadan teklif ediyorum. Kilometreniz değişebilir. Kendi riskin ile dene.
Jim

Bu çözüm sorunlarımı çözdü gibi görünüyor. Herhangi bir sorun eski bir durum dosyası kullanmaktan kaynaklanırsa güncellenir.
Matthew

Eski dosya sistemde bazı paket değişikliklerini kaçırıyor olabilir, ancak çoğunlukla sorun yok. Yapılması sudo apt update && sudo apt dist-upgrade, eski statusdosyanın neden olabileceği sorunların çoğunu çözmelidir. Sisteminizde daha büyük bir karmaşa varsa, sudo aptitude dist-upgradebunun yerine sudo apt ...bazen kırılmayı düzeltmek için daha iyi yollar önerebilir.
Mikko Rantalainen

6

Durum dosyasında girdiler bozuk olan paketleri kaldırarak bu sorunu çözebildim.

sudo dpkg -r handbrake-cli

Pcregrep yoluyla kabul edilen çözüm işe yaramadı (pcregrep hiçbir şey bulamadı).


Benim için çalıştığı için çok teşekkür ederim ve aslında doğru bir yaklaşım. Teşekkürler
user2671192

6

Sorunlu paket için bir "dpkg -P" deneyin. Bu, tüm izleri kaldırarak onu yerel depodan temizler. Sistemimde, bu hatayı üreten kaldırılmış (ancak henüz temizlenmemiş) paketler için düzeltme yapıldı.


5

Bu durumda bozuk /var/lib/dpkg/statusdosyayı yedekler ve sonra eldeki bilgileri kullanarak (1888 ve 9550 numaralı hatların etrafındaki) bilgileri elden alırdım.

apt-cache show libssl0.9.8
apt-cache show udev

Anladım . apt-get şimdi sorunsuz çalışıyor.
ændrük

3

Bu bir hataydı (düzeltilmesi gerekiyordu): Launchpad Bug 613018

Giriş: Debian Bug 590885

Bu bir geçici çözüm olmalıdır (yedekleme, "düzeltme" sürüm dizesi):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status

2

Nın oğlu...

Tamam, asıl hata 15266 satırındaydı, buna rağmen 700 satır daha ileride rapor edildi. Durum dosyasındaki sorunlu giriş, Lexmark yazıcımı uzun süre önce çalıştırmak için yüklediğim bir hatadan kaynaklanıyordu. Giriş paket içindi lexmark-inkjet-08-driver. Açıklama alanı .satır sonu yerine girmedi. Bu ayrıştırma hatasına neden oldu.

Bunu bulmak için, bir av tüfeği sorun giderme yöntemine başvurdum ve her şeyi rastgele denemeye başladım. Goofy denemelerimden biri grep-status -P e, alfabenin en yaygın harfi olan e'yi bulmaktı. Aptal, biliyorum, ancak son durum kaydı eksik bir kolondan şikayet etmeden önce basıldı, Lexmark paketi içindi .ve ekrana birkaç dakika baktıktan sonra bir karakterin olmadığını fark ettim .

Mümkünse, birinin gelecekte benzer bir sorunla karşılaşması durumunda bu tür bir sorunu bulmak için daha iyi bir yöntem tanımlayabilecek başka bir cevap istiyorum. Teşekkürler.


grep-status -r -P ^her zaman bir paketle eşleşmeli, böylece tüm dosyayı ayrıştırmalı ve ayrıştırmazsa iptal etmelidir.
Mikko Rantalainen

2

Benim Çünkü durum eski bile çok sorunlu oldu apt-get update,

Bu benim için oldukça iyi çalıştı:

(kök olarak)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

Bu komut, tek tırnaklar arasında gösterilen ASCII sekizli değerleri dışındaki girdi akışından tüm karakterleri kaldırmak için -c ve -d argümanlarını tr komutuna kullanır. Bu komut özellikle aşağıdaki karakterlerin bu Unix filtresinden geçmesine izin verir:

sekizli 11: sekme

sekizli 12: satır besleme

sekizlik 15: satır başı

sekizli 40 ila sekizli 176: tüm "iyi" klavye karakterleri

Diğer tüm ikili karakterler - dosyanızdaki "çöp" karakterleri - bu çeviri işlemi sırasında çıkarılır.

KREDİ: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

Neyin değiştiğini veya hasarın ne olacağını merak ediyorsanız: (muhtemelen uzun)

diff /var/lib/dpkg/{status-old,status} |less
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.