ติดตั้งแพคเกจโดยไม่ต้องเริ่มกระบวนการพื้นหลังและบริการ


43

บางครั้งการติดตั้งแอพพลิเคชั่นบางตัวจะเริ่มต้นกระบวนการหรือบริการจากแอปพลิเคชันที่กำลังทำงานโดยอัตโนมัติเมื่อทำการติดตั้ง ฉันจะติดตั้งโดยไม่เริ่มต้นได้อย่างไร


ฉันสงสัยว่ามีแนวโน้มที่จะปล่อยให้ระบบอยู่ในสถานะที่ไม่เสถียรเมื่อติดตั้งเคอร์เนลหรือแพ็คเกจ DKMS โดยใช้การกำหนดค่าประเภทนี้ ฉันไม่รู้เรื่องนี้มากนัก
ændrük

@ ændrükนั่นทำให้ฉันกังวล คุณเห็นว่าฉันกำลังติดตั้ง Ubuntu ขั้นต่ำบนไดรฟ์แล้วแทนที่จะบูตเข้าไปฉันใช้ Live CD / USB เพื่อchrootติดตั้งแพ็คเกจที่ฉันต้องการ แน่นอนว่าโดยเฉพาะอย่างยิ่งไดรเวอร์ GPU ไม่ได้อยู่ที่นั่นและจำเป็นต้องติดตั้ง
Oxwivi

คำตอบ:


35

มีวิธีที่แฮ็กเล็กน้อย แต่ค่อนข้างน่าเชื่อถือในการทำสิ่งนี้ซึ่งฉันได้ใช้เป็นระยะเวลานานในสคริปต์การติดตั้งอัตโนมัติ

สร้างไดเรกทอรีเป็นอันดับแรกตัวอย่างเช่น/root/fakeมี symlinks ที่/bin/trueเรียกว่า:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

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

จากนั้นให้รวมไดเรกทอรีนั้นไว้ด้านหน้าของ$PATHเมื่อติดตั้งแพ็คเกจ:

PATH=/root/fake:$PATH apt-get install whatever

สิ่งนี้จะป้องกันไม่ให้ daemons เริ่มต้น / เริ่มใหม่ในขณะที่สิ่งต่าง ๆ เช่นการสร้าง initramfs ยังคงดำเนินการอยู่

คำอธิบาย

สคริปต์ที่จะถูกดำเนินการในการติดตั้งแพคเกจและลบดำเนินการinvoke-rc.dหรือคนอื่น ๆ ของคำสั่งที่กล่าวถึงเพื่อเริ่มต้นและหยุดบริการ อย่างไรก็ตามพวกเขาไม่ได้เรียกพวกเขาด้วยเส้นทางที่แน่นอน (อย่างน้อยฉันก็ไม่ได้พบสิ่งที่ทำ)

ดังนั้นโดยการแทรกคำสั่ง "ไม่มีการดำเนินการ" ที่แกล้งทำในตอนต้นของ$PATHคำสั่งจริงไม่เคยได้รับการเรียก

เนื่องจากเฉพาะคำสั่งที่ใช้ในการเริ่ม / หยุดบริการเท่านั้นที่ถูกแกล้งทำทุกอย่างในงานสำคัญโดยเฉพาะอย่างยิ่งเช่นการอัปเดต / สร้างภาพเริ่มต้นยังคงใช้งานได้


ไม่คุ้นเคยกับ symlink คุณสามารถอธิบายขั้นตอนทั้งหมดที่คุณทำได้หรือไม่?
Oxwivi

symlink เป็นไฟล์ชนิดพิเศษที่ไม่มีเนื้อหา แต่หมายถึงไฟล์อื่น (ตามพา ธ / ชื่อ) พวกเขาสามารถสร้างขึ้นด้วยในกรณีนี้ยกตัวอย่างเช่นln -s ln -s /bin/true /root/fake/initctl
bseibold

มันป้องกัน daemons ไม่ให้เริ่ม / เริ่มใหม่ได้อย่างไร ตามคำตอบของ @ psusi invoke-rc.dเป็นผู้รับผิดชอบ
Oxwivi

โดยการวางไดเร็กทอรีด้วยคำสั่ง faked ที่จุดเริ่มต้นของ$PATHตัวแปรการเรียกไปยังinvoke-rc.dและอื่น ๆ ทั้งหมดที่สามารถใช้เพื่อสตาร์ทและหยุด daemons ใช้คำสั่งปลอม นั่นคือถ้าพวกเขาถูกเรียกด้วยเส้นทางที่สมบูรณ์ แต่ฉันไม่เคยพบสิ่งนี้
bseibold

อาตอนนี้ฉันเห็นว่ามันใช้งานได้อย่างไรโดยทั่วไป symlinks จะนำไปสู่การสิ้นสุด แต่สิ่งที่แน่นอนคือ/bin/trueอะไร? และส่วนที่เหลือของคำสั่งที่เกี่ยวข้องในแพคเกจคืออะไร? พวกเขาจะไม่ถูกโยนออกนอกเส้นทางโดยที่ระบุ$PATHหรือไม่
Oxwivi

27

daemons พื้นหลังเริ่มต้นด้วยinvoke-rc.dซึ่งทำให้แน่ใจว่า daemon ไม่ได้เริ่มต้นหากสคริปต์ rc ของมันบอกว่าไม่ควรรันใน runlevel ระบบปัจจุบัน คุณสามารถแทนที่แนวคิดของระบบระดับปัจจุบันโดยการตั้งค่าตัวแปรสภาพแวดล้อม RUNLEVEL ไม่มีสิ่งใดที่ควรจะรันใน runlevels 0 และ 6 แต่ปรากฏว่าinvoke-rc.dเป็นบั๊กกี้และรันสิ่งใด ๆ หากคุณใช้ runlevels เหล่านี้ daemons ส่วนใหญ่ไม่ทำงานใน runlevel 1 ดังนั้นคุณสามารถป้องกันพวกเขาจากการเริ่มต้นการติดตั้งเช่นนี้:

sudo RUNLEVEL=1 apt-get install redis-server

ฉันกำลังติดตั้ง Ubuntu ขั้นต่ำบนไดรฟ์จากนั้นแทนที่จะบูตเข้าไปฉันใช้ Live CD / USB เพื่อchrootติดตั้งแพ็คเกจที่ฉันต้องการ เนื่องจากสิ่งต่าง ๆ เริ่มทำงานบางครั้งฉันจึงเปลี่ยนจากเซสชัน ubuntu (live CD) อย่างไรก็ตามสิ่งที่ฉันต้องการที่จะขอเป็นอย่างไรฉันจะใช้นี้RUNLEVELในchroot?
Oxwivi

@Oxwivi วิธีเดียวกัน แต่ควรตรวจพบโดยอัตโนมัติว่าคุณอยู่ใน chroot และข้าม daemons เริ่มต้น
psusi

เป็นไปได้หรือไม่ที่ buggy invoke-rc.dรับผิดชอบต่อปัญหาที่ฉันเผชิญ
Oxwivi

@Oxwivi ก็เป็นไปได้ invoke-rc.dแต่มีแนวโน้มว่าแพคเกจโดยเฉพาะอย่างยิ่งเป็นรถและไม่ได้ใช้ แพคเกจนี้คืออะไร?
psusi

ฉันไม่มีความคิดฉันเพิ่งแสดงรายการแพ็กเกจทั้งหมดเพื่อติดตั้งและไม่ได้สนใจเทอร์มินัลเพิ่มเติมเพื่อดูผลลัพธ์
Oxwivi


5

ฉันเชื่อว่าคุณต้องใช้--no-triggersตัวเลือกบรรทัดคำสั่งเมื่อคุณทำการdpkgติดตั้ง บางสิ่งเช่นนี้

dpkg -i --no-triggers SomeBigPackage.deb

หากต้องการทำให้การตั้งค่านี้คงอยู่เพื่อที่apt-get installจะไม่เรียกใช้ทริกเกอร์ใด ๆ ให้สร้างไฟล์กำหนดค่า dpkg แบบกำหนดเองใน/etc/dpkg/dpkg.cfg.d/custom:

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

โปรดทราบว่า dpkg ยังคงบันทึกทริกเกอร์ว่ากำลังทำงานแม้ว่าจะไม่ได้:

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

หรือคุณสามารถให้สคริปต์ตัวติดตั้งเรียกใช้serviceคำสั่งเพื่อปิดบริการใหม่:

service name_of_service stop

1
ใด ๆ ที่apt-getเทียบเท่า? หรือมีวิธีการกำหนดค่าdpkgให้ทำงานด้วย--no-triggersไม่ว่าจะใช้dpkgโดยตรงหรือapt-getติดตั้งอะไร
Oxwivi

dan_linder ฉันหวังว่าคุณจะไม่รังเกียจการแก้ไขในคำตอบสำหรับคำถามของ @ Oxwivi อย่าลังเลที่จะแก้ไข / เปลี่ยนกลับหากคุณไม่ชอบ
ændrük

5
สิ่งนี้ไม่ถูกต้อง ทริกเกอร์ไม่มีส่วนเกี่ยวข้องกับการเริ่มต้น daemons ทริกเกอร์เป็นแพ็คเกจหนึ่งที่ดำเนินการบางอย่างเพื่อกำหนดค่าตัวเองใหม่เพื่อตอบสนองต่อเหตุการณ์อื่นเช่นถ้าคุณติดตั้งแพคเกจที่เพิ่มตะขอ initramfs มันจะเปิดใช้แพคเกจเครื่องมือเรียกใช้ initramfs เพื่อสร้าง initramfs ใหม่
psusi

3

สิ่งที่ฉันทำคือการเลียนแบบสิ่งที่ debootstrap ทำเมื่อติดตั้งแพ็คเกจยกเว้นฉันใช้ dpkg-divert:

ขั้นแรกย้ายไฟล์จริงออกไป:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

จากนั้นสร้างรุ่นดัมมี่:

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

จากนั้นทำการอัพเกรด apt-get การติดตั้งและอื่น ๆ จากนั้นทำการล้างด้วย:

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

ฉันรู้ว่ามีคำสั่งอื่น ๆ ที่สามารถใช้ในการหยุด / เริ่มบริการ แต่ debootstrap เพียงแค่ใส่ใจstart-stop-daemonและinitctlดังนั้นฉันจึงตามหลังชุดสูท


3

ซับอย่างรวดเร็ว:

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d

สำหรับคนที่วาง "quick one-liner" คุณลืมตั้ง /usr/sbin/policy-rc.d เป็นไฟล์ปฏิบัติการ มันจะถูกละเว้นเป็นอย่างอื่น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.