systemd ใช้สคริปต์ /etc/init.d อย่างไร


120

ฉันเพียงแค่เปลี่ยนไปเดเบียน jessie wdmและสิ่งที่มากที่สุดทำงานโอเครวมทั้งผู้จัดการการแสดงผลกราฟิกของฉัน

สิ่งนี้คือฉันไม่เข้าใจว่ามันทำงานอย่างไร เห็นได้ชัดว่า/etc/init.d/wdmสคริปต์ของฉันถูกเรียกเพราะเมื่อฉันใส่ไว้exitในนั้น wdm จะไม่เริ่ม แต่เมื่อฉันเปลี่ยนชื่อไดเรกทอรี /etc/rc3.d อีกทางหนึ่ง (runlevel เริ่มต้นของฉันเคยเป็น 3) แล้ว wdm ก็ยังคงเริ่มทำงาน

ฉันไม่สามารถหาวิธีที่ systemd ค้นหาสคริปต์นี้และฉันไม่เข้าใจว่ามันทำอะไรกับสคริปต์ init.d อื่น ๆ ทั้งหมด

  • systemd รัน init.d scrips เมื่อใดและอย่างไร
  • ในระยะยาวฉันควรกำจัดสคริปต์ init.d ทั้งหมดหรือไม่

คำตอบ:


166

คำตอบที่ยุ่งเหยิงคือเอกสารอะไรบ้างที่บอกว่า แต่มันไม่ใช่สิ่งที่ systemd ทำ (มันไม่ใช่สิ่งที่ Van Smoorenburg rcทำเช่นกัน Van Smoorenburgrcส่วนใหญ่ไม่สนใจหัว LSB ซึ่งinsservใช้ในการคำนวณการเรียงลำดับแบบคงที่สำหรับผู้เริ่มต้น) เอกสาร Freedesktop เช่นหน้า "ความเข้ากันไม่ได้" ในความเป็นจริงผิด จุดเหล่านี้และอื่น ๆ (ในHOMEตัวแปรสภาพแวดล้อมในความเป็นจริงเป็นที่มักจะตั้งตัวอย่างเช่น. นี้ไปที่ใดก็ได้ในเครือไม่มีเอกสารเป็นเวลานาน. จะได้รับการบันทึกในขณะนี้ในคู่มือการใช้งานอย่างน้อย แต่ที่หน้า Freedesktop ทำให้ WWW ยังไม่ได้รับการแก้ไข.)

รูปแบบบริการพื้นเมืองสำหรับ systemd เป็นหน่วยบริการ การจัดการบริการที่เหมาะสมของ systemd ดำเนินการเฉพาะในแง่ของสิ่งเหล่านั้นซึ่งอ่านจากหนึ่งในเก้าไดเรกทอรีที่ไฟล์ (ทั้งระบบ) .serviceสามารถใช้งานได้ /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/systemและ/usr/lib/systemd/systemสี่ของไดเรกทอรีเหล่านั้น

เข้ากันได้กับรถตู้ Smoorenburg สคริปต์จะประสบความสำเร็จกับโปรแกรมแปลงชื่อrc systemd-sysv-generatorโปรแกรมนี้แสดงอยู่ใน/usr/lib/systemd/system-generators/ไดเรกทอรีและถูกเรียกใช้โดยอัตโนมัติโดย systemd แต่เนิ่นๆในกระบวนการบูทสแตรปทุกครั้งที่ทำการบู๊ตและอีกครั้งทุกครั้งที่มีคำสั่งให้ systemd ทำการโหลดการตั้งค่าใหม่ในภายหลัง

โปรแกรมนี้เป็นเครื่องกำเนิดไฟฟ้าซึ่งเป็นยูทิลิตี้เสริมที่มีหน้าที่ในการสร้างไฟล์หน่วยบริการได้อย่างรวดเร็วใน tmpfs โดยมีอีกสามไดเรกทอรีในเก้าไดเรกทอรีเหล่านั้น systemd-sysv-generatorสร้างหน่วยบริการที่เรียกใช้rcสคริปต์van Smoorenburg จาก/etc/init.dหากไม่พบหน่วยบริการ systemd ดั้งเดิมตามชื่อนั้นมีอยู่แล้วในอีกหกที่

การจัดการบริการ systemd รู้เฉพาะเกี่ยวกับหน่วยบริการ หน่วยบริการที่สร้างขึ้นใหม่เหล่านี้จะถูกเขียนขึ้นมาเพื่อเรียกใช้rcสคริปต์Van Smoorenburg พวกเขามีเหนือสิ่งอื่นใด:

[Unit]
SourcePath = / etc / init.d / wibble
[บริการ]
ExecStart = / etc / init.d / wibble start
ExecStop = / etc / init.d / wibble stop

ภูมิปัญญาที่ได้รับคือrcสคริปต์ของ Van Smoorenburg จะต้องมีส่วนหัวของ LSB และทำงานแบบขนานโดยไม่ต้องเคารพลำดับความสำคัญที่/etc/rc?.d/ระบบกำหนดไว้ สิ่งนี้ไม่ถูกต้องในทุกจุด

ในความเป็นจริงพวกเขาไม่จำเป็นต้องมี LSB ส่วนหัวและถ้าพวกเขาไม่systemd-sysv-generatorสามารถรับรู้ที่ จำกัด มากขึ้นเก่า RedHat ความคิดเห็นส่วนหัว ( description:, pidfile:และอื่น ๆ ) ยิ่งไปกว่านั้นในกรณีที่ไม่มีส่วนหัว LSB มันจะถอยกลับไปที่เนื้อหาของ/etc/rc?.dลิงค์ฟาร์มสัญลักษณ์การอ่านลำดับความสำคัญที่เข้ารหัสเป็นชื่อลิงค์และสร้างก่อน / หลังสั่งจากพวกเขาอนุกรมบริการ ไม่เพียง แต่เป็นส่วนหัวของ LSB ไม่ใช่ข้อกำหนดและไม่เพียง แต่พวกเขาจะเข้ารหัสก่อน / หลังคำสั่งที่เรียงลำดับสิ่งต่าง ๆ ในระดับพฤติกรรมการย้อนกลับเมื่อขาดอย่างสมบูรณ์นั้นแท้จริงแล้วเป็นการดำเนินการที่ไม่ขนานกันอย่างมีนัยสำคัญ

สาเหตุที่/etc/rc3.dไม่ปรากฏว่าสำคัญคือคุณอาจเปิดใช้งานสคริปต์นั้นผ่าน/etc/rc?.d/ไดเรกทอรี อื่น systemd-sysv-generatorแปลถูกระบุไว้ในใด ๆ ของ/etc/rc2.d/, /etc/rc3.d/และ/etc/rc4.d/เป็นพื้นเมืองWanted-Byความสัมพันธ์กับ multi-user.targetsystemd ระดับการวิ่งนั้น "ล้าสมัย" ในโลกของ systemd และคุณสามารถลืมมันได้

อ่านเพิ่มเติม


2
ใน Debian ไดเรกทอรีระบบตัวสร้างไม่ได้อยู่ใน / usr / lib แต่ / lib packages.debian.org/sid/amd64/systemd/filelist
Braiam

5
นี่เป็นคำตอบที่น่าอัศจรรย์ ท่านทำได้ดีมาก
ปอกเปลือก

1
ขอบคุณขอบคุณขอบคุณสำหรับสิ่งนี้! การจัดการกับการผสมผสานของระบบ Debian 8 และ RH / CentOS 7 ทำให้การจัดการ SysVInit เทียบกับการพึ่งพาบริการ Systemd นั้นค่อนข้างน่าปวดหัว แต่คำอธิบายของสิ่งที่ systemd กำลังทำอยู่นี้ได้ช่วยให้ฉันเข้าใจอย่างมาก
Toby

เครื่องกำเนิดไฟฟ้านี้ทำงาน ฉันยังพูดถึงสำหรับผู้ติดตามว่าหากคุณมีรุ่นเก่ากว่าsystemdและสคริปต์ /etc/init.d ไม่ได้ถูกตั้งค่าเป็น "boot on start" มันจะยังคงทำงานตามที่คาดไว้ แต่จะไม่ปรากฏขึ้นใน รายการแสดงหน่วย: unix.stackexchange.com/a/518894/8337
rogerdpack

เครื่องกำเนิดไฟฟ้านี้ทำงาน ฉันยังพูดถึงสำหรับผู้ติดตามว่าหากคุณมี systemd เวอร์ชันเก่าและสคริปต์ /etc/init.d ที่ไม่ได้ตั้งค่าเป็น "boot on start" มันจะยังคงเริ่ม / หยุดตามที่คาดไว้โดยใช้ systemctl แต่ชนะ ไม่แสดงในรายการหน่วยแสดงผล: unix.stackexchange.com/questions/517872/…โปรดทราบว่าคุณไม่สามารถควบคุมบริการเหล่านี้ได้โดยการเรียกใช้ /etc/init.d/xx โดยตรงอีกต่อไปหรือ systemd ได้รับ ... สับสนกับสิ่งที่กำลังทำงานอยู่และสิ่งที่ไม่: |
rogerdpack

17

Systemd เข้ากันได้ย้อนหลังกับสคริปต์ init SysV ตาม LSB 3.1 สคริปต์เริ่มต้นจะต้องมีข้อตกลงความคิดเห็นที่ให้ข้อมูลระบุเมื่อสคริปต์ต้องเริ่ม / หยุดและสิ่งที่จำเป็นสำหรับสคริปต์ในการเริ่ม / หยุด นี่คือตัวอย่าง:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

นี่เป็นส่วนที่ถูกคอมเม้นซึ่ง SysV จะไม่สนใจ ในทางตรงกันข้าม systemd อ่านข้อมูลการพึ่งพานั้นและรันสคริปต์เหล่านั้นขึ้นอยู่กับว่า

แต่มีอยู่จุดหนึ่งที่ systemd และ SysV แตกต่างกันในแง่ของสคริปต์เริ่มต้น SysV สั่งการสคริปต์ตามลำดับตามหมายเลขในชื่อไฟล์ Systemd ไม่ หากพบการพึ่งพา systemd จะเรียกใช้สคริปต์ทันทีโดยไม่ต้องเคารพหมายเลขของชื่อสคริปต์ บางคนอาจล้มเหลวเนื่องจากการสั่งซื้อ มีความเข้ากันไม่ได้อื่น ๆ อีกมากมายที่ควรพิจารณา


หากมีสคริปต์ init และไฟล์ .service สำหรับบริการเดียวกัน systemd จะดำเนินการทั้งสองทันทีที่มีการพึ่งพา (ในกรณีของสคริปต์ init ไฟล์เหล่านั้นจะถูกกำหนดในส่วนหัวของ LSB)


ตกลง แต่ฉันยังมีไฟล์. services ทั้งหมดใน / lib / systemd / system / systemd ทำงานจริง ๆ คืออะไร? สิ่งที่ระบุไว้ในไฟล์บริการ (ตามลำดับการพึ่งพา) สคริปต์ init.d หรือทั้งสองอย่าง?
Martin Drautzburg

@MartinDrautzburg ฉันได้เพิ่มเข้าไปในคำตอบ
ความสับสนวุ่นวาย

1
ในฐานะที่เป็น sidenote ที่ Debian ได้ประกาศเพียงการถ่ายโอนข้อมูล LSB ความเข้ากันได้: article.gmane.org/gmane.linux.debian.devel.lsb/1103
ม.ค.

systemd เป็นอะไร แต่เข้ากันได้กับสคริปต์ SysV ไม่เพียง แต่คำสั่งนั้นไม่ถูกต้อง แต่ลิงก์ที่อ้างถึงทำให้ชัดเจนว่ามันเป็น "เข้ากันได้เป็นส่วนใหญ่" และปริมาณของความพยายามที่จำเป็นในการสร้างผลลัพธ์เดียวกันนั้นมีขนาดใหญ่มาก
Julie ใน Austin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.