Systemd: เริ่มหน่วยหลังจากหน่วยอื่นเริ่มต้นจริงๆ


20

ในกรณีเฉพาะของฉันฉันต้องการเริ่มremote-fsหน่วยหลังจากทั้งหมดglusterfsเริ่มต้นอย่างสมบูรณ์

ไฟล์ systemd ของฉัน:

glusterfs กำหนดเป้าหมาย:

node04:/usr/lib/systemd/system # cat glusterfsd.service 
[Unit]
Description=GlusterFS brick processes (stopping only)
After=network.target glusterd.service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
ExecStop=/bin/sh -c "/bin/killall --wait glusterfsd || /bin/true"
ExecReload=/bin/sh -c "/bin/killall -HUP glusterfsd || /bin/true"

[Install]
WantedBy=multi-user.target

remote-fs กำหนดเป้าหมาย:

node04:/usr/lib/systemd/system # cat remote-fs.target 
[Unit]
Description=Remote File Systems
Documentation=man:systemd.special(7)
Requires=glusterfsd.service
After=glusterfsd.service remote-fs-pre.target
DefaultDependencies=no
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target

ตกลงทั้งหมดภูต Gluster เริ่มต้นที่ประสบความสำเร็จและฉันต้องการที่จะติดระบบแฟ้ม Gluster ผ่าน NFS แต่ Gluster ส่วนแบ่ง NFS ได้รับพร้อมได้ทันทีหลังจากที่glusterfs.serviceเริ่มต้น แต่ไม่กี่วินาทีต่อมาจึงมักจะremote-fsไม่สามารถที่จะติดมันก็เกี่ยวกับการRequiresและAfterแนวทาง

มาดูบันทึก:

Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS, a clustered file-system server.
Apr 14 16:16:22 node04 systemd[1]: Starting GlusterFS brick processes (stopping only)...
Apr 14 16:16:22 node04 systemd[1]: Starting Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Reached target Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Mounting /stor...

ที่นี่ทุกอย่างก็โอเคดูเหมือนว่าระบบไฟล์ระยะไกล (/ stor) จะถูกเมาท์หลังจาก glusterfs เริ่มทำงานเนื่องจากมันจะเป็นไปตามไฟล์หน่วย ... แต่บรรทัดถัดไปคือ:

//...skipped.....
Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS brick processes (stopping only).

อะไร? GlusterFS เตรียมพร้อมสำหรับช่วงเวลานี้เท่านั้น! แล้วเราจะเห็น:

//...skipped.....
Apr 14 16:16:23 node04 mount[2960]: mount.nfs: mounting node04:/stor failed, reason given by server: No such file or directory
Apr 14 16:16:23 node04 systemd[1]: stor.mount mount process exited, code=exited status=32
Apr 14 16:16:23 node04 systemd[1]: Failed to mount /stor.
Apr 14 16:16:23 node04 systemd[1]: Dependency failed for Remote File Systems.
Apr 14 16:16:23 node04 systemd[1]: Unit stor.mount entered failed state.

การเมาต์ล้มเหลวเนื่องจากเซิร์ฟเวอร์ NFS ไม่พร้อมเมื่อ systemd พยายามเมานต์ที่เก็บข้อมูล

เนื่องจากลักษณะการบูตระบบ systemd ไม่สามารถกำหนดได้บางครั้ง (ประมาณ 1 จาก 10 บูท) การติดตั้งระบบไฟล์นี้เมื่อบู๊ตสำเร็จ

หากการติดตั้ง onboot ไม่สำเร็จฉันสามารถลงชื่อเข้าใช้เซิร์ฟเวอร์และติดตั้งไดเรกทอรี / stor ด้วยตนเองได้ดังนั้นบริการ NFS ของ Gluster จึงดูเหมือนว่าทำงานได้ดี

ดังนั้นวิธีการที่จะเริ่มต้นremote-fsหลังจากที่glusterfsdคือหลังจากที่Started GlusterFS brick processesปรากฏในบันทึกบรรทัดหรือไม่

remote-fsดูเหมือนจะเป็นหนึ่งในเป้าหมายสุดท้ายดังนั้นฉันจึงไม่สามารถเริ่มต้นได้หลังจากเป้าหมาย "การแก้ปัญหา" อื่นซึ่งไม่จำเป็นต้องใช้remote-fsจริง


5
คุณสามารถเพิ่มExecStartPre=<command>คุณสมบัติให้กับส่วน Unit ของglusterfsd.serviceคำสั่งที่จะบล็อกจนกว่า glusterfs พร้อมหรือไม่ ที่อาจป้องกันได้จากการแสดงให้เห็นความสำเร็จและเปิดใช้งานglusterfsd.service remotefs.target
Ben Campbell

2
ฉันสับสนกับglusterfsd.serviceไฟล์หน่วยของคุณ ดูเหมือนจะไม่เริ่มบริการใด ๆ จริง ๆ และในความเป็นจริงจะฆ่าglusterfsdกระบวนการใด ๆ คุณมีไฟล์หน่วยอื่นที่เกี่ยวข้องกับ gluster หรือไม่?
GregL

คุณสามารถแสดงstor.mountยูนิตนี้ได้หรือไม่
Brian Redbeard

คำตอบ:


3

คุณสามารถวิเคราะห์ลำดับการบู๊ตของ systemd โดยทำตามคำสั่ง ดูไฟล์เอาต์พุตโดยใช้ SVG ที่รองรับเว็บเบราว์เซอร์

systemd-analyze plot > test.svg

การวางแผนนั้นจะให้สถิติเวลาการบู๊ตครั้งล่าสุดของคุณซึ่งจะช่วยให้คุณมีมุมมองที่ชัดเจนขึ้นเกี่ยวกับปัญหา

ฉันจะแก้ไขปัญหาการติดตั้งของฉัน NFS โดยการเพิ่มคำสั่งในmount /etc/rc.localอย่างไรก็ตามฉันไม่แน่ใจว่ามันจะทำงานกับการรวม glusterd คุ้มค่าลองแก้ไขด่วน เพื่อให้ systemd รัน rc.local คุณควรปฏิบัติตามเงื่อนไขดังต่อไปนี้:

# grep Condition /usr/lib/systemd/system/rc-local.service
ConditionFileIsExecutable=/etc/rc.d/rc.local

1

ตามที่ผู้อื่นแนะนำไว้; ฉันไม่แน่ใจว่าจริง ๆ แล้วมันขึ้นอยู่กับ 'glusterfsd' แทนความล่าช้าทั่วไปในอย่างอื่นตัวอย่างเช่นการค้นหา DNS ที่ต้องประสบความสำเร็จเพื่อให้สามารถแก้ไข 'node4' และเมาท์แชร์ NFS ได้สำเร็จ

เราประสบกับความล่าช้านี้เนื่องจากการตั้งค่าส่วนใหญ่ของเราใช้ตัวแก้ไขการตรวจสอบความถูกต้องในท้องถิ่นซึ่งจำเป็นต้องมีให้ก่อนบริการอื่น ๆ ที่ขึ้นอยู่กับ DNS สามารถเริ่มต้นได้สำเร็จ

วิธีการแก้ปัญหานี้คือการมีสคริปต์ 'ExecStartPre' ซึ่งโดยทั่วไปจะทดสอบความพร้อมใช้งานของการอ้างอิงที่เฉพาะเจาะจงซ้ำแล้วซ้ำอีกจนกว่าจะประสบความสำเร็จ (ออก 0) หรือหมดเวลาลอง (ทางออก 1)

ตรวจสอบให้แน่ใจว่าคุณกำหนดค่าภายนอกไดเรกทอรีหลัก systemd lib ถ้าคุณสามารถ การเปลี่ยนไฟล์แพ็กเกจจะหมายความว่าไฟล์เหล่านั้นจะถูกเขียนทับในการอัปเดตครั้งต่อไป



0

บางทีการสำรวจอาจช่วยได้บ้าง นี่เป็นอิสระจาก systemd ตัวอย่างเช่นฉันใช้mysql -e ';'ในวงก่อนที่จะทำสิ่งที่มีประโยชน์กับ mysql

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