はじめに
先日ネットワーク構築に関する記事を書きました。
本日はその知識もフル活用しPXEとDHCPサーバーを構築します。
ネットワークブートとは何か
ネットワークブート(Network Boot)は、コンピュータをネットワーク経由で起動する方法です。通常、コンピュータは内蔵のハードディスクやSSDからオペレーティングシステム(OS)を読み込んで起動しますが、ネットワークブートではネットワーク上のサーバーからOSを読み込みます。
ネットワークブートの概念図
Client Computer
1. Send DHCP Request
2. Receive DHCP Response with IP, next-server, boot file name
3. Download boot file from TFTP server
4. Execute boot file, initiate OS install or network boot
—>
<---
—>
<---
DHCP Server
Provide IP, next-server, boot file name
—>
<---
TFTP Server
Provide boot file to client
この技術の利点は以下の通りです:
- 集中管理:多数のコンピュータのOSやソフトウェアを一元管理できます。
- 柔軟性:必要に応じて異なるOSを起動できます。
- セキュリティ:ローカルストレージを使用しないため、データの漏洩リスクを低減できます。
- コスト削減:ハードディスクレスの安価なクライアントPCを使用できます。
DHCPとPXEの基本概念
ネットワークブートを実現するためには、主に2つの技術が必要です:DHCPとPXEです。
DHCP(Dynamic Host Configuration Protocol):
DHCPは、ネットワーク上のデバイスに自動的にIPアドレスを割り当てるプロトコルです。スマートフォンがWi-Fiに接続する際に自動的にIPアドレスが設定されるのは、このDHCPの働きによるものです。
DHCPの動作イメージ
Client Computer
1. Send DHCP Discover
3. Send DHCP Request
→
←
→
DHCP Server
2. Send DHCP Offer
4. Send DHCP ACK (Acknowledgment)
Client Computer: DHCPリクエストを送信し、サーバからのレスポンスを待ちます。
DHCP Discover
: クライアントがネットワーク上の利用可能なDHCPサーバを探すためにブロードキャストメッセージを送信します。DHCP Request
: 提案されたIPアドレスをリクエストします。
DHCP Server: クライアントにIPアドレスを提案し、リクエストに応じてIPアドレスを割り当てます。
DHCP Offer
: 提案されたIPアドレスをクライアントに返します。DHCP ACK (Acknowledgment)
: クライアントにIPアドレスを正式に割り当てることを確認します。
PXE(Preboot eXecution Environment):
PXEは、ネットワーク経由でコンピュータを起動するための環境です。コンピュータのネットワークインターフェースに組み込まれており、DHCPと連携してブートイメージをダウンロードし、起動します。
PXEの動作イメージ
Client Computer (PXE Boot)
1. Send DHCP Discover
2. Receive DHCP Offer with next-server and boot file name
3. Download boot file from TFTP server
4. Execute boot file, start OS installation or network boot
→
←
→
←
DHCP Server
Provide IP, next-server, boot file name
→
←
TFTP Server
Provide boot file to client
Client Computer (PXE Boot): クライアントはPXE対応のネットワークインターフェースカード(NIC)を使用してネットワークから起動します。
DHCP Discover
: PXEクライアントは、IPアドレスを取得するためのDHCPリクエストを送信します。DHCP Offer
: DHCPサーバは、クライアントにIPアドレス、次に接続すべきTFTPサーバ(next-server)、およびブートファイルの名前を提供します。TFTP Download
: クライアントは、TFTPサーバからブートファイルをダウンロードします。Boot
: クライアントはダウンロードしたブートファイルを実行し、OSのインストールまたはネットワークブートを開始します。
これらの技術を組み合わせることで、ネットワーク上のサーバーからOSをダウンロードし、クライアントPCを起動することが可能になります。
プロジェクトの概要
目的
本プロジェクトの目的は、DHCPサーバーとPXEサーバーを構築し、ネットワークブート環境を実現することです。具体的には以下を目指します:
- Dockerを使用してDHCPサーバーを構築する
- NetBoot.XYZを利用してPXEサーバーを構築する
- クライアントPCをネットワーク経由で起動する
- 様々なOSをネットワーク経由でインストールできるようにする
期待される結果
このプロジェクトを完了することで、以下のような成果が期待されます:
- ネットワークブートの仕組みを理解し、実践的なスキルを獲得する
- Dockerを使用したサーバー構築の経験を積む
- ネットワーク管理の基礎知識を身につける
- 柔軟なシステム管理環境を構築する能力を養う
プロジェクトの全体イメージ図
インターネット
ISPルーター
(192.168.0.1)
WiFiデバイス群
(WiFi: 192.168.0.0/24)
ノートPC/ルーター
(WiFi: 192.168.0.2)
(有線: 10.0.0.1)
内部ネットワーク
(10.0.0.0/24)
ハブ/スイッチ
PC1
(10.0.0.50-150)
PC2
(10.0.0.50-150)
PC3
(10.0.0.50-150)
全体構図: インターネットからISPルーターを経由し、ノートPCがルーターおよびDHCP・PXEサーバの役割を果たして、内部ネットワークの管理を行います。
サブネットの区別: WiFiデバイス群と内部ネットワークのデバイス群がそれぞれ異なるサブネットに配置されていることを示しています。
ノートPCの役割: ノートPCが2つの異なるネットワークセグメント(WiFiと有線)を橋渡しし、内部ネットワークのDHCPサーバおよびPXEサーバとして機能します。
次のセクションでは、このプロジェクトを実現するために必要な環境構築について詳しく説明していきます。
環境構築
ネットワークブート環境を構築するために、適切なハードウェアとソフトウェアの準備が必要です。ここでは、プロジェクトに必要な機材とソフトウェアについて説明します。
必要な機材
- サーバー用PC:
- OSはUbuntu 24.04 LTS(または最新の安定版)をインストール
- 最低8GB RAM、100GB以上のストレージ推奨
- 有線LANポートが2つあるとなお良い
- たいていの場合ノートパソコンにはWi-Fiと有線の2つが物理ネットワークデバイスがあるので、サーバーはノートパソコンでOK
- クライアントPC:
- PXEブート対応のネットワークインターフェースを搭載
- テスト用なので、古いPCでも構いません
- ネットワーク機器:
- ギガビットイーサネット対応のスイッチまたはルーター
- LANケーブル(カテゴリー5e以上推奨)
ソフトウェアの準備
- Docker:
最新版のDockerをインストールします。以下のコマンドを順に実行してください。
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce
Docker及びDocker Composeのインストール方法は変更になる可能性があります。以下をチェックすることをお勧めします。
https://docs.docker.com/engine/install/ubuntu
Dockerのインストールが完了したら、以下のコマンドで動作確認をします。
sudo docker run hello-world
Dockerの動作確認結果
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
- Docker Compose:
Docker Composeをインストールします。以下のコマンドを実行してください。
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
インストールが完了したら、バージョンを確認します。
docker compose version
Docker Composeのバージョン確認結果
Docker Compose version v2.29.1
- Visual Studio Code (オプション):
リモートでサーバーを管理する場合、Visual Studio Codeが便利です。公式サイトからダウンロードしてインストールしてください。 https://code.visualstudio.com/ VSCodeをインストールしたら、以下の拡張機能をインストールすると便利です。
- Remote – SSH
- Docker
ネットワーク設定の確認
サーバーPCのネットワーク設定を確認します。以下のコマンドを実行してください。
ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether f0:76:1c:88:14:76 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::f276:1cff:fe88:1476/64 scope link
valid_lft forever preferred_lft forever
3: wlp2s0: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ac:b5:7d:87:8e:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.107/24 brd 192.168.0.255 scope global wlp2s0
valid_lft forever preferred_lft forever
inet6 fe80::aeb5:7dff:fe87:8e90/64 scope link
valid_lft forever preferred_lft forever
4: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:e2:46:ea:31 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
5: br-a180cb5a6bfa: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:6a:7c:7c:8f brd ff:ff:ff:ff:ff:ff
inet 172.20.0.1/16 brd 172.20.255.255 scope global br-a180cb5a6bfa
valid_lft forever preferred_lft forever
inet6 fe80::42:6aff:fe7c:7c8f/64 scope link
valid_lft forever preferred_lft forever
7: veth68ca453@if6: mtu 1500 qdisc noqueue master br-a180cb5a6bfa state UP group default
link/ether aa:4f:ef:fc:fb:ff brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::a84f:efff:fefc:fbff/64 scope link
valid_lft forever preferred_lft forever
この出力結果から、使用可能なネットワークインターフェースとその設定を確認できます。DHCPサーバーとPXEサーバーの設定時に、この情報が必要になります。
以上で環境構築の準備が整いました。次のセクションでは、DHCPサーバーの設定について詳しく説明していきます。
DHCPサーバーの設定
DHCPサーバーは、ネットワークブート環境の重要な基盤となります。ここでは、Dockerを使用してDHCPサーバーを構築し、適切に設定する方法を説明します。
DHCPの役割と重要性
DHCPサーバーには、以下のような重要な役割があります:
- IPアドレスの自動割り当て
- クライアントPCに一意のIPアドレスを提供
- アドレスの重複を防止
- ネットワーク管理の効率化
- ネットワーク設定の提供
- サブネットマスク
- デフォルトゲートウェイ
- DNSサーバーの情報
- PXEブート関連の情報提供
- 次に接続すべきサーバー(next-server)の情報
- ブートローダーファイルの場所
Dockerを使用したDHCPサーバーの構築
- 作業ディレクトリの作成
mkdir -p ~/netboot/dhcpconfig
cd ~/netboot
- DHCPサーバーの設定ファイル作成
VSCodeまたは任意のテキストエディタで、以下のファイルを作成します。
nano ~/netboot/dhcpconfig/dhcpd.conf
- dhcpd.confの基本設定
以下の内容を入力します。この設定は後で詳しく解説します。
default-lease-time 600;
max-lease-time 7200;
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.100 10.0.0.200;
option routers 10.0.0.1;
option broadcast-address 10.0.0.255;
option domain-name-servers 8.8.8.8, 8.8.4.4;
next-server 10.0.0.1;
filename "netboot.xyz.kpxe";
}
設定ファイルの解説
- リース時間の設定
- default-lease-time: デフォルトのIPアドレスリース時間(秒)
- max-lease-time: 最大リース時間(秒)
- サブネットの設定
- subnet: 使用するネットワークアドレス
- netmask: サブネットマスク
- range: DHCPが割り当てるIPアドレスの範囲
- ネットワークオプション
- option routers: デフォルトゲートウェイのアドレス
- option broadcast-address: ブロードキャストアドレス
- option domain-name-servers: DNSサーバーのアドレス
- PXEブート関連の設定
- next-server: PXEブート用のサーバーアドレス
- filename: ブートローダーファイルの名前
ネットワーク図
| Client Computer | | DHCP Server | | PXE Server |
| | | | | |
| (Client PC) | | | | |
+——–+———+ +——–+———+ +——–+———+
| | |
| DHCP Request | |
+————————> | |
| | |
| | |
| DHCP Response | |
| <------------------------+ |
| |
| PXE Request |
+—————————————————–>|
| |
| PXE Response |
| <-----------------------------------------------------+
| |
| Boot Image Download |
+—————————————————–>|
| |
| |
データフロー図
| Client Computer |
| |
| 1. DHCP Request |
| | |
| v |
| 2. DHCP Response |
| | |
| v |
| 3. PXE Request |
| | |
| v |
| 4. PXE Response |
| | |
| v |
| 5. Boot Image |
| |
+——————-+
Docker Composeファイルの作成
DHCPサーバーをDockerコンテナとして実行するために、docker-compose.ymlファイルを作成します。
nano ~/netboot/docker-compose.yml
以下の内容を入力します(基本的な内容):
version: "2"
services:
docker-dhcpd:
image: wastrachan/dhcpd
container_name: docker-dhcpd
environment:
- PUID=1111
- PGID=1112
volumes:
- /home/mamu/netboot/dhcpconfig:/config
network_mode: "host"
restart: unless-stopped
実際に記述したdocker-compose.ymlの内容:
version: "2"
services:
docker-dhcpd:
image: wastrachan/dhcpd
container_name: docker-dhcpd
environment:
- PUID=1111
- PGID=1112
volumes:
- /home/mamu/netboot/dhcpconfig:/config
network_mode: "host" # ホストネットワークモードを使用
restart: unless-stopped
netbootxyz:
image: ghcr.io/netbootxyz/netbootxyz
container_name: netbootxyz
environment:
- MENU_VERSION=2.0.47
- NGINX_PORT=80
- WEB_APP_PORT=3000
volumes:
- /home/mamu/netboot/config:/config
- /home/mamu/netboot/assets:/assets
networks:
- my_custom_network
ports:
- 3000:3000
- 69:69/udp
- 8080:80
restart: unless-stopped
networks:
my_custom_network:
external: true
DHCPサーバーの起動と動作確認
- コンテナの起動
cd ~/netboot
docker-compose up -d
- ログの確認
docker logs docker-dhcpd
Starting up using the following:
UID: 1111
GID: 1112
Internet Systems Consortium DHCP Server 4.4.3-P1
Copyright 2004-2022 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /config/dhcpd.conf
Database file: /config/dhcpd.leases
PID file: /run/dhcp/dhcpd.pid
Wrote 1 leases to leases file.
No subnet declaration for veth69ce47c (no IPv4 addresses).
** Ignoring requests on veth69ce47c. If this is not what
you want, please write a subnet declaration
in your dhcpd.conf file for the network segment
to which interface veth69ce47c is attached. **
Listening on LPF/br-a180cb5a6bfa/02:42:6a:7c:7c:8f/172.20.0.0/16
Sending on LPF/br-a180cb5a6bfa/02:42:6a:7c:7c:8f/172.20.0.0/16
No subnet declaration for docker0 (172.17.0.1).
** Ignoring requests on docker0. If this is not what
you want, please write a subnet declaration
in your dhcpd.conf file for the network segment
to which interface docker0 is attached. **
No subnet declaration for wlp2s0 (192.168.0.107).
** Ignoring requests on wlp2s0. If this is not what
you want, please write a subnet declaration
in your dhcpd.conf file for the network segment
to which interface wlp2s0 is attached. **
Listening on LPF/enp1s0/f0:76:1c:88:14:76/10.0.0.0/24
Sending on LPF/enp1s0/f0:76:1c:88:14:76/10.0.0.0/24
Sending on Socket/fallback/fallback-net
Server starting service.
DHCPREQUEST for 10.0.0.100 from 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPACK on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.101 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPREQUEST for 10.0.0.101 (10.0.0.1) from 54:e1:ad:33:d8:e2 via enp1s0
Wrote 2 leases to leases file.
DHCPACK on 10.0.0.101 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPREQUEST for 10.0.0.100 (10.0.0.1) from 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPACK on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.101 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPREQUEST for 10.0.0.101 (10.0.0.1) from 54:e1:ad:33:d8:e2 via enp1s0
DHCPACK on 10.0.0.101 to 54:e1:ad:33:d8:e2 via enp1s0
reuse_lease: lease age 126 (secs) under 25% threshold, reply with unaltered, existing lease for 10.0.0.100
DHCPDISCOVER from 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPOFFER on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
reuse_lease: lease age 127 (secs) under 25% threshold, reply with unaltered, existing lease for 10.0.0.100
DHCPDISCOVER from 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPOFFER on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
reuse_lease: lease age 129 (secs) under 25% threshold, reply with unaltered, existing lease for 10.0.0.100
DHCPREQUEST for 10.0.0.100 (10.0.0.1) from 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPACK on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.102 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPREQUEST for 10.0.0.102 (10.0.0.1) from 54:e1:ad:33:d8:e2 via enp1s0
DHCPACK on 10.0.0.102 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.100 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.100 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPREQUEST for 10.0.0.100 (10.0.0.1) from 54:e1:ad:33:d8:e2 via enp1s0
DHCPACK on 10.0.0.100 to 54:e1:ad:33:d8:e2 via enp1s0
reuse_lease: lease age 71 (secs) under 25% threshold, reply with unaltered, existing lease for 10.0.0.102
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.102 to 54:e1:ad:33:d8:e2 via enp1s0
reuse_lease: lease age 75 (secs) under 25% threshold, reply with unaltered, existing lease for 10.0.0.102
DHCPREQUEST for 10.0.0.102 (10.0.0.1) from 54:e1:ad:33:d8:e2 via enp1s0
DHCPACK on 10.0.0.102 to 54:e1:ad:33:d8:e2 via enp1s0
DHCPDISCOVER from 54:e1:ad:33:d8:e2 via enp1s0
DHCPOFFER on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPREQUEST for 10.0.0.100 (10.0.0.1) from 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
DHCPACK on 10.0.0.100 to 54:e1:ad:33:d8:e2 (LAPTOP-U2IPTTLE) via enp1s0
- 正常動作の確認
- ログにエラーがないことを確認
- クライアントPCがIPアドレスを取得できることを確認
トラブルシューティング
よくある問題とその解決方法:
- DHCPサーバーが起動しない場合
- 設定ファイルの構文エラーがないか確認
- ポートの競合がないか確認
- ログを詳しく確認
- クライアントがIPアドレスを取得できない場合
- ネットワーク接続を確認
- ファイアウォールの設定を確認
- DHCPサーバーのログを確認
以上でDHCPサーバーの基本設定は完了です。次のセクションでは、PXEサーバーの設定について説明します。
PXEサーバーの設定
PXEサーバーは、ネットワークブート環境においてクライアントPCに起動に必要なファイルを提供する重要な役割を担います。ここでは、NetBoot.XYZを使用してPXEサーバーを構築する方法を説明します。
PXEの役割
- ブートローダーの提供
- クライアントPCの起動に必要な初期プログラムを提供
- 様々なアーキテクチャ(BIOS/UEFI)に対応
- TFTPプロトコルを使用してファイル転送
- ブートメニューの提供
- 利用可能なOSの一覧を表示
- インストーラーや診断ツールの提供
- カスタマイズ可能なメニュー構成
NetBoot.XYZについて
NetBoot.XYZは、以下のような特徴を持つPXEブート環境です:
- 多様なOS対応
- Linux各種ディストリビューション
- Windows PE
- システム診断ツール
- メモリテストツール
- 簡単な導入
- Dockerコンテナとして提供
- 設定が容易
- 自動アップデート機能
- 柔軟なカスタマイズ
- メニューのカスタマイズが可能
- 独自のブートイメージの追加が可能
Docker Composeファイルの更新
既存のdocker-compose.ymlファイルにNetBoot.XYZの設定を追加します:
nano ~/netboot/docker-compose.yml
以下の内容を追加します:
netbootxyz:
image: ghcr.io/netbootxyz/netbootxyz
container_name: netbootxyz
environment:
- MENU_VERSION=2.0.47
- NGINX_PORT=80
- WEB_APP_PORT=3000
volumes:
- /home/mamu/netboot/config:/config
- /home/mamu/netboot/assets:/assets
ports:
- 3000:3000
- 69:69/udp
- 8080:80
restart: unless-stopped
[再喝]実際に書いたdocker-compose.ymlの内容:
version: "2"
services:
docker-dhcpd:
image: wastrachan/dhcpd
container_name: docker-dhcpd
environment:
- PUID=1111
- PGID=1112
volumes:
- /home/mamu/netboot/dhcpconfig:/config
network_mode: "host" # ホストネットワークモードを使用
restart: unless-stopped
netbootxyz:
image: ghcr.io/netbootxyz/netbootxyz
container_name: netbootxyz
environment:
- MENU_VERSION=2.0.47
- NGINX_PORT=80
- WEB_APP_PORT=3000
volumes:
- /home/mamu/netboot/config:/config
- /home/mamu/netboot/assets:/assets
networks:
- my_custom_network
ports:
- 3000:3000
- 69:69/udp
- 8080:80
restart: unless-stopped
networks:
my_custom_network:
external: true
必要なディレクトリの作成
mkdir -p ~/netboot/config
mkdir -p ~/netboot/assets
ブートファイルの種類と用途
- Legacy BIOS用
- netboot.xyz.kpxe: 従来のBIOS環境用ブートローダー
- UEFI用
- netboot.xyz.efi: UEFI環境用ブートローダー
- netboot.xyz-arm64-snp.efi: ARM64アーキテクチャ用
DHCPサーバーの設定更新
UEFIとレガシーBIOSの両方に対応するため、dhcpd.confファイルを更新します:
nano ~/netboot/dhcpconfig/dhcpd.conf
以下の設定を追加します:
if exists user-class and option user-class = "iPXE" {
filename "netboot.xyz.kpxe";
} else {
if substring(option vendor-class-identifier, 0, 9) = "PXEClient" {
if option vendor-class-identifier = "PXEClient:Arch:00000:UNDI:002001" {
filename "netboot.xyz.kpxe"; # Legacy BIOS
} else {
filename "netboot.xyz.efi"; # UEFI
}
}
}
NetBoot.XYZの管理画面
- アクセス方法
- ブラウザで http://サーバーのIPアドレス:3000 にアクセス
- 主な機能
- ブートメニューの確認
- ファイルの更新
- ステータスの監視
- 設定の変更
動作確認とトラブルシューティング
- サービスの起動確認
docker-compose up -d
docker ps
- ログの確認
docker logs netbootxyz
- よくある問題と解決方法
- TFTPポートが開いていない
- ファイルのパーミッション
- ネットワークの設定ミス
以上でPXEサーバーの基本設定は完了です。次のセクションでは、ネットワークの設定について詳しく説明します。
ネットワークの設定
適切なネットワーク設定は、DHCPサーバーとPXEサーバーが正常に機能するための重要な要素です。ここでは、ネットワークの構成方法と設定手順について説明します。
ネットワークトポロジー
基本的なネットワーク構成は以下の通りです:
- サーバー側
- DHCPサーバー + PXEサーバー(同一マシン)
- 有線LANで接続
- 固定IPアドレスを設定
- クライアント側
- PXEブート対応のネットワークカード
- DHCPでIPアドレスを自動取得
- サーバーと同一セグメントに配置
Client Computer
1. Send DHCP Request
2. Receive DHCP Response with IP, next-server, boot file name
3. Download boot file from TFTP server
4. Execute boot file, initiate OS install or network boot
→
←
→
←
DHCP Server
Provide IP, next-server, boot file name
→
←
TFTP Server
Provide boot file to client
Dockerネットワークの設定
- カスタムネットワークの作成
Dockerの再起動時にもIPアドレスが変わらないよう、固定のネットワークを作成します:
docker network create --subnet=172.20.0.0/16 my_custom_network
- ネットワークの確認
docker network ls
- 作成したネットワークの詳細確認
docker network inspect my_custom_network
IPアドレス計画
- サーバー側の設定
- DHCPサーバー: 10.0.0.1
- サブネットマスク: 255.255.255.0
- クライアント用IPレンジ: 10.0.0.100 – 10.0.0.200
- Docker用ネットワーク
- サブネット: 172.20.0.0/16
- 使用可能範囲: 172.20.0.1 – 172.20.255.254
- コンテナ用レンジ: 172.20.0.10 – 172.20.0.100
ネットワークインターフェースの設定
- 現在の状態確認
ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether f0:76:1c:88:14:76 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::f276:1cff:fe88:1476/64 scope link
valid_lft forever preferred_lft forever
3: wlp2s0: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ac:b5:7d:87:8e:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.107/24 brd 192.168.0.255 scope global wlp2s0
valid_lft forever preferred_lft forever
inet6 fe80::aeb5:7dff:fe87:8e90/64 scope link
valid_lft forever preferred_lft forever
4: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:e2:46:ea:31 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
5: br-a180cb5a6bfa: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:6a:7c:7c:8f brd ff:ff:ff:ff:ff:ff
inet 172.20.0.1/16 brd 172.20.255.255 scope global br-a180cb5a6bfa
valid_lft forever preferred_lft forever
inet6 fe80::42:6aff:fe7c:7c8f/64 scope link
valid_lft forever preferred_lft forever
7: veth68ca453@if6: mtu 1500 qdisc noqueue master br-a180cb5a6bfa state UP group default
link/ether aa:4f:ef:fc:fb:ff brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::a84f:efff:fefc:fbff/64 scope link
valid_lft forever preferred_lft forever
- インターフェースの設定確認
- 有線LANインターフェース(例:enp1s0)
- Dockerブリッジインターフェース(例:br-xxxxx)
- 仮想インターフェース(例:vethxxxxx)
ルーティングの設定
- 現在のルーティングテーブルの確認
ip route
- 必要に応じたルーティングの追加
sudo ip route add [ネットワークアドレス] via [ゲートウェイ]
セキュリティ設定
- ファイアウォールの設定
sudo ufw status
sudo ufw allow 67/udp # DHCP
sudo ufw allow 69/udp # TFTP
sudo ufw allow 3000/tcp # NetBoot.XYZ管理画面
- SELinuxの設定(必要な場合)
sudo setenforce 0
ネットワーク接続の確認
- 基本的な疎通確認
ping 10.0.0.1
- DHCPサービスの確認
netstat -uanp | grep 67
- TFTPサービスの確認
netstat -uanp | grep 69
トラブルシューティング
- ネットワーク接続の問題
- ケーブル接続の確認
- インターフェースの状態確認
- IPアドレスの重複チェック
- DHCP/PXEの問題
- ポートの開放確認
- サービスの起動確認
- ログの確認
- Docker関連の問題
- ネットワークドライバの確認
- コンテナの接続状態確認
- ブリッジの設定確認
以上でネットワークの基本設定は完了です。次のセクションでは、クライアントPCの設定について説明します。
クライアントPCの設定
ネットワークブートを実現するためには、クライアントPC側の適切な設定が不可欠です。ここでは、クライアントPCの設定手順と注意点について説明します。
BIOSの基本設定
- BIOSへのアクセス方法
- 起動時に特定のキーを押す(一般的にF2、F12、Del等)
- メーカーによって異なるため、起動画面の指示を確認
- 確認すべき項目
- ブート順序(Boot Order)の設定
- ネットワークブートの有効化
- セキュアブートの設定
- UEFIまたはレガシーモードの選択
ブートモードの選択
- UEFIモード
特徴:
- 最新のブート規格
- 高速起動が可能
- セキュリティ機能が強化
- GPTパーティションテーブルをサポート
- レガシーモード(BIOS互換モード)
特徴:
- 従来からある規格
- 広い互換性
- MBRパーティションテーブルをサポート
- シンプルな構成
ネットワークブートの優先順位設定
- ブート順序の確認
- Network Boot/LANを最優先に設定
- 必要に応じて他のブートデバイスの順序も調整
- 設定後は必ず保存
- PXEブートの有効化
- Network Stack/Network Bootの有効化
- IPV4/IPV6 PXEの設定確認
- UEFI Network Stackの確認(UEFIモード時)
ネットワークインターフェースの設定
- 有線LAN設定
- ケーブルの接続確認
- リンクランプの確認
- 自動設定(DHCP)の確認
- Windows環境の場合
設定手順:
1. コントロールパネル > ネットワークと共有センター
2. アダプター設定の変更
3. イーサネット > プロパティ
4. TCP/IPv4 > プロパティ
5. 「IPアドレスを自動的に取得する」を選択
- Linux環境の場合
# ネットワーク設定の確認
ip a
# DHCPクライアントの再起動(必要な場合)
sudo dhclient -r
sudo dhclient
セキュリティ設定
- セキュアブート
- UEFIモード使用時の注意点
- 必要に応じて一時的に無効化
- カスタム証明書の追加方法
- ネットワークセキュリティ
- ファイアウォールの設定確認
- 必要なポートの開放確認
- ウイルス対策ソフトの一時停止(必要な場合)
起動テストと確認
- 正常起動の確認
- PXEブート画面の表示確認
- DHCPでのIPアドレス取得確認
- ブートローダーのダウンロード確認
- 画面の流れ
- BIOS/UEFI画面
- PXEブート初期化画面
- NetBoot.XYZメニュー画面
- OS選択画面
トラブルシューティング
- よくある問題と解決方法
- PXEブート画面が表示されない
- IPアドレスが取得できない
- ブートローダーのダウンロードエラー
- 特定のOSが起動しない
- 確認手順
- ケーブル接続の確認
- BIOS設定の再確認
- ネットワーク設定の確認
- サーバー側のログ確認
以上でクライアントPCの設定は完了です。次のセクションでは、実際の動作確認について説明します。
動作確認
構築したネットワークブート環境が正しく機能しているか、段階的に確認していきます。各ステップで確認ポイントと問題が発生した場合の対処方法を説明します。
システム全体の動作確認
- サーバー側の確認
# Dockerコンテナの状態確認
docker ps
# ネットワークの状態確認
ip a
# 使用中のポートの確認
netstat -tulpn
確認ポイント:
- DHCPコンテナが起動しているか
- PXEコンテナが起動しているか
- 必要なポート(67, 69, 3000)が開いているか
[動作状態確認画面を挿入]
DHCPサーバーの確認
- ログの確認
# DHCPサーバーのログを表示
docker logs docker-dhcpd
- 確認ポイント
- DHCP DISCOVERメッセージの受信
- DHCP OFFERメッセージの送信
- IPアドレスの割り当て状況
- エラーメッセージの有無
PXEサーバー(NetBoot.XYZ)の確認
- 管理画面へのアクセス
- ブラウザで http://サーバーIP:3000 にアクセス
- 利用可能なブートメニューの確認
- ファイルの更新状態の確認
- TFTPサービスの確認
# TFTPサービスのログを表示
docker logs netbootxyz
クライアント側での動作確認
- ネットワークブートの開始
- クライアントPCの電源投入
- PXEブート画面の表示確認
- ブートメニューの表示確認
- 確認ポイント
- DHCPでIPアドレスを取得できるか
- ブートローダーをダウンロードできるか
- メニューが正しく表示されるか
テスト手順
- 基本動作テスト
手順:
1. クライアントPCの電源を入れる
2. PXEブート画面の表示を確認
3. IPアドレスの取得を確認
4. ブートメニューの表示を確認
- OSインストールテスト
手順:
1. ブートメニューからOSを選択
2. インストーラーの起動確認
3. ネットワーク経由でのファイル取得確認
4. インストールプロセスの確認
パフォーマンスの確認
- 転送速度の確認
- ブートローダーのダウンロード時間
- OSインストールファイルの転送速度
- ネットワーク帯域の使用状況
- レスポンス時間
- DHCPリクエストの応答時間
- メニュー表示までの時間
- システム全体の反応速度
エラー時の対応
- DHCPエラーの場合
確認手順:
1. DHCPサーバーのログを確認
2. ネットワーク接続を確認
3. 設定ファイルを確認
4. サービスの再起動を試行
- PXEブートエラーの場合
確認手順:
1. TFTPサービスのログを確認
2. ブートファイルの存在確認
3. ファイルのパーミッション確認
4. ネットワーク設定の確認
動作記録の取得
- ログの収集
# すべてのコンテナのログを保存
docker logs docker-dhcpd > dhcp.log
docker logs netbootxyz > pxe.log
- システム情報の保存
# ネットワーク設定の保存
ip a > network.log
ip route > route.log
以上で動作確認のプロセスは完了です。次のセクションでは、発生する可能性のある問題とその解決方法について詳しく説明します。
トラブルシューティング
ネットワークブート環境で発生する可能性のある問題とその解決方法について、体系的に説明します。
問題の切り分け方
- 階層別アプローチ
- ネットワーク層(物理接続、IP設定)
- DHCP層(アドレス割り当て)
- TFTP層(ブートファイル転送)
- PXE層(ブートローダー実行)
- ログによる診断
# システムログの確認
sudo journalctl -xe
# Dockerログの確認
docker logs docker-dhcpd
docker logs netbootxyz
よくある問題と解決方法
- DHCPサーバーの問題
問題:IPアドレスが割り当てられない
確認手順:
1. DHCPサーバーの起動確認
2. ネットワーク接続の確認
3. dhcpd.confの設定確認
4. ポート67の開放確認
解決方法:
- サービスの再起動
- 設定ファイルの修正
- ファイアウォールの確認
[DHCPトラブルシューティング図を挿入]
- PXEブートの問題
問題:ブートローダーが読み込めない
確認手順:
1. TFTPサービスの起動確認
2. ブートファイルの存在確認
3. ファイルパーミッションの確認
4. ポート69の開放確認
解決方法:
- ファイルの再配置
- パーミッションの修正
- TFTPサービスの再起動
- ネットワークの問題
問題:サーバーに接続できない
確認手順:
1. 物理接続の確認
2. IPアドレスの確認
3. ルーティングの確認
4. インターフェースの状態確認
解決方法:
- ケーブルの再接続
- ネットワーク設定の修正
- インターフェースの再起動
エラーメッセージと対処方法
- DHCPエラー
エラー:No subnet declaration for eth0
原因:サブネット設定の不足
対処:dhcpd.confにサブネット宣言を追加
- TFTPエラー
エラー:File not found
原因:ブートファイルの不存在
対処:必要なファイルの配置確認
- Dockerエラー
エラー:port is already allocated
原因:ポートの重複
対処:使用中のポートの確認と変更
予防的メンテナンス
- 定期的な確認事項
- ログファイルのサイズ確認
- ディスク使用量の確認
- サービスの状態確認
- バックアップの実行
- 監視項目
- CPUとメモリ使用率
- ネットワークトラフィック
- エラーログの発生頻度
- サービスの応答時間
リカバリー手順
- 設定のバックアップ
# 設定ファイルのバックアップ
cp /home/mamu/netboot/dhcpconfig/dhcpd.conf /backup/
# Dockerボリュームのバックアップ
docker run --rm --volumes-from netbootxyz \
-v $(pwd):/backup busybox tar cvf /backup/backup.tar /config
- システムの復元
# 設定ファイルの復元
cp /backup/dhcpd.conf /home/mamu/netboot/dhcpconfig/
# Dockerコンテナの再作成
docker-compose down
docker-compose up -d
ベストプラクティス
- ログ管理
- ログローテーションの設定
- 重要なログの定期的なバックアップ
- エラーログの定期的な確認
- 設定管理
- 設定変更の記録
- バージョン管理の使用
- 定期的なバックアップ
- パフォーマンス最適化
- 不要なサービスの無効化
- リソース使用量の監視
- 定期的なメンテナンス
以上でトラブルシューティングのセクションは完了です。次のセクションでは、システムの応用と発展について説明します。
応用と発展
ここでは、基本的なネットワークブート環境をさらに発展させ、より高度な活用方法について説明します。
カスタムブート環境の構築
- オリジナルブートメニューの作成
# /home/mamu/netboot/config/custom-menu.yml
menu:
- title: "カスタムOS選択メニュー"
entries:
- name: "Ubuntu Server 24.04"
kernel: "ubuntu/server/24.04/vmlinuz"
initrd: "ubuntu/server/24.04/initrd"
- name: "カスタムLinux"
kernel: "custom/vmlinuz"
initrd: "custom/initrd"
- カスタムブートパラメータの設定
kernel_params:
- "quiet"
- "splash"
- "automatic-install"
- "custom_param=value"
自動インストールの実装
- Kickstartファイルの作成(Red Hat系)
# /home/mamu/netboot/assets/ks.cfg
install
url --url="http://mirror.example.com/rhel8"
keyboard --vckeymap=jp --xlayouts='jp'
lang ja_JP.UTF-8
rootpw --iscrypted $1$randomhash$
timezone Asia/Tokyo
- Preseedファイルの作成(Debian系)
# /home/mamu/netboot/assets/preseed.cfg
d-i debian-installer/locale string ja_JP.UTF-8
d-i keyboard-configuration/xkb-keymap select jp
d-i netcfg/get_hostname string custom-host
d-i netcfg/get_domain string local
高度なネットワーク構成
- VLANの設定
# インターフェース設定
sudo ip link add link enp1s0 name enp1s0.10 type vlan id 10
sudo ip addr add 192.168.10.1/24 dev enp1s0.10
- ボンディングの設定
# インターフェースのボンディング
sudo modprobe bonding
sudo ip link add bond0 type bond
sudo ip link set enp1s0 master bond0
sudo ip link set enp2s0 master bond0
セキュリティ強化
- TFTPサーバーのセキュリティ設定
# アクセス制限の設定
allow-hosts: 10.0.0.0/24
deny-hosts: 0.0.0.0/0
- ブート認証の実装
# ブートローダーのパスワード保護
set superusers="admin"
password_pbkdf2 admin ${hashed_password}
マルチブート環境の構築
- 複数のOSイメージの管理
/assets/
├── ubuntu/
│ ├── 24.04/
│ └── 22.04/
├── debian/
│ └── 12/
└── custom/
└── linux/
- イメージの自動更新システム
#!/bin/bash
# イメージ更新スクリプト
for distro in ubuntu debian custom; do
rsync -av --delete mirror.example.com::${distro} /assets/${distro}/
done
監視システムの導入
- Prometheusの設定
# prometheus.yml
scrape_configs:
- job_name: 'netboot'
static_configs:
- targets: ['localhost:9090']
- Grafanaダッシュボードの作成
- ブート成功率の監視
- ネットワークトラフィックの可視化
- サービスの健全性チェック
バックアップと復元
- 自動バックアップシステム
#!/bin/bash
# 日次バックアップスクリプト
DATE=$(date +%Y%m%d)
tar -czf /backup/netboot_${DATE}.tar.gz /home/mamu/netboot/
find /backup -name "netboot_*.tar.gz" -mtime +30 -delete
- 障害復旧計画
復旧手順:
1. バックアップからの設定復元
2. サービスの再起動
3. 動作確認とテスト
将来の展望
- コンテナオーケストレーション
- Kubernetesへの移行
- マイクロサービス化
- スケーラビリティの向上
- クラウド連携
- ハイブリッドクラウド環境の構築
- クラウドバックアップの実装
- ディザスタリカバリの強化
以上で応用と発展のセクションは完了です。次のセクションでは、プロジェクト全体のまとめを行います。
まとめ
このプロジェクトを通じて、DHCPサーバーとPXEサーバーを利用したネットワークブート環境の構築方法を学びました。ここでは、プロジェクト全体を振り返り、得られた知見をまとめます。
プロジェクトの振り返り
- 達成した目標
- DHCPサーバーの構築と設定
- PXEサーバー(NetBoot.XYZ)の導入
- ネットワークブート環境の確立
- クライアントPCからのブート成功
- 使用した技術
- Docker/Docker Compose
- DHCP/TFTP/PXE
- ネットワーク設定
- BIOSとUEFI設定
学んだこと
- システム構築の知識
- Dockerを使用したサービス構築
- ネットワークプロトコルの理解
- システム設定の最適化
- トラブルシューティング手法
- ネットワーク管理スキル
- IPアドレス管理
- ネットワークセグメンテーション
- プロトコル連携の仕組み
- セキュリティ考慮事項
実践的な利点
- 運用面での利点
- OSインストールの効率化
- 一元管理による運用負荷の軽減
- 柔軟なシステム展開
- メンテナンス性の向上
- コスト面での利点
- 物理メディアの削減
- 作業時間の短縮
- リソースの効率的な利用
- スケーラビリティの確保
今後の展望
- システムの拡張可能性
- 自動化の範囲拡大
- 監視システムの強化
- バックアップ体制の充実
- セキュリティの強化
- 新技術への対応
- クラウドサービスとの連携
- コンテナオーケストレーション
- 仮想化技術の活用
- IoTデバイスへの対応
プロジェクトの教訓
- 成功のポイント
- 段階的な実装アプローチ
- 綿密な計画と設計
- 適切なドキュメント化
- 定期的なテストと検証
- 注意すべき点
- セキュリティへの配慮
- バックアップの重要性
- 適切な設定管理
- ユーザートレーニング
推奨事項
- システム管理者向け
- 定期的な監視とメンテナンス
- セキュリティアップデートの適用
- ドキュメントの更新
- バックアップの確認
- エンドユーザー向け
- 基本的な操作手順の理解
- トラブル時の対応方法
- セキュリティ意識の向上
- 適切な利用ガイドライン
最終考察
このプロジェクトは、単なるネットワークブート環境の構築にとどまらず、以下のような価値を提供しました:
- 技術的価値
- 最新技術の実践的活用
- システム運用の効率化
- 問題解決能力の向上
- 組織的価値
- 運用コストの削減
- 管理効率の向上
- スケーラビリティの確保
以上でまとめのセクションは完了です。次のセクションでは、補足情報として用語集と参考リンクを提供します。
付録
この付録では、本文で使用した専門用語の説明と、より詳しい情報を得るための参考リンクを提供します。
用語集
- ネットワーク関連用語
DHCP(Dynamic Host Configuration Protocol)
- 定義:ネットワーク上のデバイスにIPアドレスを自動的に割り当てるプロトコル
- 用途:クライアントPCのネットワーク設定を自動化
- 関連技術:IPv4, UDP
PXE(Preboot Execution Environment)
- 定義:ネットワーク経由でコンピュータを起動する環境
- 用途:OSのネットワークインストール、システム診断
- 関連技術:TFTP, UEFI
TFTP(Trivial File Transfer Protocol)
- 定義:シンプルなファイル転送プロトコル
- 用途:ブートイメージの転送
- 特徴:UDPベース、軽量設計
- システム関連用語
UEFI(Unified Extensible Firmware Interface)
- 定義:最新のファームウェアインターフェース規格
- 特徴:高機能、セキュアブート対応
- 従来のBIOSの後継
Docker
- 定義:コンテナ型仮想化プラットフォーム
- 用途:アプリケーションの展開と実行
- 特徴:軽量、ポータブル
NetBoot.XYZ
- 定義:ネットワークブートローダー
- 機能:様々なOSのブートメニュー提供
- 特徴:カスタマイズ可能
- セキュリティ関連用語
セキュアブート
- 定義:署名済みソフトウェアのみ起動を許可する機能
- 目的:不正なブートローダーの実行防止
- 実装:UEFI環境で利用可能
ファイアウォール
- 定義:ネットワークセキュリティ制御装置
- 用途:不正アクセスの防止
- 設定例:特定ポートの開放/遮断
参考リンク
- 公式ドキュメント
- Docker: https://docs.docker.com/
- NetBoot.XYZ: https://netboot.xyz/docs/
- Ubuntu: https://ubuntu.com/server/docs
- 技術リソース
- RFC2131 (DHCP): https://tools.ietf.org/html/rfc2131
- RFC906 (TFTP): https://tools.ietf.org/html/rfc906
- PXE仕様: https://www.intel.com/pxe/
- コミュニティリソース
- Docker Hub: https://hub.docker.com/
- Ubuntu Forums: https://ubuntuforums.org/
- Stack Overflow: https://stackoverflow.com/
推奨書籍
- ネットワーク関連
- 「マスタリングTCP/IP」
- 「実践パケット解析」
- 「ネットワーク設計の基礎」
- システム管理関連
- 「Docker実践ガイド」
- 「Linux システム管理」
- 「UEFIシステムプログラミング」
関連ツール
- 診断ツール
- Wireshark: パケット解析
- tcpdump: ネットワークトラフィック監視
- nmap: ネットワークスキャン
- 管理ツール
- Portainer: Dockerコンテナ管理
- Grafana: システム監視
- Prometheus: メトリクス収集
更新履歴
最新版: 2024年4月
- 初版作成
- Ubuntu 24.04 LTS対応追加
- Docker設定の更新
- セキュリティ関連情報の追加