कैसे पुनः बनाएँ / var / lib / dpkg / स्थिति?


10

मैंने आसपास कुछ फाइलें हटाई हैं /var/lib/dpkg/, अर्थात्:

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

मैं समझता हूं कि डेबियन इन फाइलों का उपयोग स्थापित पैकेजों के बारे में कुछ जानकारी रखने के लिए करता है। अब जब मैं करता हूं apt-get update, मुझे निम्नलिखित त्रुटि मिलती है:

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.

जैसा कि मैं एफएचएस को समझता हूं , स्थित फाइलें /varसिस्टम-क्रिटिकल नहीं होनी चाहिए। रेटर ये अस्थायी फ़ाइलें, लॉग, कैश और समान होना चाहिए।

क्या इसलिए हटाई गई फ़ाइलों को फिर से बनाने का एक तरीका है?


1
ब्रियम का जवाब आपको स्टेटस फाइल वापस मिल जाएगा; लेकिन आपके द्वारा डिलीट किया गया सामान /var/lib/dpkg/infoकाफी महत्वपूर्ण है, भी। आपने FHS को गलत समझा है, और AFAIK एकमात्र पुनर्प्राप्ति पथ हैं (a) बैकअप से पुनर्स्थापित करें या (b) पुनर्स्थापना करें।
derobert

जवाबों:


13

यदि आप फाइलसिस्टम पदानुक्रम मानक में दिए गए / var के उद्देश्य को देखते हैं, तो यह कहता है:

/varचर डेटा फ़ाइलें हैं। इसमें स्पूल डायरेक्टरीज़ और फाइल्स, एडमिनिस्ट्रेटिव और लॉगिंग डेटा और ट्रांसिएंट और अस्थायी फाइल्स शामिल हैं।

ध्यान दें कि "क्षणिक और अस्थायी" फाइलें इसमें शामिल चीजों में से एक हैं। इसमें "स्पूल डायरेक्टरीज़ और फाइल्स" और "एडमिनिस्ट्रेटिव और लॉगिंग डेटा" भी शामिल हैं। आपने महत्वपूर्ण "प्रशासनिक डेटा" हटा दिया है।

यह बताने के लिए कि क्यों /varमौजूद है:

/var/usrकेवल पढ़ने के लिए माउंट करना संभव बनाने के लिए यहां निर्दिष्ट किया गया है । सब कुछ जो एक बार चला गया /usrवह सिस्टम ऑपरेशन के दौरान लिखा गया है (स्थापना और सॉफ़्टवेयर रखरखाव के विपरीत) में होना चाहिए /var

इसके बारे में मुख्य बात यह है /var: इसमें डेटा बदलता है, इसके विपरीत /usr(जो केवल सॉफ्टवेयर को जोड़ने / हटाने / अपडेट करने पर बदलता है)।

इसके अलावा खंड विभिन्न उपनिर्देशिकाओं के बारे में बताते हैं /var; उदाहरण के लिए, /var/lib(जहाँ आपने जिन फ़ाइलों को लाइव करने के लिए उपयोग किया था) "एक एप्लिकेशन या सिस्टम से संबंधित राज्य की जानकारी" रखती है, जिसे "डेटा जो प्रोग्राम चलाते समय संशोधित करता है, और जो एक विशिष्ट होस्ट से संबंधित होता है" के रूप में परिभाषित किया गया है।

आपको वास्तव में यह जानने के बिना फ़ाइलों को नहीं हटाना चाहिए कि विशिष्ट फ़ाइल क्या है। आपके द्वारा हटाई गई फ़ाइलों के साथ, जब तक कि आपके पास इन फ़ाइलों का बैकअप नहीं होता है, मुझे लगता है कि केवल एक चीज को छोड़ना बाकी है /home, /etcआदि और फिर से इनस्टॉल करें। जब तक आप ऐसा नहीं करते, तब तक आप dpkg(और APT, आदि) का उपयोग करने में असमर्थ होंगे । इसके अलावा, सिस्टम को कार्य करना जारी रखना चाहिए।


क्या मैं दूसरी मशीन से फाइल कॉपी कर सकता हूं, या वे मशीन-विशिष्ट हैं?
मार्टिन वेगाटर

1
@MartinVegter स्टेटस सूची बताती है कि कौन से पैकेज इस विशेष मशीन पर स्थापित किए गए हैं। आप इसे मशीन से सटीक समान पैकेज वाले राज्यों से कॉपी कर सकते हैं (न केवल स्थापित, बल्कि हटाए गए लेकिन साथ ही शुद्ध नहीं)। apt-get updateमुझे लगता है कि उपलब्ध पुनर्निर्माण होगा। जानकारी / सामान प्रत्येक स्थापित पैकेज से आता है, लेकिन यह इतिहास को भी दर्शाता है, कम से कम पुरानी गोपनीय फाइलों के लिए ... लेकिन आप शायद उसी सटीक पैकेज मशीन से नकल करने से दूर हो सकते हैं)
derobert

वर्तमान दस्तावेज़ीकरण " /var/libराज्य की जानकारी की घोषणा करता है । कार्यक्रमों द्वारा संशोधित स्थायी डेटा , जैसे वे चलाते हैं, जैसे, डेटाबेस, पैकेजिंग सिस्टम मेटाडेटा, आदि।"
मिकीको रैंटलैनेन जूल

8

आप /var/lib/dpkg/statusकेवल कमांड चलाने के संदर्भ में "रीक्रिएट" नहीं कर सकते हैं और फ़ाइल जादुई रूप से प्रकट होती है। नहीं, आपको फ़ाइल का बैकअप उपयोग करने की आवश्यकता है, और यह सीखें कि /var/libनिर्देशिका की चीजों को हटाने के आसपास कभी न जाएं :

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

इससे आपको एक दिन पहले पैकेज का दर्जा मिल जाएगा। प्रार्थना करना शुरू करें यह कुछ और नहीं तोड़ा।


यह भी देखें /var/backups, वहाँ कई प्रतियां हैं।
व्युत्पन्न

@ ब्रायम - मेरे पास स्थिति-पुरानी नहीं है, न ही मेरे पास / var / बैकअप में कुछ भी है। क्या मैं दूसरी मशीन से फाइल कॉपी कर सकता हूं, या वे मशीन-विशिष्ट हैं?
मार्टिन वेग्टर

1
@MartinVegter नहीं, यह काम नहीं करेगा। आपके लिए सबसे तेज़ तरीका आपकी महत्वपूर्ण फ़ाइलों का बैकअप है, और सिस्टम को फिर से इंस्टॉल करना है। BTW, भी नहीं /var/backups/dpkg.status.0?
ब्रिअम

8

इसमें स्थित फाइलें /varबहुत ज्यादा सिस्टम-क्रिटिकल हैं। उदाहरण के लिए, /var/mailया /var/spool/mailउपयोगकर्ताओं के ईमेल में शामिल हैं; आप अपने पड़ोसी के मेलबॉक्स में आग जलाने की तुलना में इससे अधिक नहीं हटा सकते हैं। यह केवल कुछ उपनिर्देशिकाओं की /varफ़ाइलें हैं जिनमें ऐसी फ़ाइलें हैं जो कम या अधिक क्षणभंगुर हैं: लॉग इन फ़ाइलों /var/log, कैश जो आमतौर पर /var/cache, अस्थायी फ़ाइलों (जिन्हें आप उपयोग में होने के दौरान हटा नहीं सकते हैं!) को फिर से बनाया जा सकता है /var/tmp

में डेटा /var/libकाफी महत्वपूर्ण हो सकता है। उदाहरण के लिए, MySQL को आमतौर पर /var/lib/mysqlडिफ़ॉल्ट रूप से अपने डेटाबेस को संग्रहीत करने के लिए कॉन्फ़िगर किया जाता है: यदि आप इसे मिटा देते हैं, तो आप अपने डेटाबेस को मिटा देते हैं। Dpkg अपने स्वयं के डेटाबेस के तहत भी डालता है /var/lib; /var/lib/dpkg/statusएक है।

/var/lib/dpkg/statusइसमें स्थापित पैकेजों के बारे में जानकारी है। यदि आपने इसे मिटा दिया है, तो आपको इसे बैकअप से पुनर्स्थापित करना चाहिए। अपने बैकअप को पूरी तरह से करने की तारीख नहीं है, तो के तहत हाल ही में पैकेज जोड़तोड़ की लॉग की जांच /var/log/aptऔर में /var/log/dpkg.logdpkgकाम करने से पहले आपको उस फ़ाइल को बनाना होगा।

/var/lib/dpkg/availableइंटरनेट से डाउनलोड किए गए डेटा से बनाया गया है। apt-get updateइसका पुनर्निर्माण करना चाहिए।

/var/lib/dpkg/infoडेबियन पैकेज के साथ जहाज रखने वाली फाइलें शामिल हैं। आप संकुल को पुनः स्थापित करके इन फ़ाइलों को पुनर्स्थापित कर सकते हैं। बेशक, आपको उसके लिए स्थापित पैकेजों की एक सूची की आवश्यकता होगी। यदि आपने पुनर्स्थापित किया है /var/lib/dpkg/status, तो आप वहां से संकुल की सूची निकाल सकते हैं।

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

यदि आप हार गए हैं /var/lib/dpkg/status, तो आप इसे खाली फ़ाइल बनाकर फिर से बनाने में सक्षम हो सकते हैं, फिर apt-get install --reinstallपैकेज की सूची पर चल सकते हैं। एक जगह जहां पैकेज की सूची भी बचाई गई है /var/lib/apt/extended_states, कम से कम यदि आपने कभी पैकेज स्थापित करने के लिए केवल एपीटी का उपयोग किया है (जैसा कि dpkgसीधे विरोध किया जाता है) - /var/lib/dpkg/statusतो ऊपर दिए गए आदेश के बजाय उस फ़ाइल का उपयोग करें । यदि आपने वह भी हटा दिया है, तो आप संकुल की अनुमानित सूची को फिर से बना सकते हैं $(cd /usr/share/doc && ls), क्योंकि अधिकांश संकुल में एक प्रविष्टि बनाते हैं /usr/share/doc। शायद कुछ अपवाद हैं।

इस प्रणाली पर पैकेज प्रबंधन के बारे में कोई सहायता न माँगें। सिस्टम-क्रिटिकल फ़ाइलों को हटाने से पुनर्प्राप्त करना एक सटीक विज्ञान नहीं है। यदि आप बैकअप से पुनर्स्थापित नहीं कर सकते हैं, तो आपको जल्द से जल्द एक नया, साफ सिस्टम स्थापित करना चाहिए।


मैं कहूंगा कि जब तक आप ऐतिहासिक समस्या का वर्णन करने और इसे ठीक करने के तरीके से शुरू करते हैं, तब तक ऐसी प्रणाली पर पैकेज के बारे में सहायता मांगना ठीक है । कभी-कभी ऐसी प्रणालियों की मरम्मत करने से कुछ पैकेज प्रबंधन प्रक्रिया में सुरक्षा भेद्यता की सूचना मिल सकती है और यह इस तथ्य के बावजूद मूल्यवान हो सकता है कि ऐसी प्रणाली से निपटना कठिन हो सकता है।
मिकीको रैंटलैनेन जूल

5

/var/lib/dpkg/availableउपयुक्त डेटा से निर्मित किया जा सकता है। सबसे आसान तरीका मुझे dselectअपडेट का उपयोग करने और चुनने का यह मिला । मुझे उम्मीद है कि यह तभी काम करेगा जब आपके पास आपकी अपडेट पद्धति के रूप में चुना जाएगा। ऐसा लगता dselectहै:

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

ध्यान दें, हालांकि चीजें डेबियन सर्ज से बदल गई हैं।

/var/lib/dpkg/statusइस तथ्य के आधार पर फिर से बनाने के लिए चालें हैं कि प्रत्येक पैकेज को निर्देशिका में एक निर्देशिका जोड़ने की आवश्यकता होती है /usr/share/docHttp://linuxmafia.com/faq/Debian/package-database-rebuild.html पर पोस्ट देखें । प्रस्तुत एक स्क्रिप्ट है जो उन पैकेजों की एक सूची बनाने के लिए / usr / share / doc की फ़िल्टर की गई सूची का उपयोग करता है जो स्थापित किए गए थे, फिर उन सभी को पुनः स्थापित करता है।


1

वैसे मुझे लगता है कि आप फ़ाइल को फिर से तैयार कर सकते हैं और उसके बाद लंबी-सूची स्थापित कर सकते हैं, यह मानते हुए कि आपने पहली बार क्या स्थापित किया है।

मेरे पास एक प्राचीन लिपि है जो मूल रूप से संकुल के सबसे छोटे सेट से ऐसा करती है जो उपयुक्त तरीके से चल सकती है। इसका उपयोग करते समय मैंने दर्जनों गैर-घोषित निर्भरताओं की रिपोर्टिंग समाप्त कर दी।

यदि आपको वह सब कुछ पता नहीं है जिसे आपने इंस्टॉल किया है, तो सिस्टम को फिर से इंस्टॉल करें।


0

लिनक्स टकसाल 17 पर मुझे एक समान लगने वाले मुद्दे का सामना करना पड़ा। मैं फाइलों में बहक गया था और पाया कि जहां "प्रशासन -> अपग्रेड मैनेजर" सिर्फ खुश नहीं दिखे .......

मेरे लिए काम करने वाला समाधान त्रुटि संदेश के अनुसार "dpkg" नामक एक निर्देशिका बनाने के लिए था, और इसमें "स्थिति" नामक एक खाली फ़ाइल बनाएं।

मैंने फिर अपडेट मैनेजर चलाया।

यह मुझे बहुत काम आया :-)


0

यदि आपके पास अन्य उपयोगकर्ता खाते होते हैं, तो 'roo't' के अलावा आप उनमें से किसी एक से भी अपग्रेड प्राप्त कर सकते हैं। Apt अभिलेखागार को डाउनलोड करेगा, लेकिन / var / में कुछ गुम निर्देशिकाओं के कारण उन्हें स्थापित करने पर स्टाल करेगा। निर्देशिका दिखाई जाएगी। उन्हें बनाएं और apt-get dist-upgrade anew चलाएं। incase उन्हें बनाने में वैकल्पिक खाता लॉग से विफल रहता है रूट n पर dirs बनाएँ फिर से apt फिर से चलाएँ। आपको लॉगोट्रेट कॉन्फ़िगरेशन के बारे में संकेत दिया जाएगा और कुछ अन्य कॉन्फ़िगरेशन बस अंत तक वाई एन टाइप करते हैं, जब उपयुक्त डिस्ट-अपग्रेड समाप्त हो जाता है। सब कुछ अब सामान्य होना चाहिए।


0

विलंब के लिए क्षमा चाहते हैं। Briam, dirs और फ़ाइलों को मैन्युअल रूप से फिर से बनाएँ और फिर repos अपडेट करें ( mkdirऔर touch, प्रदर्शित त्रुटि द्वारा आवश्यक), और उपयोग करें dpkg --configure -a

आपका सिस्टम ठीक चलेगा, लेकिन यह सुनिश्चित करने के लिए कि यह दूषित नहीं है, इसे पुन: स्थापित करने के लिए महत्वपूर्ण है; पिछला केवल एक पुनर्स्थापना शेड्यूल करने के लिए समय प्राप्त करने के लिए है ... और /var/lib/*फ़ाइलों को हटाने का ध्यान रखें ।


-2

यदि आपने एक रास्पबेरी पाई 3 खरीदी और आपने समस्या का सामना किया और "फ़ाइल प्राप्त नहीं कर सका" / var / lib / dpkg / status पार्स या खोला "यह मेरे लिए काम करने वाला एक वर्कअराउंड है:

"/ Var / lib / dpkg / status" फ़ाइल को कैसे फिर से बनाया जाए ?, क्योंकि यह एक अप्रयुक्त फ़ाइल नहीं है, यह एक बहुत ही महत्वपूर्ण फ़ाइल है जो आपके रास्पियन ओएस में स्थापित पैकेजों के बारे में कुछ जानकारी रखती है, इसलिए यहां बताया गया है कि मैं कैसे पुन: बनाता हूं :

  1. अपने रास्पियन प्रणाली के भीतर एक प्रदर्शन करें:

    wget http://www.doglabscs.com/recover1.sh
    
  2. कुछ अनुमतियां दें:

    chmod 777 recover1.sh
    
  3. अपने सिस्टम में प्रलेखन फोल्डर का विश्लेषण करें और स्टेटस फाइल को फिर से बनाएँ:

    ./recover1.sh
    
  4. एक बार किया, फ़ाइल डाउनलोड करें और ध्यान से पढ़ें। फ़ाइल में वर्णित चरणों का पालन करें:

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

नमस्ते! लिंक के बजाय कृपया अपने उत्तरों के भाग के रूप में कोड पोस्ट करें।
धग

चेतावनी: यदि यह पहले से ही ठीक है तो परीक्षण के बिना recover1.shआपके करंट को नष्ट कर देगा /var/lib/dpkg/status। तब यह कुछ हद तक काम करने वाले संस्करण को फिर से बनाने की कोशिश करने के लिए मिश्रित बैग को क्रियान्वित करेगा। जब तक आप फ़ाइल / var / lib / dpkg / स्थिति को पूरी तरह से याद नहीं कर रहे हों, कभी भी उपरोक्त स्क्रिप्ट न चलाएं। अन्यथा strings /var/lib/dpkg/statusदूषित फ़ाइल को फिर से शुरू करने का एक बेहतर तरीका हो सकता है।
मिकीको रैंटलैनेन जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.