ฉันจะติดตั้งแพคเกจโดยไม่เริ่มบริการที่เกี่ยวข้องได้อย่างไร


13

ตามที่คุณอาจทราบแล้วตามค่าเริ่มต้นเมื่อคุณติดตั้งแพคเกจบนระบบที่ใช้ Debian หรือ Ubuntu ถ้าแพ็คเกจมีบริการโดยทั่วไปบริการดังกล่าวจะเปิดใช้งานและเริ่มต้นโดยอัตโนมัติเมื่อคุณติดตั้งแพคเกจ

นี่เป็นปัญหาสำหรับฉัน

ฉันพบว่าตัวเองต้องการจัดการเทมเพลตสำหรับการสร้างตู้คอนเทนเนอร์ LXC มีหลายคอนเทนเนอร์ซึ่งแต่ละตัวสอดคล้องกับรุ่น Debian หรือ Ubuntu (นอกจากนี้ยังมีตู้คอนเทนเนอร์ที่ใช้ Red Hat แต่ไม่มีความเกี่ยวข้องที่นี่)

/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template

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

จากตัวอย่างฉันพบว่าเท็มเพลตไม่มี syslog daemon ดังนั้นฉันจึงติดตั้ง:

for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done

และบาดแผลทันทีที่มี rsyslog ทำงานอยู่สี่ชุด ไม่ต้องพูดถึง exim4 สองชุด อ๊ะ!


ฉันอ่านที่ไหนสักแห่ง (แม้ว่าฉันจะไม่สามารถหามันได้อีกในตอนนี้) ว่ามันไม่ควรที่จะเริ่มบริการเมื่อทำงานใน chroot แต่นั่นไม่ได้เกิดขึ้นที่นี่อย่างชัดเจน

แฮ็คที่น่ารังเกียจคนหนึ่งอาจเรียกร้องให้เปลี่ยนคำสั่งต่าง ๆ ซึ่งเริ่มให้บริการชั่วคราวเช่นstart-stop-daemonและinitctlแม้ว่านี่จะเป็นงานที่มากกว่าที่ฉันอยากทำจริงๆ ถ้าฉันไม่มีทางเลือกอื่นแม้ว่า ...

ทางออกที่ดีที่นี่สำหรับระบบที่ใช้ Debian เพื่อหยุดทำอึนี้ แต่ล้มเหลวซึ่งอาจเป็นตัวเลือกบรรทัดคำสั่งที่คลุมเครือหรือไม่มีเอกสารapt-getหรือ

ในกรณีที่ไม่ชัดเจนฉันต้องการเก็บอะไรที่เกี่ยวข้องกับการจัดการแม่แบบไว้นอกแม่แบบถ้าเป็นไปได้

คำตอบ:


23

สำหรับเดเบียนคุณสามารถทำเช่นนี้กับนโยบาย rc.d นี่คือหนึ่งคำอธิบาย :

สคริปต์ของผู้ดูแลแพคเกจควรจะเชื่อมต่อกับระบบ init เท่านั้นโดยใช้ invoke-rc.d, update-rc.d และส่วนหัวของสคริปต์สคริปต์ LSB ... invoke-rc.d ประสงค์ก่อนที่จะดำเนินการตรวจสอบว่า /usr/sbin/policy-rc.d สามารถเรียกใช้งานได้จะเรียกมันพร้อมชื่อบริการที่เกี่ยวข้องและหมายเลข runlevel ปัจจุบันในบรรทัดคำสั่งและดำเนินการตามรหัสออก ตัวอย่างเช่นค่าส่งคืน 101 จะป้องกันการดำเนินการตามแผน ซึ่งรวมถึงการเริ่มต้นบริการโดยอัตโนมัติเมื่อมีการติดตั้งแพ็คเกจรวมถึงการหยุดให้บริการเมื่อนำแพ็กเกจออกและลดขั้นตอนการหยุดอัปเกรด - รีสตาร์ทระหว่างการอัพเกรดแพ็คเกจเพื่อทำการอัปเกรดเท่านั้น

เนื่องจากคุณไม่ต้องการให้บริการใด ๆ เริ่มต้นเลยสคริปต์ policy-rc.d ของคุณสามารถเป็นได้ง่ายๆ

#!/bin/sh
exit 101

นี้เป็นเทคนิคที่ใช้โดยเครื่องมือเช่น pbuilder และหางของmkimage-debootstrap

น่าเสียดายที่เทคนิคนี้ใช้ไม่ได้กับ Ubuntu chroots แพ็กเกจที่รวมเข้ากับการเรียกระบบเริ่มต้นพุ่งพรวด / usr / sbin / initctl แทนที่จะเรียกใช้ -rc.d ในระหว่างการติดตั้งและ initctl ไม่ปรึกษา policy-rc.d ตามที่ผู้เขียนพุ่งพรวดการแก้ปัญหาคือการแทนที่ / sbin / initctl ด้วย symlink ไปที่ / bin / true ใน chroot คุณสามารถดูได้ใน mkimage-debootstrap เช่นกันพวกเขาทำ

dpkg-divert --local --rename --add /sbin/initctl
ln -sf /bin/true sbin/initctl

ดูเหมือนว่าจะสะอาดดีถึงแม้ว่าจะต้องลบออกก่อนที่จะสร้างคอนเทนเนอร์จากเทมเพลต
Michael Hampton

1
ขอบคุณสำหรับสิ่งนี้. ฉันอาจท้ายต้องตัดสคริปต์ mkimage-debootstrap ของ Docker เนื่องจากดูเหมือนว่าพวกเขาจะแก้ปัญหานี้ได้เป็นส่วนใหญ่
Michael Hampton

4

คุณทำได้:

export RUNLEVEL=1
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done
exit

ฉันยังไม่ได้ทดสอบด้วย chroot แต่ควรใช้งานได้ ตอนแรกมันตั้งค่าตัวแปรสภาพแวดล้อม RUNLEVEL ดังนั้นกระบวนการที่เริ่มต้นโดย apt-get จะไม่เริ่มบริการใด ๆ เพราะพวกเขาจะ "คิด" ระบบกำลังทำงานในโหมดเดียว เนื่องจากสภาพแวดล้อมได้รับการปรับเปลี่ยนวิธีที่อาจส่งผลต่อคำสั่งในอนาคตจึงจำเป็นต้องออกจาก shell เมื่อไม่จำเป็นต้องใช้สภาพแวดล้อมที่ปรับเปลี่ยนอีกต่อไปสิ่งนี้สามารถทำได้โดยคำสั่งexitในตอนท้าย มีอาจจะมีบางคน (ที่หายาก?) แพคเกจที่จะไม่ติดตั้งอย่างถูกต้องในโหมดเดียว ( แต่ AFAIK นี้ไม่ควรจะมีปัญหาในกรณีส่วนใหญ่)


นี่export RUNLEVEL=1เป็นส่วนสำคัญหรือไม่ มันเกิดอะไรขึ้นกันแน่?
Michael Hampton

@MichaelHampton ฉันเชื่อว่าตัวแปรสภาพแวดล้อม RUNLEVEL จะให้ระดับการทำงานปัจจุบัน ในตัวอย่างนี้เขาเพิ่งเขียนทับมันเพื่อให้แอปพลิเคชันใด ๆ ที่คิดว่าทำงานบน 1 มันเป็น "kludge" แต่น่าจะพอเพียง
WinkyWolly

เพิ่มคำอธิบายให้กับคำตอบดั้งเดิม โดยทั่วไปนี่คือสิ่งที่ @WinkyWolly พูด
DavisNT

โชคไม่ดีที่rsyslogเกิดขึ้นเป็นหนึ่งในแพ็คเกจ "หายาก" ที่ระเบิดขึ้นอย่างสมบูรณ์เมื่อพยายามติดตั้งด้วยวิธีนี้ แม้ว่ามันอาจจะมีประโยชน์ แต่คุณสามารถรักษา upvote :)
Michael Hampton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.