ฉันจะรันคำสั่งเมื่อเริ่มต้น (ทางเลือก rc.local) บน Ubuntu 16.10 ได้อย่างไร


49

ฉันกำลังตั้งโควต้าบนเซิร์ฟเวอร์ Linode ที่ใช้ Ubuntu 16.10 และฉันได้รับข้อผิดพลาดดังต่อไปนี้

ไม่สามารถ stat () อุปกรณ์ที่ติดตั้ง / dev / root: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

ดังนั้นในการแก้ไขปัญหานี้ฉันถึงหัวข้อนี้สำหรับการแก้ไขที่ทำโดยการเพิ่ม

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

/etc/rc.localไป แต่อูบุนตู 16.10 ไม่ได้ใช้rc.localอีกต่อไปแทนที่จะใช้systemd อะไรคือทางเลือกสำหรับrc.localฉันจะเรียกใช้คำสั่งข้างต้นเมื่อเริ่มต้นได้อย่างไร

นอกจากนี้ฉันเปิดใช้งานบริการโดยใช้systemctl enable rc-local.serviceแต่มันไม่ได้ผลสำหรับฉัน การรอคอยใด ๆ จะได้รับการชื่นชม


คุณเรียกใช้มันในฐานะ root และคุณเริ่มระบบของคุณใหม่หรือไม่?
George Udosen

@ George ใช่ฉันทำทั้งสองอย่างแล้ว
Saurabh Sharma


@George ก็ใช้งานไม่ได้เช่นกัน
Saurabh Sharma

เพิ่งเห็นแฮ็คนี้ดูว่ามันบิน ...
George Udosen

คำตอบ:


65

Intro

ฉันคิดว่าคุณไม่ควรสร้างบริการใหม่ตามที่แนะนำในลิงค์ของ George rc-local.serviceมีอยู่แล้วใน systemd และไฟล์บริการแสดงให้เห็นว่าrc.localถ้ามันมีอยู่และเป็นที่ปฏิบัติการได้รับการดึงโดยอัตโนมัติใน multi-user.targetsystemd-rc-local-generatorดังนั้นต้องสร้างหรือบังคับสิ่งที่ไม่มีที่ทำเพียงแค่ในอีกทางหนึ่งด้วย

ทางออกหนึ่ง

วิธีแก้ปัญหาอย่างรวดเร็ว (ฉันไม่ทราบว่าเป็นวิธีมาตรฐาน):

ในเทอร์มินัลทำ:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

หลังจากนั้นrc.localจะถูกเรียกเมื่อเริ่มต้นระบบ ใส่สิ่งที่คุณต้องการ

พื้นหลัง

หากคุณทำใน terminal:

sudo systemctl edit --full rc-local

คุณจะเห็นว่าความคิดเห็นส่วนหัวมีบรรทัดต่างๆเช่น

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

สิ่งนี้บ่งชี้ว่าในระบบนี้หากมีไฟล์ที่เรียกว่าไฟล์ที่เรียก/etc/rc.localใช้งานได้ไฟล์นั้นจะถูกดึงเข้าสู่ multi-user.target โดยอัตโนมัติ ดังนั้นคุณเพียงแค่สร้างไฟล์ตาม ( sudo touch...) และทำให้มันปฏิบัติ ( sudo chmod +x ...)


4
อย่าใช้#!/bin/bashแม้ว่าจะใช้#!/bin/shยกเว้นว่าคุณต้องการทุบตีในสคริปต์ของคุณจริงๆ สคริปต์ระบบอื่นทั้งหมดใช้เส้นประไม่ใช่ทุบตีด้วยเหตุผลด้านประสิทธิภาพ
spikyjt

"ไม่จำเป็นต้องสร้างใหม่หรือบังคับบางสิ่งที่เพิ่งทำไปในอีกทางโดย systemd-rc-local-generator" rc-localไม่อนุญาตให้สั่งมันหลังจากหน่วยอื่น ๆ ใช่ไหม?
x-yuri

20

ฉันเห็นคำแนะนำนี้ซึ่งเกี่ยวข้องกับการใช้systemd ที่นี่ :

  1. สร้างบริการ:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. เพิ่มรหัสของคุณที่นั่น:

    [Unit]
    Description=/etc/rc.local Compatibility
    ConditionPathExists=/etc/rc.local
    
    [Service]
    Type=forking
    ExecStart=/etc/rc.local start
    TimeoutSec=0
    StandardOutput=tty
    RemainAfterExit=yes
    SysVStartPriority=99
    
    [Install]
    WantedBy=multi-user.target
    
  3. สร้างและตรวจสอบให้แน่ใจว่า/etc/rc.localสามารถเรียกใช้งานได้และเพิ่มรหัสนี้ภายใน:

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. เปิดใช้งานบริการ:

    sudo systemctl enable rc-local
    
  5. เริ่มบริการและตรวจสอบสถานะ:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. หากทุกอย่างไปได้ด้วยดีคุณสามารถเพิ่มไฟล์ของคุณcodeลงไป/etc/rc.localได้

หมายเหตุ:ทดสอบบน Lubuntu 16.10

ที่มา:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd


ฉันทำทุกขั้นตอน ฉันมี rc.local กับ: ก่อนtouch "hello" exit 0บริการดูเหมือนจะเปิดใช้งานอยู่ แต่ไม่ได้สร้างไฟล์ใด ๆ ใน / etc / dir ที่ทำงานบน Ubuntu 16.04 Arabian 5.31
Danny182

เนื่องจากคำตอบโดย @Jan ชี้ให้เห็นว่าไม่จำเป็นต้องสร้างบริการใหม่ทั้งหมดเนื่องจาก systemd รองรับ rc.local อยู่แล้ว
TommyPeanuts

ขอบคุณ youuuuuuuuuuuuuuuuuuuu นี่เพิ่งใช้งานได้
GPrathap

2

เพื่อเพิ่มคำตอบของแจนว่าไม่เหมือนกับrc.localไฟล์ปกติที่rc-local serviceถูกเรียกใช้งานหลังจากบริการทั้งหมดไม่ได้เริ่มทำงาน แต่หลังจากเครือข่ายออนไลน์

ในบางกรณีคุณอาจต้องการเรียกใช้คำสั่งในrc.localภายหลัง ตัวอย่างเช่นฉันต้องการให้ดำเนินการหลังจากlxdเริ่มต้น

ในกรณีนี้คุณสามารถแก้ไขการrc-local serviceพึ่งพาเริ่มต้นได้ด้วยการสร้างไฟล์ conf แบบหล่นใน: /etc/systemd/system/rc-local.service.d/override.conf กับเนื้อหา:

[Unit]
After=network.target lxd.service

คุณสามารถเพิ่มชื่อหน่วยที่ต้องการได้ (เช่นที่ฉันเพิ่มlxd.service)

อย่าลืมsystemctl daemon-reloadหลังจากนั้น


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