สถานที่ที่ดีที่สุดในการวางไฟล์หน่วยระบบ : /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 โดยอัตโนมัติในกรณีนี้ในไดเรกทอรีWantedBy
multi-user.target
multi-user.target.wants
systemctl 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
)
มีความแตกต่างระหว่างหน่วยผู้ใช้ต่อหน่วยและผู้ใช้ทั่วโลกทั้งหมด
ผู้ใช้ขึ้นอยู่กับ
--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
เป็นที่ที่คุณวางสคริปต์ของคุณ, Pacmanทำให้สคริปต์แพคเกจใน/usr/lib/systemd/system
การออกsystemctl enable foo.service
สร้าง symlinks จาก/usr
ไป/etc
...