Bagaimana cara membuat ulang / var / lib / dpkg / status?

10

Saya telah menghapus beberapa file di sekitar /var/lib/dpkg/, yaitu:

/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*

Saya mengerti Debian menggunakan file-file ini untuk menyimpan beberapa informasi tentang paket yang diinstal. Sekarang ketika saya melakukannya apt-get update, saya mendapatkan kesalahan berikut:

Reading package lists... Error!
E: Could not open file /var/lib/dpkg/status - open 
(2: No such file or directory)
E: The package lists or status file could not be parsed or opened.

Seperti yang saya pahami tentang FHS , file-file yang terletak di /vartidak seharusnya menjadi sistem-kritis. Penilai ini harus berupa file sementara, log, cache, dan sejenisnya.

Apakah ada cara untuk membuat ulang file yang dihapus?

Martin Vegter
sumber
1
Jawaban Braiam akan membuat Anda kembali ke file status; tetapi hal-hal yang Anda hapus /var/lib/dpkg/infojuga cukup penting. Anda telah salah memahami FHS, dan AFAIK satu-satunya jalur pemulihan adalah (a) memulihkan dari cadangan atau (b) menginstal ulang.
derobert

Jawaban:

13

Jika Anda melihat tujuan / var seperti yang diberikan dalam Filesystem Hierarchy Standard , ia mengatakan:

/varberisi file data variabel. Ini termasuk direktori dan file spool, data administratif dan logging, dan file sementara dan sementara.

Perhatikan bahwa file "sementara dan sementara" hanyalah salah satu hal yang dikandungnya. Ini juga berisi "direktori dan file spool" dan "data administratif dan logging". Anda menghapus "data administratif" yang penting.

Selanjutnya dijelaskan mengapa /varada:

/varditentukan di sini untuk memungkinkan mount /usrhanya-baca. Segala sesuatu yang pernah pergi ke /usryang ditulis untuk selama operasi sistem (sebagai lawan instalasi dan pemeliharaan software) harus dalam /var.

Itulah hal utama tentang /var: data di dalamnya berubah, tidak seperti /usr(yang hanya berubah ketika Anda menambah / menghapus / memperbarui perangkat lunak).

Bagian selanjutnya menjelaskan berbagai subdirektori dari /var; misalnya, /var/lib(tempat file yang Anda hapus dulu tinggal) menyimpan "nyatakan informasi yang berkaitan dengan aplikasi atau sistem", yang didefinisikan sebagai "data yang diubah oleh program saat dijalankan, dan yang berkaitan dengan satu host tertentu."

Anda benar - benar tidak boleh menghapus file tanpa mengetahui untuk apa file spesifik itu. Dengan file yang Anda hapus, kecuali jika Anda memiliki cadangan file-file ini, saya pikir satu-satunya yang tersisa untuk dilakukan adalah mengambil cadangan /home, /etcdll. Dan menginstal ulang. Sampai Anda melakukannya, Anda tidak dapat menggunakan dpkg(dan APT, dll.). Selain itu, sistem harus terus berfungsi.

derobert
sumber
Bisakah saya menyalin file dari komputer lain, atau apakah itu spesifik mesin?
Martin Vegter
1
@MartinVegter daftar status paket mana yang diinstal pada mesin khusus ini. Anda dapat menyalinnya dari mesin dengan status paket yang sama persis (tidak hanya diinstal, tetapi dihapus tetapi tidak dibersihkan juga). apt-get updateakan membangun kembali tersedia, saya percaya. Info / barang datang dari setiap paket yang diinstal, tetapi juga mencerminkan sejarah juga, setidaknya untuk file conf lama ... tetapi Anda mungkin bisa pergi dengan menyalin dari mesin paket yang sama persis)
derobert
Dokumentasi saat ini menyatakan " /var/libNyatakan informasi. Data persisten dimodifikasi oleh program saat dijalankan, mis. Database, metadata sistem pengemasan, dll."
Mikko Rantalainen
8

Anda tidak dapat "menciptakan kembali" /var/lib/dpkg/statusdalam arti hanya menjalankan perintah dan file tersebut muncul secara ajaib. Tidak. Anda perlu menggunakan cadangan file, dan belajar untuk tidak pernah menghapus sesuatu dari /var/libdirektori:

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

Ini akan memberi Anda status paket sehari sebelumnya. Mulailah berdoa itu tidak merusak sesuatu yang lain.

Braiam
sumber
lihat juga /var/backups, ada banyak salinan di sana.
derobert
@Braiam - Saya tidak memiliki status lama, saya juga tidak memiliki apa pun di / var / backup. Bisakah saya menyalin file dari komputer lain, atau apakah itu spesifik mesin?
Martin Vegter
1
@ Martin Tidak, tidak akan berhasil. Cara tercepat bagi Anda adalah mencadangkan file penting Anda, dan menginstal ulang sistem. BTW, bahkan tidak /var/backups/dpkg.status.0?
Braiam
8

File yang terletak di dalam /varsistem sangat kritis. Misalnya, /var/mailatau /var/spool/mailberisi email pengguna; Anda tidak akan lagi menghapusnya daripada menyalakan api di kotak surat tetangga Anda. Ini hanya file dalam subdirektori tertentu /varyang berisi file-file yang lebih atau kurang fana: file log di /var/log, cache yang biasanya dapat diciptakan dalam /var/cache, file-file sementara (yang Anda tidak harus menghapus sementara mereka digunakan!) Di /var/tmp.

Data dalam /var/libbisa sangat kritis. Misalnya, MySQL biasanya dikonfigurasikan untuk menyimpan databasenya /var/lib/mysqlsecara default: jika Anda menghapusnya, Anda menghapus databasenya. Dpkg juga menempatkan basis datanya sendiri /var/lib; /var/lib/dpkg/statusadalah satu.

/var/lib/dpkg/statusberisi informasi tentang paket yang diinstal. Jika Anda menghapusnya, Anda harus mengembalikannya dari cadangan. Jika cadangan Anda tidak sepenuhnya terbaru, periksa log manipulasi paket terbaru di bawah /var/log/aptdan di /var/log/dpkg.log. Anda harus membuat file itu sebelum dpkgberfungsi.

/var/lib/dpkg/availabledibangun dari data yang diunduh dari Internet. apt-get updateharus membangunnya kembali.

/var/lib/dpkg/infoberisi file yang dikirimkan dengan paket Debian. Anda dapat memulihkan file-file ini hanya dengan menginstal ulang paket. Tentu saja, Anda akan memerlukan daftar paket yang diinstal untuk itu. Jika Anda telah memulihkan /var/lib/dpkg/status, maka Anda dapat mengekstrak daftar paket dari sana.

apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')

Jika Anda kehilangan /var/lib/dpkg/status, maka Anda mungkin dapat membuatnya kembali dengan membuat file kosong, kemudian berjalan apt-get install --reinstallpada daftar paket. Satu tempat di mana daftar paket juga disimpan adalah /var/lib/apt/extended_states, setidaknya jika Anda hanya pernah menggunakan APT untuk menginstal paket (bukan dpkglangsung) - gunakan file itu alih-alih /var/lib/dpkg/statusdengan perintah di atas. Jika Anda juga menghapusnya, Anda dapat membangun kembali daftar perkiraan paket $(cd /usr/share/doc && ls), karena sebagian besar paket membuat entri /usr/share/doc. Mungkin ada beberapa pengecualian.

Jangan meminta bantuan apa pun tentang manajemen paket pada sistem ini. Memulihkan dari penghapusan file sistem-kritis bukan ilmu pasti. Jika Anda tidak dapat memulihkan dari cadangan, Anda harus menginstal sistem baru yang bersih secepat mungkin.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya akan mengatakan bahwa tidak apa-apa untuk meminta bantuan tentang paket pada sistem seperti itu selama Anda mulai dengan menggambarkan masalah historis dan cara Anda memperbaikinya . Kadang-kadang memperbaiki sistem seperti itu memungkinkan pemberitahuan misalnya kerentanan keamanan dalam beberapa proses manajemen paket dan itu mungkin berharga meskipun fakta bahwa berurusan dengan sistem seperti itu mungkin sulit.
Mikko Rantalainen
5

The /var/lib/dpkg/availabledapat diciptakan dari data apt. Cara termudah yang saya temukan untuk melakukan ini adalah kami menggunakan dselectdan memilih pembaruan. Saya berharap ini hanya akan berfungsi jika Anda telah memilih sebagai metode pembaruan Anda. Sepertinya dselectmelakukan:

/bin/bash /usr/lib/dpkg/methods/apt/update /var/lib/dpkg apt apt

Perhatikan bahwa hal-hal mungkin telah berubah sejak Debian sarge.

Ada trik untuk membuat ulang /var/lib/dpkg/statusberdasarkan fakta bahwa setiap paket diperlukan untuk menambahkan direktori di /usr/share/docdirektori. Lihat posting di http://linuxmafia.com/faq/Debian/package-database-rebuild.html . Ada skrip yang disajikan yang menggunakan daftar / usr / share / doc yang difilter untuk membuat daftar paket yang diinstal, kemudian menginstal ulang semuanya.

Chris Gibson
sumber
1

Yah saya kira Anda bisa membuat ulang file kosong dan kemudian melakukan apt-get install daftar panjang, dengan asumsi Anda tahu apa yang Anda instal pertama kali.

Saya memiliki skrip kuno yang pada dasarnya melakukan ini dari set paket terkecil yang dapat menjalankan apt-get. Ketika menggunakannya saya akhirnya melaporkan lusinan dependensi yang tidak dideklarasikan.

Jika Anda tidak tahu semua yang Anda instal, instal ulang sistem.

Joshua
sumber
0

Di Linux Mint 17 saya mengalami masalah terdengar serupa. Saya sangat bersemangat dalam menghapus file dan menemukan diri saya di mana "Administrasi -> Upgrade Manager" tidak terlihat bahagia .......

Solusi yang berhasil bagi saya adalah membuat direktori bernama "dpkg" sesuai dengan pesan kesalahan, dan di dalamnya buat file kosong yang disebut "status".

Saya kemudian menjalankan Update Manager.

Ini bekerja untuk saya :-)

Bluegerbil
sumber
0

Jika Anda memiliki akun pengguna lain selain 'roo't Anda dapat mencoba apt-get dist-upgrade dari salah satunya. Apt akan mengunduh arsip tetapi tetap menginstalnya karena ada beberapa direktori yang hilang di / var /. Direktori akan ditampilkan. buat mereka dan jalankan apt-get dist-upgrade lagi. jika membuat mereka gagal dari login akun alternatif kembali ke root dan membuat direktori dari sana kemudian jalankan apt lagi. Anda akan diminta tentang konfigurasi logrotate dan beberapa konfigurasi lainnya cukup ketik Y n lanjutkan sampai akhir lalu reboot ketika apt-upgrade upgrade selesai. semuanya sekarang harus kembali normal.

Yang satu
sumber
0

Maaf atas keterlambatannya. Briam, buat kembali dir dan file secara manual dan kemudian perbarui repo ( mkdirdan touch, sebagaimana diminta oleh kesalahan yang ditampilkan), dan gunakan dpkg --configure -a.

Sistem Anda akan berjalan dengan baik, tetapi penting untuk menginstal ulang untuk memastikan bahwa itu tidak rusak; sebelumnya hanya untuk mendapatkan waktu untuk menjadwalkan instalasi ulang ... dan mengurus penghapusan /var/lib/*file.

Daniel Ospitia
sumber
-2

Jika Anda membeli raspberry pi 3 dan Anda menghadapi masalah dan mendapatkan kesalahan "tidak dapat membuka file / var / lib / dpkg / status diuraikan atau dibuka" ini adalah solusi yang bekerja untuk saya:

Bagaimana cara membuat ulang file "/ var / lib / dpkg / status", hanya karena ini bukan file yang tidak digunakan, ini adalah file yang sangat penting yang menyimpan beberapa informasi tentang paket yang diinstal di OS raspbian Anda, jadi inilah cara saya membuat ulang file :

  1. Lakukan wget dalam sistem Raspbian Anda:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Berikan beberapa izin:

    chmod 777 recover1.sh
    
  3. Analisis folder dokumentasi di sistem Anda dan buat kembali file status:

    ./recover1.sh
    
  4. Setelah selesai, unduh file dan baca dengan seksama. Ikuti langkah-langkah yang dijelaskan dalam file:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    
Dog Labs Corporation
sumber
Hai! Silakan posting kode sebagai bagian dari jawaban Anda daripada sebagai tautan.
Dhag
Peringatan: recover1.shakan menghancurkan arus Anda /var/lib/dpkg/statustanpa pengujian jika sudah baik-baik saja. Kemudian ia akan menjalankan berbagai trik untuk mencoba membangun kembali versi yang berfungsi. Jangan pernah menjalankan skrip di atas kecuali Anda benar-benar kehilangan file / var / lib / dpkg / status. Kalau tidak, strings /var/lib/dpkg/statusmungkin cara yang lebih baik untuk mulai membangun kembali file yang rusak.
Mikko Rantalainen