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ı?
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.
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ı.
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ı.
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ı).
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
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
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.
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