目次
LXD-UIセットアップ
まずはLXD-UIセットアップ部分を。
# LXD インストール
sudo snap install lxd --channel=latest/stable
# 初期化
sudo lxd init --minimal
# HTTPS API を有効化
sudo lxc config set core.https_address :8443
# UI 有効化
sudo snap set lxd ui.enable=true
sudo systemctl reload snap.lxd.daemon
# ユーザーを lxd グループに追加
sudo usermod -aG lxd $USER
# 一度再起動
sudo reboot
LXD-UI https://ホスト名:8443
マウントディレクトリ作成
ホストとLXDコンテナ内にマウントしてホストと共有するディレクトリを作成
sudo mkdir -p /opt/lxd-data
sudo chown -R 1000:1000 /opt/lxd-data
ここからスクリプトを作成。
全部で4つあります。
最後に、この4つを一気に作成するスクリプトも。
lxd-base-minimal作成スクリプト
mkrir -p ~/script/lxd
cd ~/script/lxd
nano create-lxd-base-minimal.sh
chmod +x create-lxd-base-minimal.sh
./create-lxd-base-minimal.sh
create-lxd-base-minimal.sh
#!/bin/bash
CONTAINER="lxd-base-minimal"
MOUNT_PATH="/opt/lxd-data"
echo "=== lxd-base-minimal コンテナを作成 ==="
lxc launch images:ubuntu/24.04 "$CONTAINER"
echo "=== ホストの $MOUNT_PATH をコンテナに同じパスでマウント ==="
lxc config device add "$CONTAINER" opt-lxd-data disk source="$MOUNT_PATH" path="$MOUNT_PATH"
echo "=== ID マッピング設定を適用 ==="
lxc config set "$CONTAINER" raw.idmap "both 1000 1000"
echo "=== コンテナを再起動します ==="
lxc restart "$CONTAINER"
echo "=== 完了しました ==="
コンテナを選択してコピーするスクリプト
lxd-base-dockerを作成する時にも。その場合はLXD-UIでNestingをAllowに設定して保存。
create-lxd-copy.sh
#!/bin/bash
# --- コンテナ一覧を取得 ---
containers=($(lxc list -c n --format csv))
echo "=== コピー元のコンテナを選択してください ==="
i=1
for c in "${containers[@]}"; do
echo "$i) $c"
((i++))
done
# --- 番号入力 ---
read -p "番号を入力: " index
if ! [[ "$index" =~ ^[0-9]+$ ]]; then
echo "エラー: 数字を入力してください" >&2
exit 1
fi
index=$((index - 1))
if [ "$index" -lt 0 ] || [ "$index" -ge "${#containers[@]}" ]; then
echo "エラー: 不正な番号です" >&2
exit 1
fi
SRC="${containers[$index]}"
echo "選択されたコピー元: $SRC"
read -p "新しいコンテナ名を入力: " NEW
if [ -z "$NEW" ]; then
echo "エラー: コンテナ名が空です" >&2
exit 1
fi
echo "=== コピー開始: $SRC → $NEW ==="
lxc copy "$SRC" "$NEW"
echo "=== コンテナを起動します ==="
lxc start "$NEW"
# (※ raw.idmap を適用するには STOP している必要があるため)
echo "=== 一旦コンテナを停止します(ID マップ適用のため) ==="
lxc stop "$NEW"
echo "=== raw.idmap を設定します ==="
lxc config set "$NEW" raw.idmap "both 1000 1000"
echo "=== コンテナを起動します ==="
lxc start "$NEW"
echo "=== 設定反映のため再起動 ==="
lxc restart "$NEW"
echo "=== コンテナに入ります: $NEW ==="
lxc exec "$NEW" -- bash
スナップショットを作成
容量節約や確実に行うために、一旦停止してスナップショットを作成
take-lxd-snapshot.sh
#!/bin/bash
echo "=== LXD コンテナ一覧 ==="
# コンテナ名一覧を配列に格納
containers=($(lxc list -c n --format csv))
# 一覧表示
i=1
for c in "${containers[@]}"; do
echo "$i) $c"
((i++))
done
# 番号選択
read -p "番号を入力: " index
# 数字チェック
if ! [[ "$index" =~ ^[0-9]+$ ]]; then
echo "エラー: 数字を入力してください" >&2
exit 1
fi
index=$((index - 1))
# 範囲チェック
if [ "$index" -lt 0 ] || [ "$index" -ge "${#containers[@]}" ]; then
echo "エラー: 不正な番号です" >&2
exit 1
fi
TARGET="${containers[$index]}"
echo "選択されたコンテナ: $TARGET"
# コメント入力
read -p "スナップショットのコメントを入力(任意・空可): " COMMENT
# スナップショット名(日時)
SNAP="snap-$(date +%Y%m%d-%H%M%S)"
echo "=== コンテナ停止: $TARGET ==="
lxc stop "$TARGET"
echo "=== スナップショット作成: $TARGET/$SNAP ==="
if [ -n "$COMMENT" ]; then
lxc snapshot "$TARGET" "$SNAP" --comment "$COMMENT"
else
lxc snapshot "$TARGET" "$SNAP"
fi
echo "=== コンテナ起動: $TARGET ==="
lxc start "$TARGET"
echo "=== 完了しました ==="
echo "作成されたスナップショット: $TARGET/$SNAP"
if [ -n "$COMMENT" ]; then
echo "コメント: $COMMENT"
fi
コンテナに入るだけ
コンテナ一覧を表示して選択したコンテナに入る
enter-lxd-container.sh
#!/bin/bash
echo "=== LXD コンテナ一覧 ==="
# コンテナ名の一覧を取得
containers=($(lxc list -c n --format csv))
# 番号付きで表示
i=1
for c in "${containers[@]}"; do
echo "$i) $c"
((i++))
done
# 番号入力
read -p "番号を入力: " index
# 数字チェック
if ! [[ "$index" =~ ^[0-9]+$ ]]; then
echo "エラー: 数字を入力してください" >&2
exit 1
fi
index=$((index - 1))
# 範囲チェック
if [ "$index" -lt 0 ] || [ "$index" -ge "${#containers[@]}" ]; then
echo "エラー: 不正な番号です" >&2
exit 1
fi
TARGET="${containers[$index]}"
echo "選択されたコンテナ: $TARGET"
# 起動状態を確実に判定(Running / RUNNING / Stopped / STOPPED など対応)
STATUS=$(lxc info "$TARGET" | awk '/Status:/ {print tolower($2)}')
if [ "$STATUS" != "running" ]; then
echo "=== コンテナが停止中です。起動します ==="
lxc start "$TARGET"
else
echo "=== コンテナは既に起動中です ==="
fi
echo "=== コンテナに入ります: $TARGET ==="
lxc exec "$TARGET" -- bash
4個のスクリプトを一度に作成して保存するスクリプト
コピーボタンでまとめてコピーして、ターミナルに貼り付けて実行するだけです。
実行後、以下の4ファイルが ~/script/lxd/ に作成され、実行権限も付与されます。
create-lxd-base-minimal.shcreate-lxd-copy.shtake-lxd-snapshot.shenter-lxd-container.sh
最後の ls -la で作成確認もできます。
mkdir -p ~/script/lxd
cat > ~/script/lxd/create-lxd-base-minimal.sh << 'SCRIPT'
#!/bin/bash
CONTAINER="lxd-base-minimal"
MOUNT_PATH="/opt/lxd-data"
echo "=== lxd-base-minimal コンテナを作成 ==="
lxc launch images:ubuntu/24.04 "$CONTAINER"
echo "=== ホストの $MOUNT_PATH をコンテナに同じパスでマウント ==="
lxc config device add "$CONTAINER" opt-lxd-data disk source="$MOUNT_PATH" path="$MOUNT_PATH"
echo "=== ID マッピング設定を適用 ==="
lxc config set "$CONTAINER" raw.idmap "both 1000 1000"
echo "=== コンテナを再起動します ==="
lxc restart "$CONTAINER"
echo "=== 完了しました ==="
SCRIPT
cat > ~/script/lxd/create-lxd-copy.sh << 'SCRIPT'
#!/bin/bash
# --- コンテナ一覧を取得 ---
containers=($(lxc list -c n --format csv))
echo "=== コピー元のコンテナを選択してください ==="
i=1
for c in "${containers[@]}"; do
echo "$i) $c"
((i++))
done
# --- 番号入力 ---
read -p "番号を入力: " index
if ! [[ "$index" =~ ^[0-9]+$ ]]; then
echo "エラー: 数字を入力してください" >&2
exit 1
fi
index=$((index - 1))
if [ "$index" -lt 0 ] || [ "$index" -ge "${#containers[@]}" ]; then
echo "エラー: 不正な番号です" >&2
exit 1
fi
SRC="${containers[$index]}"
echo "選択されたコピー元: $SRC"
read -p "新しいコンテナ名を入力: " NEW
if [ -z "$NEW" ]; then
echo "エラー: コンテナ名が空です" >&2
exit 1
fi
echo "=== コピー開始: $SRC → $NEW ==="
lxc copy "$SRC" "$NEW"
echo "=== コンテナを起動します ==="
lxc start "$NEW"
# (※ raw.idmap を適用するには STOP している必要があるため)
echo "=== 一旦コンテナを停止します(ID マップ適用のため) ==="
lxc stop "$NEW"
echo "=== raw.idmap を設定します ==="
lxc config set "$NEW" raw.idmap "both 1000 1000"
echo "=== コンテナを起動します ==="
lxc start "$NEW"
echo "=== 設定反映のため再起動 ==="
lxc restart "$NEW"
echo "=== コンテナに入ります: $NEW ==="
lxc exec "$NEW" -- bash
SCRIPT
cat > ~/script/lxd/take-lxd-snapshot.sh << 'SCRIPT'
#!/bin/bash
echo "=== LXD コンテナ一覧 ==="
# コンテナ名一覧を配列に格納
containers=($(lxc list -c n --format csv))
# 一覧表示
i=1
for c in "${containers[@]}"; do
echo "$i) $c"
((i++))
done
# 番号選択
read -p "番号を入力: " index
# 数字チェック
if ! [[ "$index" =~ ^[0-9]+$ ]]; then
echo "エラー: 数字を入力してください" >&2
exit 1
fi
index=$((index - 1))
# 範囲チェック
if [ "$index" -lt 0 ] || [ "$index" -ge "${#containers[@]}" ]; then
echo "エラー: 不正な番号です" >&2
exit 1
fi
TARGET="${containers[$index]}"
echo "選択されたコンテナ: $TARGET"
# コメント入力
read -p "スナップショットのコメントを入力(任意・空可): " COMMENT
# スナップショット名(日時)
SNAP="snap-$(date +%Y%m%d-%H%M%S)"
echo "=== コンテナ停止: $TARGET ==="
lxc stop "$TARGET"
echo "=== スナップショット作成: $TARGET/$SNAP ==="
if [ -n "$COMMENT" ]; then
lxc snapshot "$TARGET" "$SNAP" --comment "$COMMENT"
else
lxc snapshot "$TARGET" "$SNAP"
fi
echo "=== コンテナ起動: $TARGET ==="
lxc start "$TARGET"
echo "=== 完了しました ==="
echo "作成されたスナップショット: $TARGET/$SNAP"
if [ -n "$COMMENT" ]; then
echo "コメント: $COMMENT"
fi
SCRIPT
cat > ~/script/lxd/enter-lxd-container.sh << 'SCRIPT'
#!/bin/bash
echo "=== LXD コンテナ一覧 ==="
# コンテナ名の一覧を取得
containers=($(lxc list -c n --format csv))
# 番号付きで表示
i=1
for c in "${containers[@]}"; do
echo "$i) $c"
((i++))
done
# 番号入力
read -p "番号を入力: " index
# 数字チェック
if ! [[ "$index" =~ ^[0-9]+$ ]]; then
echo "エラー: 数字を入力してください" >&2
exit 1
fi
index=$((index - 1))
# 範囲チェック
if [ "$index" -lt 0 ] || [ "$index" -ge "${#containers[@]}" ]; then
echo "エラー: 不正な番号です" >&2
exit 1
fi
TARGET="${containers[$index]}"
echo "選択されたコンテナ: $TARGET"
# 起動状態を確実に判定(Running / RUNNING / Stopped / STOPPED など対応)
STATUS=$(lxc info "$TARGET" | awk '/Status:/ {print tolower($2)}')
if [ "$STATUS" != "running" ]; then
echo "=== コンテナが停止中です。起動します ==="
lxc start "$TARGET"
else
echo "=== コンテナは既に起動中です ==="
fi
echo "=== コンテナに入ります: $TARGET ==="
lxc exec "$TARGET" -- bash
SCRIPT
chmod +x ~/script/lxd/*.sh
echo "=== 完了 ==="
ls -la ~/script/lxd/

