สถานที่ที่ดีที่สุดในการวางไฟล์หน่วยระบบ : /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)
มีความแตกต่างระหว่างหน่วยผู้ใช้ต่อหน่วยและผู้ใช้ทั่วโลกทั้งหมด
ผู้ใช้ขึ้นอยู่กับ
--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...