systemd ไม่ทำงาน /etc/rc.local?


12

ฉันกำลังใช้ Archlinux และเริ่มพยายาม systemd วันนี้

อย่างไรก็ตามฉันพบว่า systemd ไม่โหลดสคริปต์ /etc/rc.local ของฉัน

ตามที่กล่าวไว้ในหน้า Wiki ฉันได้ทำงานsystemctl enable rc-local.serviceแล้ว แต่สิ่งนี้ไม่ได้ช่วย

เนื้อหาของไฟล์ /etc/rc.local ของฉันคือ:

echo -n 120 > /sys/devices/platform/i8042/serio1/speed
echo -n 250 > /sys/devices/platform/i8042/serio1/sensitivity
iptables --table nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

ข้อเสนอแนะใด ๆ

คำตอบ:


16

Arch rc.localอาจจะไม่ได้รวมถึงไฟล์ที่หน่วยบริการจำเป็นต้องใช้

เพียงสร้างไฟล์ที่/etc/systemd/system/rc-local.serviceมีเนื้อหาดังต่อไปนี้ (คัดลอกคำต่อคำจากระบบ Fedora ของฉัน):

# ไฟล์นี้เป็นส่วนหนึ่งของ systemd
#
# systemd เป็นซอฟต์แวร์ฟรี คุณสามารถแจกจ่ายต่อและ / หรือแก้ไขได้
# ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของกนูตามที่เผยแพร่โดย
# มูลนิธิซอฟต์แวร์เสรี ทั้งรุ่นที่ 2 ของใบอนุญาตหรือ
# (ตามที่คุณเลือก) เวอร์ชันที่ใหม่กว่า

[Unit]
คำอธิบาย = / etc / rc.local ความเข้ากันได้
ConditionPathExists = / etc / rc.local

[บริการ]
พิมพ์ = ฟอร์ก
ExecStart = / etc / rc.local start
TimeoutSec = 0
standardoutput = TTY
RemainAfterExit = yes
SysVStartPriority = 99

จากนั้นเรียกใช้systemctl enable rc-local.serviceเป็นรูทเพื่อเปิดใช้งาน นอกจากนี้คุณยังสามารถทดสอบ / systemctl start rc-local.serviceทำงานได้ในขณะนี้โดยการเรียกใช้


ทั้งสองไฟล์ที่มีอยู่แล้ว: /etc/systemd/system/multi-user.target.wants/rc-local.serviceและ /lib/systemd/system/rc-local.service
เฟลิกซ์ยัน

2
มันอาจจะปิดการใช้งานแล้ว systemctl enable rc-local.serviceลองใช้ systemctl status rc-local.serviceหากคุณยังคงมีปัญหาโปรดโพสต์การส่งออกของ
แพทช์

5
คุณไม่สามารถออก "เปิดใช้งาน" บนหน่วยที่ไม่มีส่วนการติดตั้งตัวอย่างนี้อาจไม่ทำงาน
lzap

1
ในทางกลับกันไฟล์ (หวังว่าลิงก์) multi-user.target.wantsจะเป็นสิ่งที่เปิดใช้งานได้
Pavel Šimerda

28

ด้วย systemd 188-2, systemd บ่นเกี่ยวกับการไม่มี[Install]ส่วนและไม่สามารถเปิดใช้งานบริการ rc.local อาจเป็นกรณีของรุ่นก่อนหน้านี้ แต่เนื่องจาก Arch devs เพิ่งประกาศเมื่อเร็ว ๆ นี้ systemd จะกลายเป็นค่าเริ่มต้นฉันแก้ไขระบบของฉัน

หากต้องการแก้ไขให้เพิ่มส่วนสำหรับเป้าหมายผู้ใช้หลายคนใน/etc/systemd/system/rc-local.service:

[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

สร้าง/etc/rc.localสคริปต์และทำให้มันใช้งานได้chmod +x /etc/rc.local


1
นี้เป็นเพราะrc-local.serviceไม่เคยเป็นบริการที่ถูกเปิดใช้งานผ่านทางsystemctl enableแต่ตั้งแต่ 2011 ได้รับการบริการรถยนต์ที่เปิดใช้งานโดยกำเนิด อย่างไรก็ตาม Arch Linux ดังที่อธิบายไว้ที่unix.stackexchange.com/a/471871/5132ไม่ได้เปิดตัวเลือกความเข้ากันได้แบบย้อนหลังใน systemd ที่ให้กำเนิดในตอนแรก
JdeBP

4

Pkgfile (ในระบบของฉัน) พูดว่า:

$ pkgfile --search rc-local.service
community/initscripts-systemd

แพ็คเกจนั้นติดตั้งสิ่งอื่น ๆ ที่คุณอาจไม่ต้องการ แต่คุณสามารถปิดการใช้งานได้ ดูเพิ่มเติมที่: https://wiki.archlinux.org/index.php/Systemd#The_initscripts-systemd_package


2

อย่าลืมทำให้ rc.local executable - เลเยอร์ความเข้ากันได้จะไม่ทำงาน! ในตัวอย่างข้างต้นซึ่งมีการระบุไว้ - คุณจะเรียกใช้ chmod a + x เพื่อให้ไฟล์ rc.local ปฏิบัติการได้ ดังนี้

$ chmod a+X /etc/systemd/system/rc-local.service 

ฉันคิดว่าปัญหาที่เป็นไปได้อีกประการหนึ่งคือตำแหน่งของสคริปต์ rc.local ของคุณ! หากคุณยังไม่ได้เพิ่มความเข้ากันได้กับ systemd (ซึ่งควรจะมีอยู่แล้วภายใน - และดูเหมือนว่าจะกล่าวถึงก่อนหน้านี้แล้ว) คุณอาจต้องตรวจสอบที่ตั้งของไฟล์อีกครั้ง ... ในระบบปฏิบัติการของฉันฉันมี rc-local ที่ /etc/rc.d/rc.local ดังนั้นฉันจึงรันสิ่งต่อไปนี้:

$ sudo chmod a+x /etc/rc.d/rc.local
$ sudo systemctl restart rc-local.service
$ sudo systemctl status rc-local.service
rc-local.service - /etc/rc.d/rc.local Compatibility
      Loaded: loaded (/lib/systemd/system/rc-local.service; static)
      Active: active (exited) since Fri, 13 Apr 2012 14:42:39 -0600; 3s ago
     Process: 2285 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/rc-local.service

4
มันไม่มีประโยชน์ที่จะทำให้systemdไฟล์บริการปฏิบัติการดังที่แสดงในข้อมูลโค้ดแรกของคุณ นอกจากนี้บน Arch Linux เส้นทางของไฟล์คือ/etc/rc.local- บางทีเนื้อหาของsystemdไฟล์บริการนั้นไม่ถูกต้อง
RavuAlHemio

1

สอง gotchas ทั่วไป:

  1. อย่าลืมที่จะทำให้/etc/rc.d/rc.localปฏิบัติการได้ คุณสามารถใช้ได้

    # chmod a+rx /etc/rc.d/rc.local
    

    เพื่อให้สามารถเรียกใช้งานได้

  2. อย่าลืมที่จะนำบรรทัดในบรรทัดแรกของ#!/bin/sh /etc/rc.d/rc.localนี่คือสิ่งที่ควรมีลักษณะ:

    #  head -1 /etc/rc.d/rc.local 
    #!/bin/sh
    # file /etc/rc.d/rc.local 
    /etc/rc.d/rc.local: POSIX shell script, ASCII text executable
    

    หากคุณไม่ได้รับผลลัพธ์ที่คล้ายแก้ไขเพื่อเพิ่มบรรทัดที่ด้านบนสุดที่มีเพียง/etc/rc.d/rc.local#!/bin/sh


1

ถ้าคุณมี/etc/rc.localเป็นแฟ้มที่ปฏิบัติการก็จะถูกดึงเข้าไปในขั้นตอนการบู๊ตโดย/systemd-rc-local-generatorrc-local.service

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

$ systemctl cat rc-local.service
# /usr/lib/systemd/system/rc-local.service
# ...

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

ดูเหมือนว่านี่จะไม่ค่อยเป็นที่รู้จักมากนัก มีหลายโพสต์ที่แสดงไฟล์เวอร์ชันก่อนหน้าซึ่งไม่มีความคิดเห็นดังกล่าว


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