systemd không chạy /etc/rc.local?


11

Tôi đang sử dụng Archlinux và bắt đầu dùng thử systemd những ngày này.

Tuy nhiên, tôi thấy rằng systemd không tải tập lệnh /etc/rc.local của tôi.

Như đã đề cập trong trang Wiki, tôi đã chạy systemctl enable rc-local.service, nhưng điều này không giúp được gì.

Nội dung của tệp /etc/rc.local của tôi là:

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

Bất kỳ đề xuất?

Câu trả lời:


16

Arch có thể không bao gồm tệp đơn vị dịch vụ cần thiết để chạy rc.local.

Chỉ cần tạo một tệp /etc/systemd/system/rc-local.servicecó nội dung sau (sao chép nguyên văn từ hệ thống Fedora systemd của tôi):

# Tập tin này là một phần của systemd.
#
# systemd là phần mềm miễn phí; bạn có thể phân phối lại và / hoặc sửa đổi nó
# theo các điều khoản của Giấy phép Công cộng GNU như được xuất bản bởi
# Quỹ phần mềm miễn phí; phiên bản 2 của Giấy phép, hoặc
# (tùy chọn của bạn) bất kỳ phiên bản mới hơn.

[Đơn vị]
Mô tả = / etc / rc.local Tương thích
Điều kiệnPathExists = / etc / rc.local

[Dịch vụ]
Loại = rèn
ExecStart = / etc / rc.local bắt đầu
Hết giờ = 0
StandardOutput = tty
RemainAfterExit = có
SysVStartP Warriority = 99

Sau đó, chỉ cần chạy systemctl enable rc-local.servicenhư root để kích hoạt nó. Bạn cũng có thể kiểm tra nó / chạy nó ngay bây giờ bằng cách chạy systemctl start rc-local.service.


Hai tập tin này đã tồn tại: /etc/systemd/system/multi-user.target.wants/rc-local.service/lib/systemd/system/rc-local.service
Felix Yan

2
Có lẽ nó đã bị vô hiệu hóa rồi. Hãy thử chạy systemctl enable rc-local.service. Nếu bạn tiếp tục gặp sự cố, xin vui lòng gửi đầu ra của systemctl status rc-local.service.
Bản vá

5
Bạn không thể phát hành "enable" trên thiết bị không có phần Cài đặt, ví dụ này có thể sẽ không hoạt động.
lzap

1
Mặt khác, tệp (hy vọng là một liên kết) multi-user.target.wantschính xác là những gì cho phép nó.
Pavel imerda

28

Với systemd 188-2, systemd phàn nàn về việc không có [Install]phần nào và do đó không thể kích hoạt dịch vụ RC.local. Có thể là trường hợp với các phiên bản trước nhưng vì Arch dev chỉ được công bố gần đây systemd sẽ trở thành mặc định tôi đang sửa chữa hệ thống của mình.

Để khắc phục điều đó, chỉ cần thêm một phần cho mục tiêu nhiều người dùng trong /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

Tạo /etc/rc.localtập lệnh và làm cho nó có thể thực thi được vớichmod +x /etc/rc.local


1
Điều này là do rc-local.servicechưa bao giờ dịch vụ được kích hoạt thông qua systemctl enablenhưng kể từ năm 2011 đã là dịch vụ được máy phát tự động kích hoạt . Tuy nhiên, Arch Linux, như được giải thích tại unix.stackexchange.com/a/471871/5132 , không bật các tùy chọn tương thích ngược trong systemd cung cấp trình tạo ở vị trí đầu tiên.
JdeBP


2

Đừng quên làm cho RC.local thực thi - hoặc lớp tương thích sẽ không chạy nó! Trong các ví dụ trên được liệt kê - bạn sẽ chạy chmod a + x để làm cho tệp RC.local có thể thực thi được. Như sau:

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

Tôi nghĩ một vấn đề khác có thể xảy ra là vị trí của tập lệnh RC.local của bạn! Nếu bạn chưa thêm khả năng tương thích với systemd (cần được tích hợp sẵn - và dường như trước đây đã đề cập đến nó đã tồn tại), bạn có thể cần kiểm tra lại vị trí tệp của mình ... Trên hệ điều hành của tôi, tôi có RC-local tại /etc/rc.d/rc.local vì vậy tôi đã chạy như sau:

$ 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
Thật vô nghĩa khi làm cho systemdtệp dịch vụ có thể thực thi được, như được hiển thị trong đoạn mã đầu tiên của bạn. Ngoài ra, trên Arch Linux, đường dẫn tệp là /etc/rc.local- có lẽ nội dung của systemdtệp dịch vụ không chính xác.
RavuAlHemio

1

Hai vấn đề phổ biến:

  1. Đừng quên thực hiện /etc/rc.d/rc.local. Bạn có thể dùng

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

    để làm cho nó thực thi.

  2. Đừng quên đặt một #!/bin/shdòng trong dòng đầu tiên /etc/rc.d/rc.local. Đây là cách mọi thứ sẽ nhìn:

    #  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
    

    Nếu bạn không nhận được đầu ra tương tự, hãy chỉnh sửa /etc/rc.d/rc.localđể thêm một dòng ở trên cùng chỉ chứa #!/bin/sh.


1

Nếu bạn có /etc/rc.localmột tệp thực thi, nó sẽ được kéo vào quá trình khởi động bằng systemd-rc-local-generator/ rc-local.service.

Ít nhất /etc/rc.locallà đường dẫn mặc định mà nó sử dụng, nhưng điều này được thiết lập bởi phân phối. Bởi vì chủ yếu là để tương thích ngược và các bản phân phối khác nhau đã sử dụng các đường dẫn khác nhau. Ví dụ trên Fedora, con đường là /etc/rc.d/rc.local. Bạn có thể kiểm tra đường dẫn như sau:

$ 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

Có vẻ như điều này không được biết đến nhiều. Có một số bài đăng hiển thị phiên bản trước của tệp, không có nhận xét như vậy.


1
Điều này không đúng trong thực tế. Như đã giải thích tại unix.stackexchange.com/a/471871/5132 , Arch không sử dụng các cơ chế tương thích ngược và không có trình tạo này.
JdeBP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.