助け合いフォーラム
正解
runlevel3.target
multi-user.target
解説
これらのターゲットは「/lib/systemd/system」配下に格納されています。また、SysVinitとの関連がわかりやすいように、runlevel0.target〜runlevel6.targetまでのシンボリックリンクも用意されています。
サーバとして動作させる際は、ランレベル3(multi-user.target)を指定します。ランレベル5でも必要なサービスを起動させることは可能ですが、グラフィカルログインやデスクトップを制御するプロセスも起動させるため、サーバとして稼働するには無駄なリソースを使用してしまいます。
よって正解は
・multi-user.target
・runlevel3.target
です。
その他の選択肢については以下のとおりです。
・runlevel1.target
シングルユーザーモード(ランレベル1)に相当するターゲットです。サーバとして動作するのに必要なサービス群も起動しないターゲットのため、誤りです。
・graphical.target
・runlevel5.target
グラフィカルログイン(ランレベル5)に相当するターゲットです。上記の通り無駄なリソースを使用してしまうターゲットのため、誤りです。
・server.target
そのようなターゲットはないため、誤りです。
参考
systemdで扱う処理はUnitという単位で管理します。Unitは設定ファイルであり、Unitの設定に従ってsystemd自体が処理を実行します。SysVinitのようにスクリプトを実行するわけではありません。
Unitには各機能ごとに拡張子が割り当てられており、拡張子を見ることでどういった機能のためのUnitかが判別できるようになっています。
また、SysVinitではプロセスをPIDによって管理していましたが、systemdではcgroupsというLinuxカーネルの機能によってプロセスのリソースを管理できます。
systemdはUpstartと同様、各サービスを並列起動することができます。そのため、順次起動していくSysVinitに比べて高速なシステム起動や停止が行えます。
システム起動時に最初に読み込まれるUnitは「/etc/systemd/system/default.target」です。「default.target」をSysVinitでのランレベルに相当するUnitへのシンボリックリンクとして作成することで、期待するサービス群を起動できるようになります。
シンボリックリンクとは、Windowsでのショートカットのようなもので、元ファイルの場所を指し示すリンクの事です。シンボリックリンクが持っている情報は「元ファイル(ディレクトリ)がどこにあるのか」というパス情報のみです。
シンボリックリンクを作成するにはlnコマンドに「-s」オプションを付加して作成します。(書式:ln -s 元ファイル リンクファイル)
SysVinitのランレベルとsystemdのターゲットは以下のように対応しています。
これらのターゲットは「/lib/systemd/system」配下に格納されています。また、SysVinitとの関連がわかりやすいように、runlevel0.target〜runlevel6.targetまでのシンボリックリンクも用意されています。
ランレベル3:マルチユーザーモード(テキストログイン)からランレベル5:マルチユーザーモード(グラフィカルログイン)に切り替えるには以下のようにdefault.targetを切り替えます。
各サービスの稼働状況や起動設定を管理するにはsystemctlコマンドを使用します。systemctlコマンドの書式は以下のとおりです。
systemctl サブコマンド [ Unit名 ]
※Unit名に拡張子がない場合、.serviceの拡張子を持つUnitが指定されたものとみなされます
主なサブコマンドの一覧
実行例:Webサービスの自動起動設定と、手動起動
上記実行例を見ると、「/usr/lib/systemd/system/httpd.service」のシンボリックリンクが「/etc/systemd/system/multi-user.target.wants/httpd.service」に作成されているのがわかります。これは、systemdが .target Unitの実行時に、「/etc/systemd/system/[実行ターゲット名].wants」ディレクトリを参照し、格納されているUnitを自動起動するようになっているためです。例えばgraphical.targetを実行する場合、「/etc/systemd/system/graphical.target.wants」ディレクトリを参照します。
上記実行例の場合、multi-user.targetの起動時にhttpd.serviceというWebサービスを制御するUnitが実行されるように、systemctlが自動でシンボリックリンクを「/etc/systemd/system/multi-user.target.wants/」配下に作成しています。
自動起動設定がどのターゲットに対して有効となるかは、各Unit定義ファイルに記述されています。httpd.serviceファイルの中では、以下のとおりmulti-user.targetで有効となるよう[WantedBy]項目に記述されていることがわかります。
サービスの自動起動を無効にすると、作成されたシンボリックリンクが自動で削除されます。
参考URL
ランレベルとtargetの対応関係
この問題で解説されているランレベルとtargetとの関係について、いくつかわからない点が
あったので、教えて下さい。
①解説の冒頭に、ランレベルとtargetの対応表があります。
この表では、ランレベル2~4と5が区別されているため、Debian系のランレベルではなく
RedHat系のランレベルを意味していると理解したのですが、正しいでしょうか。
②RedHat系のランレベルでは、4は未使用とされているかと思います。
それにもかかわらず、「/lib/systemd/system」配下にrunlevel4.target
があるのは、どの様な理由でしょうか。
③multiuser.targetが対応するランレベルは2,3,4とされていますが、別の問題のランレベルの解説では
2 マルチユーザモード(テキストログイン、NFSなし)
3 マルチユーザモード(テキストログイン)
4 未使用
とされており、2,3,4には違いがあるとされています。
ランレベル2,3,4に違いがあるのであれば、「multiuser.targetが2,3,4に対応する」
というのは矛盾があるので、2,3,4のうち、どれがひとつのランレベルに対応するという
ことになると思うのですが、正しいでしょうか。
④上記③の理解が正しい場合、multiuser.targetは、どのランレベルと対応するのでしょうか。
ご存じの方がおられたら、教えて下さい。
宜しくお願いします。
①この解説の表は「RedHat系のランレベル」
そうだと思います。
②「/lib/systemd/system」配下にrunlevel4.targetがある理由
互換性のためと、ユーザが使いたいときに使えるようにしておくためでしょうね。
Red Hat系のディストリビューションでは、ランレベル4は基本的に未使用ですが、ユーザが自由にカスタムして使われることが想定されているみたいです。
③と④ランレベルとtargetの対応について
まず、systemdは内部的にtargetベースで制御されています。
ただ、従来のユーザはランレベルで指定したいので、その人達がランレベルを指定した場合には、「ターゲットを利用して、それらしく制御」しています。
なので「multi-user.targetがどのランレベル相当か」という問いに対しては、
「ランレベル2もそうだし、ランレベル3も4もそうだよ。でも最も一般的なのはランレベル3だね」
という答えになってしまうのは正しい。
※Debian系ver「ランレベル2もそうだし、3も4も、5もそうだよ。でも最も一般的なのはランレベル2だね」
逆に「runlevel2~5がそれぞれどのターゲットか」という問いに対しては、以下のように個別に正確に答えることが可能です。
runlevel2.target → multi-user.targetと関連付けられています。
runlevel3.target → multi-user.targetと関連付けられています。
runlevel4.target → デフォルトではmulti-user.targetに対応しているようです。
runlevel5.target → graphical.targetと関連付けられています。
※Debian系では、ランレベル2~5が全てmulti-user.targetにマッピングされています。
コメント
この投稿に対して返信しませんか?
k kz5835
2023/07/19 23:17
m7jgc様 丁寧な解説、誠に有難うございます。 お忙しいところ恐縮ですが、もうすこし、質問させてください。 [1] 手元の環境で見てみますと、runlevel2(~4).targetは multi-user.targetへのシンボリックリンクの様でした。 このことから ご回答の最後の「multi-user.targetと関連付けられています。」 は、「multi-user.targetへのシンボリックリンクである。」 という意味で、実態としては runlevel2(~4).targetは、multi-user.targetそのものである というご指摘かと思ったのですが正しいでしょうか。 [2] 本サイトで、ランレベルの2と3は、NFSができない、できるの違いがあると 解説されていると思っております。 「ランレベル2もそうだし、ランレベル3も4もそうだよ。でも最も一般的なのはランレベル3だね」 の情報からすると、multi-user.targetは、本サイトのランレベルの 解説の言い方でいうとランレベル3の「テキストログイン/NFSあり」になる と思ったのですが、正しいでしょうか。 可能であれば、教えて下さい。 宜しくお願いいたします。