Centos开机启动脚本执行过程

本文详细介绍了CentOS系统的启动过程,从加载内核到执行init程序,再到各个运行级别的初始化脚本及其执行顺序。特别关注了rc.local脚本在启动序列中的实际位置,并通过实验验证了其并非最后一个执行的脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Centos开机启动主要过程如下:      

     找到系统引导分区,执行引导程序,加载内核 

      执行init程序 
      /etc/rc.d/rc.sysinit # 由init执行的第一个脚本 
      /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式 ,服务器的运行级别为3
      /etc/rc.d/rc.local     #相应级别服务启动之后、再执行该文件(其实也可以把需要执行的命令写到该文件中)
      /sbin/mingetty # 等待用户登录 

      在Redhat/Centos中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括: 
      调入keymap以及系统字体 
      启动swapping 
      设置主机名 
      设置NIS域名 
      检查(fsck)并mount文件系统 
      打开quota 

      装载声卡模块,设置系统时钟等等。 

       /etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx 从小到大来执行。(其中xx是数字、表示的是启动顺序)例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用 /etc/rc.d/rc3.d/下的脚本。

  值得一提的是,Redhat/Centos中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。(对此提出了疑问,见后面的:rc.local不一定是最后执行的脚本

lrwxrwxrwx 1 root root 11 Apr 12 14:26 S99local -> ../rc.local

init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。 至此,LINUX的启动结束。

Linux系统有7个运行级别,他们各自的含义是:

   第0级  关闭系统

   第1级  单用户模式

   第2级  没有网络多用户模式

   第3级  有网络多用户模式

   第4级  系统保留

   第5级  有网络和图形的多用户模式

   第6级  重启系统


在centos中,rc.local不应是最后一个启动脚本。

centos运行级别为3,在/etc/rc3.d中存在S99local和S99smartd 这两个文件。

lrwxrwxrwx 1 root root 11 Apr 12 14:26 S99local -> ../rc.local
lrwxrwxrwx 1 root root 16 Apr 12 14:26 S99smartd -> ../init.d/smartd

根据启动规则(启动的先后与文件名S之后的数字有关,数字越大,启动的顺序越靠后),rc.local比smartd先执行,为了验证这个猜想,在这两个脚本中分别添加下面的两个语句

 echo "rc.local"`date` >> /test

echo "smartd"`date`>> /test

/test结果为:

 smartdThu Jun 20 17:43:56 CST 2013
 rc.localThu Jun 20 17:45:21 CST 2013
 smartdThu Jun 20 17:45:21 CST 2013

可以发现smartd执行了两次,一次是在关机的时候,一次是在rc.local执行之后。rc.local不一定是最后一个执行的脚本,虽让rc.local中给出了如下注释

 #!/bin/sh

  2 #
  3 # This script will be executed *after* all the other init scripts.
  4 # You can put your own initialization stuff in here if you don't
  5 # want to do the full Sys V style init stuff.
  6 
  7 touch /var/lock/subsys/local


 rc3.d中文件名为S开头时,传入的启动参数为start;rc3.d中文件名为S开头时,传入的启动参数为stop。系统先执行Kill脚本(以S开头),后执行start脚本(以S开始)。



  
### CentOS 7.9 设置开机启动脚本方法 #### 编辑 `/etc/rc.d/rc.local` 文件实现开机启动 对于希望在系统启动时自动执行特定命令或脚本的情况,可以编辑位于 `/etc/rc.d/rc.local` 的文件,在该文件末尾追加相应的启动指令[^2]。 ```bash sudo vi /etc/rc.d/rc.local ``` 向此文件中加入想要于开机运行的具体命令。为了确保权限正确无误,还需赋予可执行权限: ```bash sudo chmod +x /etc/rc.d/rc.local ``` #### 利用 `crontab` 实现服务的开机自启配置 另一种方式则是通过 `crontab` 来设定定时任务以达成相同目的。具体操作如下所示:先打开用户的 cron 表单进行编辑: ```bash crontab -e ``` 随后添加一行用于指定程序或脚本路径以及触发条件(@reboot表示重启后立即执行),例如: ```bash @reboot /path/to/script.sh ``` #### 创建 Systemd Service Unit File 启动 MongoDB 或其他应用实例 针对某些应用程序如 MongoDB ,更推荐创建 systemd service unit file 完成其开机自启设置。这涉及到新建一个 `.service` 文件并放置到 `/etc/systemd/system/` 下面[^3]。 假设已经下载好 MongoDB 并解压至合适位置,则需按照官方文档指导构建对应的 .service 配置文件;之后利用 systemctl 命令管理服务状态: ```bash sudo nano /etc/systemd/system/mongodb.service ``` 内容可能类似于下面这段定义: ```ini [Unit] Description=MongoDB Database Server After=network.target [Service] User=mongod ExecStart=/opt/mongodb/bin/mongod --config /etc/mongodb.conf [Install] WantedBy=multi-user.target ``` 完成上述步骤后记得刷新守护进程配置,并启用新添加的服务以便下次引导时加载它: ```bash sudo systemctl daemon-reload sudo systemctl enable mongodb ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值