จะสร้างเป้าหมายระบบได้อย่างไร?


16

หลังจากค้นหามากมายผ่านโพสต์วิดีโอ Youtube และ "เอกสาร" มากมายในเรื่องของ systemd ฉันยังคงสูญเสีย

ลิงค์ ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) ดูเหมือนจะมีแนวโน้ม แต่ก็ค่อนข้างคลุมเครือ (สำหรับฉัน)

คำถาม

เราจะสร้างเป้าหมาย systemd ที่กำหนดเองได้อย่างไร (IE: foo.target) เพื่อให้สามารถบู๊ตด้วยหน่วยบริการที่เลือกได้

ตัวอย่าง

  1. ระบบบูต default.target (symlink ของ "foo.target")
  2. "foo.target" จะเริ่มโปรแกรม X server และ GUI ของ barebones เท่านั้นให้พูดว่า "gvim"

เหตุผล

ฉันแค่ต้องการสร้างเป้าหมายที่กำหนดเองสำหรับการเปิดตัวหนึ่งโปรแกรม X อย่างรวดเร็ว ฉันยินดีที่จะยกเว้นบริการทั้งหมดที่ฉันไม่ต้องการ

ขอบคุณล่วงหน้า!

คำตอบ:


16

อ่านman 5 systemd.unitและman 5 systemd.targetบอกเราว่าไฟล์หน่วยใช้เพื่อกำหนดเป้าหมายเช่นเดียวกับทุกอย่างอื่น systemd ไม่มีเอกสารเกี่ยวกับวิธีสร้างเป้าหมายโดยเฉพาะดังนั้นจึงยากที่จะระบุว่าควรทำอย่างไร แต่ไม่แตกต่างจากการสร้างบริการ

เมื่อคุณสร้างเป้าหมายของคุณคุณจะต้องสร้างsymlinkไปยังtarget.wantsไดเรกทอรีจากไดเรกทอรี systemd services จากนั้นคุณสามารถตั้งค่า / บูตเป้าหมายของคุณ นี่คือลักษณะที่อาจให้ตัวอย่างของคุณ

/etc/systemd/system/foo.target

นี่คือไฟล์หน่วยของเป้าหมาย หากใช้กราฟิกเซตเป้าหมายเป็นตัวอย่างเราสามารถสร้างเป้าหมายของเราเองโดยใช้เป็นฐาน

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

เพื่ออธิบายทางเลือกที่นำมาจาก systemd manpages

  • Description- อธิบายถึงเป้าหมาย คุณควรเข้าใจ
  • Requires- การพึ่งพายากของเป้าหมาย คุณควรปล่อยให้ระบบพื้นฐานเริ่มก่อนที่จะเริ่มบริการของคุณเอง
  • Wants- พึ่งพานุ่ม เป้าหมายไม่จำเป็นต้องเริ่มต้นสิ่งเหล่านี้
  • Conflicts - หากหน่วยมีการตั้งค่าความขัดแย้งในหน่วยอื่นการเริ่มต้นก่อนจะหยุดหลังและในทางกลับกัน
  • After - บูทหลังจากบริการเหล่านี้
  • AllowIsolate- ขึ้นอยู่กับคุณและสภาพแวดล้อมของคุณ รายละเอียดมีอยู่ใน manpagesystemd.unit(5)

/etc/systemd/system/foo.target.wants/

นี่คือไดเรกทอรีที่คุณจะเชื่อมโยงบริการที่คุณสร้าง / ต้องการสำหรับเป้าหมายของคุณ มันเทียบเท่ากับWants=ตัวเลือกในไฟล์หน่วย สร้างไดเรกทอรีนี้แล้วสร้าง symlink ดังนี้ ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. สิ่งนี้จะสร้าง symlink จาก bar.service ในไดเรกทอรีระบบไปยังไดเรกทอรี foo.target.wants ของคุณ


ฉันคิดว่าการสร้างไฟล์หน่วยสำหรับบริการนั้นไม่ได้อยู่ในขอบเขตของคำตอบนี้และคำถามนั้นได้รับการบันทึกไว้อย่างแน่นอนยิ่งขึ้นดังนั้นฉันจะทิ้งมันไว้ตอนนี้ เมื่อคุณสร้างไฟล์หน่วยของคุณเพียงแค่เชื่อมโยงเข้ากับไดเรกทอรี target.wants หรือเพิ่มลงในWants=คำสั่ง


ฉันปฏิบัติตามข้างต้นเพื่อสร้างเป้าหมายใหม่และเพิ่มเป้าหมายไปที่บริการของฉัน อย่างไรก็ตามบริการเหล่านั้นไม่ได้เริ่มทำงานโดย systemd มีตัวอย่างที่สมบูรณ์ที่แสดงให้เห็นถึงบริการภายในเป้าหมายที่เพิ่งเพิ่มเข้ามาใหม่หรือไม่?
linuxfan

1
ดูสแต็คโพสต์ของหมอผีหากคุณกำลังมองหาขั้นตอนง่าย ๆ ในการตั้งค่าบริการที่กำหนดเองเพื่อให้ทำงานตอนบูท
Pilbox

@linuxfan ฉันจะเพิ่มfoo.targetไปที่RequiresสนามและBeforeเขตของและมันเหมือนmulti-user.target Requires: base.target foo.targetหลังจากนั้นฉันรีบูต Arch Linux vm ของฉันและfoobar.serviceจะทำงานเป็น daemon โดยอัตโนมัติ
L_K

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