ฉันจะแก้ไขข้อผิดพลาด“ ปัญหาเกี่ยวกับ MergeList” หรือ“ ไม่สามารถแยกวิเคราะห์ไฟล์สถานะ” เมื่อพยายามอัปเดตได้อย่างไร


355

คอมพิวเตอร์ให้ผลลัพธ์นี้กับฉันในหน้าต่าง:

E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_natty_main_binary-i386_Packages
E: The package lists or status file could not be parsed or opened.

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


7
มันทำให้ฉันงุนงงว่าระบบปฏิบัติการนี้จัดการกับการอัปเดตได้อย่างน่าประหลาดใจเพียงใดแม้ตอนนี้จะต้องใช้สิ่งนี้และสิ่งที่คล้ายกันหลังจากผู้ใช้ไม่ได้ใช้งานในทางที่ผิด
matt

คำตอบ:


485

คำสั่งเทอร์มินัลเหล่านี้ควรแก้ปัญหาของคุณ:

ขั้นแรกให้ลบรายการรวมโดยเปิดเทอร์มินัล (กดCtrl+ Alt+ Tเพื่อเปิด) และเรียกใช้คำสั่งนี้:

sudo rm -vf /var/lib/apt/lists/*

ถัดไปสร้างใหม่โดยใช้การอัพเดทง่าย ๆ :

sudo apt-get update

นี่คือรายงานข้อผิดพลาด (และอื่น ๆ ) สำหรับปัญหานี้ซึ่งได้รับการแก้ไขแล้วในขณะนี้ดังนั้นจึงไม่ควรสร้างไฟล์ที่มีรูปแบบไม่ถูกต้องอย่างไรก็ตามหากคุณมีไฟล์ที่มีรูปแบบไม่ถูกต้องคุณต้องลบออกตามที่อธิบายไว้ในโพสต์นี้


* ตัวเลือกที่ใช้สำหรับ rm เป็น-vverbose

-v, - verbose อธิบายสิ่งที่กำลังทำอยู่

และ-fกำลัง

-f, - บังคับให้ละเว้นไฟล์และอาร์กิวเมนต์ที่ไม่มีอยู่ไม่เคยแสดงพร้อมต์

หากคุณไม่แน่ใจเกี่ยวกับบรรทัดคำสั่งหรือตัวเลือกที่ใช้อยู่เสมอให้อ้างอิงหน้าคู่มือสำหรับคำสั่ง สิ่งเหล่านี้สามารถเข้าถึงได้บนอินเทอร์เน็ตโดยค้นหา man และคำสั่งเช่นman rm หรือคุณสามารถเข้าถึงข้อมูลเดียวกันได้โดยพิมพ์คำสั่งเดียวกันใน terminal ตัวอย่างเช่นman rmคำแนะนำสำหรับการเลิกหน้าจะอยู่ที่ด้านล่างของเทอร์มินัลเช่น นี้

รูปภาพของตัวเลือกหน้าคน


8
บุคคลหนึ่งพบว่าเขาต้องทำสองขั้นตอนเหล่านี้หลายครั้ง แต่มันก็ใช้งานได้ในที่สุด
John S Gruber

5
มันแปลกที่จะวาง-vfที่ส่วนท้ายของrmคำสั่ง
Keith Thompson

6
มันไม่ได้แก้ปัญหาสำหรับฉัน การปรับปรุงยังคงแสดงให้ฉันเห็นข้อผิดพลาดนั้น
นาวิกโยธิน

1
นี่เป็นปัญหาที่เกิดซ้ำ มันเกิดขึ้นนาน ๆ ครั้ง มีใครตระหนักถึงสาเหตุของปัญหานี้หรือไม่?
Rushil Paul

1
ฉันได้แก้ไขคำตอบเพื่อความเข้าใจ @jasser
อัลลัน

82

เปิด Terminal และเรียกใช้คำสั่งต่อไปนี้ทีละครั้ง:

sudo rm /var/lib/apt/lists/* -vf
sudo apt-get update

ดูสิ่งนี้ด้วย:


1
-vf ทำอะไร
speedox

5
@speedox ตามman rm, -vหมายถึง 'verbose' และ-fหมายถึง 'แรง' กล่าวอีกนัยหนึ่งให้ลบไฟล์ที่กำหนดไว้ทั้งหมดโดยไม่แจ้งให้ผู้ใช้ทราบและแจ้งให้ผู้ใช้ทราบว่ากำลังทำอะไรอยู่
fouric

ในกรณีของฉันเพิ่งsudo apt-get updateแก้ไขปัญหาได้ ฉันคิดว่าอัลลันพูดถึงเวอร์ชั่นใหม่กว่าของ apt ที่ถูกต้องโดยอัตโนมัติดังนั้นอาจลองแค่อัปเดตก่อน
ThorSummoner

23

/var/lib/dpkg/statusคุณเมาขึ้นเมื่อคุณแก้ไข กู้คืนจากข้อมูลสำรองที่คุณทำก่อนแก้ไข แน่นอนคุณสำรองข้อมูลใช่ไหม

เนื่องจากคุณไม่ได้สำรองข้อมูลแก้ไขมันอีกครั้งอย่างรอบคอบ พยายามอย่าทำให้เกิดความเสียหายมากขึ้น

คุณสามารถใช้/var/lib/dpkg/status.oldเป็นจุดอ้างอิง นี่เป็นข้อมูลสำรองของstatusไฟล์ก่อนที่จะdpkgรันครั้งสุดท้าย วิ่ง

diff /var/lib/dpkg/status.old /var/lib/dpkg/status

เพื่อดูความแตกต่าง เลิกทำการเปลี่ยนแปลงที่คุณทำด้วยตนเองและเก็บการเปลี่ยนแปลงที่ทำไว้ในการdpkgเรียกใช้ครั้งล่าสุด

จริงๆถ้าคุณไม่สามารถจัดการการซ่อมแซมไฟล์ให้คัดลอกมากกว่า/var/lib/dpkg/status.old /var/lib/dpkg/statusคุณจะได้รับฐานข้อมูลแพ็กเกจที่ดี แต่ล้าสมัย

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


ฉันยังต้องการที่จะรู้ว่าวิธีที่ดีกว่าที่คุณกล่าวถึงในการลบ crossplatformui หากคุณสามารถช่วย coz ฉันพยายามทุกวิถีทางที่จะเอามันออกไปและพยายามหาทางแก้ปัญหาจำนวนมาก แต่เพียงคนเดียวที่ได้กล่าวถึงได้ทำงาน ...
Nirmik

1
@Nirmik crossplatformuiไม่มีความคิดเกี่ยวกับ ถามเป็นคำถามแยกต่างหาก ฉันสามารถบอกคุณได้ว่าในช่วงทศวรรษที่ผ่านมามีการใช้dpkgงานรวมถึงแหล่งข้อมูลที่ไม่เป็นทางการจำนวนมากฉันไม่ค่อยต้องการแก้ไขstatusไฟล์มากนักและเฉพาะเมื่อมีที่เก็บของบุคคลที่สามที่ใช้งานไม่ได้
Gilles

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

พยายามที่จะวางเก่าแทนที่ของใหม่ไม่ได้แก้ไขสำหรับฉัน :-(
Stéphane Gourichon

1
อีก: {คุณเมาเมื่อคุณแก้ไข / var / lib / dpkg / status} สำหรับฉัน - ไม่ฉันไม่ฉันไม่ได้สัมผัสไฟล์นี้ :) อย่างไรก็ตามนี่เป็นวิธีเดียวที่แก้ปัญหาในของฉัน กรณี. ขอขอบคุณ.
ruslo


16

ทำตามขั้นตอนที่ 2-5 ในขั้นตอนการแก้ไขปัญหาตัวจัดการแพคเกจมักจะแก้ปัญหานี้

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

สำหรับขั้นตอนที่ 3ให้ปิดโปรแกรมที่เปิดอยู่ที่คุณสามารถทำได้ มันอาจจะปลอดภัยที่จะเปิดเว็บเบราว์เซอร์ของคุณไว้เพื่อที่คุณจะได้รับคำแนะนำต่อหน้าคุณ แต่สิ่งสำคัญอย่างยิ่งคือต้องแน่ใจว่าผู้จัดการแพ็คเกจไม่ได้ทำงานอยู่ ซึ่งรวมถึง Software Center, Software Updater (Update Manager ใน Ubuntu รุ่นเก่า), Synaptic และ Gdebi นอกจากนี้ยังมีการจัดการสาธารณูปโภคแพคเกจบรรทัดคำสั่งเช่นapt-get, และdpkgaptitude

โปรดทราบว่าหากผู้ใช้อื่นเข้าสู่ระบบในเวลาเดียวกันพวกเขาควรออกจากระบบหากเป็นไปได้

สำหรับขั้นตอนที่ 4เปิดหน้าต่างเทอร์มินัล วิธีหนึ่งที่จะทำเช่นนี้ที่ทำงานไม่ว่าสิ่งที่สภาพแวดล้อมเดสก์ทอปที่คุณใช้คือการกดCtrl+ +AltT

สำหรับขั้นตอนที่ 5เรียกใช้คำสั่งเหล่านี้ในหน้าต่างเทอร์มินัล:

ubuntu-support-status
sudo grep -R proxy /etc/apt/*
grep proxy  /etc/environment
echo $http_proxy
echo $ftp_proxy
grep proxy /etc/bash.bashrc
grep proxy ~/.bashrc
cat /etc/apt/apt.conf
sudo fuser -vvv /var/lib/dpkg/lock
sudo fuser -vvv /var/cache/apt/archives/lock
cat /etc/lsb-release
uname -a
sudo rm /var/lib/apt/lists/lock 
sudo rm  /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
sudo cp -arf /var/lib/dpkg /var/lib/dpkg.backup
sudo mv /var/lib/dpkg/status /var/lib/dpkg/status-bad
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status  ||  sudo cp /var/backups/apt.extended_states.0 /var/lib/dpkg/status
sudo mv /var/lib/dpkg/available /var/lib/dpkg/available-bad
sudo cp /var/lib/dpkg/available-old /var/lib/dpkg/available
sudo rm -rf /var/lib/dpkg/updates/*
sudo rm -rf /var/lib/apt/lists
sudo rm /var/cache/apt/*.bin
sudo mkdir /var/lib/apt/lists
sudo mkdir /var/lib/apt/lists/partial
LANG=C;sudo apt-get clean
LANG=C;sudo apt-get autoclean
LANG=C;sudo apt-get --purge autoremove
LANG=C;sudo apt-get --fix-missing update -o APT::Cache-Limit=100000000
sudo dpkg --configure -a
sudo dpkg --clear-avail
LANG=C;sudo apt-get -f install
LANG=C;sudo apt-get --fix-missing install
LANG=C;sudo apt-get update -o APT::Cache-Limit=100000000 && sudo apt-get dist-upgrade
find /etc/apt -name '*.list' -exec bash -c 'echo -e "\n$1\n"; cat -n "$1"' _ '{}' \;

ผมคัดลอกที่คำต่อคำจากPackageManagementTroubleshoootingProcedureวันที่ 2 มีนาคม 2014 คำสั่งดังกล่าวมีการพัฒนาในอดีตและคำสั่งที่แนะนำในบทความที่อาจจะมีการเปลี่ยนแปลงหรือการขยายตัวอีกครั้งในอนาคต ดังนั้นคุณอาจต้องการที่จะทำงานจากขั้นตอนที่ 5 มี (บทความนั้นสร้าง / แก้ไขโดย "ผู้มีส่วนร่วมในวิกิเอกสารของอูบุนตู" - โดยเฉพาะMark Rijckenberg - ได้รับใบอนุญาต CC-BY-SA 3.0ซึ่งอนุญาตให้มีการรวมที่นี่ด้วยการระบุแหล่งที่มาที่เหมาะสม)

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

บ่อยครั้งที่มันแก้ไขได้ แต่เมื่อมันไม่บ่อยก็ให้ข้อมูลเพียงพอที่จะแก้ไข

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


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

11

ฉันเคยเห็นปัญหานี้เกิดขึ้นเมื่อคุณมีแหล่งที่มามากเกินไปใน repos ของคุณ

ลองวิธีแก้ปัญหาที่โพสต์ด้านบนและ / หรืออาจเป็นวิธีนี้ซึ่งบางครั้งก็แนะนำบน launchpad:

sudo mv /var/lib/apt/lists /var/lib/apt/lists-old
sudo mkdir -p /var/lib/apt/lists/partial
sudo apt-get update

แจ้งให้เราทราบว่าคุณจะไปได้อย่างไร


ขอขอบคุณ! สิ่งนี้ไม่สามารถใช้งานกับ DSL ได้หากไม่มี makedir ด้วย
Doug

4

ฉันพบข้อผิดพลาดที่คล้ายกัน:

Reading package lists... Error!
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/dpkg/status
E: The package lists or status file could not be parsed or opened.

status-oldผมทำตามคำแนะนำที่คล้ายกันในการคัดลอก

$ head /var/lib/dpkg/status
$ head /var/lib/dpkg/status-old

ไฟล์สถานะของฉันทั้งหมดว่างเปล่าด้วยเหตุผลบางอย่าง โชคดีที่ฉันพบว่ามีการสำรองข้อมูลของไฟล์เหล่านี้:

$ ls -l /var/backups/dpkg.status.*
-rw-r--r-- 1 root root 444620 Nov 15 06:33 /var/backups/dpkg.status.0
-rw-r--r-- 1 root root 444620 Nov 15 06:33 /var/backups/dpkg.status.1.gz
-rw-r--r-- 1 root root 128168 Sep 20  2013 /var/backups/dpkg.status.2.gz
-rw-r--r-- 1 root root 112545 Sep 16  2013 /var/backups/dpkg.status.3.gz
-rw-r--r-- 1 root root 107767 Sep 14  2013 /var/backups/dpkg.status.4.gz
-rw-r--r-- 1 root root 107766 Sep 11  2013 /var/backups/dpkg.status.5.gz
-rw-r--r-- 1 root root  94583 Sep 11  2013 /var/backups/dpkg.status.6.gz

ฉันตรวจสอบข้อมูลสำรองล่าสุด ...

$ head /var/backups/dpkg.status.0

... แต่มันยังว่างเปล่า ดังนั้นฉันคลายซิปอันเก่า ...

$ gunzip /var/backups/dpkg.status.1.gz
$ head /var/backups/dpkg.status.1

ครั้งนี้มีเนื้อหา ดังนั้นฉันจึงคัดลอก ...

$ cp /var/backups/dpkg.status.1 /var/lib/dpkg/status

จากนั้นก็apt-get updateวิ่งได้โดยไม่มีปัญหา

เครดิตไปที่โพสต์นี้


3

ฉันมีปัญหาเดียวกันและลองแก้ไขปัญหาทั้งหมดที่กล่าวถึงในคำตอบอื่น ๆ การแก้ไขอย่างเดียวที่น่าประหลาดก็คือขั้นตอนอื่น:

  • ไปที่ซอฟต์แวร์ & อัปเดต -> ซอฟต์แวร์ Ubuntu -> ดาวน์โหลดจาก -> อื่น ๆ -> เลือกเซิร์ฟเวอร์ที่ดีที่สุด

  • รอการทดสอบ เมื่อสิ้นสุดการทดสอบเซิร์ฟเวอร์ที่ดีที่สุดจะถูกเลือกไม่จำเป็นต้องเป็นเซิร์ฟเวอร์ที่ใกล้ที่สุดหรือเซิร์ฟเวอร์หลักหรือเซิร์ฟเวอร์สำหรับสถานที่ของคุณ

  • ตอนนี้โหลดข้อมูล Repo ใหม่มันจะเสร็จสิ้นอย่างถูกต้อง

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