it-swarm-tr.com

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

Ne zaman yazsam Sudo apt-get remove ve ardından Tab otomatik tamamlama anahtarı 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 kitaplık paketinin açıklama alanındaki bir nokta karakteri ve iki nokta üst üste eklemek yardımcı olmadı. Nokta içeren satırı kaldırmak da işe yaramadı. Durum eski olan dosyanın üzerine yazmak aynı iletiyle sonuçlandı.

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

26
Ramón

Sonunda sistemimi bu konuda düzelttim. Durum dosyasının bir yedeğini geri yüklemek uzun süredir sorun yaşadığım için işe yaramadı, tüm yedeklemelerimde.

Düzeltme, gerçek biçimlendirme kesmeleri için açmayı ve bunları manuel olarak düzeltmeyi içerir. Göründüğü kadar zor değil.

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

7
Oli

Bilinen bir iyi durum dosyasıyla çalışabilmeli ve oradan güncelleme yapabilmelisiniz. Her yükleme veya güncelleme yaptığınızda, durum dosyası /var/backups altında bir gzip yedeklemeye kaydedilir. Dizinde bir ls -l dpkg * işaretinin gösterilmesi:

-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

Status-old adlı/var/lib/dpkg/dizininde oluşturulan dosyanın bir yedeği de vardır. Dizinde bir ls -l durumu * yapmak şunu 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ın yedeğini alın:

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

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

ya da

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

ya da

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

. Sonra apt-get güncellemesini çalıştırın:

Sudo apt-get update

Bunu yapmalı.

20
Jim

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

6
ordually

Durum dosyasındaki girişleri bozmuş 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ı).

6
gap

Bu durumda bozuk /var/lib/dpkg/status dosyasını seçin ve ardından aşağıdaki bilgileri kullanarak el ile (1888 ve 9550 satırlarının çevresinde)

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

Bu bir hata oldu (düzeltilmesi gerekiyordu): Launchpad Bug 613018

Memba: Debian Bug 590885

Bu geçici bir çö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
3
htorque

Nın oğlu...

Tamam, asıl hata yaklaşık 700 satır daha aşağıda bildirilmesine rağmen 15266 satırındaydı. Durum dosyasındaki sorunlu girişe, Lexmark yazıcımı uzun zaman önce çalıştırmak için yüklediğim bir hata neden oldu. Giriş, lexmark-inkjet-08-driver Paketi içindi. Açıklama alanında satır sonu yerine . Öğesi yoktu. Bu ayrıştırma hatasına neden oldu.

Bunu bulmak için bir av tüfeği sorun giderme yöntemine başvurdum ve işleri rastgele denemeye başladım. Aptal girişimlerimden biri, grep-status -P e E'nin alfabedeki en yaygın harf olduğunu bulmaktı. Aptal, biliyorum, ama eksik bir kolondan şikayet etmeden önce basılan son durum kaydı lexmark paketi içindi ve birkaç dakika ekrana baktıktan sonra . Karakterinin eksikliğini fark ettim.

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

2
Ramón

eski durumum , apt-get update İle bile çok sorunlu olduğu için,

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 sekizlik değerler dışındaki tüm karakterleri giriş akışından kaldırmak için tr komutunun -c ve -d değişkenlerini kullanır. Bu komut özellikle aşağıdaki karakterlerin bu Unix filtresinden geçmesine izin verir:

sekizli 11: sekme

sekizli 12: satır besleme

sekizli 15: satır başı

sekizli 40 - 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 nerede olacağını merak ediyorsanız: (muhtemelen uzun)

diff /var/lib/dpkg/{status-old,status} |less
2
Marcos