最近买了一台RakSmart的美西1C1G VPS,年付只花了1.8刀,只可惜的年付,所以不准备在上面跑什么服务,放着吃灰了快半个月。在很多人眼里,这种配置除了挂个探针或者跑个简单的梯子,似乎难堪大用。
不如来折腾一下,给自己开几台LXC小鸡玩玩。还可以看看一台内存仅有64mb的LXC小鸡有什么用。
准备工作
宿主机:一台 Linux VPS(推荐 Debian 11/12 或 Ubuntu 20.04+),配置 1C1G 即可。
目标:开设数个 64MB 内存的 Alpine Linux 容器。
第一步:重装并给服务器加上SWAP
一台干净的宿主机十分关键,我们首先使用DD脚本来重装系统,这里使bin456789大佬的DD脚本:
# 下载DD脚本
curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh || wget -O ${_##*/} $_
# 安装Debian 12
bash reinstall.sh debian 121GB 内存非常紧张。为了防止某个容器突然发力导致宿主机内存溢出死机,我们必须配置虚拟内存,执行以下命令:
# 1. 创建一个 1GB 的 Swap 文件
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 2. 写入 fstab 实现开机自动挂载
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab
# 3. 调整 Swappiness (倾向于使用物理内存,只有内存吃紧时才用 Swap)
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf第二步:安装与配置 LXD
LXD 是管理 LXC 容器的「神器」,比原生的 LXC 命令更人性化。
1. 安装 LXD
这里推荐使用 Snap 安装,因为版本更新且兼容性好:
# 确保 snapd 已安装
apt update && apt install -y snapd
# 安装 LXD
snap install lxd
# 将当前用户加入 lxd 组(如果是 root 操作可忽略,但建议执行)
adduser root lxd2. 初始化 LXD(关键步骤!)
执行初始化命令:
lxd init
⚠️ 注意: 在配置过程中,系统会问你使用什么存储后端 (Storage backend)。
默认通常是 ZFS 或 Btrfs。
但是在 1GB 内存机器上,请务必手动输入 dir (Directory)。
原因:ZFS 的 ARC 缓存机制会占用大量内存,而 dir 模式直接使用目录存储,虽然快照性能稍弱,但不额外占用内存,这对小内存机器至关重要。
Clustering? -> no
New storage pool? -> yes
Name of storage pool? -> default
Name of the storage backend? -> dir
Create a new MAAS server? -> no
Network bridge? -> yes
Name of the bridge? -> lxdbr0 (默认即可)
IPv4? -> yes (auto)
IPv6? -> no (除非你需要)
第三步:定制「64MB 迷你」配置文件
我们需要创建一个 Profile(配置文件模板),以后每次创建小鸡时套用这个模板,就能自动限制它的资源。
创建名为 mini 的配置:
lxc profile create mini编辑 Profile:
lxc profile edit mini这会打开一个文本编辑器,请将内容修改为以下 YAML 配置:
description: "64MB Alpine Mini Server Profile" devices: eth0: name: eth0 network: lxdbr0 type: nic root: path: / pool: default type: disk config: limits.cpu: "1" # 限制使用1个核心 limits.cpu.allowance: 20% # (可选) 限制最多占用20% CPU时间,防止卡死宿主 limits.memory: 64MB # 硬性限制内存 limits.memory.swap: "false" # 禁止容器使用 Swap,逼迫其在64MB内运行注:limits.memory.swap: "false" 比较激进。如果你希望容器满了之后能借用一点宿主机的 Swap 防止崩溃,可以删除这一行。
第四步:生产迷你小鸡
一切准备就绪,我们来启动第一台名为 alpine01 的容器,使用 Alpine Edge 版本。
# 启动容器,同时加载 default(网络)和 mini(资源限制)配置
lxc launch images:alpine/edge alpine01 --profile default --profile miniimages:alpine/edge: 使用 Alpine 的 Edge 版本(最新),也可以用 images:alpine/3.18。
--profile default: 加载默认网络配置。
--profile mini: 加载我们刚才设定的 64MB 限制。
验证资源占用:运行 lxc list 查看列表。 运行 lxc info alpine01 查看具体资源使用。
lxc list你应该能看到 alpine01 正在运行,且拥有一个内网 IP(如 10.x.x.x)。
如果你想看看这个示例的资源消耗,这是 LXD 提供的原生监控命令,可以看到该容器实际消耗了宿主机多少资源。
lxc info alpine01第五步:NAT 端口映射
由于宿主机只有一个公网 IP,我们需要通过端口转发来从外网访问这台小鸡。 假设我们将宿主机的 10122 端口映射到 alpine01 的 SSH 端口 22。
lxc config device add alpine01 ssh-proxy proxy listen=tcp:0.0.0.0:10122 connect=tcp:127.0.0.1:22第六步:配置容器内部环境
Alpine 默认非常精简,默认没有开启 SSH 远程登录,我们需要进去设置一下。
进入容器 Shell:
# 进入容器内部 Shell lxc exec alpine01 -- sh在容器内执行安装与配置:
# ---- 以下在容器内执行 ---- # 1. 安装 openssh (Alpine 默认可能是 dropbear,openssh 更习惯些) apk add openssh rc-update add sshd default # 2. 允许 root 密码登录 (或者配置密钥,更安全) echo "PermitRootLogin yes" >> /etc/ssh/sshd_config # 3. 设置 root 密码 passwd # (输入你的密码) # 4. 启动 SSH /etc/init.d/sshd start # 退出容器 exit
大功告成! 现在,你可以通过你常用的 SSH 客户端连接你的迷你小鸡了:
IP: 宿主机公网 IP
Port: 10101
User: root
总结与玩法
在 1C1G 的机器上,除去系统本身占用,你大约还有 700MB+ 的可用内存。
理论极限:你可以开设 10 台 以上这样的 64MB 小鸡。
能干什么?
集群测试:模拟 Ansible 批量管理,测试 K3s (可能需要调大一点内存)。
内网穿透节点:运行 Frp 客户端。
静态网站:每个小鸡跑一个 Nginx 托管静态 HTML,毫无压力。
Python 脚本:跑一些轻量的爬虫或监控脚本。