ฉันจะวางไฟล์ systemd unit ของฉันได้ที่ไหน


59

ฉันอ่านว่ามีสองโฟลเดอร์สำหรับไฟล์หน่วย (ไม่ใช่ในโหมดผู้ใช้)

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

ขัดแย้งกับความเข้าใจนี้เป็นคำตอบต่อไปนี้: https://unix.stackexchange.com/a/47715/33386 บางคนสามารถกรอกข้อมูลที่หายไปเพื่อที่ฉันจะได้เข้าใจว่าเกิดอะไรขึ้น? ( ปรับปรุง: คำตอบได้รับการปรับปรุงและความเข้าใจของฉันจะไม่ขัดแย้งกับมันอีกต่อไป )

นอกจากนี้ดูเหมือนว่าสคริปต์จะถูกจัดระเบียบในโฟลเดอร์ย่อยภายใน/etc/systemd/system/โฟลเดอร์:

getty.target.wants
multi-user.target.wants

ในสถานที่อื่นฉันอ่านว่ามีสถานที่อื่น ดูเหมือนว่าสิ่งเหล่านี้มีไว้สำหรับบริการเฉพาะผู้ใช้

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

อัปเดต 2015-08-31:

เพื่อประโยชน์ของผู้อื่นนี่คือลิงค์ไปยังคำถามที่เกี่ยวข้องที่ฉันถามเมื่อเร็ว ๆ นี้: ฉันจะวางสคริปต์ที่ดำเนินการโดยหน่วย systemd ที่ไหน


4
/etc/systemd/systemเป็นที่ที่คุณวางสคริปต์ของคุณ, Pacmanทำให้สคริปต์แพคเกจใน/usr/lib/systemd/systemการออกsystemctl enable foo.serviceสร้าง symlinks จาก/usrไป/etc...
jasonwryan

1
ดูman systemd.target: มันอธิบายเหตุผลเบื้องหลังการจัดกลุ่ม
jasonwryan

คำตอบ:


57

สถานที่ที่ดีที่สุดในการวางไฟล์หน่วยระบบ : /etc/systemd/system อย่าลืมเพิ่มเป้าหมายใต้ส่วน [ติดตั้ง] อ่าน "มันรู้ได้อย่างไร" สำหรับรายละเอียด อัปเดต : /usr/local/lib/systemd/systemเป็นอีกตัวเลือกหนึ่งให้อ่าน "รายละเอียดพื้นที่สีเทา"

ที่ที่ดีที่สุดในการวางไฟล์หน่วยผู้ใช้ /etc/systemd/userหรือ$HOME/.config/systemd/user ขึ้นอยู่กับการอนุญาตและสถานการณ์

ความจริงก็คือหน่วย systemd (หรือประโยคที่เป็นคำนำเรียกพวกเขาว่า "การกำหนดค่าหน่วย") สามารถไปได้ทุกที่ -แสดงว่าคุณยินดีที่จะทำ symlink แบบแมนนวลและคุณทราบว่า caveats มันทำให้ชีวิตง่ายขึ้นที่จะนำยูนิตsystemctl daemon-reloadนี้มาหาได้ด้วยเหตุผลที่ดี:

  • โดยใช้สถานที่ตั้งมาตรฐานหมายความว่าเครื่องปั่นไฟ systemd systemctl enableจะพบพวกเขาและทำให้พวกเขาง่ายต่อการเปิดใช้งานที่บูตด้วย นี่เป็นเพราะหน่วยของคุณจะถูกเพิ่มลงในแผนผังการพึ่งพาหน่วยโดยอัตโนมัติ (แคชหน่วย)
  • คุณไม่จำเป็นต้องคิดถึงสิทธิ์เนื่องจากมีเพียงผู้ใช้ที่มีสิทธิ์เท่านั้นที่สามารถเขียนลงในพื้นที่ที่กำหนดได้

มันรู้ได้อย่างไร?

และจะsystemctl enableรู้ได้อย่างไรว่าจะสร้าง symlink ได้ที่ไหน? คุณรหัสยากภายในหน่วยตัวเองภายใต้[install]ส่วน มักจะมีเส้นเหมือน

[Install]
WantedBy = multi-user.target

ที่สอดคล้องกับตำแหน่งที่กำหนดไว้ล่วงหน้าบนระบบไฟล์ ด้วยวิธีนี้systemctlรู้ว่าหน่วยนี้ขึ้นอยู่กับกลุ่มของไฟล์หน่วยที่เรียกว่าmulti-user.target("เป้าหมาย" เป็นคำที่ใช้เพื่อกำหนดกลุ่มพึ่งพาหน่วยคุณสามารถแสดงรายการกลุ่มทั้งหมดที่มีsystemctl list-units --type target) กลุ่มของไฟล์หน่วยที่จะโหลดพร้อมเป้าหมายจะใส่ไว้ในtargetname.target.wantsไดเรกทอรี นี่เป็นเพียงไดเรกทอรีที่เต็มไปด้วย symlink (หรือของจริง) หาก[Install]ส่วนบอกว่ามันเป็นแต่ถ้า symlink ไปมันไม่ได้อยู่ในไดเรกทอรีแล้วมันจะไม่โหลด เมื่อตัวกำเนิดหน่วย systemd เพิ่มไฟล์หน่วยของคุณไปยังแคชทรีพึ่งพาเมื่อบูต (คุณสามารถทริกเกอร์เครื่องกำเนิดไฟฟ้าด้วยตนเอง) มันจะรู้ตำแหน่งของ symlink โดยอัตโนมัติในกรณีนี้ในไดเรกทอรีWantedBymulti-user.targetmulti-user.target.wantssystemctl daemon-reload/etc/systemd/system/multi-user.target.wants/ คุณควรเปิดใช้งาน

ประเด็นสำคัญในคู่มือ:

หน่วยเพิ่มเติมอาจถูกโหลดเข้าสู่ systemd ("linked") จากไดเร็กทอรีที่ไม่ได้อยู่ในพา ธ การโหลดยูนิต ดูคำสั่งลิงค์สำหรับ systemctl (1)

ภายใต้ systemctl ให้ค้นหาคำสั่งไฟล์หน่วย

โหลดพา ธ ไฟล์หน่วย

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

เมื่อตัวแปร$SYSTEMD_UNIT_PATHถูกตั้งค่าเนื้อหาของตัวแปรนี้จะแทนที่พา ธ โหลดยูนิต หาก$SYSTEMD_UNIT_PATHลงท้ายด้วยองค์ประกอบที่ว่างเปล่า (":") เส้นทางโหลดหน่วยปกติจะถูกผนวกเข้ากับเนื้อหาของตัวแปร

ตารางที่ 1 และตารางที่ 2 man systemd.unitเป็นสิ่งที่ดี

โหลดพา ธ เมื่อทำงานในโหมดระบบ ( --system)

  • /etc/systemd/system การกำหนดค่าท้องถิ่น
  • /run/systemd/system หน่วยรันไทม์
  • /usr/lib/systemd/system หน่วยของแพ็คเกจที่ติดตั้ง

โหลดพา ธ เมื่อทำงานในโหมดผู้ใช้ ( --user)

มีความแตกต่างระหว่างหน่วยผู้ใช้ต่อหน่วยและผู้ใช้ทั่วโลกทั้งหมด

ผู้ใช้ขึ้นอยู่กับ

  • $XDG_CONFIG_HOME/systemd/user การกำหนดค่าผู้ใช้ (ใช้เฉพาะเมื่อ$XDG_CONFIG_HOMEมีการตั้งค่า)
  • $HOME/.config/systemd/user การกำหนดค่าผู้ใช้ (ใช้เฉพาะเมื่อ$XDG_CONFIG_HOMEไม่ได้ตั้งค่า)
  • $XDG_RUNTIME_DIR/systemd/user หน่วยรันไทม์ (ใช้เมื่อ$XDG_RUNTIME_DIRถูกตั้งค่าเท่านั้น)

  • $XDG_DATA_HOME/systemd/user หน่วยของแพ็กเกจที่ติดตั้งในโฮมไดเร็กทอรี (ใช้เฉพาะเมื่อ$XDG_DATA_HOMEตั้งค่าแล้ว)

  • $HOME/.local/share/systemd/user หน่วยของแพ็กเกจที่ติดตั้งในโฮมไดเร็กทอรี (ใช้เฉพาะเมื่อ$XDG_DATA_HOMEไม่ได้ตั้งค่า)

--global (ผู้ใช้ทั้งหมด)

หน่วยที่ใช้กับผู้ใช้ทั้งหมด - ความหมายที่เป็นเจ้าของโดยผู้ใช้แต่ละคนเช่นกัน ดังนั้นผู้ใช้แต่ละคนสามารถหยุดบริการเหล่านี้ได้แม้ว่าผู้ดูแลระบบจะเปิดใช้งานเมื่อทำการบู๊ต

  • /etc/systemd/user การกำหนดค่าท้องถิ่นสำหรับผู้ใช้ทั้งหมด ( systemctl --global enable userunit.service)
  • /usr/lib/systemd/user หน่วยของแพ็กเกจที่ถูกติดตั้งทั่วทั้งระบบสำหรับผู้ใช้ทั้งหมด
  • /run/systemd/user หน่วยรันไทม์

พื้นที่สีเทา

ในอีกด้านหนึ่งไฟล์ลำดับชั้นมาตรฐานระบุว่า/etcมีไว้สำหรับการกำหนดค่าท้องถิ่นที่ไม่ได้ดำเนินการไบนารี ในทางตรงกันข้ามมันระบุว่า/usr/local/"มีไว้สำหรับการใช้งานโดยผู้ดูแลระบบเมื่อติดตั้งซอฟต์แวร์ในเครื่อง" คุณสามารถโต้เถียง (ถ้าไม่ใช่เพื่อวัตถุประสงค์ขององค์กร) ว่าไฟล์หน่วยระบบทั้งหมดควรอยู่ภายใต้/usr/local/lib/systemd/systemแต่สิ่งนี้มีไว้สำหรับไฟล์หน่วยที่เป็นส่วนหนึ่งของ "ซอฟต์แวร์" ไม่ใช่จากตัวจัดการแพคเกจ หน่วยผู้ใช้ systemd ที่เกี่ยวข้องที่มีทั้งระบบสามารถดำเนินการ /usr/local/lib/systemd/userได้


คำแนะนำเกี่ยวกับการใส่ไฟล์หน่วย/etc/systemd/systemเป็นคำแนะนำทั่วไปสำหรับไฟล์หน่วยที่สร้างขึ้นเองหรือไม่ สิ่งใดก็ตามที่ติดตั้งโดยผู้จัดการแพ็คเกจควรติดตั้งไว้เสมอ/usr/lib/systemd/systemเช่น
slm

@slm ใช่เมื่อคำถามอ้างอิงถึงไฟล์ systemd unit ของฉันมันมีจุดประสงค์เพื่อบ่งบอกถึงไฟล์ที่สร้างขึ้นเอง
Jonathan Komar

ฉันจะแยกแยะ: /etc/systemd/userสำหรับบริการผู้ใช้ทั่วทั้งระบบ (รับประกัน) และ~/.config/systemd/userสำหรับบริการเฉพาะผู้ใช้ที่กำหนดเอง
Suuuehgi

16

/etc/systemd/systemเป็นที่ที่คุณใส่ของคุณสคริปต์ Pacman ทำให้แพคเกจ/usr/lib/systemd/systemสคริปต์ใน

ออกsystemctl enable foo.serviceสร้าง symlinks จากไป/usr /etcดูที่ส่วนเส้นทางโหลดหน่วยของman systemd.unit(5)เพื่อดูรายละเอียดเพิ่มเติม


@ macmadness86 มันหายไปเพราะมันไม่เกี่ยวข้องกับคำถาม
jasonwryan

1

ฉันเขียน 3 สำหรับหนึ่งสำหรับntpdหนึ่งสำหรับสองการ์ดอีเธอร์เน็ตคงที่และหนึ่งสำหรับการทำงานp0fตัวบ่งชี้ระบบปฏิบัติการแฝง /etc/systemd/systemฉันทำให้พวกเขาทั้งหมดใน ดูเหมือนว่าฉันจะปล่อยให้systemdจัดการกับสิ่ง NTP ได้ แต่ฉันไม่คิดว่าฉันจะพึ่งมันมากขนาดนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.