Linuxの起動時にコマンドやプログラムを自動で実行したい場合どうするか? Windowsだとスタートアップに入れて終了だが、Linuxでは方法が違う。
このページでは、Linuxの起動時にプログラムを自動実行させる方法についてお伝えする。細かいところまで解説を行ったので、自動起動に関してはここのページで必要知識を網羅できるだろう。
目次
Linuxの自動起動
現在、Linuxのシステム起動には2種の方法が混在している。
SysVinit系とsystemdの2種類だ。古くて安定的に動いているものはSysVinit系が多く、現場ではこちらに出会う確率が高い。
しかし、最近出た新しいディストリビューションでは新しいsystemdが採用されている。
- CentOS 7
- SUSE Linux Enterprise Server 12
- Fedora 15以降
- Ubuntu 15
などのディストリビューションはsystemdが使われている。
それぞれ起動の方法が違うため、両方を分けて見ていこう。まずはSysVinit系だ。
SysVinit系の自動起動
SysVinitはUNIX系のOSで広く使われてきた起動システムだ。こちらの方が現場ではまだまだ現役で使われていることが多い。
SysVinit系の起動プロセス
まずはそもそもの起動プロセスを少々ご説明しよう。
- 電源が入る
- BIOSが起動し、ハードウェアを初期化
- ブートローダが起動し、Linuxカーネルをメモリ上に展開する
- Linuxカーネルが起動
- ドライバなどがロードされ、最後にinitプロセスを起動
- 指定されたランレベルに応じた起動処理を実行
- ログインを受け付け開始
これが基本的な起動プロセスだ。initプロセスの中で自動起動を設定することになる。
設定ファイル
自動起動の設定ファイルは次のとおりだ。目的に合わせて編集するといい。もっと簡単なコマンド操作は次の項目でお伝えするので、そこに飛んで見て頂いても構わない。
/etc/rc.sysinitファイル
ファイルシステムのマウントなど基本的な処理を担当するファイルだ。内部はシェルスクリプトになっている。
ランレベルに関わらず実行されるスクリプトだ。RedHat系のディストリビューションでは/etc/rc.d/rc.sysinitのシンボリックリンクになっている。
/etc/rc0.d 〜 rc6.d ディレクトリ
ランレベルごとの起動スクリプトが配置されている。例えばランレベル3のときは、/etc/rc3.dディレクトリ以下のスクリプトが実行される。
/etc/init.dディレクトリ以下の起動スクリプトシンボリックリンクをこのディレクトリに入れれば自動起動する。
実際の中身を見てみよう。
Sではじまるものと、Kではじまるものがあるのに気がつくだろう。
ファイル名がS(Start)で始まるスクリプトは、そのランレベルになったときに開始されるスクリプトだ。ファイル名がK(Kill)で始まるスクリプトはそのランレベルになったときに終了されるサービスだ。
ファイル名を変更すれば自動起動するように設定ができる。
# mv /etc/rc3.d/K60nfs /etc/rc3.d/S60nfs
これだけでOKだ。
/etc/rc.local
起動時に実行するホスト固有の処理を書いておくスクリプトだ。
ここに書いておくことで、独自のコマンドやスクリプトを実行することができる。
chkconfigコマンド
より簡単にコマンドで設定をする方法をご紹介しよう。chkconfigコマンドを使用することでデフォルトで起動するサービスを設定することができる。
chkconfig --list
システムサービスの一覧を表示するにはchkconfig --listと入力する。chkconfigコマンドのみでも同じように動作する。
# chkconfig
0〜6の数字はランレベルだ。ランレベルによって、自動起動するサービスには「on」が、起動しないものには「off」が記述されている。
chkconfig on
chkconfig [--level ランレベル] サービス名 on
自動起動するには上のコマンドを使用する。httpdを自動起動onにするには、
# chkconfig httpd off
ランレベルを指定するには --levelオプションを使う。
# chkconfig --level 3 httpd on
複数のランレベルを同時に設定したければ、
# chkconfig --level 345 smb off
となる。
また、そもそもサービス一覧に表示されていない場合、
# chkconfig --add サービス名
で追加できる。削除は、
# chkconfig --del サービス名
だ。
systemd系の自動起動
続いてsystemd系の自動起動について見ていこう。こちらは新しいディストリビューションに搭載されているものだ。
この先、実際の現場で出会うことも多くなっていくはずなのでチェックしておいたほうがいいだろう。
systemdはこれまでのSysVinit系と大分違う。サービス起動スクリプトで定義されていたものがUnitという形になる。サービスを管理するというより、Unitを管理するという形だ。
systemd系の起動プロセス
次のプロセス順序で起動していく。
- 電源が入る
- BIOSが起動し、ハードウェアを初期化
- ブートローダが起動し、Linuxカーネルをメモリ上に展開する
- Linuxカーネルが起動
- ドライバなどがロードされ、systemdプロセスを起動
- default.targetというUnitが処理される
- システムの用途に適したターゲットが処理される
- ログインを受け付け開始
これが基本的な起動プロセスだ。default.target(/etc/systemd/system/default.target)は他のターゲットへのシンボリックリンクとなっている。
サービスの起動
systemdではsystemctlコマンドを使ってサービス(Unit)を管理する。
例をあげると次のようになる。
従来(SysVinit)# /etc/init.d/httpd start
systemd# systemctl start http.service
有効化されているUnitの一覧は次のコマンドで表示できる。実際には、systemctlコマンドだけでも同じものが表示される。
# systemctl list-units
インストールされているUnitファイルの一覧を表示するにはlist-unit-filesオプションを利用する。yumでhttpdをインストールすると次のようになる。
サービスの自動起動
自動起動に関してもこちらのコマンドを利用する。
自動起動設定systemctl enable サービス名.service
自動起動解除systemctl disable サービス名.service
下記のコマンドになる。
# systemctl enable httpd.service
これでhttpdサービスが自動起動するようになる。見ての通りシンボリックリンクがはられているのがわかるだろう。
起動の確認には、
$ systemctl list-unit-files | grep httpd
などでも構わないが、
systemctl is-enabled サービス名.service
でも確認ができる。
その他サブコマンド
systemctlの他のサブコマンドも含めて一覧で紹介しておこう。
- start:サービスの起動
- stop:サービスの終了
- restart:サービスを再起動
- reload:サービスの設定をもう一度読み込む
- status:サービスの状況を表示する
- enable:サービスが自動的に起動するようにする
- disable:サービスが自動的に起動しないようにする
- list-unit-files:すべてのUnitを表示する
SysVinit系と大分変わってきているが、今後の主流になる方法論だ。この機会にマスターしておいて損はない。
まとめ
Linuxの自動起動についてSysVinit系、systemd系共にまとめてみた。SysVinitからsystemdに代わり、サービスの起動は大きく代わっていることもぜひ覚えて押してほしい。
まずはあなたが使っているディストリビューションがどちらを使っているか把握し、それからコマンドを叩いて自動起動を設定しよう。
コメント