aboutsummaryrefslogtreecommitdiff
path: root/debian-container/lib/container.sh
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-10-28 23:44:45 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-10-28 23:44:45 +0800
commit4e6376cfc58e73fc14ddb691c0fac9da425efac9 (patch)
tree7b4e06cdfe2b4f4fbf6fb1a10ba94b5ab8402809 /debian-container/lib/container.sh
parente7236907dfe3e9130d532d5e8a7f2b17af13df1c (diff)
downloadrutils-4e6376cfc58e73fc14ddb691c0fac9da425efac9.tar.gz
rutils-4e6376cfc58e73fc14ddb691c0fac9da425efac9.tar.xz
Add Debian base tarball creation and configurable initialization options.
Signed-off-by: Richard Qin <richard.qin.x@gmail.com>
Diffstat (limited to 'debian-container/lib/container.sh')
-rw-r--r--debian-container/lib/container.sh77
1 files changed, 73 insertions, 4 deletions
diff --git a/debian-container/lib/container.sh b/debian-container/lib/container.sh
index 759d798..05c3944 100644
--- a/debian-container/lib/container.sh
+++ b/debian-container/lib/container.sh
@@ -3,8 +3,31 @@
# Copyright (C) 2026 by Richard Qin
dc_init() {
+ local tarball=
+
+ while (($# > 0)); do
+ case "$1" in
+ --tarball)
+ (($# >= 2)) || dc_die '--tarball 需要一个文件路径。'
+ tarball=$2
+ shift 2
+ ;;
+ --help|-h)
+ dc_usage
+ return 0
+ ;;
+ *)
+ dc_die "未知的 init 选项:$1"
+ ;;
+ esac
+ done
+
dc_require_commands debootstrap unshare mkfs.ext4 mount chroot setpriv flock
+ if [[ -n "$tarball" && ! -f "$tarball" ]]; then
+ dc_die "找不到 tarball:$tarball"
+ fi
+
if [[ -e "$DC_IMAGE" ]]; then
dc_die "镜像已存在:$DC_IMAGE。请使用 enter 进入,避免覆盖容器数据。"
fi
@@ -12,23 +35,69 @@ dc_init() {
mkdir -p "$(dirname -- "$DC_IMAGE")" "$DC_ROOT"
truncate -s 3G "$DC_IMAGE"
mkfs.ext4 -F -q -L DEBIAN_CONTAINER "$DC_IMAGE"
- unshare --mount --propagation private -- bash "$DC_SCRIPT" _init
+ if [[ -n "$tarball" ]]; then
+ unshare --mount --propagation private -- bash "$DC_SCRIPT" _init "$tarball"
+ else
+ unshare --mount --propagation private -- bash "$DC_SCRIPT" _init
+ fi
echo "初始化完成。执行 sudo bash $DC_SCRIPT enter 进入容器。"
}
dc_init_rootfs() {
+ local tarball=${1:-}
+ local -a include_packages=()
+
dc_mount_root
trap dc_cleanup_mounts EXIT
- debootstrap --variant=minbase stable "$DC_ROOT" http://deb.debian.org/debian
+ if [[ -n "$tarball" ]]; then
+ debootstrap \
+ --variant=minbase \
+ --unpack-tarball="$tarball" \
+ "$DC_SUITE" "$DC_ROOT" "$DC_MIRROR"
+ else
+ debootstrap \
+ --variant=minbase \
+ "$DC_SUITE" "$DC_ROOT" "$DC_MIRROR"
+ fi
+
rm -f "$DC_ROOT/etc/resolv.conf"
cp -L /etc/resolv.conf "$DC_ROOT/etc/resolv.conf"
dc_mount_virtual_filesystems
- chroot "$DC_ROOT" /usr/bin/env DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get update
- chroot "$DC_ROOT" /usr/bin/env DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get install -y passwd util-linux vim-tiny e2fsprogs
+
+ if [[ -z "$tarball" ]]; then
+ IFS=, read -r -a include_packages <<< "$DC_INCLUDE"
+ chroot "$DC_ROOT" /usr/bin/env DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get update
+ chroot "$DC_ROOT" /usr/bin/env DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get install -y "${include_packages[@]}"
+ fi
+
echo debian-container > "$DC_ROOT/etc/hostname"
}
+dc_base_create() {
+ local output=${1:-$DC_TARBALL}
+ local temporary_root
+
+ (($# <= 1)) || dc_die '用法:base-create [tarball 路径]'
+ output=$(readlink -m -- "$output")
+ [[ ! -e "$output" ]] || dc_die "tarball 已存在:$output"
+
+ dc_require_commands debootstrap mktemp readlink
+ mkdir -p "$(dirname -- "$output")"
+ temporary_root=$(mktemp -d)
+
+ (
+ trap 'rm -rf -- "$temporary_root"' EXIT
+ debootstrap \
+ --variant=minbase \
+ --include="$DC_INCLUDE" \
+ --make-tarball="$output" \
+ "$DC_SUITE" "$temporary_root" "$DC_MIRROR"
+ )
+
+ echo "基础 tarball 已创建:$output"
+}
+
dc_enter() {
[[ -f "$DC_IMAGE" ]] || dc_die '没有找到镜像,请先运行 init。'