
# CentOS 7中/etc/rc.local开机启动脚本不生效怎么办？
#### 问题现象
CentOS 7、EulerOS操作系统云服务器中，/etc/rc.local开机启动脚本不生效。
本节操作以CentOS 7操作系统为例分析根因，并介绍解决方法。
#### 根因分析
出现该问题的可能原因如下：
- CentOS 7中/etc/rc.d/rc.local文件没有执行权限。解决方案请参考[处理方法1]。
  ![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/note_3.0-zh-cn.png)
  /etc/rc.local为/etc/rc.d/rc.local的软链接
  ![](https://support.huaweicloud.com/trouble-ecs/zh-cn_image_0201114278.png "点击放大")
  
- /etc/rc.local配置路由重启不生效的场景，是由于添加路由依赖网络服务，而在CentOS 7系统启动过程中内核读取rc.local时网络服务尚未启动，导致添加路由失败。解决方案请参考[处理方法2]。
 
 #### 处理方法1
针对/etc/rc.d/rc.local文件没有执行权限导致开机启动脚本执行失败的场景，解决方案如下。
![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/note_3.0-zh-cn.png)
CentOS7中该文件默认没有可执行权限
1. 查看/etc/rc.d/rc.local是否有执行权限 **ls -l /etc/rc.d/rc.local**
   ```
   -rw-r--r-- 1 root root 473 Sep 14 02:19 /etc/rc.d/rc.local
   ```
   如回显信息所示该文件没有执行权限，需要为/etc/rc.d/rc.local添加可执行权限。
   
2. 执行以下命令为/etc/rc.d/rc.local添加可执行权限 **chmod +x /etc/rc.d/rc.local**
   
 
 #### 处理方法2
针对/etc/rc.local配置路由重启不生效的场景，解决方案如下。
**方法一**：不使用/etc/rc.local配置路由，改为将路由写入静态路由配置文件（该方法即使重启网卡路由也不会丢失）。
1. 在/etc/sysconfig/network-scripts/目录中创建或修改route-\<interface\>文件。
   该目录\<interface\>是与路由相关的接口的名称。
   ```
   <network/prefix> via <gateway>
   ```
   其中\<network/prefix\>是带有前缀的远程网络，\<gateway\>是下一跳的IP地址。
   例如，要添加一条通过192.168.100.10到10.20.30.0/24网络的路由，以便在eth0启用时都处于活动状态：
   **cat /etc/sysconfig/network-scripts/route-eth0**
   ```
   10.20.30.0/24 via 192.168.100.10
   ```
   
2. 执行以下命令，使修改生效。 **ifup eth0**
   
**方法二**：/etc/rc.d/rc.local开机启动脚本由rc-local服务引导执行，可以修改在network-online.target后启动该服务。
1. rc-local服务配置路径为/usr/lib/systemd/system/rc-local.service。 执行以下命令，在\[Unit\]模块中添加或修改Requires和After项值为network-online.target。
   **cat /usr/lib/systemd/system/rc-local.service \|grep -v "\^#"**
   修改内容如下：
   ```
   [Unit]
   Description=/etc/rc.d/rc.local Compatibility
   ConditionFileIsExecutable=/etc/rc.d/rc.local
   Requires=network-online.target
   After=network-online.target
   [Service]
   Type=forking
   ExecStart=/etc/rc.d/rc.local start
   TimeoutSec=0
   RemainAfterExit=yes
   ```
   ![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/note_3.0-zh-cn.png)
   network-online.target是主动等待直到网络"启动"的target，其中"启动"的定义由网络管理软件定义。通常，它表示某种已配置的、可路由的IP地址。其主要目的是主动延迟服务的激活，直到建立网络为止。
   
2. 执行以下命令，确认/etc/rc.d/rc.local有执行权限。 **ls -l /etc/rc.d/rc.local**
   如果显示没有可执行权限，请参考[处理方法1]处理。
   
3. 通知systemd重新加载配置文件。 **systemctl daemon-reload**
   
4. 重启rc-local.service，使/etc/rc.d/rc.local脚本立即生效。 **systemctl restart rc-local.service**
   
 
