Ubuntuの起動の仕組みと起動オプション【ランレベル/ターゲット】

システム管理

「Ubuntuを起動したとき、裏側で何が起きているのか気になったことはありませんか?」そういった疑問は、VPSやサーバーを管理するようになったときに急に重要になってきます。

結論から言うと、現代のUbuntuはBIOSまたはUEFIがGRUBを呼び出し、GRUBがLinuxカーネルを起動し、カーネルがsystemd(PID 1)を立ち上げ、systemdがターゲットと呼ばれる起動段階を順番に処理する、という流れになっています。

本記事では実際にUbuntu 24.04と22.04のDockerコンテナを起動してsystemdのバージョンやターゲット設定を実測した結果をもとに、起動の仕組みをわかりやすく解説します。

この記事のポイント

  • Ubuntu 24.04 LTS の systemd バージョンは 255(Ubuntu 22.04 は 249)と実測で確認
  • 昔の「ランレベル」は systemd の「ターゲット」に置き換わり、対応関係がある
  • デフォルトのターゲットは graphical.target。VPS用に multi-user.target に変更できる
  • GRUBの起動オプション(カーネルパラメータ)で起動挙動を細かく制御できる
  • systemctl set-default コマンドで次回起動から適用されるターゲットを変更できる

Ubuntuの起動は「systemd」が管理している

Ubuntu 15.04 以降、起動プロセスの管理は systemd(システム・ディー) というプログラムが担っています。systemd は起動時に最初に実行されるプロセス(PID 1)で、OS全体のサービスやデーモンをまとめて管理します。

以前は SysV init(SysVイニット)や Upstart が使われていましたが、Ubuntu 24.04 LTS では完全に systemd が標準となっています。

注意

本記事のコマンドは Ubuntu 24.04 LTS で検証しています。Ubuntu 20.04 以前や他のディストリビューションではオプションや挙動が異なる場合があります。

実測:Ubuntu 24.04 の systemd バージョン

Docker 公式イメージ ubuntu:24.04 でsystemdパッケージをインストールし、バージョンを確認しました。




ubuntu@linuxlab: ~
$ docker run –rm ubuntu:24.04 bash -c “apt-get install -y –no-install-recommends systemd 2>/dev/null && systemd –version | head -1”
systemd 255 (255.4-1ubuntu8.16)

Ubuntu 24.04 LTS(コードネーム Noble Numbat)には systemd 255(パッケージバージョン 255.4-1ubuntu8.16)が収録されていることを確認しました。

Ubuntu 22.04 vs 24.04 systemdバージョン比較(実測)
Ubuntu 22.04 vs 24.04 systemdバージョン比較(実測)

Ubuntu 22.04 LTS(Jammy Jellyfish)は systemd 249(249.11-0ubuntu3.21)と、6世代分のメジャーバージョンの差があります。255では cgroup v2(コントロールグループ v2)のフルサポートが完成し、/lib/systemd へのシンボリックリンクが整理されるなど、内部的な改善が多数含まれています。

起動フローをざっくり理解する

Ubuntuが電源ボタンを押してからログイン画面が出るまでの流れを整理しましょう。

Ubuntuの起動フロー概念図(illustrative)
Ubuntuの起動フロー概念図(illustrative)

①〜② BIOS/UEFI → GRUB2

まず BIOS(または UEFI) がハードウェアを初期化し、起動デバイス(HDDやSSD)を探します。MBR(マスターブートレコード)または EFIシステムパーティションから GRUB2 が読み込まれます。

GRUB2(GRand Unified Bootloader 2)はブートローダーです。複数のOSがインストールされている場合はここで選択できます。Ubuntu単体の場合は通常カウントダウン後に自動で進みます。

③〜④ Linuxカーネル → initramfs → systemd

GRUBが選択したカーネル(/boot/vmlinuz-*)と initramfs(初期RAMファイルシステム)をメモリに読み込みます。initramfs は一時的なルートファイルシステムで、カーネルが本物のルートディレクトリ(/)をマウントするための準備をします。

ルートマウントが完了すると、/sbin/init(実体は systemdへのシンボリックリンク)が PID 1 として起動します。以降の起動処理は systemd が管理します。

⑤〜⑧ systemd のターゲット連鎖

systemd は「ターゲット(target)」という単位で起動フェーズを管理します。デフォルトターゲット(graphical.target)に向かって、複数のターゲットが依存関係に従って順番に処理されます。

ランレベルとターゲットの関係

古いLinuxシステムでは「ランレベル(runlevel)」という概念で起動状態を管理していました。systemd にはこの互換レイヤーがあり、runlevelN.target というシンボリックリンクで旧来のランレベルに対応しています。

実際に Ubuntu 24.04 の Docker コンテナで確認した結果が以下です。

ランレベルとsystemdターゲットの対応(実測)
ランレベルとsystemdターゲットの対応(実測)
ランレベル 対応するsystemdターゲット 説明
0 poweroff.target システムシャットダウン
1 / s rescue.target シングルユーザーモード(rootのみ)
2 multi-user.target マルチユーザー(ネットワークなし、歴史的には)
3 multi-user.target マルチユーザー+ネットワーク(VPS・サーバーの標準)
4 multi-user.target カスタム用途(現在はほぼ使わない)
5 graphical.target デスクトップGUI付き起動(デスクトップUbuntuのデフォルト)
6 reboot.target システム再起動

実測で確認したとおり、ランレベル2〜4はすべて multi-user.target にマッピングされています。Ubuntu の systemd では実質的にランレベルの差異がなくなり、シンボリックリンクで後方互換性だけを保っています。




ubuntu@linuxlab: ~
$ readlink /lib/systemd/system/default.target
graphical.target

$ readlink /lib/systemd/system/runlevel3.target
multi-user.target

$ readlink /lib/systemd/system/runlevel5.target
graphical.target

systemdターゲットの種類と役割

Ubuntu 24.04 に含まれる主要なターゲットとその役割を整理します。これらは /usr/lib/systemd/system/ に格納されており、実際に中身を読むことができます。

①起動シーケンスの主要ターゲット




ubuntu@linuxlab: ~
$ cat /usr/lib/systemd/system/multi-user.target
[Unit]
Description=Multi-User System
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

$ cat /usr/lib/systemd/system/graphical.target
[Unit]
Description=Graphical Interface
Requires=multi-user.target
Wants=display-manager.service
AllowIsolate=yes

ターゲットファイルの構造を読むとわかるように、graphical.targetmulti-user.targetRequires(必須)で要求し、さらに display-manager.service(GDMやlightdm)を Wants(オプション)で引き込んでいます。

つまり、graphical.target はmulti-user.targetの上位互換という関係になっています。

②主要ターゲットの一覧と役割

ターゲット名 役割 典型的な用途
sysinit.target システム初期化(マウント・udev) 起動初期フェーズ
basic.target ソケット・タイマーなどの基本設定 サービス起動の前提
multi-user.target マルチユーザー+ネットワーク VPS・サーバー運用の標準
graphical.target GUI(デスクトップ)付き デスクトップUbuntu
rescue.target シングルユーザー(rootのみ) 緊急メンテナンス
emergency.target 最小限の環境(マウントなし) ファイルシステム修復
poweroff.target シャットダウン shutdown -h と同じ
reboot.target 再起動 reboot コマンドと同じ

GRUBの起動オプション(カーネルパラメータ)

GRUBはLinuxカーネルに「カーネルパラメータ」を渡すことができます。起動時のF7キー(または起動直後にShiftキー長押し)でGRUBメニューを表示し、eキーで一時的にオプションを編集できます。

/etc/default/grub の構成例(illustrative)
/etc/default/grub の構成例(illustrative)

②主要なカーネルパラメータ

パラメータ 効果 典型的な用途
quiet splash ブートメッセージを非表示・スプラッシュ画面表示 デスクトップ標準設定
text GUIを起動せずテキストモードで起動 GUIトラブル時
single / 1 シングルユーザーモード(rescue.target相当) パスワードリセット・修復作業
init=/bin/bash systemdの代わりにbashを起動 重大なシステム修復
systemd.unit=multi-user.target 起動するターゲットを指定 一時的なターゲット変更
nomodeset GPUドライバーを使わずに起動 グラフィックトラブル回避

注意:GRUB設定変更は慎重に

/etc/default/grub を変更した後は必ず sudo update-grub を実行してください。設定ミスで起動不能になるリスクがあるため、VPS等のリモート環境では変更前にスナップショットを取っておくことを強く推奨します。

③永続的なGRUB設定変更の手順

たとえば、毎回テキストモード(GUI無し)で起動したい場合:




ubuntu@myserver: ~
$ sudo nano /etc/default/grub
— 以下のように変更 —
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash” ← 変更前
GRUB_CMDLINE_LINUX_DEFAULT=”text” ← 変更後

$ sudo update-grub
Generating grub configuration file …
Found linux image: /boot/vmlinuz-6.8.0-60-generic
done

systemctlで起動ターゲットを切り替える実践コマンド

VPSでサーバーを管理する場面でよく使うターゲット操作のコマンドをまとめます。

systemctl get-default / set-default の使い方(実測データに基づく)
systemctl get-default / set-default の使い方(実測データに基づく)

①現在のデフォルトターゲットを確認する




ubuntu@myserver: ~
$ systemctl get-default
graphical.target

②デフォルトターゲットを変更する(次回起動から反映)




ubuntu@myserver: ~
$ sudo systemctl set-default multi-user.target
Removed “/etc/systemd/system/default.target”.
Created symlink /etc/systemd/system/default.target
→ /usr/lib/systemd/system/multi-user.target.

$ systemctl get-default
multi-user.target

set-default/etc/systemd/system/default.target のシンボリックリンクを書き換えるだけです。再起動後から適用されます。

③すぐにターゲットを切り替える(今のセッション限り)




ubuntu@myserver: ~
$ sudo systemctl isolate multi-user.target
(即座にGUIが終了してテキストログインに切り替わる)

$ sudo systemctl isolate graphical.target
(GUIを再起動する)

正直、isolate コマンドはGUIが固まったときにSSHからリモートでGUIだけ再起動したいケースなどで役立ちます。AllowIsolate=yes が設定されているターゲットにのみ使えます。

④現在の起動ターゲット(動作中のターゲット一覧)を確認する




ubuntu@myserver: ~
$ systemctl list-units –type=target –state=active
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
cryptsetup.target loaded active active Local Encrypted Volumes
graphical.target loaded active active Graphical Interface
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network.target loaded active active Network
sysinit.target loaded active active System Initialization

Ubuntu 22.04 と 24.04 の systemd 差異

Docker コンテナで両バージョンのsystemdを実際にインストールして比較しました。




ubuntu@linuxlab: ~ (Ubuntu 22.04 コンテナ)
$ systemd –version | head -1
systemd 249 (249.11-0ubuntu3.21)

$ readlink /lib/systemd/system/default.target
graphical.target



ubuntu@linuxlab: ~ (Ubuntu 24.04 コンテナ)
$ systemd –version | head -1
systemd 255 (255.4-1ubuntu8.16)

$ readlink /usr/lib/systemd/system/default.target
graphical.target

ランレベルとターゲットのマッピングは Ubuntu 22.04 / 24.04 どちらも同一でした。ユニットファイルの格納場所が Ubuntu 24.04 では /lib/systemd/ から /usr/lib/systemd/ に統一されているのが違いとして確認できます(Ubuntu 22.04 は両方がシンボリックリンクで共存)。

よくある質問

①VPSサーバーに適切なターゲットは?

VPSでWebサーバーやSSHサーバーを動かす場合は multi-user.target が適切です。GUI(デスクトップ環境)は不要なので、Vultr や ConoHa VPS でサーバーを立てる場合は確認しておきましょう。




ubuntu@vps-server: ~
$ systemctl get-default
multi-user.target
↑ VPSの場合これが理想的

②「rescue モード」で起動したときは何ができる?

rescue.target はシングルユーザーモードです。rootパスワードなしでrootシェルが起動し、ファイルシステムの修復やパスワードリセットができます。GRUBメニューで e キーを押してカーネルオプションに single または 1 を追記することで起動できます。

③systemd-analyze で起動時間を確認できる?

実機(VPSや物理マシン)では以下のコマンドで起動時間の内訳を確認できます。Dockerコンテナ上ではPID1がsystemdでないため実行できません。




ubuntu@myserver: ~
$ systemd-analyze
Startup finished in 1.234s (kernel) + 3.456s (initrd) + 8.901s (userspace) = 13.591s
graphical.target reached after 8.876s in userspace.

$ systemd-analyze blame | head -10
5.234s NetworkManager-wait-online.service
2.123s snapd.service
1.456s apt-daily.service

systemd-analyze blame を使うと、起動に時間のかかっているサービスを特定できます。VPSで起動が遅いと感じたら NetworkManager-wait-online.service の無効化が効くケースが多いです。

まとめ

Ubuntuの起動は「BIOS/UEFI → GRUB → カーネル → initramfs → systemd → ターゲット連鎖」という流れで進みます。

  • Ubuntu 24.04 の systemd は実測で 255(255.4-1ubuntu8.16)、Ubuntu 22.04 は 249(249.11-0ubuntu3.21)
  • 旧来のランレベルは systemd ターゲットに対応。ランレベル3 = multi-user.target、ランレベル5 = graphical.target
  • デフォルトターゲットは systemctl get-default で確認、systemctl set-default で変更
  • GRUBの GRUB_CMDLINE_LINUX_DEFAULT でカーネルパラメータを設定できる
  • VPS運用では multi-user.target が適切。不要なGUIサービスが起動しない分、リソースが節約される

VPSでUbuntuを本格的に運用したい方は、次の記事もあわせてご覧ください。

コメント

タイトルとURLをコピーしました