概要

先日立てた Proxmox VE 仮想環境 に、Rocky Linux 9 をゲストOSとして作ってゆく。通常の VM ではなく LXC コンテナとして作成する。

LXC コンテナの特徴

Proxmox VE は、VMware ESXi のように、ハードウェアエミューレーションを含む完全仮想サーバとしてゲスト OS 構築することもできるが、より軽量な LXC もサポートしている。

Proxmox VE アーキテクチャ構成図

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 のストレージにダウンロードする。

  1. 左メニュー大項目 [フォルダ表示] → [ストレージ] [local]
  2. ストレージのメニュー [CTテンプレート]
  3. [テンプレート] ボタン
    テンプレートボタンをクリック

ダウンロード可能なテンプレート一覧が表示される。
ここでは rockylinux-9-default パッケージを選択し、[ダウンロード] をクリック。

テンプレートパッケージを選択してダウンロードをクリック

ダウンロードウィンドウが開いて進行する。TASK OK と出たら右上の (×) で閉じる。

ダウンロードウィンドウで TASK OK と出たらバツボタンで閉じる

CTテンプレート一覧に、ダウンロードしたテンプレートファイルが出てくれば完了。

ダウンロードしたテンプレートが表示されることを確認

コンテナ作成(WebUI版)

Proxmox VE の WebUI で LXC コンテナを作成してゆく。
※CLIで実施する場合は コンテナ作成(CLI版) を参照。

Proxmox Web UI から開始

[CTを作成] ボタンをクリック

CTを作成 のボタンをクリック

「作成: LXCコンテナ」ウィンドウにパラメータを入れてゆく。

  • 「非特権コンテナ」とは LXC において親 Kernel の PID 1 を共有しない仕組みである。よほど必要がない限り、チェックは入れたままにして置く方が安全。なお、構築後の変更が面倒。
  • 「ネスト」は、非特権コンテナに於いて内側で Docker 等の準仮想サービスを立てる際に必要。チェックを入れたままでよい。
  • SSH 公開鍵は、作業用 PC で作成済みの公開鍵をペーストするか、ファイルを読ませる
    LXCコンテナ作成の全般タブ、各項目に入力

プルダウンして、ダウンロードした Rocky linux のテンプレートを選択

ダウンロード済みのテンプレートを選択

ディスクサイズを指定

ディスクサイズを指定

割当 CPU コア数を指定

CPUコア数を指定

メモリと SWAP 容量を指定

割当メモリとスワップ容量を指定

固定 IP の指定

IPアドレスを指定

(家庭内)DNS サーチドメインと、DNS サーバの指定

DNSサーチドメインとDNSサーバのIPアドレスを指定

設定値を確認後、問題なければ [完了] クリック

設定一覧を確認できたら完了ボタンをクリック

「Task viewer: CT nnn -作成」ウィンドウの構築を待つ。このスペックなら 20秒程度。
TASK OK が (×) ボタンで閉じる

TASK OK と表示されたらバツボタンで閉じる

  • 左メニュー [LXCコンテナ] → [作成したホスト名] 選択
  • ノードメニュー [コンソール] をクリックしてから [開始] ボタンをクリック
    作成したLXCコンテナのコンソールを開く

数秒で Rocky Linux が起動する

Linuxが起動したことを確認

root ユーザー+指定パスワードでログインしてみる。
df -h コマンドでディスク容量を確認。

rootユーザーでログインしてみる

起動後の調整

  • 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"

参考