Update ocixjj.sh
This commit is contained in:
1 file changed
+46
-32
@@ -6,12 +6,13 @@
|
||||
#
|
||||
# 用法:
|
||||
# sudo ./chicken.sh init 初始化环境:装 Incus、自动初始化、放开本机防火墙(只需跑一次)
|
||||
# sudo ./chicken.sh create [N] [CPU] [MEM] [DISK]
|
||||
# sudo ./chicken.sh create [N] [CPU%] [MEM] [DISK]
|
||||
# 批量创建 N 台(默认1台),自动分配端口段、装ssh、随机密码
|
||||
# CPU/MEM/DISK 可选,不填则用脚本顶部默认值
|
||||
# 示例: sudo ./chicken.sh create 3 2 2GiB 20GiB
|
||||
# CPU%/MEM/DISK 可选,不填则用脚本顶部默认值
|
||||
# CPU% 是时间片百分比(如 5%),不是核数,可以设得很小
|
||||
# 示例: sudo ./chicken.sh create 50 5% 128MiB 512MiB
|
||||
# sudo ./chicken.sh list 查看所有小鸡及其端口/密码/资源限制
|
||||
# sudo ./chicken.sh resize <名称> [CPU] [MEM] [DISK]
|
||||
# sudo ./chicken.sh resize <名称> [CPU%] [MEM] [DISK]
|
||||
# 调整已存在小鸡的资源限制(留空的项不改)
|
||||
# sudo ./chicken.sh delete <名称> 删除指定小鸡(同时清理端口转发规则)
|
||||
# sudo ./chicken.sh check <名称> 自检:从本机直接测试该小鸡的SSH端口是否真的能连通
|
||||
@@ -29,15 +30,16 @@ set -e
|
||||
# ================= 可调参数 =================
|
||||
PORTS_PER=20 # 每台小鸡分配的端口数量
|
||||
POOL_START=21000 # 端口池起始端口(建议避开20000-20099等常见默认端口)
|
||||
IMAGE="images:debian/12" # 容器镜像
|
||||
IMAGE="images:alpine/3.20" # 容器镜像(Alpine,体积小,适合高密度切鸡)
|
||||
STATE_FILE="/root/chicken_port_pool.state" # 端口池分配进度记录
|
||||
LOG_FILE="/root/chicken_accounts.txt" # 账号信息记录(名称/IP/SSH端口/端口段/密码/CPU/内存/磁盘)
|
||||
NAME_PREFIX="ck" # 小鸡命名前缀,如 ck1 ck2 ck3
|
||||
|
||||
# ---- 资源限制默认值(可在此改,或 create 时用参数临时覆盖) ----
|
||||
DEFAULT_CPU="1" # 核数,对应 incus limits.cpu
|
||||
DEFAULT_MEM="1GiB" # 内存,对应 incus limits.memory,如 512MiB / 1GiB / 2GiB
|
||||
DEFAULT_DISK="10GiB" # 根盘大小,对应 root 设备的 size,如 10GiB / 20GiB
|
||||
DEFAULT_CPU="5%" # CPU 时间片百分比,对应 incus limits.cpu.allowance,如 5% / 10% / 50%
|
||||
# 用百分比而不是整数核,高密度切鸡时才能切得细,不受"最少1核"限制
|
||||
DEFAULT_MEM="128MiB" # 内存,对应 incus limits.memory,如 128MiB / 256MiB / 1GiB
|
||||
DEFAULT_DISK="512MiB" # 根盘大小,对应 root 设备的 size,如 512MiB / 1GiB / 10GiB
|
||||
# 注意: 磁盘限额是否生效取决于存储池驱动(zfs/btrfs 支持配额;
|
||||
# dir 驱动不支持,只会记录不会真正限制,脚本会给出提示)
|
||||
|
||||
@@ -131,10 +133,16 @@ EOF
|
||||
# ================= 子命令: create =================
|
||||
cmd_create() {
|
||||
local COUNT=${1:-1}
|
||||
local CPU=${2:-$DEFAULT_CPU}
|
||||
local CPU=${2:-$DEFAULT_CPU} # 百分比,如 5%
|
||||
local MEM=${3:-$DEFAULT_MEM}
|
||||
local DISK=${4:-$DEFAULT_DISK}
|
||||
|
||||
# 兼容:如果用户传了纯数字(比如 "2"),自动补上 % 号,避免手滑忘记加%
|
||||
case "$CPU" in
|
||||
*%) ;;
|
||||
*) CPU="${CPU}%" ;;
|
||||
esac
|
||||
|
||||
[ -f "$STATE_FILE" ] || echo "$POOL_START" > "$STATE_FILE"
|
||||
[ -f "$LOG_FILE" ] || echo -e "名称\tIP\tSSH端口\t端口段\t密码\tCPU\t内存\t磁盘" > "$LOG_FILE"
|
||||
|
||||
@@ -167,7 +175,7 @@ cmd_create() {
|
||||
done
|
||||
}
|
||||
|
||||
echo "开始批量创建 $COUNT 台 (每台限制: CPU=${CPU}核 内存=${MEM} 磁盘=${DISK})..."
|
||||
echo "开始批量创建 $COUNT 台 (每台限制: CPU=${CPU} 内存=${MEM} 磁盘=${DISK})..."
|
||||
|
||||
for n in $(seq 1 "$COUNT"); do
|
||||
IDX=$(get_next_index)
|
||||
@@ -181,10 +189,11 @@ cmd_create() {
|
||||
echo "===== 创建 $NAME (端口段: ${PORT_START}-${PORT_END}, CPU=${CPU} 内存=${MEM} 磁盘=${DISK}) ====="
|
||||
|
||||
# 创建时直接带上资源限制:
|
||||
# -c limits.cpu / -c limits.memory 限制 CPU 核数和内存
|
||||
# -d root,size=... 限制根盘大小(需存储池驱动支持配额才会真正强制)
|
||||
# -c limits.cpu.allowance= CPU 时间片百分比(不是核数,可以设很小,如 5%)
|
||||
# -c limits.memory= 内存上限
|
||||
# -d root,size= 根盘大小限制(需存储池驱动支持配额才会真正强制)
|
||||
incus launch "$IMAGE" "$NAME" \
|
||||
-c limits.cpu="${CPU}" \
|
||||
-c limits.cpu.allowance="${CPU}" \
|
||||
-c limits.memory="${MEM}" \
|
||||
-d root,size="${DISK}"
|
||||
|
||||
@@ -202,13 +211,14 @@ cmd_create() {
|
||||
|
||||
sleep 3
|
||||
|
||||
incus exec "$NAME" -- bash -c "apt update -qq && DEBIAN_FRONTEND=noninteractive apt install -y -qq openssh-server"
|
||||
incus exec "$NAME" -- bash -c "sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config"
|
||||
incus exec "$NAME" -- bash -c "sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config"
|
||||
# Alpine 用 apk 装包、ash 跑脚本、OpenRC 管服务,和 Debian 版(apt/bash/systemd)不一样
|
||||
incus exec "$NAME" -- sh -c "apk update -q && apk add -q openssh"
|
||||
incus exec "$NAME" -- sh -c "sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config"
|
||||
incus exec "$NAME" -- sh -c "sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config"
|
||||
|
||||
PASSWORD=$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 16)
|
||||
incus exec "$NAME" -- bash -c "echo 'root:${PASSWORD}' | chpasswd"
|
||||
incus exec "$NAME" -- systemctl restart ssh
|
||||
incus exec "$NAME" -- sh -c "echo 'root:${PASSWORD}' | chpasswd"
|
||||
incus exec "$NAME" -- sh -c "rc-update add sshd default && (rc-service sshd restart || rc-service sshd start)"
|
||||
|
||||
SSH_PORT=$PORT_START
|
||||
incus config device add "$NAME" sshport proxy \
|
||||
@@ -232,16 +242,16 @@ cmd_create() {
|
||||
|
||||
# ================= 子命令: resize =================
|
||||
# 调整已存在小鸡的资源限制。留空的参数表示不改该项。
|
||||
# 用法: sudo ./chicken.sh resize ck1 2 2GiB 20GiB
|
||||
# 用法: sudo ./chicken.sh resize ck1 10% 256MiB 1GiB
|
||||
cmd_resize() {
|
||||
local NAME="$1"
|
||||
local CPU="$2"
|
||||
local CPU="$2" # 百分比,如 10%
|
||||
local MEM="$3"
|
||||
local DISK="$4"
|
||||
|
||||
if [ -z "$NAME" ]; then
|
||||
echo "用法: sudo ./chicken.sh resize <名称> [CPU] [MEM] [DISK]"
|
||||
echo " 留空的项不修改,例如只改内存: sudo ./chicken.sh resize ck1 '' 2GiB"
|
||||
echo "用法: sudo ./chicken.sh resize <名称> [CPU%] [MEM] [DISK]"
|
||||
echo " 留空的项不修改,例如只改内存: sudo ./chicken.sh resize ck1 '' 256MiB"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -251,8 +261,12 @@ cmd_resize() {
|
||||
fi
|
||||
|
||||
if [ -n "$CPU" ]; then
|
||||
incus config set "$NAME" limits.cpu "$CPU"
|
||||
echo "$NAME CPU 限制已改为 ${CPU} 核"
|
||||
case "$CPU" in
|
||||
*%) ;;
|
||||
*) CPU="${CPU}%" ;;
|
||||
esac
|
||||
incus config set "$NAME" limits.cpu.allowance "$CPU"
|
||||
echo "$NAME CPU 限制已改为 ${CPU}"
|
||||
fi
|
||||
|
||||
if [ -n "$MEM" ]; then
|
||||
@@ -270,7 +284,7 @@ cmd_resize() {
|
||||
# 同步更新 LOG_FILE 里的记录(如果存在这一行)
|
||||
if [ -f "$LOG_FILE" ] && grep -q "^${NAME} " "$LOG_FILE"; then
|
||||
local CUR_CPU CUR_MEM CUR_DISK
|
||||
CUR_CPU=$(incus config get "$NAME" limits.cpu 2>/dev/null || echo "-")
|
||||
CUR_CPU=$(incus config get "$NAME" limits.cpu.allowance 2>/dev/null || echo "-")
|
||||
CUR_MEM=$(incus config get "$NAME" limits.memory 2>/dev/null || echo "-")
|
||||
CUR_DISK=$(incus config device get "$NAME" root size 2>/dev/null || echo "-")
|
||||
awk -F'\t' -v name="$NAME" -v c="$CUR_CPU" -v m="$CUR_MEM" -v d="$CUR_DISK" \
|
||||
@@ -309,7 +323,7 @@ cmd_delete() {
|
||||
incus delete "$NAME" --force
|
||||
|
||||
if [ -f "$LOG_FILE" ]; then
|
||||
grep -v "^${NAME} " "$LOG_FILE" > "${LOG_FILE}.tmp" && mv "${LOG_FILE}.tmp" "$LOG_FILE"
|
||||
grep -vP "^${NAME}\t" "$LOG_FILE" > "${LOG_FILE}.tmp" && mv "${LOG_FILE}.tmp" "$LOG_FILE"
|
||||
fi
|
||||
|
||||
echo "$NAME 已删除。注意:它占用的端口段不会自动回收复用,新建的小鸡会继续往后分配,避免冲突。"
|
||||
@@ -329,7 +343,7 @@ cmd_check() {
|
||||
fi
|
||||
|
||||
local ROW
|
||||
ROW=$(grep "^${NAME} " "$LOG_FILE" || true)
|
||||
ROW=$(grep -P "^${NAME}\t" "$LOG_FILE" || true)
|
||||
if [ -z "$ROW" ]; then
|
||||
echo "在 $LOG_FILE 中找不到 $NAME 的记录"
|
||||
exit 1
|
||||
@@ -358,11 +372,11 @@ cmd_check() {
|
||||
echo " OK - 本机内部能连通,说明 Incus 转发链路没问题"
|
||||
echo " 若外部(比如你自己电脑)连不上,问题基本可以定位在: OCI控制台Security List 没放行"
|
||||
else
|
||||
echo " !! 本机内部都连不上,问题在 Incus/容器内sshd本身,检查: incus exec ${NAME} -- systemctl status ssh"
|
||||
echo " !! 本机内部都连不上,问题在 Incus/容器内sshd本身,检查: incus exec ${NAME} -- rc-service sshd status"
|
||||
fi
|
||||
|
||||
echo "3) 当前资源限制:"
|
||||
echo " CPU: $(incus config get "$NAME" limits.cpu 2>/dev/null || echo '未设置(不限)')"
|
||||
echo " CPU: $(incus config get "$NAME" limits.cpu.allowance 2>/dev/null || echo '未设置(不限)')"
|
||||
echo " 内存: $(incus config get "$NAME" limits.memory 2>/dev/null || echo '未设置(不限)')"
|
||||
echo " 磁盘: $(incus config device get "$NAME" root size 2>/dev/null || echo '未设置(不限)')"
|
||||
}
|
||||
@@ -392,9 +406,9 @@ case "$1" in
|
||||
*)
|
||||
echo "用法:"
|
||||
echo " sudo ./chicken.sh init 初始化环境(装Incus+自动init+放开防火墙,只需跑一次)"
|
||||
echo " sudo ./chicken.sh create [N] [CPU] [MEM] [DISK] 批量创建N台小鸡(默认1台,资源限制用脚本顶部默认值)"
|
||||
echo " 示例: sudo ./chicken.sh create 3 2 2GiB 20GiB"
|
||||
echo " sudo ./chicken.sh resize <名称> [CPU] [MEM] [DISK] 调整已存在小鸡的资源限制(留空项不改)"
|
||||
echo " sudo ./chicken.sh create [N] [CPU%] [MEM] [DISK] 批量创建N台小鸡(默认1台,资源限制用脚本顶部默认值)"
|
||||
echo " 示例: sudo ./chicken.sh create 50 5% 128MiB 512MiB"
|
||||
echo " sudo ./chicken.sh resize <名称> [CPU%] [MEM] [DISK] 调整已存在小鸡的资源限制(留空项不改)"
|
||||
echo " sudo ./chicken.sh list 查看所有小鸡状态和账号信息/资源限制"
|
||||
echo " sudo ./chicken.sh delete <名称> 删除指定小鸡"
|
||||
echo " sudo ./chicken.sh check <名称> 自检该小鸡SSH是否真的通,并显示资源限制"
|
||||
|
||||
Reference in new issue
Block a user