systemd tidak menjalankan /etc/rc.local?

11

Saya menggunakan Archlinux dan mulai mencoba systemd hari ini.

Namun, saya menemukan bahwa systemd tidak memuat skrip /etc/rc.local saya.

Seperti yang disebutkan di halaman Wiki, saya memang sudah lari systemctl enable rc-local.service, tetapi ini tidak membantu.

Konten file /etc/rc.local saya adalah:

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

Ada saran?

Felix Yan
sumber

Jawaban:

16

Arch mungkin belum menyertakan file unit layanan yang diperlukan untuk dijalankan rc.local.

Cukup buat file /etc/systemd/system/rc-local.servicedengan konten berikut (disalin kata demi kata dari sistem Fedora systemd saya):

# File ini adalah bagian dari systemd.
#
# systemd adalah perangkat lunak gratis; Anda dapat mendistribusikan ulang dan / atau memodifikasinya
# berdasarkan ketentuan Lisensi Publik Umum GNU yang diterbitkan oleh
# Yayasan Perangkat Lunak Bebas; baik versi 2 dari Lisensi, atau
# (sesuai pilihan Anda) versi yang lebih baru.

[Satuan]
Deskripsi = / etc / rc.local Compatibility
ConditionPathExists = / etc / rc.local

[Layanan]
Ketik = forking
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = tty
RemainAfterExit = ya
SysVStartPriority = 99

Kemudian, jalankan saja systemctl enable rc-local.serviceroot untuk mengaktifkannya. Anda juga dapat mengujinya / jalankan sekarang dengan menjalankan systemctl start rc-local.service.

Tambalan
sumber
Kedua file ini sudah ada: /etc/systemd/system/multi-user.target.wants/rc-local.servicedan /lib/systemd/system/rc-local.service
Felix Yan
2
Mungkin itu dinonaktifkan. Coba jalankan systemctl enable rc-local.service. Jika Anda terus mengalami masalah, silakan kirim output dari systemctl status rc-local.service.
Tambalan
5
Anda tidak dapat mengeluarkan "aktifkan" pada unit yang tidak memiliki bagian Instal, contoh ini mungkin tidak akan berfungsi.
lzap
1
Di sisi lain, file (semoga tautan) di multi-user.target.wantspersis apa yang memungkinkannya .
Pavel Šimerda
28

Dengan systemd 188-2, systemd mengeluh tentang tidak memiliki [Install]bagian dan karena itu tidak dapat mengaktifkan layanan rc.local. Mungkin memang demikian halnya dengan versi sebelumnya, tetapi karena Arch devs yang baru saja mengumumkan systemd akan menjadi default, saya memperbaiki sistem saya.

Untuk memperbaikinya, tambahkan saja bagian untuk target multiuser di /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

Buat /etc/rc.localskrip dan buat agar dapat dieksekusichmod +x /etc/rc.local

Borromini
sumber
1
Ini karena rc-local.servicetidak pernah ada layanan yang diaktifkan melalui systemctl enabletetapi sejak 2011 telah menjadi layanan yang diaktifkan secara otomatis oleh generator . Namun Arch Linux, seperti yang dijelaskan di unix.stackexchange.com/a/471871/5132 , tidak mengaktifkan opsi kompatibilitas mundur di systemd yang menyediakan generator di tempat pertama.
JdeBP
2

Jangan lupa untuk membuat rc.local dapat dieksekusi - atau lapisan kompatibilitas tidak akan menjalankannya! Dalam contoh di atas yang tercantum - Anda akan menjalankan chmod a + x untuk membuat file rc.local dapat dieksekusi. Sebagai berikut:

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

Saya pikir masalah lain yang mungkin terjadi adalah lokasi skrip rc.local Anda! Jika Anda belum menambahkan kompatibilitas ke systemd (yang harus dibangun di - dan tampaknya oleh menyebutkan sebelumnya sudah ada) Anda mungkin perlu memeriksa lokasi file Anda ... Pada OS saya, saya memiliki rc-lokal di /etc/rc.d/rc.local jadi saya menjalankan yang berikut:

$ 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
Rio1
sumber
4
Tidak ada gunanya membuat systemdfile layanan dapat dieksekusi, seperti yang ditunjukkan dalam cuplikan kode pertama Anda. Juga, di Arch Linux, path file-nya /etc/rc.local- mungkin konten dari systemdfile service salah.
RavuAlHemio
1

Dua gotcha umum:

  1. Jangan lupa untuk membuat /etc/rc.d/rc.localexecutable. Kamu bisa memakai

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

    untuk membuatnya dieksekusi.

  2. Jangan lupa untuk meletakkan #!/bin/shbaris di baris pertama /etc/rc.d/rc.local. Begini tampilannya:

    #  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
    

    Jika Anda tidak mendapatkan hasil yang serupa, edit /etc/rc.d/rc.localuntuk menambahkan baris di bagian paling atas yang berisi saja #!/bin/sh.

DW
sumber
1

Jika Anda memiliki /etc/rc.localfile yang dapat dieksekusi, file tersebut akan ditarik ke proses boot oleh systemd-rc-local-generator/ rc-local.service.

Paling tidak /etc/rc.localadalah jalur default yang digunakannya, tetapi ini ditetapkan oleh distribusi. Karena ini terutama untuk kompatibilitas mundur, dan distribusi yang berbeda menggunakan jalur yang berbeda. Misalnya di Fedora, jalannya /etc/rc.d/rc.local. Anda dapat memeriksa jalur sebagai berikut:

$ 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

Sepertinya ini tidak terlalu dikenal. Ada beberapa posting yang menunjukkan versi file sebelumnya, yang tidak memiliki komentar seperti itu.

sourcejedi
sumber
1
Ini sebenarnya tidak benar. Seperti dijelaskan di unix.stackexchange.com/a/471871/5132 , Arch tidak menggunakan mekanisme kompatibilitas mundur dan tidak memiliki generator ini.
JdeBP