मैं एक भ्रष्ट dpkg स्थिति फ़ाइल का पुनर्निर्माण कैसे करूँ?


26

जब भी मैं टाइप करता हूं sudo apt-get removeऔर फिर Tabऑटो-पूर्ति के लिए कुंजी दबाता हूं तो मुझे निम्नलिखित संदेश मिलता है:

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

मुझे विशेष रूप से स्टेटस फाइल में 15945 लाइन में कुछ भी अजीब नहीं दिख रहा है। यह मोनो लाइब्रेरी पैकेज के विवरण क्षेत्र में एक डॉट कैरेक्टर है और एक कोलन को सम्मिलित करने से मदद नहीं मिली। डॉट वाली लाइन को हटाने से भी काम नहीं हुआ। स्थिति-पुरानी के साथ फ़ाइल को ओवरराइट करने के परिणामस्वरूप एक ही संदेश प्राप्त हुआ।

क्या स्थिति फ़ाइल के पुनर्निर्माण का कोई तरीका है?


3
मुझे नहीं लगता कि आप पूरी तरह से statusफ़ाइल का पुनर्निर्माण कर सकते हैं : यह जानकारी का एक प्राथमिक स्रोत है, और जबकि बहुत सारे यह अनावश्यक है, यह सब नहीं है। हालाँकि संभवतः फ़ाइल को मैन्युअल रूप से ठीक करना संभव है। Package:समसामयिक रेखा के चारों ओर फ़ाइल का एक हिस्सा पोस्ट करें, 15940 लाइन के पहले और बाद में कम से कम एक लाइन सहित 20-40 लाइनें कहें।
गाइल्स

मैंने तब से मोनो को अनइंस्टॉल करने की कोशिश की है, लेकिन यह सब किया था कि एक त्रुटि के रूप में रिपोर्ट किए जाने वाले लाइन नंबर को बदल दिया गया था। यदि आप पेस्ट लिंक का अनुसरण करते हैं, तो आपत्तिजनक लाइन नंबर 25 है, "सेक्शन: अजगर" पेस्ट ।ubuntu.com
Ramón

@ रेमन तो, apt-get, dpkgऔर दोस्तों अभी भी सही ढंग से काम है, और स्वत: पूर्ण करने के लिए क्या बाहर erroring रहा है?
रिकार्डो मुर्री

सही बात। ऐसा लगता है कि ऑटो-पूर्णता का उपयोग करते समय केवल स्थिति फ़ाइल को पार्स करने में समस्याएँ हो रही हैं। मैं अन्यथा बिना किसी स्पष्ट त्रुटियों के संकुल को स्थापित और हटा सकता हूँ।
रामोन

वही समस्या हो रही है। मुझे नहीं लगता कि apt के डेटाबेस के पुराने संस्करण का उपयोग करना इस समस्या को ठीक करने की परवाह किए बिना यहाँ करना सही है।
ओली

जवाबों:


7

मैंने आखिरकार अपनी इस प्रणाली को ठीक कर लिया है। स्टेटस फाइल का बैकअप रिस्टोर करने से काम नहीं चला क्योंकि मेरे पास इतने समय से यह समस्या है, यह मेरे सभी बैकअप में है।

फिक्स में वास्तविक स्वरूपण विराम के लिए पकड़ना और उन्हें मैन्युअल रूप से ठीक करना शामिल है। यह उतना कठिन नहीं है जितना लगता है।

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


खुशी है कि आपको एक समाधान मिला, ओली और साझा करने के लिए धन्यवाद। मेरे मामले में, समस्याग्रस्त लेक्समार्क डिबेट के अलावा, एक वेबमिन डिबेट में भी इसका विवरण विकृत था, लेकिन उस मामले में यह स्वत: पूर्ण होने पर किसी भी पार्सिंग मुद्दे का कारण नहीं बना। अजीब।
रामोन

3
@ क्या आप लाइसेंस के धारक हैं? क्या आप यहां लिख सकते हैं?
Braiam

यह सच है, अच्छा है कि मैंने आपकी पोस्ट पढ़ी। मेरे पास एक था missing package nameऔर मुझे पता चला कि, कुछ अजीब कारणों से मैंने अपना समय बर्बाद करने में बेहतर नहीं पाया, मेरे पास एक लाइन थी Packaga: landscape-commonजो कि ऑर्थोग्राफिक रूप से तय की गई थी और बीएएम, समस्या हल हो गई थी। बात यह है, मैंने इस फाइल को कभी नहीं छुआ है, न ही किसी और ने। वर्तनी की गलती से कंप्यूटर कैसे गड़बड़ कर सकता है?
सेवेरो रज़

वास्तविक उत्तर यहां भी होना चाहिए, इसे लिंक-ओनली उत्तर होने से बचने के लिए [यदि त्रुटि एक रिक्त रेखा से है जो "पैकेज:" से पहले नहीं है, तो .उस रिक्त पंक्ति में एक जोड़ें ]।
Xen2050 1

20

आपको पिछली ज्ञात अच्छी स्थिति फ़ाइल के साथ काम करने और वहां से अपडेट करने में सक्षम होना चाहिए। हर बार जब आप इंस्टॉल या अपडेट करते हैं, तो स्थिति फ़ाइल को gzipped backup के अंतर्गत / var / backups में सहेजा जाता है । निर्देशिका शो पर ls -l dpkg * करना :

-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

स्थिति-पुराने नामक / var / lib / dpkg / निर्देशिका में बनाई गई फ़ाइल का बैकअप भी है। निर्देशिका शो पर ls -l स्टेटस * करना :

-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

तो, एक भ्रष्टाचार से उबरने के लिए, आपको निम्नलिखित कार्य करने में सक्षम होना चाहिए:

1. भ्रष्ट स्थिति फ़ाइल का बैकअप बनाएँ :

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

2. उपरोक्त स्रोतों में से किसी हाल की dpkg स्थिति फ़ाइल को कॉपी करें:

भी

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

या

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. इसके बाद apt-get update चलाएं:

sudo apt-get update

इससे हो जाना चाहिए।


2
मुझे / var / backups में रखी स्थिति फाइलों के बारे में पता नहीं था। यह मामले में फिर से होने के लिए अच्छी जानकारी है। धन्यवाद, जिम।
रामोन

लेकिन क्या पुराने संस्करण का उपयोग करना सुरक्षित है? मेरा मतलब है, निश्चित रूप से यह सिर्फ ऑटो-पूर्ण नहीं है जो इस फ़ाइल का उपयोग करता है और पुराने पैकेज की जानकारी के साथ एक पुराने संस्करण का उपयोग करके अन्य, बहुत अधिक महत्वपूर्ण चीजों को पेंच करने जा रहा है ... जैसे खुद को।
ओली

@ मुझे यकीन नहीं हो रहा है मुझे केवल एक बार ऐसा करना पड़ा है। मुझे लगता है कि मुझे उस ऐप को फिर से स्थापित करना पड़ा जो समस्या पैदा कर रहा था, लेकिन आगे जाकर यह काम कर गया। इंटरनेट पर सभी सलाह के साथ (या इंटरनेट पर मुझसे कम से कम सलाह), इसने मेरे लिए काम किया। इसका मतलब यह नहीं है कि यह जरूरी आपके लिए काम करेगा। मैं इसे वारंटी के बिना प्रदान करता हूं और आपके सिस्टम पर यह कैसे व्यवहार होगा, इसके बारे में ज्ञान के बिना। आपकी माइलेज भिन्न हो सकती है। अपने जोखिम पर प्रयास करें।
जिम

यह समाधान मेरी समस्याओं को तय करता प्रतीत होता है। यदि किसी पुराने स्टेटस फ़ाइल का उपयोग करने से कोई समस्या उत्पन्न होती है तो मैं अपडेट करूंगा।
मैथ्यू

पुरानी फ़ाइल कुछ पैकेज परिवर्तनों को याद कर रही हो सकती है जो सिस्टम में किए गए हैं लेकिन ज्यादातर यह ठीक होगा। sudo apt update && sudo apt dist-upgradeपुरानी statusफ़ाइल के कारण अधिकांश समस्याओं को ठीक करना चाहिए । यदि आपके सिस्टम में बड़ी गड़बड़ है, तो sudo aptitude dist-upgradeइसके बजाय sudo apt ...कभी-कभी ब्रेक्जिट को ठीक करने के बेहतर तरीके सुझा सकते हैं।
बजे मिक्को रैंटलैनेन

6

मैं इस समस्या को ठीक करने में सक्षम था, जिन पैकेजों की स्थिति फ़ाइल में दूषित प्रविष्टियाँ थी।

sudo dpkg -r handbrake-cli

Pcregrep के माध्यम से स्वीकृत समाधान काम नहीं किया (pcregrep को कुछ भी नहीं मिला)।


बहुत बहुत धन्यवाद यह मेरे लिए काम करता है और वास्तव में यह सही तरीका है धन्यवाद
user2671192

6

अपमानजनक पैकेज के लिए "dpkg -P" का प्रयास करें। यह स्थानीय भंडार से इसे शुद्ध करेगा, सभी निशान को हटा देगा। मेरे सिस्टम पर, उस त्रुटि को उत्पन्न करने वाले हटाए गए (लेकिन अभी तक शुद्ध नहीं) पैकेज के लिए फिक्स था।


5

इस स्थिति में मैं दूषित /var/lib/dpkg/statusफ़ाइल का बैकअप लूंगा और फिर सूचनाओं का उपयोग करके इसे मैन्युअल रूप से (1888 और 9550 के आसपास) सही करूंगा ।

apt-cache show libssl0.9.8
apt-cache show udev

मिल गया । apt-get अब आसानी से चल रहा है।
ændrük


2

का बेटा...

ठीक है, वास्तविक त्रुटि लाइन १५२६६ पर थी, इसके बावजूद यह कुछ further०० लाइनों के नीचे होने की सूचना थी। स्थिति फ़ाइल में समस्याग्रस्त प्रविष्टि एक बहस के कारण होती है जिसे मैंने अपने लेक्समार्क प्रिंटर को लंबे समय पहले काम करने के लिए स्थापित किया था। एंट्री पैकेज के लिए थी lexmark-inkjet-08-driver। विवरण फ़ील्ड .में पंक्ति विराम के स्थान पर नहीं था । इससे पार्सिंग त्रुटि हुई।

इसे खोजने के लिए, मैंने एक शॉटगन समस्या निवारण पद्धति का सहारा लिया और चीजों को बहुत ही बेतरतीब ढंग से आज़माना शुरू कर दिया। मेरी नासमझ कोशिशों में से एक यह grep-status -P eअनुमान लगा रहा था कि ई वर्णमाला में सबसे आम पत्र था। गूंगा, मुझे पता है, लेकिन इससे पहले कि छपा हुआ स्टेटस रिकॉर्ड लेक्समार्क पैकेज के लिए गायब कॉलन के बारे में शिकायत करता था और मैंने .स्क्रीन पर घूरने के कुछ मिनटों के बाद एक चरित्र की कमी को देखा ।

यदि संभव हो, तो मैं एक और उत्तर चाहूंगा जो इस तरह के मुद्दे को खोजने के लिए एक बेहतर विधि का वर्णन कर सकता है यदि कोई व्यक्ति भविष्य में इसी तरह की समस्या में चलता है। धन्यवाद।


grep-status -r -P ^हमेशा किसी भी पैकेज से मेल खाना चाहिए ताकि यह पूरी फ़ाइल को पार्स करे और यदि इसे पार्स नहीं कर सकता है तो गर्भपात कराएं।
मिकीको रैंटलैनेन

2

क्योंकि मेरी स्थिति पुरानी होने के साथ भी समस्याग्रस्त थी apt-get update,

इसने मेरे लिए बहुत अच्छा काम किया:

(रूट के रूप में)

cd /var/lib/dpkg 

cp -avf status status.corrupt

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

यह कमांड ASCII ऑक्टल मानों के अलावा इनपुट स्ट्रीम से सभी वर्णों को हटाने के लिए tr कमांड में -c और -d तर्कों का उपयोग करता है जो एकल उद्धरणों के बीच दिखाए जाते हैं। यह आदेश विशेष रूप से निम्न वर्णों को इस यूनिक्स फिल्टर से गुजरने की अनुमति देता है:

अष्टक ११: टैब

अष्टक 12: लाइनफीड

अष्टक १५: गाड़ी वापसी

ऑक्टल 40 ऑक्टल 176 के माध्यम से: सभी "अच्छे" कीबोर्ड अक्षर

अन्य सभी बाइनरी वर्ण - आपकी फ़ाइल में "कचरा" वर्ण - इस अनुवाद प्रक्रिया के दौरान छीन लिए गए हैं।

क्रेडिट: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

यदि आप उत्सुक हैं कि क्या बदला है या कहां नुकसान होगा: (संभवतः लंबा)

diff /var/lib/dpkg/{status-old,status} |less
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.