Blog·Tanky WooABOUTTAGSRSS

init 是Linux内核加载后执行的第一个进程, 是所有程序的父进程. 使用pstree -lp可以看到init(1)位于数的最顶级.

init常见的有三种程序: SysVinit, Upstart, Systemd

SysVinit

SysVinit (System-V style init) 是一个传统的初始化进程.

首先读取 /etc/inittab 文件. 如果文件内容修改, 可以通过 telinit q重新读取加载.

配置在 /etc/rcX.d/ (X表示运行级别)下, 比如nginx服务:

$ ls -l /etc/rc*.d/*nginx
lrwxrwxrwx 1 root root 15 May 19 13:51 /etc/rc0.d/K20nginx -> ../init.d/nginx
lrwxrwxrwx 1 root root 15 May 19 13:51 /etc/rc1.d/K20nginx -> ../init.d/nginx
lrwxrwxrwx 1 root root 15 May 19 13:51 /etc/rc2.d/S20nginx -> ../init.d/nginx
lrwxrwxrwx 1 root root 15 May 19 13:51 /etc/rc3.d/S20nginx -> ../init.d/nginx
lrwxrwxrwx 1 root root 15 May 19 13:51 /etc/rc4.d/S20nginx -> ../init.d/nginx
lrwxrwxrwx 1 root root 15 May 19 13:51 /etc/rc5.d/S20nginx -> ../init.d/nginx
lrwxrwxrwx 1 root root 15 May 19 13:51 /etc/rc6.d/K20nginx -> ../init.d/nginx

K(Kill)表示关闭, S(Start)表示运行, 数字20表示优先级.

Ubuntu 使用update-rc.d命令可以管理启动项:

  • update-rc.d xxx remove 删除启动项
  • update-rc.d xxx enable|disable 开启/关闭 启动项, 必须在有启动项软链接时才可用
  • update-rc.d xxx defaults 加入到启动项(默认级别)

另外通过service命令来控制SysV服务的启动,停止及状态查看 (service runs a System V init script or upstart job in as predictable environment as possible).

service --status-all 可以查看所有SysVinit和Upstart的服务状态

Centos 使用chkconfig命令.

Upstart

Upstart是基于事件(event-based)的初始化进程. 官方主页

最开始是给Ubuntu设计的, 后来也被一些其它发行版使用. 不过Ubuntu 和 Debian 也在逐步考虑迁往 systemd.

管理命令是 initctl, 显示的是/etc/init下的启动配置.

  • initctl start xxx

  • initctl stop xxx

  • initctl status xxx

  • initctl list

  • initctl show-config xxx 可以查看job的详细配置

    $ initctl show-config ssh ssh start on (filesystem or runlevel [2345]) stop on runlevel [!2345]

另外 initctl start 等可以简写为 start, 后者是前者的软链接:

$ ls -al `which start`
lrwxrwxrwx 1 root root 7 Mar 12 06:54 /sbin/start -> initctl

另外ubuntu下upstart兼容sysvinit, 具体可以看看这篇文章 Ubuntu init启动流程分析

Systemd

为了感受下systemd, 专门装了一个Centos7.

原来的chkconfig仅仅管理了一点遗留的服务, 其余都是通过systemctl来管理.

关于这几个init程序的优缺点等, 暂时还没有太多的感受, 尤其systemd, 后续还得慢慢了解, 再补充.

参考