systemd: ปัญหาการอนุญาตกับ mkdir & ExecStartPre


37

ฉันมีปัญหากับไฟล์ serviced นี้ (สั้นลง) systemd:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
ExecStartPre=/bin/mkdir -p /var/run/FOOd/
ExecStartPre=/bin/chown -R FOOd:FOO /var/run/FOOd/
ExecStart=/usr/local/bin/FOOd -P /var/run/FOOd/FOOd.pid
PIDFile=/var/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

ให้อาหารเป็นชื่อผู้ใช้และFOO/usr/local/bin/FOOdชื่อกลุ่มซึ่งมีอยู่แล้วสำหรับภูตของฉัน

ฉันต้องสร้างไดเรกทอรี/var/run/FOOd/ก่อนที่จะเริ่มกระบวนการภูตผ่าน/usr/local/bin/FOOd # systemctl start FOOd.serviceสิ่งนี้ล้มเหลวเนื่องจาก mkdir ไม่สามารถสร้างไดเรกทอรีได้เนื่องจากการอนุญาต:

...
Jun 03 16:18:49 PC0515546 mkdir[2469]: /bin/mkdir: cannot create directory /var/run/FOOd/: permission denied
Jun 03 16:18:49 PC0515546 systemd[1]: FOOd.service: control  process exited, code=exited status=1
...

เหตุใด mkdir จึงล้มเหลวที่ ExecStartPre และฉันจะแก้ไขได้อย่างไร (และไม่ฉันไม่สามารถใช้ sudo สำหรับ mkdir ... )


FYI: ฉันใช้ Debian 8
Matt

คุณช่วยแปลข้อความแสดงข้อผิดพลาดเป็นภาษาอังกฤษได้ไหม
Thushi

1
... Jun 03 16:18:49 PC0515546 mkdir [2469]: / bin / mkdir: ไดเรกทอรี / var / run / FOOd / ไม่สามารถสร้างได้: ไม่ได้รับอนุญาต Jun 03 16:18:49 PC0515546 systemd [1] : FOOd.service: ออกจากกระบวนการควบคุมแล้วรหัส = สถานะที่ออก = 1 ...
Matt

คำตอบ:


56

คุณต้องเพิ่ม

PermissionsStartOnly=true

[Service]ไปยัง ผู้ใช้ของคุณเป็นหลักสูตรที่ได้รับอนุญาตให้สร้างไดเรกทอรีในFOOd /var/runในการอ้างถึง man page:

รับอาร์กิวเมนต์บูลีน หากเป็นจริงตัวเลือกการดำเนินการที่เกี่ยวข้องกับการอนุญาตตามที่กำหนดค่าด้วย User = และตัวเลือกที่คล้ายกัน (ดูที่ systemd.exec (5) สำหรับข้อมูลเพิ่มเติม) จะใช้กับกระบวนการที่เริ่มต้นด้วย ExecStart = และไม่ใช่ ExecStartPre อื่น ๆ = , ExecStartPost =, ExecReload =, ExecStop = และ ExecStopPost = คำสั่ง หากเป็นเท็จการตั้งค่าจะถูกนำไปใช้กับคำสั่งที่กำหนดค่าทั้งหมดด้วยวิธีเดียวกัน ค่าเริ่มต้นเป็นเท็จ


1
ยอดเยี่ยมสิ่งที่ฉันกำลังมองหา
เบิร์ต

2
ตัวเลือกนี้ทำให้คำสั่งในการExecReload=ทำงานในสิทธิ์พิเศษ นี่อาจไม่ใช่สิ่งที่คุณต้องการ
Rockallite

@ Rockallite นั่นคือสิ่งที่เอกสารที่ฉันอ้างว่าแท้จริงใช่
embik

2
PermissionsStartOnlyเลิกใช้แล้ว การอ้างอิง: github.com/NixOS/nixpkgs/issues/53852วิธีการทำเช่นนั้นตอนนี้?
adrelanos

1
@adrelanos ตอนนี้เพิ่มทันทีหลังจากที่+ ExecStartPre=ตัวอย่างเช่นExecStartPre=+/bin/mkdir test
Jamie Scott

28

นี่ไม่ใช่คำตอบที่อธิบายหรือแก้ไขปัญหาการอนุญาต แต่ฉันคิดว่าคุณควรใช้ตัวเลือก systemds RuntimeDirectory การอ้างถึงหน้าคน :

RuntimeDirectory=, RuntimeDirectoryMode=
       Takes a list of directory names. If set, one or more directories by
       the specified names will be created below /run (for system
       services) or below $XDG_RUNTIME_DIR (for user services) when the
       unit is started, and removed when the unit is stopped. The
       directories will have the access mode specified in
       RuntimeDirectoryMode=, and will be owned by the user and group
       specified in User= and Group=. Use this to manage one or more
       runtime directories of the unit and bind their lifetime to the
       daemon runtime. The specified directory names must be relative, and
       may not include a "/", i.e. must refer to simple directories to
       create or remove. This is particularly useful for unprivileged
       daemons that cannot create runtime directories in /run due to lack
       of privileges, and to make sure the runtime directory is cleaned up
       automatically after use. For runtime directories that require more
       complex or different configuration or lifetime guarantees, please
       consider using tmpfiles.d(5).

ดังนั้นสิ่งที่คุณต้องทำคือเปลี่ยนไฟล์บริการของคุณเป็น:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
RuntimeDirectory=FOOd
RuntimeDirectoryMode=$some-mode
ExecStart=/usr/local/bin/FOOd -P /run/FOOd/FOOd.pid
PIDFile=/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

ขอบคุณ. น่าเศร้าที่หายไปจากแพ็คเกจ OpenVPN Ubuntu !!
BaseZen

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