ตั้งค่าเซอร์วิส systemd เพื่อดำเนินการหลังจาก fstab mount


33

ฉันกำลังทำงานกับsystemd .serviceสคริปต์ที่ควรเริ่มต้นหลังจากตำแหน่งเครือข่าย CIFS ติดตั้งผ่าน/etc/fstabเพื่อ/mnt/เปิดเครื่อง

สคริปต์รอให้สคริปต์พึ่งพา OpenVPN เปิดใช้ก่อน แต่ฉันต้องการให้รอให้การติดตั้งเสร็จสมบูรณ์

/etc/systemd/system/my-daemon.service :

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

ฉันพยายามเพิ่มลงsystemd.mountในบรรทัด: After=network.target vpn-launch.service systemd.mountแต่มันไม่ได้ให้ผลลัพธ์ที่ฉันหวังไว้


มันใช้งานได้ถ้าคุณเพิ่มลงsystemd-remount-fsในAfterรายการของคุณ?
Eric Renouf

คำตอบ:


40

ตำแหน่งเครือข่าย CIFS ถูกเชื่อมต่อผ่าน/etc/fstabเพื่อ/mnt/เปิดเครื่อง

ไม่มันไม่ใช่. ได้รับสิทธินี้และส่วนที่เหลือตกอยู่ในสถานที่ตามธรรมชาติ

ภูเขาจะถูกจัดการโดย (สร้าง) systemd ติดหน่วยmnt-wibble.mountที่จะถูกตั้งชื่อสิ่งที่ต้องการ คุณสามารถเห็นชื่อจริงในผลลัพธ์ของsystemctl list-units --type=mountคำสั่ง systemctl statusคุณสามารถดูในรายละเอียดเช่นเดียวกับหน่วยงานอื่นใดที่มี

อย่างง่ายมากแล้ว: คุณต้องสั่งให้หน่วยของคุณเริ่มต้นหลังจากเมานต์ยูนิตนั้นเริ่มต้นขึ้น

หลังจาก = network.target vpn-launch.service mnt-wibble.mount

อ่านเพิ่มเติม


10
list mounts ด้วย "systemctl list-units --type = mount"
nijave

สำหรับผู้ติดตาม "wibble" เป็นเพียงชื่อจำลองเช่น "foobar"
rogerdpack

17

ขออภัยฉันยังไม่สามารถแสดงความคิดเห็น

เช่นเดียวกับ JdeBP กล่าวว่าคุณควรสั่งซื้อบนเมานต์ระบบไฟล์ คุณสามารถทำนายชื่อของหน่วยเมานต์หรือคุณสามารถใช้ (ในส่วนของหน่วย):

RequiresMountsFor = / แน่นอน / เส้นทาง / ของ / ติด

ตัวเลือกนี้จะสร้างการพึ่งพาหน่วย * .mount ที่เหมาะสมเพื่อให้สามารถเข้าถึงพา ธ ก่อนเริ่มบริการ อาจไม่ได้อยู่ใน systemd ทุกรุ่น แต่ฉันใช้มันในเครื่อง CentOS 7 ในช่วง 6 เดือนที่ผ่านมา


(และความแตกต่างของคุณจากวานิลลา systemd อยู่ที่นี่ ) RequiresMountsFor=มาพร้อมกับชุดคำเตือน ด้วยRedHat ข้อผิดพลาด # 1088057และคริส SIEBENMANNในมือคุณควรจะสามารถที่จะตอบsuperuser.com/questions/988734 มันเป็นภูเขา CIFS ในคำถามนี้เช่นกัน แต่ความหมายก็คือautoโชคดี
JdeBP

@JdeBP ขอบคุณสำหรับความคิดเห็น ฉันไม่ทราบข้อควรระวังและปัญหาเกี่ยวกับคุณลักษณะนั้น
miguelbernadi

14

แม้ว่าคำตอบทั้งสองจะถูกต้อง แต่ฉันต้องการเพิ่มสองเซ็นต์ของฉันไปยังการอภิปรายเพราะเมื่อฉันได้มองหามันฉันก็หายไปบางคำแนะนำและตัวอย่างของวิธีการดำเนินการต่อไป

  1. เพิ่มระบบไฟล์ไปที่ /etc/fstab
  2. พิมพ์mount -aว่าเมาท์ระบบไฟล์ทั้งหมดที่กล่าวถึงใน fstab
  3. ค้นหายูนิต systemd ที่สร้างขึ้นด้วย:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    (ควรส่งคืนบางสิ่งที่ลงท้ายด้วย.mount)
  4. เพิ่ม mount-unit ที่พบลงในAfter=คำสั่งใน*.serviceไฟล์

นี่คือตัวอย่างของการเริ่มต้นmy-daemonบริการเมื่อบู๊ต แต่หลังจากที่เครือข่ายพร้อมใช้งาน CIFS จะถูกติดตั้งที่/mnt/cifsและvpn-launchบริการเริ่มขึ้นแล้ว:

/ etc / fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

หมายเหตุ: คุณอาจต้องการเพิ่มnofailตัวเลือก fstab ของคุณ (เช่นเมื่อใช้ไดรฟ์ภายนอก) มิฉะนั้นเครื่องของคุณจะไม่บูตหากอุปกรณ์ไม่ได้เชื่อมต่อ ดูบทความ fstab ของ ArchWiki


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

อย่าลืมที่จะเปิดใช้งานบริการที่มันเริ่มเมื่อบู๊ต: systemctl enable my-daemon

โปรดทราบว่าสิ่งนี้ใช้ได้กับระบบไฟล์อื่น ๆ (NFS, HDD ฯลฯ ) เช่นกัน

ดังที่ได้กล่าวไปแล้วคำตอบทั้งสองนั้นถูกต้องและฉันขอแนะนำให้ทุกคนอ่าน แต่สำหรับฉันตัวอย่างสองสามอย่างจะช่วยฉันได้บ้าง

อัปเดต (2019-06-25):

  • เพิ่มหมายเหตุเกี่ยวกับตัวเลือก fstab เพื่อป้องกันการล็อคการบูตเมื่อใช้ไดรฟ์ภายนอก
  • เพิ่มลงmnt-cifs.mountในRequires=รายการซึ่งทำให้การmy-daemon.serviceเริ่มต้นล้มเหลวเมื่อการเมานท์ cifs ไม่ถูกเมานท์สำเร็จ

เพื่อให้ชัดเจน "mnt-cifs.mount" เป็นชื่อของหน่วยเมานท์สำหรับจุดเมานต์เฉพาะของคุณsystemctl list-units --type=mountหรือไม่
smdvlpr

1

@ bm-bergmotte: ขอบคุณสำหรับคำแนะนำของคุณซึ่งช่วยฉันได้มาก สำหรับฉันมันแค่ทำงานถ้าฉันใส่

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

ถ้าฉันไม่ใส่ "mnt-cifs.mount" ใน "ต้อง" (และตามลำดับนี้) มันใช้งานได้สำหรับการรีบูต / เริ่มต้น แต่การบริการเริ่มต้นอย่างไรก็ตามถ้าอุปกรณ์ไม่ได้ติดตั้ง หลังจากติดตั้งเพิ่มเติมภายใน "" ต้อง "บริการจะติดตั้งอุปกรณ์ก่อนที่จะเริ่มถ้าอุปกรณ์ไม่ได้ถูกเมาท์


คุณพูดถูก หากการเมานต์ล้มเหลว my-daemon.service จะเริ่มต้นใหม่ After=เพียงแค่สั่งการ Requires=ทำให้จำเป็นต้องมีการติดตั้ง cifs (ดูที่Sufiyan Ghori ตอบคำถามนั้น) ฉันจะอัปเดตคำตอบของฉัน
bm-bergmotte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.