Init.d 命令及 Linux 启动

Linux 引导教程

  • 内核的引导

    当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

  • 运行 init,运行第一个程序 /sbin/initv

    • init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

    • init 程序首先是需要读取配置文件 /etc/inittab

    • 许多程序需要开机启动。在Linux就叫做”守护进程”(daemon)。

    • init进程的一大任务,就是去运行这些开机启动的程序。

    • Linux允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别”(runlevel)。根据”运行级别”,确定要运行哪些程序。

    • Linux系统有7个运行级别(runlevel):

    命令 说明
    运行级别0 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
    运行级别1 单用户工作状态,root权限,用于系统维护,禁止远程登录
    运行级别2 多用户状态(没有NFS)
    运行级别3 完全的多用户状态(有NFS),登录后进入控制台命令行模式
    运行级别4 系统未使用,保留
    运行级别5 X11控制台,登录后进入图形GUI模式
    运行级别6 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
  • 系统初始化 在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

  • 建立终端

  • 用户登录系统

Init.d 命令

  • 我们所有的服务,都是存放在 /etc/init.d 这个目录下。

  • 通过 service 命令,就能实现对 /etc/init.d 里面所有程序进行状态管理。

命令 说明
service nginx status 服务的状态
service nginx start 启动服务
service nginx stop 暂停服务
service nginx restart 重启服务
  • /etc/rc.local 这是一个开机之后会执行的初始化文件,它非常的好用。如果你有什么程序、脚本,想要让它 开机之后自动启动,那么只需要把想要执行的命令写入到这个文件中。

开机自启动脚本

  1. 方法1

    • 新建个脚本文件a.sh

        #!/bin/bash
        date >> /home/alvin/output.txt
        hostname >> /home/alvin/output.txt
      
    • 退出后,再赋予可执行权限

        chmod +x a.sh
      
    • 把脚本添加到 /etc/rc.d/rc.local 文件最后一行

        vim /etc/rc.d/rc.local
        /home/alvin/a.sh
      
    • 直接重启就可以试试效果了。

  2. 方法2,使用 crontab

    crontab 是 Linux 下的计划任务,当达到设定的时间,自动触发脚本的运行。 编写计划任务时间对应的脚本。@reboot ,这个任务就是在系统重启之后自动运行某个脚本。我们可以通过 crontab -e 来设置。

         crontab -e
         @reboot /home/alvin/a.sh
    
  3. 方法3,使用 systemd 服务

    • 运行 ps aux 命令,查看 pid 为 1 的进程是不是 systemd
    • 在 /etc/systemd/system 目录下创建 .service 文件,

        vim auto_a.service
      
        [Unit]
        Description=Run a Custom Script at Startup
        After=default.target
      
        [Service]
        ExecStart=/home/alvin/a.sh
      
        [Install]
        WantedBy=default.target
      
    • 完成后更新 systemd 配置文件,并启动服务

        systemctl daemon-reload
        systemctl enable a.service
        systemctl status a.service