อะไรคือความแตกต่างระหว่าง“ systemctl mask” และ“ systemctl disable”?


35

ฉันต้องการปรับปรุงเวลาบูตของ Ubuntu GNOME 16.04 ของฉันด้วยการปิดใช้งานบริการพลีมั ธ เมื่อทำการบูทขึ้น ฉันพบคำตอบสองข้อเกี่ยวกับวิธีการทำในเว็บไซต์ต่างๆ ได้แก่ :

# systemctl disable plymouth-quit-wait.service 
# systemctl mask plymouth-quit-wait.service 

ฉันไม่สามารถดำเนินการอย่างใดอย่างหนึ่งข้างต้นเว้นแต่ว่าฉันรู้ว่าพวกเขาทำอะไร


4
อ่านที่นี่ fedoramagazine.org/systemd-masking-units
Rinzwind

คำตอบ:


52

หากมีการบริการenabledก็จะมี symlink อยู่ที่ไหนสักแห่ง

/etc/systemd/system

ไปยังไฟล์หน่วยซึ่งส่วนใหญ่มักจะอยู่ที่ไหนสักแห่งใน

/lib/systemd/system

มีประโยชน์เมื่อคุณenableให้บริการเส้นทางแบบเต็มของลิงก์และเป้าหมายที่สร้างขึ้นจะถูกพิมพ์ไปยัง stdout

ปิดการใช้งานบริการลบ symlink ดังนั้นไฟล์หน่วยตัวเองไม่ได้รับผลกระทบ แต่บริการไม่ได้โหลดที่บูตถัดไปเมื่อ systemd /etc/systemd/systemอ่าน

อย่างไรก็ตามการให้บริการคนพิการสามารถโหลดและจะเริ่มต้นถ้าบริการที่ขึ้นอยู่กับว่ามันจะเริ่มต้น ; enableและdisableกำหนดค่าพฤติกรรมเริ่มต้นอัตโนมัติสำหรับหน่วยเท่านั้นและสถานะจะถูกแทนที่ได้อย่างง่ายดาย

สวมหน้ากากบริการเป็นหนึ่งที่มีหน่วยเป็นไฟล์ symlink /dev/nullไป สิ่งนี้ทำให้ "เป็นไปไม่ได้" ในการโหลดบริการแม้ว่าจะเป็นบริการอื่นที่เปิดใช้งานก็ตาม

เมื่อคุณmaskให้บริการ symlink จะถูกสร้างขึ้นจาก/etc/systemd/systemถึง/dev/nullออกจากไฟล์หน่วยดั้งเดิมที่อื่น ๆ โดยไม่มีการแตะต้อง เมื่อคุณunmaskให้บริการ symlink จะถูกลบ

อย่างไรก็ตามฉันสังเกตเห็นว่าคำสั่งเหล่านี้ไม่ได้รับเกียรติเสมอไป

เมื่อฉันพยายามที่จะปิดบังบริการส่วนใหญ่มันล้มเหลว:

$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument

แน่นอนฉันหยุดให้บริการก่อน @Anwar แนะนำให้ปิดบังได้เฉพาะกับบริการที่ไม่สำคัญเท่านั้น

เปิดโปงบริการที่สวมหน้ากากยกเว้นว่าฉันปิดบังตัวเองก็ล้มเหลวเช่นกัน ฉันเชื่อว่าเป็นเพราะไม่มีไฟล์หน่วยสำหรับบริการที่ใดก็ได้ยกเว้นในรูปแบบของ symlink ไป/dev/nullคราวนี้ใน/lib/systemd/system:

$ file $(locate fuse.service)
/lib/systemd/system/fuse.service: symbolic link to /dev/null
$ sudo systemctl unmask fuse.service
$ systemctl status fuse
● fuse.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

ฉันไม่ใช่คนเดียวที่มีปัญหานี้

ที่จริงการเปิดโปงการหลอกลวงบริการ x11 ทั่วไปผมต้องลบ symlink ไปและ/dev/null sudo apt-get install --reinstall x11-common && sudo systemctl daemon-reloadตอนนี้เมื่อฉันถามด้วยsystemctl status x11-commonฉันเห็นบริการมีวงกลมสีเขียวที่ดีและมีการโหลดและใช้งาน (ออก) แม้ว่ามันจะไม่มีไฟล์หน่วย

สำหรับการอ้างอิงเพิ่มเติมบทความนี้เกี่ยวกับวิธีการใช้ Systemctlอาจมีการใช้งานบางส่วน


1
systemctl status x11-common ● x11-common.service Loaded: masked (/dev/null; bad) Active: inactive (dead)อืมผมได้รับ มันแย่ใช่ไหม แต่ฉันใช้ Debian ไม่ใช่ Ubuntu อย่างไรก็ตามคำอธิบายที่ดี ขอขอบคุณ.
Faheem Mitha

@FaheemMitha ฉันไม่แน่ใจว่าบริการเป็นสิ่งจำเป็น - ระบบของฉันดูเหมือนว่าจะทำงานโดยไม่ได้ แม้ว่าจะไม่มีประสบการณ์กับเดเบียนขออภัย!
Zanna

17

มันค่อนข้างง่าย

  • systemctl start, systemctl stop: เริ่ม (หยุด) หน่วยที่มีปัญหาทันที ;
  • systemctl enable, systemctl disable: ทำเครื่องหมาย (ไม่ทำเครื่องหมาย) หน่วยสำหรับการเริ่มอัตโนมัติในเวลาบูต (ในลักษณะเฉพาะหน่วย, อธิบายไว้ใน[Install]ส่วนของมัน);
  • systemctl mask, systemctl unmask: ไม่อนุญาต (อนุญาต) ทั้งหมดและความพยายามใด ๆ ในการเริ่มหน่วยที่สงสัย (ไม่ว่าจะด้วยตนเองหรือเป็นการพึ่งพาของหน่วยอื่นใดรวมถึงการขึ้นต่อกันของเป้าหมายการบูตเริ่มต้น) โปรดทราบว่าการทำเครื่องหมายสำหรับการเริ่มอัตโนมัติใน systemd นั้นถูกนำไปใช้โดยการเพิ่มการพึ่งพาเทียมจากเป้าหมายการบูตเริ่มต้นไปยังหน่วยที่สงสัยดังนั้น "หน้ากาก" ก็ไม่อนุญาตให้ทำการเริ่มอัตโนมัติ

Ref .: systemctl (1)(1)

เพิ่มเติม: Lennart Poettering (2011-03-02) "สามระดับของการปิด" systemd สำหรับผู้ดูแลระบบ 0pointer.de


ภาพรวมที่ยอดเยี่ยม! ดูเพิ่มเติมวิธีการใช้ Systemctl การจัดการบริการและหน่วย
Peter Mortensen

6

ในระยะสั้น

  • disableทำให้หน่วยปิดการใช้งานในระหว่างการบูต แต่ยูนิตนั้นสามารถเริ่มต้นได้ทุกเวลาหลังจากบูต

  • maskปิดการใช้งานหน่วยอย่างสมบูรณ์ ไม่สามารถเริ่มได้หากไม่เปิดโปง นั่นหมายความว่ามันจะล้มเหลวโดยอัตโนมัติในระหว่างการบู๊ต


ฉันอยากรู้อยากเห็น - ทำmaskและunmaskทำงานให้คุณ? (ฉันเข้าใจโดยสิ้นเชิงถ้าคุณไม่ต้องการทดสอบ!)
Zanna

1
@ ซานน่าใช่ มันทำงานได้ดี ฉันได้ทดสอบก่อนหน้านี้อีกครั้งทดสอบในขณะนี้ พร้อมpostgresql@9.5-main.serviceบริการ
Anwar

อืมฉันจะต้องคิดออกว่าทำไมมันไม่ได้ผลสำหรับฉัน ฉันรู้ว่าฉันไม่ใช่คนเดียว
Zanna

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