systemdに関する世界観です。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
また、サーバーはデーモンと呼ばれるシステムに常駐するプログラムによって一度に一回実行するコマンドではなく、システムで常にサービスを提供するが、これの管理にはsystemdと呼ばれる仕組みを用いる。
以前はSysV initと呼ばれるプログラムとrcスクリプトによって設定を行っていたが、現在はinitに「デーモンの並列起動処理ができない」という問題があり、systemdが使われることが多い。
FreeBSDなどの*BSD系UNIXでは、SysV initではなくrc.confと呼ばれる、ひとつの設定ファイルにおいてinit処理を行う。
以前のrcスクリプトでは、デーモンごとに起動を行う起動スクリプトがあり、スクリプトへのシンボリックリンクに番号をつけることで順番を管理していたが、これでは並列で起動処理を行うことができず、現在のマルチコアプロセッサにおいては起動が遅くなる。
そのため、systemdではUnitファイルを用いて、可能な限り並列で起動する。
同時に、systemdはinitの代替以外にも多くの機能を提供し、たとえばコマンドを定期的に実行するcrondや、システムロガーなどの代わりにもなる。
systemdは「新しいLinuxの管理の中心」ともいえるシステムであり、複雑であるため賛否の両論があるが、現在のLinuxの管理機構の中心となっている。
Linux initとデーモンも参照のこと。
複雑怪奇だと言って、何かと嫌われているsystemd。僕もそんなに好きではない。並列処理が可能なため速く、サービスの開始・停止などをスクリプトではなく、systemdの標準機能として行える。サービスの設定などはUnitファイルと呼ばれる、シェルスクリプトよりも単純でシンプルな設定ファイルから行える。
柔軟で動的な管理が可能ということだが、いかんせん複雑だ。
Debianから派生したDevuanのように、systemdを取り除いて、さまざまなinitアーキテクチャを選べるようにしたディストリビューションも存在する。
後日注記:現在のマルチコアプロセッサが普通になった64bit CPU環境では、従来の順次起動しかできないSysV initは時代遅れであり、並列処理が可能なsystemdは大幅な起動時間の削減に繋がる。これは悪いことではない。
僕が感じることとして、systemdはただの複雑さ・相互依存のオンパレードではない。「Linux界の設定・管理の中心的存在」になろうとしているのである。
systemdは、System VやMulticsの失敗を繰り返していると良く批判されるが、systemdのやりたいことは、「Linuxシステム管理で、新しい中心的なリーダー」になろうとしている、ということである。
複雑とは言われるが、systemdのUnitファイルはSysV initよりもシンプルである。これは、シェルスクリプトではなくさまざまなsystemdの機能の下での「設定ファイル」を使うことで、システムアーキテクチャとしての「シンプルかつ高機能性」を目指しているところがある。
批判について知りたい方は、有名な以下のサイトやWikipediaを参照のこと。
最近のLinuxを見ていると、まるで「Linuxの管理=systemd」である。
今までのLinuxの管理の方法を一掃し、「ディストリビューションの間で違っていたさまざまな管理の手法」は、全てsystemdに置き換わろうとしている。
そして、多くの開発者や管理者も、それを受け入れている。「systemdは確かに巨大なソフトウェアスイートで、Linuxの管理全てを支配するソフトウェアだが、今までのLinuxよりはマシ」ということになろうとしている。
これは必ずしも悪いことではない。今のLinuxの管理はsystemdそのものである。systemdを学んでおけば、Linuxの管理ができるようになる。カーネルやシステムとアプリケーションを繋ぐ「ノリ」の役割は全部systemdにさせる、というのが今の「ナウいLinuxの管理」である。
よく似ているものとして、ネットワークの設定に使うNetworkManagerが挙げられる。Linuxはどんどん作り変えられようとしている。
systemdには、とても批判的な意見が多い。
たとえば、Slashdotの以下のような記事を見ると、systemdが「古きよきUNIXの慣習を全部壊している」という意見を見ることができる。
systemdでは、Linuxカーネルが起動するとPID=1でsystemdが起動する。systemdは正しい順序関係(これより前・後に実行しなければならないとする設定)を計算してそれぞれのUnitを起動する。順序関係のないUnitはすべて並列で起動される。
以下のページが参考になります。
システム標準のUnitファイルは/usr/lib/systemd/system/にある。管理者が自分で設定するには/etc/systemd/system/にUnitファイルを置く。順序関係とは別に依存関係という概念があることがポイントか。
以下のページが参考になります。
Linuxファイルシステム階層も参照のこと。
systemctlコマンドは、enable(有効化)、disable(無効化)、is-enabled(有効・無効の確認)、start(起動)、status(状況の表示)、show(状況の表示2)、stop(停止)、reload(設定の再読み込み)、restart(再起動)と使う。
たとえば、
# systemctl start httpd.service
.serviceは省略できる。
# systemctl start httpd
httpdをシステム起動時に起動するには以下のようにする。
# systemctl enable httpd
systemdでは、ログの参照にはless /var/log/syslogではなくjounalctlを使用する。
UNIXシステム管理(システムロガー)も参照のこと。
systemdでは、cronの代わりにsystemd timerを使うことができる。
UNIXシステム管理(cron)も参照のこと。
systemdでは、localectlでロケールを設定できる。
UNIXシステム管理(タイムゾーンとロケール)も参照のこと。
systemdでは、networkdでネットワークを設定できる。
Linuxネットワーク(設定)も参照のこと。
udevは/devディレクトリ以下にあるデバイスファイルを自動的に作成するユーザーレベルのLinuxの機構。
以下のような記事もあるように、最近のudevは完全にsystemdと統合されている。
Linuxデバイスファイルも参照のこと。
systemdはGNOMEなどとも統合されており、「今までのLinuxは何だったのだ」というぐらい、systemdによってLinuxシステム管理の方法は変わっている。激変ではないが、多くがsystemdによってリプレースされようとしている。systemdへの「複雑で巨大だ」という批判は、こうした理由から起きているのかもしれない。
systemdが嫌いな方は多い。多くの人が、Linuxを棄て、systemdのないBSDなどの別のUNIXに逃れようとしている。
たとえば、Devuanというプロジェクトでは、Debian GNU/Linuxからsystemdを排除し、「色んなRCシステムが使えるように選択肢を与える」という発想をしている。Arch LinuxベースでもArtix Linuxというsystemdを排除したArch系ディストリビューションが開発されている。
また、GentooはOpenRCと呼ばれるBSDライクだが独自なRCシステムを開発している。GNOMEなどからも、systemd依存の部分を書き直したりしている。
ただし、これらのプロジェクトは、多くの場合アップストリームに対するパッチになってしまい、保守や維持、メンテナンスと追従が大変である。
そこで、良い選択肢がある。OpenBSDである。最近、OpenBSDが新しいUNIXの選択肢として注目されている。特に、GNOMEなどを排除し、OpenBSDでXfceなどを使う方が増えている。
Debian GNU/LinuxやArch LinuxやGentooやOpenBSDも参照のこと。
systemdに代わるinitシステムとして、OpenRC, runit, S6などがある。
OpenRCは、Gentoo Linuxで使われていることで有名。また、runitはいろいろと人気である。また、S6は独自の面白い設計思想を持っている。
Void Linuxも参照のこと。
Ubuntuによるinitの代替。昔は採用するディストリビューションが多かったが、今ではsystemdが事実上の標準になって衰退した。
Ubuntuも参照のこと。
僕が思うに、Linuxは一度全部最初から作り直してもいいのかもしれないと思います。
たとえば、ファイルシステム階層などは、FHSから逸脱したGoboLinuxのようなディストリビューションが誕生しています。
また、X11のようなウィンドウシステムは、ネットワーク透過の機能があるなど、前時代的で、今のモダンなOSのディスプレイサーバとしては相応しくありません。そのため、新しいWaylandなどが開発されています。
このように、UNIXのシステムは古くなってきており、そろそろ一度すべて作り直すような、新しいアップデートが必要となってきています。
そして、systemdは、まさにこのような「Linuxの管理方法を刷新する」という意味で、新しい試みだと思います。
確かに、「systemdはUNIXの古き良き文化を壊している」とは言えるでしょう。たとえば、ホームディレクトリ管理で、ユーザー情報をJSONレコードにするなどはありえないと感じられるかもしれません。ですが、systemdの開発者は、もっと遠くを見ています。UNIXのおかしな慣習を改め、Linuxをモダンでまともな最先端のOSにしようとしているのです。
また、systemdのいい点があるとしたら、それはディストリビューションの間の無駄な違いがなくなるということです。
ネットワークの設定は、NetworkManagerがあるとはいえ、各ディストリビューションの間で違いますし、従来のinitシステムもそれぞれのディストリビューションで起動スクリプトの場所が違ったり、ランレベルの構成が違ったりします。デーモンをOS起動時に起動する・しないの設定方法も異なります。
systemdでは、このような「無駄なディストリビューションの違い」がなくなります。すべての設定が共通化され、ディストリビューションはより重要な「使いやすさ」や「安定性・堅牢さ」だけを考えることができるのです。
Linuxネットワーク設定(D.NetworkManager)も参照のこと。
新しいinitシステムのsystemdについて。