blob: 075cd15e6ba83586dc920b20ba2dc38db125309e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 by Richard Qin
dc_die() {
echo "$*" >&2
exit 1
}
dc_require_root() {
[[ ${EUID} -eq 0 ]] || dc_die '请使用 sudo 执行此脚本。'
}
dc_require_commands() {
local tool
for tool in "$@"; do
command -v "$tool" >/dev/null || dc_die "缺少工具:$tool"
done
}
dc_acquire_lock() {
mkdir -p "$(dirname -- "$DC_LOCK_FILE")"
exec 9>"$DC_LOCK_FILE"
flock -n 9 || dc_die 'Debian 容器已经在运行或正在初始化。'
}
dc_select_instance() {
local name=$1
[[ "$name" =~ ^[A-Za-z0-9][A-Za-z0-9._-]*$ ]] || dc_die "实例名称无效:$name"
DC_INSTANCE=$name
DC_INSTANCE_DIR="$DC_INSTANCES/$DC_INSTANCE"
DC_IMAGE="$DC_INSTANCE_DIR/rootfs.ext4"
DC_ROOT="$DC_INSTANCE_DIR/root"
}
dc_list() {
local path
[[ -d "$DC_INSTANCES" ]] || return 0
for path in "$DC_INSTANCES"/*; do
[[ -d "$path" ]] || continue
basename -- "$path"
done
}
dc_usage() {
cat <<EOF
用法:sudo bash $DC_SCRIPT <命令>
命令:
base-create [选项] 下载一次并创建 debootstrap 软件包 tarball
base-info TAR 查看基础 tarball 的 manifest
init NAME [选项] 创建指定名称的容器镜像
enter NAME [选项] 进入指定容器
exec NAME [选项] 在指定容器中执行命令
resize NAME [选项] 扩大指定容器的镜像
status NAME 查看指定容器状态
list 列出所有容器
delete NAME 删除指定容器
init 选项:
--tarball PATH 从本地 tarball 初始化,跳过软件包下载
--size SIZE 镜像大小(默认:3G)
--profile PATH 复制实例 profile
resize 选项:
--size SIZE 新的镜像大小,只能扩大
base-create 选项:
--output PATH 输出 tarball 路径
--manifest PATH manifest 路径(默认:TARBALL.manifest)
--suite SUITE Debian 版本
--arch ARCH 目标架构
--mirror URL Debian 镜像地址
--include PACKAGES 要加入的软件包,使用逗号分隔
--exclude PACKAGES 要排除的软件包,使用逗号分隔
网络选项:
--network MODE 网络模式:none(默认)、host 或 nat
挂载选项:
--mount SPEC 目录挂载:HOST:CONTAINER[:ro|rw]
profile 配置项:
network=MODE
mount=HOST:CONTAINER[:ro|rw]
环境变量:
DEBIAN_INSTANCES 实例目录(默认:当前目录/instances)
DEBIAN_SIZE 新实例镜像大小(默认:3G)
DEBIAN_LOCK_FILE 锁文件路径(默认:/run/lock/debian-container.lock)
DEBIAN_TARBALL 基础 tarball(默认:当前目录/debian-base.tar.gz)
DEBIAN_SUITE Debian 版本(默认:stable)
DEBIAN_ARCH 目标架构
DEBIAN_MIRROR Debian 镜像地址
DEBIAN_INCLUDE 额外软件包,使用逗号分隔
DEBIAN_EXCLUDE 要排除的软件包,使用逗号分隔
DEBIAN_NETWORK 默认网络模式(默认:none)
DEBIAN_NAT_BRIDGE NAT 网桥名称(默认:rutils0)
DEBIAN_NAT_NETWORK NAT 子网(默认:10.88.0.0/24)
DEBIAN_NAT_GATEWAY NAT 网关地址(默认:10.88.0.1)
DEBIAN_NAT_ADDRESS 容器地址(默认:10.88.0.2)
DEBIAN_NAT_DNS NAT 模式 DNS(默认:1.1.1.1)
EOF
}
|