/ Var / lib / dpkg / status nasıl yeniden oluşturulur?


10

Bazı dosyaları sildim /var/lib/dpkg/, yani:

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

Debian'ın bu dosyaları yüklü paketler hakkında bazı bilgileri tutmak için kullandığını anlıyorum. Şimdi yaptığımda apt-get update, aşağıdaki hatayı alıyorum:

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.

FHS'yi anladığım gibi , içinde bulunan dosyaların /varsistem açısından kritik olması gerekmez. Daha sonra bunlar geçici dosyalar, günlükler, önbellekler ve benzeri olmalıdır.

Bu nedenle silinen dosyaları yeniden oluşturmanın bir yolu var mı?


1
Braiam'ın cevabı size durum dosyasını geri getirir; ancak altında sildiğiniz şeyler /var/lib/dpkg/infode oldukça önemlidir. FHS'yi yanlış anladınız ve AFAIK tek kurtarma yolları (a) yedeklemeden geri yükleme veya (b) yeniden yükleme.
derobert

Yanıtlar:


13

/ Var'ın amacına Dosya Sistemi Hiyerarşi Standardında belirtildiği gibi bakarsanız, şöyle diyor:

/vardeğişken veri dosyaları içerir. Bu, biriktirme dizinlerini ve dosyalarını, yönetimsel ve günlük verilerini ve geçici ve geçici dosyaları içerir.

"Geçici ve geçici" dosyaların içerdiği şeylerden sadece biri olduğunu unutmayın. Ayrıca "biriktirme dizinleri ve dosyaları" ve "yönetim ve kayıt verileri" içerir. Kritik "idari verileri" sildiniz.

Neden /varvar olduğunu açıklamaya devam ediyor :

/varburada /usrsalt okunur bağlamayı mümkün kılmak için belirtilmiştir . /usrSistem işletimi sırasında (kurulum ve yazılım bakımının aksine) bir kez girilen her şey içeride olmalıdır /var.

Şununla ilgili en önemli şey /var: içindeki veriler, aksine /usr(yalnızca yazılım eklediğinizde / kaldırdığınızda / güncellediğinizde değişir) değişir.

Diğer bölümler /var; örneğin, /var/lib(silmek için kullandığınız dosyalar yaşamak için kullanıldığında), "programların çalışırken çalışırken değiştiği ve belirli bir ana bilgisayarla ilgili olan veriler" olarak tanımlanan "bir uygulama veya sistemle ilgili durum bilgilerini" tutar.

Sen gerçekten belirli bir dosya için ne olduğunu bilmeden dosyaları silmek gerekir. Bu dosyaların yedeğini olmadığı sürece, silinen dosyaların, ben tek şey bir yedeğini almak şeyi bırakır düşünüyorum /home, /etcvb ve yeniden yükleme. Bunu yapana kadar dpkg(ve APT vb.) Kullanamazsınız. Bunun dışında, sistem çalışmaya devam etmelidir.


Dosyaları başka bir makineden kopyalayabilir miyim yoksa makineye özel mi?
Martin Vegter

1
@MartinVegter durum, bu makineye hangi paketlerin yüklendiğini listeler. Tam olarak aynı paket durumlarına sahip bir makineden kopyalayabilirsiniz (sadece takılı değil, aynı zamanda çıkarılmış ancak temizlenmemiş). apt-get updatemevcut yeniden inşa edecek inanıyorum. Bilgi / şeyler yüklü her paketten gelir, ancak en azından eski conf dosyaları için de tarihi de yansıtır ... ama muhtemelen aynı paketlerden kopyalamadan
kurtulabilirsiniz

Mevcut belgeler " /var/libDurum bilgileri. Çalıştırıldıkça programlar tarafından değiştirilen kalıcı veriler , örneğin veritabanları, paketleme sistemi meta verileri, vb."
Mikko Rantalainen

8

/var/lib/dpkg/statusSadece bir komut çalıştırmak anlamında "yeniden oluşturamazsınız" ve dosya sihirli bir şekilde görünür. Hayır. Dosyanın yedeğini kullanmanız ve /var/libdizindeki şeyleri silmeyi asla öğrenmemeniz gerekir :

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

Bu size önceki günün paket durumunu verecektir. Dua etmeye başla, başka bir şey kırmadı.


ayrıca bakın /var/backups, orada birden fazla kopya var.
derobert

@Braiam - Eski bir durumum yok / / var / backup içinde hiçbir şeyim yok. Dosyaları başka bir makineden kopyalayabilir miyim yoksa makineye özel mi?
Martin Vegter

1
@MartinVegter hayır, işe yaramaz. Sizin için en hızlı yol, önemli dosyalarınızı yedeklemek ve sistemi yeniden yüklemektir. BTW, değil /var/backups/dpkg.status.0mi?
Braiam

8

Bulunan dosyalar /varsistem açısından çok önemlidir. Örneğin /var/mailveya /var/spool/mailkullanıcıların e-postalarını içerir; komşunuzun posta kutusunda ateş yakacağınızdan daha fazla silemezsiniz. Yalnızca belirli alt dizinlerindeki /varveya az ya da çok geçici olan dosyaları içeren dosyalardır: giriş dosyaları /var/log, genellikle yeniden oluşturulabilen önbellekler /var/cache, geçici dosyalar (kullanımdayken silmemeniz gerekir!) /var/tmp.

Veriler /var/liboldukça kritik olabilir. Örneğin, MySQL genellikle veritabanlarını /var/lib/mysqlvarsayılan olarak depolayacak şekilde yapılandırılır : bunu silerseniz, veritabanlarınızı silersiniz. Dpkg kendi veritabanlarını da ortaya koyuyor /var/lib; /var/lib/dpkg/statusbiridir.

/var/lib/dpkg/statuskurulu paketler hakkında bilgi içerir. Bunu sildiyseniz, bir yedekten geri yüklemeniz gerekir. Yedek tamamen yukarı güncel değilse, altında son paket manipülasyon günlükleri kontrol /var/log/aptve /var/log/dpkg.log. dpkgÇalışmadan önce bu dosyayı oluşturmanız gerekir .

/var/lib/dpkg/availableİnternet'ten indirilen verilerden oluşturulmuştur. apt-get updateyeniden inşa etmelisiniz.

/var/lib/dpkg/infoDebian paketleriyle birlikte gelen dosyalar içerir. Bu dosyaları paketleri yeniden yükleyerek geri yükleyebilirsiniz. Tabii ki, bunun için kurulu paketlerin bir listesine ihtiyacınız olacak. Geri yüklediyseniz /var/lib/dpkg/status, paket listesini oradan çıkarabilirsiniz.

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

Kaybettiyseniz /var/lib/dpkg/status, boş bir dosya oluşturarak ve ardından apt-get install --reinstallpaketler listesinde çalışarak yeniden oluşturabilirsiniz . Paket listesinin de kaydedildiği bir yer /var/lib/apt/extended_states, en azından paketleri yüklemek için APT'yi ( dpkgdoğrudan aksine ) kullandıysanız - /var/lib/dpkg/statusyukarıdaki komutu yerine bu dosyayı kullanın . Bunu da sildiyseniz, $(cd /usr/share/doc && ls)çoğu paket bir giriş oluşturduğundan yaklaşık paket listesini yeniden oluşturabilirsiniz /usr/share/doc. Muhtemelen birkaç istisna vardır.

Bu sistemdeki paket yönetimi hakkında herhangi bir yardım istemeyin. Sistem açısından kritik dosyaların silinmesinden kurtulmak tam bir bilim değildir. Yedeklerden geri yükleyemiyorsanız, en kısa zamanda yeni, temiz bir sistem kurmalısınız.


Tarihsel sorunu ve bu sorunu nasıl çözdüğünüzü anlatmaya başladığınız sürece böyle bir sistemdeki paketler hakkında yardım istemenin uygun olduğunu söyleyebilirim . Bazen bu tür sistemlerin onarılması, örneğin bazı paket yönetimi süreçlerinde güvenlik açıklarının fark edilmesine izin verebilir ve böyle bir sistemle uğraşmanın zor olabilmesine rağmen değerli olabilir.
Mikko Rantalainen

5

/var/lib/dpkg/availableApt verilerden yeniden olabilir. Bunu yapmanın en kolay yolu, dselectgüncellemeyi kullanarak ve seçerek bize . Bunun yalnızca güncelleme yönteminiz olarak seçtiyseniz işe yarayacağını umuyorum. Şöyle görünüyor dselect:

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

Yine de Debian çavuşundan bu yana işler değişmiş olabilir.

/var/lib/dpkg/statusHer paketin dizine bir dizin eklemek için gerekli olduğu gerçeğine dayanarak yeniden oluşturulacak hileler vardır /usr/share/doc. Http://linuxmafia.com/faq/Debian/package-database-rebuild.html adresindeki gönderiye bakın . Yüklü paketlerin listesini oluşturmak için / usr / share / doc filtrelenmiş bir listesini kullanan ve sonra hepsini yeniden yükleyen bir komut dosyası vardır.


1

Peki, dosyayı boş olarak yeniden oluşturabilir ve daha sonra ilk kez ne yüklediğinizi bildiğinizi varsayarak apt-get install uzun listesini yapabilirsiniz.

Temelde bunu uygun apt-get çalıştırabilirsiniz en küçük paket kümesinden yapar eski bir komut dosyası var. Bunu kullanırken düzinelerce bildirilmemiş bağımlılığı bildirdim.

Yüklediğiniz her şeyi bilmiyorsanız, sistemi yeniden yükleyin.


0

Linux Mint 17'de benzer bir sondaj sorunuyla karşılaştım. Dosyaları silme konusunda gayet iyiydim ve kendimi "Yönetim -> Yükseltme Yöneticisi" nin mutlu görünmediği yerde buldum .......

Benim için çalışan çözüm, hata mesajına göre "dpkg" adlı bir dizin oluşturmak ve içinde "status" adlı boş bir dosya oluşturmaktı.

Daha sonra Güncelleme Yöneticisi'ni çalıştırdım.

Bana fot çalıştı :-)


0

Eğer u 'dışında başka kullanıcı hesapları olsaydı bunlardan birinden apt-get dist-upgrade deneyebilirsiniz. Apt, arşivleri indirecek ancak / var / dizinindeki bazı eksik dizinler nedeniyle bunları kurmayı bırakacaktır. Dizinler gösterilir. onları oluşturmak ve apt-get dist-upgrade yeniden çalıştırın. onları oluşturmak için alternatif hesap günlüğü kök n geri başarısız olursa oradan dirs oluşturmak sonra tekrar apt çalıştırın. logrotate yapılandırması ve diğer birkaç yapılandırma sadece Y n yazın ve sonuna kadar devam edin, sonra apt dist-upgrade işlemi tamamlandığında yeniden başlatın. şimdi her şey normale dönecek.


0

Gecikme için üzgünüm. Briam, dizinleri ve dosyaları el ile yeniden oluşturun ve depoları güncelleyin ( mkdirve touchgörüntülenen hatanın gerektirdiği şekilde) ve kullanın dpkg --configure -a.

Sisteminiz iyi çalışır, ancak bozuk olmadığından emin olmak için yeniden yüklemek önemlidir; önceki yalnızca bir yeniden yükleme zamanlamak ve /var/lib/*dosyaları silmek için zaman kazanmak için .


-2

Bir ahududu pi 3 satın aldıysanız ve sorunla karşılaştı ve "/ var / lib / dpkg / status ayrıştırılmış veya açılmış dosya açılamadı" hatasını alıyorsanız, bu benim için çalışan bir çözümdür:

"/ Var / lib / dpkg / status" dosyasını nasıl yeniden oluşturabilirim? Bu sadece bir unusefull dosyası olmadığı için, raspbian işletim sisteminizde kurulu paketler hakkında bazı bilgileri tutan çok önemli bir dosyadır, bu yüzden nasıl yeniden oluşturuldum :

  1. Raspbian sisteminizde bir wget gerçekleştirin:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Bazı izinler verin:

    chmod 777 recover1.sh
    
  3. Sisteminizdeki belgeler klasörünü analiz edin ve durum dosyasını yeniden oluşturun:

    ./recover1.sh
    
  4. tamamlandığında, dosyayı indirin ve dikkatlice okuyun. Dosyada açıklanan adımları izleyin:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    

Selam! Lütfen kodu bağlantılar yerine yanıtlarınızın bir parçası olarak gönderin.
dhag

Uyarı: zaten iyi olup olmadığını test etmeden akımınızı recover1.shyok edecektir /var/lib/dpkg/status. Daha sonra, biraz çalışan versiyonu yeniden oluşturmaya çalışmak için karışık hileler torbasını yürütecek. / Var / lib / dpkg / status dosyasını tamamen kaçırmadıkça yukarıdaki komut dosyasını asla çalıştırmayın. Aksi takdirde strings /var/lib/dpkg/status, bozuk dosyayı yeniden oluşturmaya başlamanın daha iyi bir yolu olabilir.
Mikko Rantalainen
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.