จะสร้าง / var / lib / dpkg / status ใหม่ได้อย่างไร?


10

ฉันได้ลบไฟล์บางไฟล์ไป/var/lib/dpkg/แล้วนั่นคือ:

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

ฉันเข้าใจว่า Debian ใช้ไฟล์เหล่านี้เพื่อเก็บข้อมูลบางอย่างเกี่ยวกับแพ็คเกจที่ติดตั้ง ตอนนี้เมื่อฉันทำ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.

ตามที่ฉันเข้าใจFHSไฟล์ที่อยู่ใน/varนั้นไม่ควรมีความสำคัญกับระบบ ให้คะแนนสิ่งเหล่านี้ควรเป็นไฟล์ชั่วคราวบันทึกแคชและสิ่งที่คล้ายกัน

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


1
คำตอบของ Braiam จะทำให้คุณกลับไฟล์สถานะ แต่สิ่งที่คุณลบไป/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 เป็นต้น) นอกเหนือจากนั้นระบบควรทำงานต่อไป


ฉันสามารถคัดลอกไฟล์จากเครื่องอื่นหรือไฟล์เฉพาะเครื่องได้หรือไม่
Martin Vegter

1
@MartinVegter แสดงสถานะรายการที่ติดตั้งบนเครื่องนี้โดยเฉพาะ คุณสามารถคัดลอกมาจากเครื่องที่มีสถานะแพคเกจเดียวกันแน่นอน (ไม่เพียง แต่ติดตั้ง แต่ลบออก แต่ไม่ถูกลบทิ้งด้วย) apt-get updateฉันจะสร้างใหม่ได้ฉันเชื่อว่า ข้อมูล / สิ่งต่าง ๆ มาจากแพ็คเกจที่ติดตั้ง แต่มันก็สะท้อนถึงประวัติเช่นกันอย่างน้อยสำหรับไฟล์ conf เก่า ... แต่คุณอาจจะได้ออกไปพร้อมกับการคัดลอกจากเครื่องแพคเกจเดียวกันนั้นก็ได้
Derobert

เอกสารปัจจุบันประกาศ " /var/libข้อมูลสถานะข้อมูลถาวรที่แก้ไขโดยโปรแกรมขณะที่ทำงานเช่นฐานข้อมูลเมตาดาต้าระบบบรรจุภัณฑ์ ฯลฯ "
Mikko Rantalainen

8

คุณไม่สามารถ "สร้างใหม่" /var/lib/dpkg/statusในแง่ของการเรียกใช้คำสั่งและไฟล์จะปรากฏขึ้นอย่างน่าอัศจรรย์ ไม่คุณต้องใช้การสำรองไฟล์และเรียนรู้ที่จะไม่ลบสิ่งต่าง ๆ ใน/var/libไดเรกทอรี:

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

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


เห็น/var/backupsไหมว่ามีหลายชุด
Derobert

@Braiam - ฉันไม่มีสถานะเก่าและฉันไม่มีอะไรใน / var / backups ฉันสามารถคัดลอกไฟล์จากเครื่องอื่นหรือไฟล์เฉพาะเครื่องได้หรือไม่
Martin Vegter

1
@MartinVegter ไม่มันไม่ทำงาน วิธีที่เร็วที่สุดสำหรับคุณคือการสำรองไฟล์สำคัญของคุณและติดตั้งระบบใหม่ BTW ไม่ใช่/var/backups/dpkg.status.0เหรอ?
Braiam

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มีข้อมูลเกี่ยวกับแพ็คเกจที่ติดตั้ง หากคุณลบออกแล้วคุณควรกู้คืนจากข้อมูลสำรอง หากการสำรองข้อมูลของคุณไม่ได้อย่างเต็มที่ up-to-date, ตรวจสอบบันทึกกิจวัตรแพคเกจที่ผ่านมาภายใต้และใน/var/log/apt /var/log/dpkg.logคุณจะต้องสร้างไฟล์นั้นก่อนdpkgจะใช้งานได้

/var/lib/dpkg/availableสร้างขึ้นจากข้อมูลที่ดาวน์โหลดจากอินเทอร์เน็ต apt-get updateควรสร้างใหม่

/var/lib/dpkg/infoมีไฟล์ที่มาพร้อมกับแพ็คเกจ Debian คุณสามารถกู้คืนไฟล์เหล่านี้ได้ง่ายๆโดยติดตั้งแพคเกจใหม่ แน่นอนคุณจะต้องมีรายการแพคเกจที่ติดตั้งไว้สำหรับสิ่งนั้น หากคุณกู้คืน/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อย่างน้อยถ้าคุณเคยใช้ APT เพื่อติดตั้งแพ็กเกจ (ตรงข้ามกับdpkgโดยตรง) - ใช้ไฟล์นั้นแทนที่จะ/var/lib/dpkg/statusใช้คำสั่ง int ข้างต้น หากคุณได้ลบที่มากเกินไปคุณสามารถสร้างรายการโดยประมาณของแพคเกจด้วยเพราะแพคเกจส่วนใหญ่สร้างรายการใน$(cd /usr/share/doc && ls) /usr/share/docอาจมีข้อยกเว้นเล็กน้อย

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


ฉันจะบอกว่ามันโอเคที่จะขอความช่วยเหลือเกี่ยวกับแพคเกจในระบบดังกล่าวตราบใดที่คุณเริ่มต้นด้วยการอธิบายปัญหาที่เกิดขึ้นในอดีตและวิธีการที่คุณคงมัน บางครั้งการซ่อมแซมระบบดังกล่าวอาจช่วยให้สังเกตเห็นช่องโหว่ด้านความปลอดภัยเช่นในกระบวนการจัดการแพคเกจบางอย่างและมันอาจมีค่าแม้ว่าข้อเท็จจริงที่ว่าการจัดการกับระบบดังกล่าวอาจเป็นเรื่องยาก
Mikko Rantalainen

5

/var/lib/dpkg/availableสามารถสร้างจากข้อมูลที่ฉลาด วิธีที่ง่ายที่สุดที่ฉันพบว่าทำสิ่งนี้กับเราโดยใช้dselectและเลือกอัพเดต ฉันคาดว่าสิ่งนี้จะใช้งานได้หากคุณเลือกที่จะเป็นวิธีการอัปเดตของคุณ ดูเหมือนว่าdselectจะเป็น:

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

หมายเหตุแม้ว่าสิ่งต่าง ๆ อาจมีการเปลี่ยนแปลงตั้งแต่ Debian sarge

มีเทคนิคในการสร้างใหม่/var/lib/dpkg/statusตามความจริงที่ว่าทุกแพ็คเกจจำเป็นต้องเพิ่มไดเรกทอรีใน/usr/share/docไดเรกทอรี ดูโพสต์ที่http://linuxmafia.com/faq/Debian/package-database-rebuild.html มีสคริปต์ที่แสดงซึ่งใช้รายการที่กรองของ / usr / share / doc เพื่อสร้างรายการของแพ็คเกจที่ติดตั้งแล้วติดตั้งใหม่ทั้งหมด


1

ดีฉันคิดว่าคุณสามารถสร้างไฟล์ที่ว่างเปล่าและจากนั้นทำการติดตั้ง apt-get long-list โดยสมมติว่าคุณรู้ว่าคุณติดตั้งอะไรเป็นครั้งแรก

ฉันมีสคริปต์โบราณที่ทำสิ่งนี้โดยทั่วไปจากชุดแพ็กเกจที่เล็กที่สุดที่สามารถเรียกใช้ apt-get ได้ เมื่อใช้งานฉันได้รับรายงานการอ้างอิงที่ไม่ได้ประกาศจำนวนมาก

หากคุณไม่ทราบทุกสิ่งที่ติดตั้งให้ติดตั้งระบบใหม่


0

บน Linux Mint 17 ฉันพบปัญหาการทำให้เกิดเสียงคล้ายกัน ฉันเป็นคนขี้เกียจในการลบไฟล์และพบว่าตัวเองอยู่ในตำแหน่ง "การจัดการ -> ตัวจัดการอัปเกรด" ฉันไม่ได้ดูมีความสุขเลย .......

วิธีแก้ปัญหาที่ใช้งานได้สำหรับฉันคือการสร้างไดเรกทอรีชื่อ "dpkg" ตามข้อความแสดงข้อผิดพลาดและในนั้นจะสร้างไฟล์ว่างเปล่าที่เรียกว่า "สถานะ"

จากนั้นฉันก็จัดการ Update Manager

มันทำงานได้ฉัน :-)


0

หากคุณมีบัญชีผู้ใช้อื่นนอกเหนือจาก 'คุณไม่สามารถลอง apt-get-dist-upgrade ได้จากหนึ่งในนั้น Apt จะดาวน์โหลดไฟล์เก็บถาวร แต่หยุดการติดตั้งเนื่องจากมีบางไดเรกทอรีขาดหายไปใน / var / ไดเรกทอรีจะปรากฏขึ้น สร้างและเรียกใช้ apt-get dist-upgrade ใหม่อีกครั้ง ในกรณีที่การสร้างล้มเหลวจากการบันทึกบัญชีทางเลือกกลับไปที่รูท n สร้าง dirs จากตรงนั้นแล้วเรียกใช้ apt อีกครั้ง คุณจะได้รับแจ้งเกี่ยวกับการกำหนดค่า logrotate และการกำหนดค่าอื่น ๆ เพียงพิมพ์ Y ดำเนินการต่อจนถึงสิ้นแล้วรีบูตเมื่อ apt dist-upgrade เสร็จสิ้น ตอนนี้ทุกอย่างควรกลับมาเป็นปกติ


0

ขออภัยในความล่าช้า. Briam อีกครั้งสร้าง dirs และไฟล์ด้วยตนเองและจากนั้นปรับปรุง Repos ( mkdirและtouchตามที่มีข้อผิดพลาดที่แสดง) dpkg --configure -aและการใช้งาน

ระบบของคุณจะทำงานได้ดี แต่สิ่งสำคัญคือต้องติดตั้งใหม่เพื่อให้แน่ใจว่าไม่เสียหาย หน้าที่แล้วคือเพื่อให้ได้เวลาในการกำหนดเวลาการติดตั้งใหม่ ... และดูแลการลบ/var/lib/*ไฟล์


-2

หากคุณซื้อราสเบอร์รี่ pi 3 และคุณประสบปัญหาและได้รับข้อผิดพลาด "ไม่สามารถเปิดไฟล์ / var / lib / dpkg / สถานะแยกวิเคราะห์หรือเปิด" นี่เป็นวิธีแก้ปัญหาที่เหมาะกับฉัน:

จะสร้างไฟล์ "/ var / lib / dpkg / status" ใหม่ได้อย่างไรเพราะนี่ไม่ใช่ไฟล์ที่ไม่ได้ใช้มันเป็นไฟล์ที่สำคัญมากที่เก็บข้อมูลบางอย่างเกี่ยวกับแพ็คเกจที่ติดตั้งไว้ใน raspbian OS ดังนั้นนี่คือวิธีที่ฉันได้สร้างขึ้นใหม่ :

  1. ดำเนินการ wget ภายในระบบ Raspbian ของคุณ:

    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
    

Hi! โปรดโพสต์รหัสเป็นส่วนหนึ่งของคำตอบของคุณแทนที่จะเป็นลิงก์
dhag

คำเตือน: recover1.shจะทำลายปัจจุบันของคุณ/var/lib/dpkg/statusโดยไม่ต้องทดสอบหากไม่เป็นไร จากนั้นจะดำเนินการถุงผสมเพื่อพยายามสร้างเวอร์ชันที่ค่อนข้างใช้งานได้ ไม่เคยเรียกใช้สคริปต์ข้างต้นยกเว้นกรณีที่คุณไม่มีไฟล์ / var / lib / dpkg / status มิฉะนั้นstrings /var/lib/dpkg/statusอาจเป็นวิธีที่ดีกว่าในการเริ่มสร้างไฟล์ที่เสียหายขึ้นใหม่
Mikko Rantalainen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.