読者です 読者をやめる 読者になる 読者になる

Ubuntuにおけるinitと起動方法

sysvinit, upstart, systemd, update-rc.d, insserv の関係性・歴史的背景がよくわからなくていろいろ調べたので、メモしておく。

基礎知識

sysvinit とは?

sysvinitはSystemV initの略で,UNIX SystemV(システムファイブ)と呼ばれるAT&T社謹製の古典的なUNIXが採用した起動メカニズムと同じ動作をするように設計されたソフトウェアです。

出典: http://gihyo.jp/dev/serial/01/sc-literacy/0013

upstart とは?

Upstart is an event-based replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.

It was originally developed for the Ubuntu distribution, but is intended to be suitable for deployment in all Linux distributions as a replacement for the venerable System-V init.

出典: http://upstart.ubuntu.com/

systemd とは?

systemd is a suite of basic building blocks for a Linux system. It provides a system and service manager that runs as PID 1 and starts the rest of the system.

出典: http://www.freedesktop.org/wiki/Software/systemd/

これらはいずれも PID 1として動作し、OS起動時に諸々のプロセスを立ち上げる役割を担う。

実際にどう使われるのかを理解するのにはinitとプロセス再起動 - slideshare が役に立った。

update-rc.d とは?

update-rc.d updates the System V style init script links /etc/rcrunlevel.d/NNname whose target is the script /etc/init.d/name

出典: man update-rc.d(8)

insserv とは?

insserv is a low level tool used by update-rc.d which enables an installed system init script (`boot script') by reading the comment header of the script

出典: man insserv(8)

initの調べ方

sysvinit, upstart, systemd のうちどれが使われているか調べてみた。OS は Ubuntu 14.04.2。

root@ubuntu-14:~# dpkg -S /sbin/init
upstart: /sbin/init
root@ubuntu-14:~# /sbin/init --version
init (upstart 1.12.1)
Copyright (C) 2006-2014 Canonical Ltd., 2011 Scott James Remnant

This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Ubuntu 6.10 から upstart が採用されたと https://help.ubuntu.com/community/UbuntuBootupHowto に書かれてたけど、確かにその通り。

起動方法

http://heartbeats.jp/hbblog/2013/06/service-start-stop.html によれば service コマンドを使って起動するのがオススメの様子。

man service(8)

service runs a System V init script or upstart job in as predictable an environment as possible, removing most environment variables and with the current working directory set to /.

The SCRIPT parameter specifies a System V init script, located in /etc/init.d/SCRIPT, or the name of an upstart job in /etc/init. The existence of an upstart job of the same name as a script in /etc/init.d will cause the upstart job to take precedence over the init.d script.

実行ユーザに依存しない環境変数で起動でき、sysvinit と upstart のどちらにも対応ということらしい。

# /usr/sbin/service より一部抜粋

if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
   && initctl version | grep -q upstart
then
   # Upstart configuration exists for this job and we're running on upstart
   case "${ACTION}" in
      start|stop|status|reload)
         # Action is a valid upstart action
         exec ${ACTION} ${SERVICE} ${OPTIONS}
      ;;
      restart)
         # Map restart to the usual sysvinit behavior.
         stop ${SERVICE} ${OPTIONS} || :
         exec start ${SERVICE} ${OPTIONS}
      ;;
      force-reload)
         # Upstart just uses reload for force-reload
         exec reload ${SERVICE} ${OPTIONS}
      ;;
   esac
fi

# Otherwise, use the traditional sysvinit
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
   exec env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
else
   echo "${SERVICE}: unrecognized service" >&2
   exit 1
fi

コードを眺めると、upstart job があればそれを優先するようになってる。

upstart を使ってみる

heartbeats.jp

を参考に、カンタンな設定を書いてみる。

"hello" を /var/log/hello に書き出し、10秒 sleep するというもの。

# /etc/init/hello.conf
description "hello"
author  "kotaroito"

start on runlevel [2345]
stop on runlevel [016]

exec /opt/ruby/bin/ruby -e "puts 'hello'; sleep 10" >> /var/log/hello 2>&1

respawn
respawn limit 10 5
$ sudo service hello start

で起動する。

まとめ

  • Ubuntu 6.10 以降は upstart が標準 となった
  • 設定ファイルは /etc/init/*.conf で runlevel も書ける
  • 手動でプロセスを上げる時は service コマンドを使うとよい