Ubuntu20.04 设置开机自启

1,621 阅读3分钟

一、背景介绍

通常 CentOS、Ubuntu 早期版本Linux系统开机自动加载程序或者脚本,我们都放在 /etc/rc.local 执行。
拿 Ubuntu系统来说,Ubuntu 16.04 版本开始去除了 rc.local 文件,自启动服务方面基本由 systemd 全面接管了。
想要添加一些开机运行的操作只能创建 systemd 服务或者添加 desktop 文件,有点麻烦。
那么在 Ubuntu 20.04 LTS 版本系统中如何实现开机自启动呢?我们通过 systemd 服务来创建它。


二、实现原理

其实,Ubuntu 20.04 系统已经预制了一个叫做 rc-local.service的服务,只不过默认没有执行。我们可以在以下目录中找到该服务文件:

root@360che:~# ll /usr/lib/systemd/system/ | grep rc-

-rw-r--r--  1 root root   716 Apr 21 12:54 rc-local.service

drwxr-xr-x  2 root root  4096 Apr 26 04:29 rc-local.service.d/

root@360che:~# ll /lib/systemd/system/ | grep rc-

-rw-r--r--  1 root root   716 Apr 21 12:54 rc-local.service

drwxr-xr-x  2 root root  4096 Apr 26 04:29 rc-local.service.d/

可能你要问 /usr/lib/systemd/system 和 /lib/systemd/system 有什么区别,我就简单说一下:

1. 区别:

我们看下 /usr/lib/systemd/system 和 /lib/systemd/system 、/etc/systemd/system 这三个目录有什么区别呢。

  • /usr/lib/systemd/system/ 软件包安装的单元
  • /lib/systemd/system 实际就是/usr/lib/systemd/system,因为 /lib 实际是 /usr/lib 的一个软链接,可以通过 ll / 命令察看。

image.png

  • /etc/systemd/system/ 系统管理员安装的单元, 优先级更高

2. 优先级:

systemd的使用大幅提高了系统服务的运行效率, 而unit的文件位置一般主要有三个目录:

/etc/systemd/system
/run/systemd/system
/lib/systemd/system

这三个目录的配置文件优先级依次从高到低,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。

系统安装时,默认会将unit文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:

1)在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。

2)在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入我们自己的配置。推荐这种做法。
/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。

了解了以上信息,我们可以创建一个 systemd 服务,开机执行指定脚本(rc.local)的内容来实现开机自启动。


三、配置实现

将rc-local服务设置为开机自启动(本文操作都在root用户下,或使用sudo)。

1. 首先将rc-local.service文件复制到system目录下

cp /usr/lib/systemd/system/rc-local.service /etc/systemd/system/
  • rc-local.service 最下面增加以下内容:
[Install]

WantedBy=multi-user.target

Alias=rc-local.service

2. 新建rc.local文件

大家不用奇怪,ubuntu20.04中 /etc/ 目录下是没有 rc.local 文件的,需要我们手动建立一个。

touch /etc/rc.local

chmod 755 /etc/rc.local

echo '''#!/bin/bash''' >> /etc/rc.local

设置开机启动rc-local

systemctl start rc-local

systemctl enable rc-local

init 6

重启系统后,通过命令systemctl status rc-local查看服务已经正常开启了。