ฉันจะสร้างไฟล์สถานะ dpkg ที่เสียหายได้อย่างไร


26

เมื่อใดก็ตามที่ฉันพิมพ์sudo apt-get removeแล้วกดTabปุ่มสำหรับการเติมข้อความอัตโนมัติฉันจะได้รับข้อความต่อไปนี้:

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

ฉันไม่เห็นอะไรแปลก ๆ โดยเฉพาะอย่างยิ่งที่บรรทัด 15945 ในไฟล์สถานะ มันเป็นตัวละครจุดในฟิลด์คำอธิบายของแพคเกจห้องสมุดโมโนและการแทรกโคลอนไม่ได้ช่วย การลบบรรทัดที่มีจุดนั้นไม่สามารถทำได้ การเขียนทับไฟล์ด้วยสถานะเก่าทำให้เกิดข้อความเดียวกัน

มีวิธีสร้างไฟล์สถานะอีกครั้งหรือไม่?


3
ฉันไม่คิดว่าคุณสามารถสร้างstatusไฟล์ใหม่ได้อย่างสมบูรณ์: มันเป็นแหล่งข้อมูลหลักและในขณะที่ไฟล์ส่วนใหญ่นั้นซ้ำซ้อน แต่ไม่ใช่ทั้งหมด อย่างไรก็ตามอาจเป็นไปได้ที่จะซ่อมแซมไฟล์ด้วยตนเอง โพสต์ไฟล์ขนาดเล็กรอบบรรทัดที่มีปัญหาพูดประมาณ 20-40 บรรทัดรวมถึงอย่างน้อยหนึ่งPackage:บรรทัดก่อนและหลังบรรทัด 15945
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

ฉันได้ลองถอนการติดตั้งขาวดำแล้ว แต่ทั้งหมดก็เปลี่ยนหมายเลขบรรทัดที่ได้รับรายงานว่าเป็นข้อผิดพลาด หากคุณไปที่ลิงค์วางหมายเลขบรรทัดที่ละเมิดคือ 25 "Section: python" paste.ubuntu.com/501929
Ramón

@ Ramónดังนั้นapt-get, dpkgและเพื่อน ๆ ยังคงทำงานได้อย่างถูกต้องและสิ่งที่ erroring ออกเป็นอัตโนมัติเสร็จ?
Riccardo Murri

แก้ไข. ดูเหมือนว่าจะมีปัญหาเฉพาะในการแยกวิเคราะห์ไฟล์สถานะเมื่อใช้การเติมข้อมูลอัตโนมัติ ฉันสามารถติดตั้งและลบแพ็คเกจได้โดยไม่มีข้อผิดพลาดที่ชัดเจน
Ramón

รับปัญหาเดียวกัน ฉันไม่คิดว่าสุ่มสี่สุ่มห้าใช้รุ่นเก่าของฐานข้อมูลที่ฉลาดเป็นสิ่งที่ถูกต้องที่จะทำที่นี่โดยไม่คำนึงถึงว่ามันแก้ไขนี้ปัญหา
Oli

คำตอบ:


7

ในที่สุดฉันก็ได้แก้ไขระบบนี้ การกู้คืนการสำรองข้อมูลของไฟล์สถานะไม่ทำงานเนื่องจากฉันมีปัญหามานานแล้วมันอยู่ในการสำรองข้อมูลทั้งหมดของฉัน

การแก้ไขเกี่ยวข้องกับการ grepping สำหรับตัวแบ่งการจัดรูปแบบจริงและแก้ไขด้วยตนเอง มันไม่ยากอย่างที่คิด

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


ดีใจที่คุณพบทางออก Oli และขอบคุณสำหรับการแบ่งปัน ในกรณีของฉันนอกเหนือจาก Lexmark ที่มีปัญหา deb, Webmin deb ยังมีคำอธิบายที่ผิดรูปแบบ แต่ในกรณีนั้นมันไม่ได้ทำให้เกิดปัญหาการวิเคราะห์คำเมื่อทำการเติมข้อความอัตโนมัติ แปลก.
Ramón

3
@Oli คุณเป็นผู้ถือใบอนุญาตหรือไม่ คุณเขียนที่นี่ได้ไหม
Braiam

นี่เป็นเรื่องจริงดีที่ฉันอ่านโพสต์ของคุณ ฉันมีmissing package nameและฉันพบว่าด้วยเหตุผลแปลก ๆ บางอย่างที่ฉันไม่ต้องเสียเวลาไปกับการหาคำตอบฉันมีบรรทัดPackaga: landscape-commonที่แก้ไข ortographically และ bam แก้ปัญหาได้ สิ่งนี้คือฉันไม่เคยแตะไฟล์นี้และไม่มีใครเลย คอมพิวเตอร์จะยุ่งกับการสะกดคำผิดได้อย่างไร
Severo Raz

คำตอบที่แท้จริงควรอยู่ที่นี่เช่นกันเพื่อหลีกเลี่ยงการเป็นคำตอบแบบลิงก์เท่านั้น [หากข้อผิดพลาดมาจากบรรทัดว่างที่ไม่นำหน้า "แพ็คเกจ:" จากนั้นเพิ่มคำ.ในบรรทัดว่างนั้น
Xen2050

20

คุณควรจะสามารถทำงานกับไฟล์สถานะที่ดีที่รู้จักก่อนหน้านี้และอัปเดตจากที่นั่น ทุกครั้งที่คุณจะติดตั้งหรือปรับปรุงไฟล์สถานะจะถูกบันทึกไว้ในการสำรองข้อมูลบีบอัดภายใต้/ var / การสำรองข้อมูล การทำ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 / ที่มีชื่อว่า status-old การทำสถานะ 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:

sudo apt-get update

ที่ควรทำ


2
ฉันไม่รู้เกี่ยวกับไฟล์สถานะที่เก็บอยู่ใน / var / backups นี่เป็นข้อมูลที่ดีที่จะมีในกรณีที่มันเกิดขึ้นอีกครั้ง ขอบคุณจิม
Ramón

แต่มันปลอดภัยที่จะใช้เวอร์ชั่นเก่าหรือไม่? ฉันหมายถึงแน่นอนว่ามันไม่ใช่แค่การเติมข้อมูลอัตโนมัติที่ใช้ไฟล์นี้และการใช้เวอร์ชั่นเก่าที่มีข้อมูลแพ็คเกจเก่าจะทำให้เกิดข้อผิดพลาดอื่น ๆ ที่สำคัญกว่า ...
Oli

@Oli ฉันไม่แน่ใจ ฉันต้องทำสิ่งนี้เพียงครั้งเดียว ฉันคิดว่าฉันต้องติดตั้งแอพที่ทำให้เกิดปัญหาอีกครั้ง เช่นเดียวกับคำแนะนำทั้งหมดบนอินเทอร์เน็ต (หรืออย่างน้อยคำแนะนำจากฉันบนอินเทอร์เน็ต) สิ่งนี้ได้ผลสำหรับฉัน ไม่ได้หมายความว่ามันจะจำเป็นสำหรับคุณ ฉันเสนอให้โดยไม่มีการรับประกันและไม่มีความรู้อย่างชัดเจนว่ามันจะทำงานบนระบบของคุณอย่างไร ไมล์สะสมของคุณอาจแตกต่างกันไป ลองรับความเสี่ยงของคุณเอง
จิม

วิธีนี้ดูเหมือนจะแก้ไขปัญหาของฉันแล้ว ฉันจะอัปเดตหากมีปัญหาใด ๆ เกิดขึ้นจากการใช้ไฟล์สถานะเก่า
แมทธิว

ไฟล์เก่าอาจหายไปจากการเปลี่ยนแปลงแพ็คเกจที่ทำกับระบบ แต่ส่วนใหญ่มันจะไม่เป็นไร การทำsudo apt update && sudo apt dist-upgradeควรแก้ไขปัญหาส่วนใหญ่ที่statusไฟล์เก่าอาจทำให้เกิด หากระบบของคุณมีระเบียบที่ใหญ่กว่าsudo aptitude dist-upgradeแทนsudo apt ...บางครั้งอาจแนะนำวิธีการที่ดีในการแก้ไขปัญหาความแตกแยก
Mikko Rantalainen

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

3

นี่เป็นข้อผิดพลาด (ควรได้รับการแก้ไข): Launchpad Bug 613018

ต้นน้ำ: Debian Bug 590885

นี่ควรเป็นวิธีแก้ปัญหา (สตริงการสำรองข้อมูล "แก้ไข"):

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

2

ลูกชายของ ...

โอเคข้อผิดพลาดที่เกิดขึ้นจริงอยู่ในบรรทัดที่ 15266 แม้จะมีรายงานว่า 700 บรรทัดต่อไป รายการปัญหาในไฟล์สถานะเกิดจากมีการติดตั้ง deb ฉันเพื่อให้เครื่องพิมพ์ Lexmark ของฉันทำงานนานแล้ว lexmark-inkjet-08-driverรายการที่เป็นแพคเกจ ฟิลด์คำอธิบายไม่มี.ในตำแหน่งของตัวแบ่งบรรทัด สิ่งนี้ทำให้เกิดข้อผิดพลาดในการวิเคราะห์คำ

เพื่อค้นหาสิ่งนี้ฉันใช้วิธีการแก้ปัญหาปืนลูกซองและเริ่มลองทำสิ่งต่าง ๆ แบบสุ่ม หนึ่งในความพยายามที่โง่ของฉันคือgrep-status -P eการหาว่า e เป็นตัวอักษรที่พบบ่อยที่สุดในตัวอักษร เป็นใบ้ฉันรู้ แต่บันทึกสถานะล่าสุดที่พิมพ์ออกมาก่อนที่มันจะบ่นเกี่ยวกับเครื่องหมายโคลอนที่หายไปนั้นเป็นแพ็คเกจ lexmark และฉันสังเกตเห็นการขาด.อักขระหลังจากไม่กี่นาทีที่จ้องมองที่หน้าจอ

ถ้าเป็นไปได้ฉันต้องการคำตอบอื่นที่สามารถอธิบายวิธีการที่ดีกว่าสำหรับการค้นหาปัญหาประเภทนี้ในกรณีที่บางคนพบปัญหาที่คล้ายกันในอนาคต ขอบคุณ


grep-status -r -P ^ควรจับคู่แพ็กเกจใด ๆ เสมอดังนั้นจึงควรวิเคราะห์ไฟล์ทั้งหมดและยกเลิกหากไม่สามารถวิเคราะห์ได้
Mikko Rantalainen

2

เพราะฉันสถานะเก่าเป็นปัญหามากเกินไปแม้จะมีapt-get update,

มันใช้งานได้ดีสำหรับฉัน:

(เป็น root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

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

คำสั่งนี้ใช้อาร์กิวเมนต์ -c และ -d กับคำสั่ง tr เพื่อลบอักขระทั้งหมดออกจากอินพุตสตรีมอื่นนอกเหนือจากค่าฐานแปด ASCII ที่แสดงระหว่างเครื่องหมายคำพูดเดี่ยว คำสั่งนี้อนุญาตให้เฉพาะอักขระต่อไปนี้ผ่านตัวกรอง Unix นี้:

แท็บฐานแปด 11:

Octal 12: linefeed

Octal 15: การคืนรถ

ฐานแปด 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.