Làm cách nào tôi có thể thực thi lệnh khi khởi động (RC.local thay thế) trên Ubuntu 16.10


49

Tôi đang thiết lập hạn ngạch trên máy chủ Linode của mình chạy Ubuntu 16.10 và tôi gặp lỗi sau

Không thể stat () gắn thiết bị / dev / root: Không có tệp hoặc thư mục như vậy

Vì vậy, để khắc phục điều này, tôi đã đạt được chủ đề này cho việc khắc phục được thực hiện bằng cách thêm

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

đến /etc/rc.local. Nhưng Ubuntu 16.10 không sử dụng rc.localnữa thay vì sử dụng systemd . Thay thế cho là gì rc.local, Làm thế nào tôi có thể chạy các lệnh trên khi khởi động?

Ngoài ra tôi đã kích hoạt dịch vụ bằng cách sử dụng systemctl enable rc-local.servicenhưng nó không hoạt động với tôi. Bất kỳ dẫn sẽ được đánh giá cao.


Bạn có chạy nó dưới quyền root không, và bạn đã khởi động lại hệ thống của mình chưa?
George Udosen

@George vâng, tôi đã làm cả hai
Saurabh Sharma


@George Điều đó không hoạt động tốt
Saurabh Sharma

Chỉ cần nhìn thấy bản hack này, hãy xem nó có bay không ...
George Udosen

Câu trả lời:


65

Giới thiệu

Tôi nghĩ bạn không nên tạo một dịch vụ mới như được đề xuất trong liên kết của George. Cái rc-local.serviceđã tồn tại trong systemd và tệp dịch vụ cho thấy rằng rc.local, nếu nó tồn tại và có thể thực thi đượcmulti-user.target , sẽ tự động được kéo vào . Vì vậy, không cần phải tạo lại hoặc buộc một cái gì đó chỉ được thực hiện theo cách khác bằng cách systemd-rc-local-generator.

Một cách giải quyết

Cách giải quyết nhanh chóng (tôi không biết nếu đó là cách chính tắc):

Trong một thiết bị đầu cuối làm:

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

Sau đó, rc.localsẽ được gọi khi khởi động hệ thống. Chèn những gì bạn muốn.

Lý lịch

Nếu bạn làm trong một thiết bị đầu cuối:

sudo systemctl edit --full rc-local

Bạn có thể thấy rằng nhận xét đầu chứa các dòng như:

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

Điều này chỉ ra rằng, trong hệ thống này, nếu có một tệp được gọi là /etc/rc.localcó thể thực thi được, thì nó sẽ tự động được kéo vào multi-user.target. Vì vậy, bạn chỉ cần tạo tệp theo ( sudo touch...) và làm cho nó thực thi ( sudo chmod +x ...).


4
Đừng sử dụng #!/bin/bashmặc dù, sử dụng #!/bin/shtrừ khi bạn thực sự cần bash trong tập lệnh của bạn. Tất cả các tập lệnh hệ thống khác sử dụng dấu gạch ngang, không phải bash, vì lý do hiệu suất.
spikyjt

"Không cần phải tạo lại hoặc ép buộc một cái gì đó được thực hiện theo cách khác bởi systemd-rc-local-tạo" rc-localkhông cho phép đặt hàng sau một số đơn vị khác, phải không?
x-yuri

20

Tôi thấy giải pháp này được đề xuất liên quan đến việc sử dụng systemd ở đây :

  1. Tạo một dịch vụ:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Thêm mã của bạn vào đó:

    [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. Tạo và đảm bảo /etc/rc.localcó thể thực thi được và thêm mã này vào bên trong nó:

    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. Kích hoạt dịch vụ:

    sudo systemctl enable rc-local
    
  5. Bắt đầu dịch vụ và kiểm tra trạng thái:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Nếu mọi việc suôn sẻ, bạn có thể thêm tệp của mình codevào /etc/rc.localtệp rồi khởi động lại.

Lưu ý: Đã thử nghiệm trên Lubfox 16.10.

Nguồn:

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


Tôi đã làm tất cả các bước. Tôi có RC.local với: touch "hello"trước exit 0. Dịch vụ này dường như đang hoạt động nhưng nó không tạo bất kỳ tệp nào trong / etc / dir Chạy trên
ubfox

Như câu trả lời của @Jan chỉ ra, việc tạo ra một dịch vụ hoàn toàn mới là không cần thiết vì systemd đã hỗ trợ RC.local.
TommyPeanuts

Cảm ơn bạnuuuuuuuuuuuuuuuuuuu, điều này chỉ hoạt động
GPrathap

2

Để thêm vào câu trả lời của Jan rằng, không giống như rc.localtệp thông thường , rc-local serviceđược thực hiện không phải sau khi tất cả các dịch vụ đã được khởi động, nhưng sau khi mạng trực tuyến.

Trong một số trường hợp, bạn có thể muốn chạy các lệnh từ rc.localsau này. Ví dụ, tôi muốn nó được thực thi sau khi lxdbắt đầu.

Trong trường hợp này, bạn có thể chỉnh sửa các rc-local servicephụ thuộc khởi động bằng cách tạo tệp conf thả vào: /etc/systemd/system/rc-local.service.d/override.conf với nội dung:

[Unit]
After=network.target lxd.service

Nơi bạn có thể thêm một tên đơn vị cần thiết (như tôi đã thêm lxd.service)

Đừng quên systemctl daemon-reloadsau đó.


Chào mừng bạn đến hỏi Ubuntu! Nếu bạn muốn cải thiện câu trả lời khác, vui lòng đề nghị chỉnh sửa nó. Nếu bạn muốn trình bày một thay thế một phần, vui lòng lặp lại hoặc trích dẫn các phần giống nhau (trong trường hợp câu trả lời ban đầu thay đổi) và làm nổi bật sự khác biệt. Trong mọi trường hợp, đừng tạo ra một câu trả lời mới không đầy đủ ! Cảm ơn bạn.
David foerster
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.