Bagaimana cara membangun kembali file status dpkg yang rusak?

26

Setiap kali saya mengetik sudo apt-get removedan kemudian tekan Tabtombol untuk pelengkapan otomatis saya mendapatkan pesan berikut:

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

Saya tidak melihat sesuatu yang aneh pada baris 15945 di file status. Ini adalah karakter titik di bidang deskripsi paket perpustakaan mono dan menyisipkan tanda titik dua tidak membantu. Menghapus garis yang mengandung titik juga tidak berhasil. Menimpa file dengan status lama menghasilkan pesan yang sama.

Apakah ada cara untuk membangun kembali file status?

Ramon
sumber
3
Saya tidak berpikir Anda dapat sepenuhnya membangun kembali statusfile: itu adalah sumber informasi utama, dan sementara banyak yang berlebihan, tidak semuanya. Namun mungkin untuk memperbaiki file secara manual. Posting potongan file di sekitar baris bermasalah, katakan 20-40 baris termasuk setidaknya satu Package:baris sebelum dan sesudah baris 15945.
Gilles 'SEGERA berhenti menjadi jahat'
Sejak itu saya mencoba mencopot pemasangan mono tetapi yang dilakukannya hanyalah mengubah nomor baris yang dilaporkan sebagai kesalahan. Jika Anda mengikuti tautan tempel, nomor baris yang menyinggung adalah 25, "Bagian: python" paste.ubuntu.com/501929
Ramón
@ Ramón Jadi, apt-get, dpkgdan teman-teman masih bekerja dengan benar, dan apa yang erroring out adalah auto-completion?
Riccardo Murri
Benar. Tampaknya hanya akan mengalami masalah dalam mengurai file status saat menggunakan pelengkapan otomatis. Saya sebaliknya dapat menginstal dan menghapus paket tanpa kesalahan yang jelas.
Ramón
Mendapat masalah yang sama. Saya tidak berpikir secara membabi buta menggunakan versi lama dari database apt adalah hal yang benar untuk dilakukan di sini terlepas dari itu memperbaiki masalah ini .
Oli

Jawaban:

7

Saya akhirnya memperbaiki sistem saya ini. Mengembalikan cadangan file status tidak berfungsi karena saya sudah memiliki masalah begitu lama, ada di semua cadangan saya.

Perbaikan ini melibatkan pengambilan untuk istirahat pemformatan yang sebenarnya dan memperbaikinya secara manual. Tidak sesulit kedengarannya.

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

Oli
sumber
Senang Anda menemukan solusinya, Oli dan terima kasih telah berbagi. Dalam kasus saya, selain deb Lexmark yang bermasalah, deb Webmin juga uraiannya salah, tetapi dalam kasus itu tidak menyebabkan masalah penguraian saat melakukan pelengkapan otomatis. Aneh.
Ramón
3
@Oli apakah Anda pemegang lisensi? Bisakah Anda menulisnya di sini?
Braiam
Ini benar, bagus bahwa saya membaca posting Anda. Saya punya missing package namedan saya menemukan bahwa, untuk beberapa alasan aneh saya lebih baik tidak membuang waktu untuk mencari tahu, saya memiliki garis Packaga: landscape-commonyang diperbaiki secara ortografis dan tetapi masalah diselesaikan. Masalahnya, saya tidak pernah menyentuh file ini, juga tidak ada orang lain. Bagaimana komputer bisa mengacaukan kesalahan pengejaan?
Severo Raz
Jawaban sebenarnya harus ada di sini juga, untuk menghindarinya menjadi jawaban tautan saja [jika kesalahan berasal dari baris kosong yang tidak mendahului "Paket:" kemudian tambahkan .ke baris kosong itu].
Xen2050
20

Anda harus dapat bekerja dengan file status bagus yang dikenal sebelumnya dan memperbarui dari sana. Setiap kali Anda menginstal atau memperbarui, file status disimpan ke cadangan yang di-gzip di / var / backup . Melakukan ls -l dpkg * pada direktori menunjukkan:

-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

Ada juga cadangan file yang dibuat di direktori / var / lib / dpkg / yang bernama status-old. Melakukan status ls -l * pada direktori menunjukkan:

-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

Jadi, untuk pulih dari korupsi, Anda harus dapat melakukan hal berikut:

1. Buat cadangan file status rusak :

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

2. Salin file status dpkg terakhir ke tempatnya dari salah satu sumber di atas:

antara

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

atau

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. Kemudian jalankan pembaruan apt-get:

sudo apt-get update

Itu harus dilakukan.

Jim
sumber
2
Saya tidak tahu tentang file status yang disimpan di / var / backup. Ini adalah info yang bagus untuk dimiliki jika terjadi lagi. Terima kasih, Jim.
Ramón
Tetapi apakah aman menggunakan versi lama? Maksud saya, tentunya bukan hanya pelengkapan otomatis yang menggunakan file ini dan menggunakan versi lama dengan informasi paket yang lebih lama akan mengacaukan hal-hal lain yang jauh lebih penting ... seperti apt itu sendiri.
Oli
@Oli saya tidak yakin. Saya hanya perlu melakukan ini sekali. Saya pikir saya harus menginstal ulang aplikasi yang menyebabkan masalah, tetapi untuk selanjutnya berfungsi. Seperti halnya semua saran di Internet (atau setidaknya saran dari saya di Internet), ini berhasil bagi saya. Itu tidak berarti bahwa itu akan berhasil untuk Anda. Saya menawarkannya tanpa jaminan dan tanpa pengetahuan yang jelas tentang bagaimana hal itu akan berlaku pada sistem Anda. Jarak tempuh Anda mungkin beragam. Coba dengan risiko Anda sendiri.
Jim
Solusi ini tampaknya telah memperbaiki masalah saya. Saya akan memperbarui jika ada masalah karena menggunakan file status lama.
Matius
File lama mungkin hilang beberapa perubahan paket yang telah dilakukan pada sistem tetapi kebanyakan tidak apa-apa. Melakukannya sudo apt update && sudo apt dist-upgradeharus memperbaiki sebagian besar masalah yang statusmungkin disebabkan oleh file lama . Jika sistem Anda memiliki kekacauan yang lebih besar, sudo aptitude dist-upgradealih-alih sudo apt ...kadang-kadang menyarankan cara yang lebih baik untuk memperbaiki kerusakan.
Mikko Rantalainen
6

Saya dapat memperbaiki masalah ini dengan menghapus paket yang entri yang rusak dalam file status.

sudo dpkg -r handbrake-cli

Solusi yang diterima melalui pcregrep tidak berfungsi (pcregrep tidak menemukan apa pun).

celah
sumber
Terima kasih banyak, ini bekerja untuk saya dan sebenarnya ini adalah pendekatan yang tepat. Terima kasih
user2671192
6

Coba "dpkg -P" untuk paket yang menyinggung. Itu akan membersihkannya dari repositori lokal, menghapus semua jejak. Di sistem saya, itu adalah perbaikan untuk paket yang dihapus (tetapi belum dibersihkan) yang menghasilkan kesalahan itu.

secara biasa
sumber
5

Dalam hal ini saya akan membuat cadangan /var/lib/dpkg/statusfile yang rusak dan kemudian memperbaikinya secara manual (sekitar baris 1888 dan 9550) menggunakan informasi dari

apt-cache show libssl0.9.8
apt-cache show udev
mengatur
sumber
Mendapatkannya . apt-get sekarang berjalan dengan lancar.
ændrük
3

Ini telah menjadi bug (seharusnya diperbaiki): Launchpad Bug 613018

Hulu: Bug Debian 590885

Ini harus menjadi solusi (cadangan, string versi "perbaiki"):

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

Anak dari...

Oke, kesalahan sebenarnya ada di saluran 15266 meskipun sedang dilaporkan sekitar 700 baris lebih jauh ke bawah. Entri yang bermasalah dalam file status disebabkan oleh deb yang saya instal agar printer Lexmark saya berfungsi sejak lama. Entri itu untuk paket lexmark-inkjet-08-driver. Bidang Deskripsi tidak memiliki .tempat jeda baris. Ini menyebabkan kesalahan penguraian.

Untuk menemukan ini, saya menggunakan metode pemecahan masalah senapan dan mulai mencoba berbagai hal secara acak. Salah satu upaya konyol saya adalah grep-status -P emembayangkan bahwa e adalah huruf paling umum dalam alfabet. Bodoh, aku tahu, tetapi catatan status terakhir yang dicetak sebelum mengeluh tentang titik dua yang hilang adalah untuk paket lexmark dan aku memperhatikan kurangnya .karakter setelah beberapa menit menatap layar.

Jika memungkinkan, saya ingin jawaban lain yang dapat menjelaskan metode yang lebih baik untuk menemukan masalah semacam ini jika seseorang mengalami masalah serupa di masa mendatang. Terima kasih.

Ramon
sumber
grep-status -r -P ^harus selalu cocok dengan paket apa pun sehingga harus mem-parsing seluruh file dan batalkan jika tidak dapat menguraikannya.
Mikko Rantalainen
2

Karena status lama saya terlalu bermasalah bahkan dengan apt-get update,

Ini bekerja cukup baik untuk saya:

(sebagai root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

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

Perintah ini menggunakan argumen -c dan -d ke perintah tr untuk menghapus semua karakter dari input stream selain nilai oktal ASCII yang ditampilkan di antara tanda kutip tunggal. Perintah ini secara khusus memungkinkan karakter berikut untuk melewati filter Unix ini:

11 oktal: tab

oktal 12: linefeed

oktal 15: carriage return

oktal 40 hingga oktal 176: semua karakter keyboard "baik"

Semua karakter biner lainnya - karakter "sampah" di file Anda - dihapus selama proses terjemahan ini.

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

Jika Anda penasaran apa yang berubah atau di mana kerusakannya: (mungkin lama)

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