แกะ DEB ออกได้อย่างง่ายดายแก้ไข postinst และบรรจุใหม่ DEB


129

ฉันกำลังพยายามติดตั้ง OpenCL SDK ของ Intel แต่ไฟล์ DEB เป็นการแปลงแบบบั๊กจาก RPM (ดูที่นี่สำหรับคนที่อยากรู้อยากเห็น) ฉันต้องการแก้ไขpostinstสคริปต์ใน DEB ที่ให้ไว้

ฉันจะใช้ DEB ที่มีอยู่แล้วแยกเนื้อหา (รวมถึงข้อมูลการควบคุม) จากนั้นจึงบรรจุเนื้อหาใหม่เพื่อสร้าง DEB ใหม่ในภายหลัง ฉันจะแก้ไขไฟล์เท่านั้นจะไม่มีการเพิ่มหรือลบไฟล์ใด ๆ

คำตอบ:


202

คำสั่งหลักในการจัดการกับแพคเกจ deb dpkg-debเป็น

หากต้องการคลายแพ็กเกจให้สร้างไดเร็กทอรีว่างและสลับไปยังแพ็กเกจจากนั้นรันdpkg-debเพื่อแตกข้อมูลการควบคุมและไฟล์แพ็กเกจ ใช้dpkg-deb -bเพื่อสร้างแพ็คเกจใหม่

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

ระวังว่าหากสคริปต์ของคุณทำงานในฐานะรูทการอนุญาตและความเป็นเจ้าของไฟล์จะเสียหายในขั้นตอนการแตกไฟล์ fakerootวิธีหนึ่งที่จะหลีกเลี่ยงปัญหานี้คือการเรียกใช้สคริปต์ของคุณภายใต้ โปรดทราบว่าคุณต้องเรียกใช้ทั้งลำดับภายใต้fakerootไม่ใช่แต่ละdpkg-debรายการเนื่องจากเป็นfakerootกระบวนการที่เก็บหน่วยความจำของสิทธิ์ของไฟล์ที่ไม่สามารถสร้างได้ตามที่เป็นอยู่

fakeroot sh -c '
  mkdir tmp
  dpkg-deb -R original.deb tmp
  # edit DEBIAN/postinst
  dpkg-deb -b tmp fixed.deb
'

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

mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

คุณควรเพิ่มรายการการเปลี่ยนแปลงและเปลี่ยนหมายเลขรุ่นหากคุณแก้ไขอะไรในแพ็คเกจ โครงสร้างพื้นฐานเพื่อจัดการกับแพคเกจ Debian สันนิษฐานว่าถ้าสองแพ็คเกจมีชื่อและรุ่นเดียวกันมันเป็นแพ็คเกจเดียวกัน เพิ่มคำต่อท้ายไปยังส่วนdebian_revisionที่ท้ายหมายเลขรุ่น สำหรับการจัดเรียงเหตุผลต่อท้ายควรเริ่มต้นด้วย~เช่นกลายเป็น1.2.3-4.11.2.3-4.1~johnjumper1

แทนที่จะใช้เครื่องมือเชลล์คุณสามารถใช้ Emacs dpkg-dev-elแพคเกจ (ซึ่งก็คือต้นน้ำของตัวเองเช่นนี้เป็นแพคเกจ Debian พื้นเมือง) มีโหมดการแก้ไข.debไฟล์และแก้ไข changelogs Debian Emacs สามารถใช้แบบโต้ตอบหรือสคริปต์


4
นอกจากนี้คุณยังสามารถใช้-eสวิทช์ของFPMfpm -e -s deb -t deb ../old.debการเปลี่ยนไฟล์ควบคุม: นี่จะเป็นการเปิดไฟล์ควบคุมในโปรแกรมแก้ไขของคุณ
Artefacto

1
btw fakeroot bashและพยายามที่จะออกคำสั่งจะไม่ทำงานเกี่ยวกับความเป็นเจ้าของและarวิธีการที่รวดเร็วอย่างเหลือเชื่อสำหรับไฟล์ deb ขนาดใหญ่!
กุมภ์อำนาจ

1
ขอบคุณ สิ่งนี้มีประโยชน์ การใช้dpkg-deb -Rโหมดถูกเก็บไว้และdpkg-deb -bตั้งค่าของแฟ้มที่แยกไปuid:gid 0:0ไม่จำเป็นต้องมี fakeroot (ฉันคิดว่าอาจมีปัญหาหากมีการตั้งไฟล์ {u, g} id ไว้ในไฟล์เก็บถาวร แต่นั่นไม่ใช่กรณีในสถานการณ์ของฉัน
PSkocik

2
@PSkocik ไม่เพียง แต่ไฟล์ setxid เช่นไฟล์และไดเรกทอรีภายใต้/etcหรือ/varที่จำเป็นต้องอยู่ในกลุ่มเฉพาะ
Gilles

8

คุณสามารถใช้fpmพร้อม--after-installตัวเลือกเพื่อแทนที่postinstสคริปต์ดังนี้:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb

2
ในการติดตั้ง fpm บน Debian / Ubuntu: sudo apt-get install ruby-dev build-essential sudo gem ติดตั้ง fpm
Craig S. Anderson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.