「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パッケージをインストールし、バージョンを確認しました。
systemd 255 (255.4-1ubuntu8.16)
Ubuntu 24.04 LTS(コードネーム Noble Numbat)には systemd 255(パッケージバージョン 255.4-1ubuntu8.16)が収録されていることを確認しました。

Ubuntu 22.04 LTS(Jammy Jellyfish)は systemd 249(249.11-0ubuntu3.21)と、6世代分のメジャーバージョンの差があります。255では cgroup v2(コントロールグループ v2)のフルサポートが完成し、/lib/systemd へのシンボリックリンクが整理されるなど、内部的な改善が多数含まれています。
起動フローをざっくり理解する
Ubuntuが電源ボタンを押してからログイン画面が出るまでの流れを整理しましょう。

①〜② 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ターゲット | 説明 |
|---|---|---|
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 では実質的にランレベルの差異がなくなり、シンボリックリンクで後方互換性だけを保っています。
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/ に格納されており、実際に中身を読むことができます。
①起動シーケンスの主要ターゲット
[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.target は multi-user.target を Requires(必須)で要求し、さらに 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キーで一時的にオプションを編集できます。

②主要なカーネルパラメータ
| パラメータ | 効果 | 典型的な用途 |
|---|---|---|
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無し)で起動したい場合:
— 以下のように変更 —
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でサーバーを管理する場面でよく使うターゲット操作のコマンドをまとめます。

①現在のデフォルトターゲットを確認する
graphical.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 のシンボリックリンクを書き換えるだけです。再起動後から適用されます。
③すぐにターゲットを切り替える(今のセッション限り)
(即座にGUIが終了してテキストログインに切り替わる)
$ sudo systemctl isolate graphical.target
(GUIを再起動する)
正直、isolate コマンドはGUIが固まったときにSSHからリモートでGUIだけ再起動したいケースなどで役立ちます。AllowIsolate=yes が設定されているターゲットにのみ使えます。
④現在の起動ターゲット(動作中のターゲット一覧)を確認する
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を実際にインストールして比較しました。
systemd 249 (249.11-0ubuntu3.21)
$ readlink /lib/systemd/system/default.target
graphical.target
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 でサーバーを立てる場合は確認しておきましょう。
multi-user.target
↑ VPSの場合これが理想的
②「rescue モード」で起動したときは何ができる?
rescue.target はシングルユーザーモードです。rootパスワードなしでrootシェルが起動し、ファイルシステムの修復やパスワードリセットができます。GRUBメニューで e キーを押してカーネルオプションに single または 1 を追記することで起動できます。
③systemd-analyze で起動時間を確認できる?
実機(VPSや物理マシン)では以下のコマンドで起動時間の内訳を確認できます。Dockerコンテナ上ではPID1がsystemdでないため実行できません。
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を本格的に運用したい方は、次の記事もあわせてご覧ください。


コメント