概要
先日立てた Proxmox VE 仮想環境 に、Rocky Linux 9 をゲストOSとして作ってゆく。通常の VM ではなく LXC コンテナとして作成する。
LXC コンテナの特徴
Proxmox VE は、VMware ESXi のように、ハードウェアエミューレーションを含む完全仮想サーバとしてゲスト OS 構築することもできるが、より軽量な LXC もサポートしている。
LXC の詳細な解説は他の詳細な記事にお任せして、ユーザー視点から見た特徴を挙げる。
- LXC ゲスト環境は、親の Linux Kernel を共有する「準仮想化」
- Proxmox VE は Debian Linux ベースだが、ゲストは CentOS や Rocky Linux でも動く
- ゲスト OS ではハードウェアドライバやサービスはほとんど動いていない
- CPU やメモリの使用率が低く、起動も終了も爆速
- LXC コンテナの構築がスクリプト化できる
- たくさん LXC 環境を起動してもサーバが熱くならないので、御家庭用には最適!
普通の VM とは違って注意点があるものの、スクラップ&ビルドがあまりに軽いので、当初構築していた VM はほぼ LXC で作り直してしまった。
LXC テンプレートから Rocky Linux コンテナ作成
作成する前にゲスト OS のパラメータを決めておく。
OSパラメータの例
項目 | 設定値 |
---|---|
ホスト名 | lxc-rocky1 |
パスワード | xxxxxxxxx |
割当ディスク容量(GB) | 20 |
割当CPUコア | 1 |
割当メモリ(MiB) | 2048 |
スワップ(MiB) | 1024 |
IPv4アドレス/ネットマスク長 | 192.168.0.50/24 |
IPv4デフォルトゲートウェイ | 192.168.0.1 |
IPv6アドレス/ネットマスク長 | (今回は未設定) |
IPv6デフォルトゲートウェイ | (今回は未設定) |
DNSドメイン | home |
DNSサーバ | 192.168.0.1 |
LXC テンプレートをダウンロード
LXC で OS を立てるには、まず LXC リポジトリからテンプレートファイルを Proxmox のストレージにダウンロードする。
- 左メニュー大項目 [フォルダ表示] → [ストレージ] [local]
- ストレージのメニュー [CTテンプレート]
- [テンプレート] ボタン
ダウンロード可能なテンプレート一覧が表示される。
ここでは rockylinux-9-default
パッケージを選択し、[ダウンロード] をクリック。
ダウンロードウィンドウが開いて進行する。TASK OK
と出たら右上の (×) で閉じる。
CTテンプレート一覧に、ダウンロードしたテンプレートファイルが出てくれば完了。
コンテナ作成(WebUI版)
Proxmox VE の WebUI で LXC コンテナを作成してゆく。
※CLIで実施する場合は コンテナ作成(CLI版) を参照。
Proxmox Web UI から開始
[CTを作成] ボタンをクリック
「作成: LXCコンテナ」ウィンドウにパラメータを入れてゆく。
- 「非特権コンテナ」とは LXC において親 Kernel の PID 1 を共有しない仕組みである。よほど必要がない限り、チェックは入れたままにして置く方が安全。なお、構築後の変更が面倒。
- 「ネスト」は、非特権コンテナに於いて内側で Docker 等の準仮想サービスを立てる際に必要。チェックを入れたままでよい。
- SSH 公開鍵は、作業用 PC で作成済みの公開鍵をペーストするか、ファイルを読ませる
プルダウンして、ダウンロードした Rocky linux のテンプレートを選択
ディスクサイズを指定
割当 CPU コア数を指定
メモリと SWAP 容量を指定
固定 IP の指定
(家庭内)DNS サーチドメインと、DNS サーバの指定
設定値を確認後、問題なければ [完了] クリック
「Task viewer: CT nnn -作成」ウィンドウの構築を待つ。このスペックなら 20秒程度。
TASK OK
が (×) ボタンで閉じる
- 左メニュー [LXCコンテナ] → [作成したホスト名] 選択
- ノードメニュー [コンソール] をクリックしてから [開始] ボタンをクリック
数秒で Rocky Linux が起動する
root ユーザー+指定パスワードでログインしてみる。
df -h
コマンドでディスク容量を確認。
起動後の調整
- Proxmox の Web UI「コンソール」で root でログイン
- 初回アップデートと sshサーバパッケージの追加
- 一旦再起動
# 先にmanを入れないとman pageが出ないことがある
dnf install -y man man-pages
# アップデート
dnf update -y
# ssh server 起動
dnf install -y openssh-server
reboot
ここからは、PC端末の SSH クライアントから root / 公開鍵認証でログインできるようになる。
以降は RLogin/PuTTY 等のターミナルで接続し、設定を続行する。
# 不足パッケージを導入 (お好み)
dnf install -y bash-completion net-tools which zip unzip bzip2 xz zstd tar telnet perl dnf-plugins-core
# viエディタ (お好み)
dnf install -y vim-enhanced
# EPEL レポジトリの追加
dnf config-manager --set-enabled crb
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
# もろもろツール (お好み)
dnf install -y htop whois bind-utils wireshark-cli tcpdump traceroute nc dhcping fping
#タイムゾーン設定
timedatectl set-timezone Asia/Tokyo
# 再起動
reboot
コンテナ作成 (CLI版)
上記 コンテナ作成(WebUI版) での作業を、Proxmox VE の linux CLI から直接実行することもできる。
- LXC テンプレートのダウンロードは WebUI でやっておく
- 下記のスクリプトを編集
- PC端末の SSH 公開鍵を指定
- 仮想環境の設定値として
CTxxxx
変数を修正 - コンテナID (CTID) は自動で払い出されない ので、空き番号を探して記入
- 編集後、スクリプトを Proxmox VE のコンソールに貼り付ける
- コンテナの作成と初期化まで全自動で実施
# SSH 公開鍵
cat <<'__EOT__' >/tmp/ssh_public_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIErv+lDj844n1VKiL2tm+CiP+HytuFDmQLgPBtcOA6Zi MyPC
__EOT__
# 設定値を記入
## 未使用コンテナIDの指定
CTID=100
CTDESCRIPTION="Rocky Linux Sample 1"
CTHOSTNAME="lxc-rocky1"
CTPASSWORD="xxxxxxxxx"
CTCORE=1
CTSTORAGESIZE=20
CTMEMORY=2048
CTSWAP=1024
CTIPV4="192.168.0.50/24"
CTIPV4GW="192.168.0.1"
CTIPV4DNS="192.168.0.24"
# IPv6 も指定する場合
#CTIPV6="xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64"
#CTIPV6GW="xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx"
#CTIPV6DNS="xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx"
CTSEARCHDOMAIN="home"
CTTEMPLATE=$(ls -1 /var/lib/vz/template/cache/rockylinux-9-* | tail -1)
# コンテナ作成
pct create ${CTID} ${CTTEMPLATE} \
--arch amd64 \
--cores ${CTCORE} \
--description "${CTDESCRIPTION}" \
--unprivileged 1 \
--features "nesting=1,fuse=1" \
--hostname "${CTHOSTNAME}" \
--memory "${CTMEMORY}" \
--nameserver "${CTIPV6DNS} ${CTIPV4DNS}" \
--net0 "name=eth0,bridge=vmbr0,gw=${CTIPV4GW},ip=${CTIPV4},type=veth" \
--onboot 1 \
--ostype "centos" \
--password "${CTPASSWORD}" \
--rootfs "local-lvm:${CTSTORAGESIZE}" \
--searchdomain "${CTSEARCHDOMAIN}" \
--ssh-public-keys "/tmp/ssh_public_keys" \
--start 1 \
--swap "${CTSWAP}" \
--timezone "Asia/Tokyo"
# IPv6を指定する場合は↓に修正
# --net0 "name=eth0,bridge=vmbr0,gw=${CTIPV4GW},ip=${CTIPV4},gw6=${CTIPV6GW},ip6=${CTIPV6},type=veth" \
rm -f /tmp/ssh_public_keys
sleep 10
# 初期設定やパッケージ追加の実施
pct exec ${CTID} -- bash -c "\
systemctl set-default multi-user.target &&\
dnf install -y man man-pages &&\
dnf install -y openssh-server &&\
systemctl start sshd &&\
nmcli c m 'System eth0' ipv4.dhcp-send-hostname no &&\
nmcli c m 'System eth0' ipv6.dhcp-send-hostname no &&\
nmcli c reload &&\
nmcli c down 'System eth0' ; nmcli c up 'System eth0' &&\
dnf install -y dnf-plugins-core &&\
dnf config-manager --set-enabled crb &&\
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm &&\
dnf install -y bash-completion net-tools which zip unzip bzip2 xz zstd tar telnet perl vim-enhanced htop whois bind-utils tcpdump traceroute glibc-langpack-ja &&\
dnf update -y &&\
reboot"
sleep 10
# アップデート情報クリーンアップ
pct exec ${CTID} -- bash -c "\
dnf clean all"
参考
- Proxmox: Linux Container
- 15分で分かるLXC(Linux Containers)の仕組みと基本的な使い方 さくらのナレッジ, 2014-06-16
- LXC のわかりやすい解説だが 10年以上前なので内容がちょっと古い
- LXC / セキュリティ LinuxContainers
- 「非特権コンテナ」の解説
- LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術 記事一覧 gihyo.jp, (2014年から10年以上連載中)