ปัญหา apt-listchages และ libdjvulibre21 ใน sid ช่วงนี้

ช่วงนี้ใครใช้ sid อยู่ อาจพบปัญหาการอัปเกรดอยู่สองเรื่อง คือ apt-listchanges กับ libdjvulibre21

apt-listchanges

อาการของ apt-listchanges คือ ไม่แสดง changelog ใด ๆ เลย โดยพังกลางทาง แจ้งข้อความทำนองนี้:

Reading changelogs... Done
Traceback (most recent call last):
  File "/usr/bin/apt-listchanges", line 227, in ?
    main()
  File "/usr/bin/apt-listchanges", line 148, in main
    seen.close()
  File "/usr/lib/python2.4/bsddb/__init__.py", line 237, in close
    v = self.db.close()
bsddb.db.DBRunRecoveryError: (-30975, 'DB_RUNRECOVERY: Fatal error, run database
 recovery -- PANIC: fatal region error detected; run recovery')

ปัญหา ดูได้จาก Bug #469221 สาเหตุมาจากปัญหา db4.6 ใน python2.5 ซึ่ง upstream python แก้ปัญหาด้วยการห้ามใช้ db4.6 แต่ apt-listchanges ฝืนใช้ ขณะนี้ นักพัฒนากำลังถกกันอยู่ ว่า apt-listchanges ควรถอยกลับมา db4.5 หรือควรแก้ปัญหา db4.6 ที่ python2.5 ดี แต่ในระหว่างนี้ มีวิธีแก้ขัดอยู่สองวิธี

  1. ลบ apt-listchanges แล้วติดตั้งใหม่:
    # aptitude purge apt-listchanges
    # aptitude install apt-listchanges
    

    วิธีนี้ดูง่ายดี เป็นการทำลายประวัติการอ่าน changelog เก่า ๆ ของเราทิ้งแล้วเริ่มใหม่หมดด้วย db4.5 แต่ข้อเสียคือ บางทีโปรแกรมจะแสดง changelog เก่า ๆ ที่เราเคยอ่านมาแล้วด้วย

  2. dump ฐานข้อมูลจาก db4.6 เพื่อนำมาสร้างใหม่สำหรับ db4.5
    # db4.6_dump /var/lib/apt/listchanges.db | db4.5_load a.db
    # mv a.db /var/lib/apt/listchanges.db
    

    แต่จะต้องติดตั้งแพกเกจ db4.5-util และ db4.6-util เพิ่มเติม เพื่อใช้คำสั่ง db4.6_dump และ db4.5_load วิธีนี้ทำให้ไม่เสียข้อมูลประวัติการอ่าน changelog เก่า ๆ ที่เคยอ่านแล้ว

ปัญหานี้ เกิดใน sid เท่านั้น ผู้ใช้ lenny จะไม่เจอปัญหานี้ เพราะแพกเกจยังไม่ได้ migrate ไป

libdjvulibre21

อาการคือ เมื่อปรับรุ่นขึ้นแล้ว พบข้อผิดพลาดดังนี้:

dpkg: error processing /var/cache/apt/archives/libdjvulibre21_3.5.20-5_i386.deb 
(--unpack):
 trying to overwrite `/usr/share/djvu/osi/cs/messages.xml', which is also in pac
kage libdjvulibre15

จากนั้น สถานะของระบบแพกเกจจะค้างอยู่ที่ unconfigured state ทำให้ไม่สามารถติดตั้งแพกเกจอื่น ๆ อีกได้ บอกให้แก้ด้วย apt-get -f install ลูกเดียว ซึ่งแม้จะสั่งแล้ว ก็ไม่สามารถแก้ปัญหาได้

ปัญหานี้ เข้าใจได้ไม่ยาก.. สาเหตุก็คือ libdjvulibre21 ไปเขียนแฟ้มทับซ้อนกับ libdjvulibre15 โดยไม่ได้ประกาศ "Replaces: libdjvulibre15" ซึ่งถือว่าผิด policy แต่ก็อาจเป็นความจำเป็นก็ได้ เพราะเมื่อวันก่อน ยังมีบางแพกเกจที่ยังลิงก์กับ libdjvulibre15 อยู่ แล้ววันต่อมาก็มี binNMU สั่ง build ใหม่ให้ลิงก์กับ libdjvulibre21 ตามมา คาดว่าคงต้องรอให้แพกเกจเหล่านี้ build ใหม่ให้ครบก่อน จึงจะสั่งให้ libdjvulibre21 conflicts/replaces libdjvulibre15 ได้

วิธีแก้ปัญหา เป็นไปได้สองอย่าง

  1. คงรุ่นแพกเกจต่าง ๆ ที่ใช้ libdjvulibre21 ไว้ก่อน โดยใช้ aptitude สั่ง remove libdjvulibre21 แล้วไป downgrade แพกเกจที่ถูกกระทบเป็นตัว ๆ ไป (สำหรับเครื่องผม ที่เจอคือ evince และ libmagick10) จากนั้นก็ hold ไว้ที่รุ่นเดิม รอสักพักค่อยลอง upgrade ใหม่
  2. ใช้ libdjvulibre21 นี่แหละ ถ้าระบบไม่มีแพกเกจไหนใช้ libdjvulibre15 เหลืออีกแล้ว ก็สั่ง purge libdjvulibre15 ด้วย dpkg แล้วใช้ apt-get -f ซ่อม:
    # dpkg --purge libdjvulibre15
    # apt-get -f install
    

    วิธีนี้เอามาจากความเห็นใน Bug #471650

และเช่นกัน ปัญหานี้มีแต่ใน sid ไม่ตกไปถึง lenny

Topic: 

Comments

เจอเหมือนกันเมื่อเช้าครับ ใช้วิธี purge ตาม Bug #471650 ครับ

___
Neutron: Linux Addict!

Update: ปัญหาของ libdjvulibre21 แก้แล้วใน 3.5.20-6 ด้วยการย้ายไฟล์ออกไปที่ djvulibre-desktop แล้ว conflict กับ libdjvulibre15 และ libdjvulibre21 (<= 3.5.20-5)

แพกเกจเพิ่งเข้า sid เมื่อเช้านี้ เหตุที่มาช้า เท่าที่อ่านดูเป็นเพราะมีการเพิ่ม binary package ใหม่ ทำให้ติดอยู่ที่ NEW queue ครับ

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้