为什么开始要使用alpine系统呢?前段时间收了个1g硬盘的cdt,由于空间实在太小了,放debian系统进去担心会爆盘,故只得不得不使用alpine系统了,由此我也开始被长达几天的折磨了。
先介绍下alpine系统吧,这个系统无论是流行度还是适用人数都远远不及 Ubuntu/Debian 系统,和alpine系统配套出现的往往是特定场景,比如我刚才说的1g硬盘,又或者是128mb内存的lxc机器。一般情况在机器性能够用的情况下,应该是不会有人选择alpine系统的。alpine系统轻量归轻量,但是使用起来就相对要难受一点了,并且同样作为Linux系统,它的操作语言和逻辑与大家常用的Ubuntu/Debian有所不同,这一点上也会导致很多人无法适应。
Alpine的优点:
- 轻量,极致的轻量 ,镜像仅有50M左右
- apk包管理工具极其方便
- 不默认存储日志,重启后日志消失(适合容器),需手动配置持久化
- 使用轻量级 OpenRC 管理服务(命令 rc-service),而非 systemd(只专注于 服务管理,依赖更少)
Alpine的不足:
- 兼容性问题,很多一键脚本并不支持一键使用,需要单独下载二进制文件等
- 上手难度略高,部署服务的话需要自行添加持久化运行和开机自启
然后记录下自己使用alpine系统一些心得吧(目前用的不多,很多特性还没体验到,后续再补)
首先是一些常见的指令:
1. 包管理(apk)
| 功能 | 命令 | 说明 |
|---|---|---|
| 更新软件源 | apk update | 同步仓库索引(类似 apt update) |
| 安装软件 | apk add <包名> | 如 apk add nginx curl |
| 删除软件 | apk del <包名> | 卸载软件包 |
| 搜索软件 | apk search <关键词> | 如 apk search python3 |
| 查看已安装 | apk info | 列出所有安装的包 |
| 升级所有软件 | apk upgrade | 更新所有已安装包 |
2. 服务管理(OpenRC)
| 功能 | 命令 | 说明 |
|---|---|---|
| 启动服务 | rc-service <服务名> start | 如 rc-service nginx start |
| 停止服务 | rc-service <服务名> stop | |
| 重启服务 | rc-service <服务名> restart | |
| 查看状态 | rc-status | 列出所有服务状态 |
| 开机自启 | rc-update add <服务名> | 如 rc-update add nginx |
| 禁用自启 | rc-update del <服务名> |
我一般是依次用以下几个命令先配置好系统运行环境:
apk update
apk upgrade
apk add unzip curl wget git sudo bash
其次是开启bbr+fq
cat > /etc/sysctl.d/99-tcp.conf <<EOF
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl -p /etc/sysctl.d/99-tcp.conf由于cdt的1g硬盘实在太小,目前只开了realm转发,一些常用的realm一键脚本都只支持Ubuntu/Debian系统的,我就自行搓了个半自动的realm脚本专门适配alpine系统使用的
#!/bin/bash
SERVICE_NAME="realm"
INIT_SCRIPT_PATH="/etc/init.d/$SERVICE_NAME"
REALM_BIN_DIR="/usr/local/bin"
REALM_BIN_PATH="${REALM_BIN_DIR}/realm"
REALM_CONFIG_DIR="/etc/realm"
REALM_CONFIG_FILE="${REALM_CONFIG_DIR}/config.toml"
DOWNLOAD_URL="https://github.com/zhboner/realm/releases/download/v2.7.0/realm-x86_64-unknown-linux-musl.tar.gz"
TEMP_DOWNLOAD_FILE="/tmp/realm_download.tar.gz"
TEMP_EXTRACT_DIR="/tmp/realm_extract_$$"
clear_screen() {
clear
}
check_root() {
if [ "$(id -u)" -ne 0 ]; then
echo "错误:此脚本需要 Root 权限才能运行。请使用 'bash $0' (在root用户下) 运行。"
exit 1
fi
}
install_deps() {
echo "--- 正在安装依赖 (wget, tar, iproute2)... ---"
apk add --no-cache -q wget tar iproute2 || { echo "错误:依赖安装失败。"; exit 1; }
echo "依赖安装完成。"
}
create_openrc_init_script() {
echo "--- 正在创建 OpenRC init 脚本 ${INIT_SCRIPT_PATH}... ---"
cat > "$INIT_SCRIPT_PATH" << 'EOF_INIT_SCRIPT'
#!/sbin/openrc-run
name="realm"
description="Realm Service"
supervisor="supervise-daemon"
command="/usr/local/bin/realm"
command_args="-c /etc/realm/config.toml"
depend() {
after net dns
}
restart() {
ebegin "Restarting $name"
if [ -e /run/openrc/boot.d/realm.pid ]; then
stop
fi
start
eend $?
}
EOF_INIT_SCRIPT
chmod +x "$INIT_SCRIPT_PATH" || { echo "错误:OpenRC init 脚本权限设置失败。"; exit 1; }
echo "OpenRC init 脚本已创建并赋予执行权限。"
}
install_realm_binary() {
echo "--- 正在安装 Realm 主程序 (musl 版本)... ---"
echo "将从 ${DOWNLOAD_URL} 下载 Realm。"
mkdir -p "$REALM_BIN_DIR" "$REALM_CONFIG_DIR" || { echo "错误:创建目录失败。"; exit 1; }
wget -O "$TEMP_DOWNLOAD_FILE" "$DOWNLOAD_URL" || { echo "错误:下载 Realm 失败。请检查网络或下载链接。"; rm -f "$TEMP_DOWNLOAD_FILE"; exit 1; }
echo "下载完成。"
mkdir -p "$TEMP_EXTRACT_DIR" || { echo "错误:创建临时解压目录失败。"; exit 1; }
tar -xzvf "$TEMP_DOWNLOAD_FILE" -C "$TEMP_EXTRACT_DIR" || { echo "错误:解压 Realm 失败。"; rm -rf "$TEMP_EXTRACT_DIR" "$TEMP_DOWNLOAD_FILE"; exit 1; }
echo "解压完成。"
local found_realm_bin=$(find "$TEMP_EXTRACT_DIR" -name "realm" -type f -executable | head -n 1)
if [ -n "$found_realm_bin" ]; then
if [ -f "$REALM_BIN_PATH" ] || [ -d "$REALM_BIN_PATH" ]; then
echo "发现旧的 Realm 安装,正在清理..."
rm -rf "$REALM_BIN_PATH" || { echo "错误:清理旧 Realm 文件失败。"; exit 1; }
fi
echo "正在移动 Realm 可执行文件到 ${REALM_BIN_PATH}..."
mv "$found_realm_bin" "$REALM_BIN_PATH" || { echo "错误:移动 Realm 可执行文件失败。"; exit 1; }
chmod +x "$REALM_BIN_PATH" || { echo "错误:设置 Realm 可执行权限失败。"; exit 1; }
echo "Realm 可执行文件已成功安装到:${REALM_BIN_PATH}"
else
echo "错误:在解压的文件中未找到可执行的 Realm 二进制文件。请检查下载内容。"
exit 1
fi
rm -rf "$TEMP_DOWNLOAD_FILE" "$TEMP_EXTRACT_DIR" || { echo "警告:临时文件清理失败。"; }
echo "Realm 主程序安装完毕。"
}
initial_setup_check() {
if [ ! -f "$REALM_BIN_PATH" ] || [ ! -f "$INIT_SCRIPT_PATH" ] || ! rc-update -s | grep -q "$SERVICE_NAME"; then
echo "--- 发现 Realm 未完全设置,正在执行初次安装... ---"
install_deps
create_openrc_init_script
install_realm_binary
echo "--- 正在启用 Realm 服务开机自启... ---"
rc-update add "$SERVICE_NAME" default || { echo "错误:设置开机自启失败。"; exit 1; }
echo "Realm 服务已添加到开机启动。"
echo "--- Realm 初次安装和设置完成! ---"
echo "重要:请务必手动创建或编辑 Realm 配置文件!"
echo "文件路径: ${REALM_CONFIG_FILE}"
echo "例如,使用 'vi ${REALM_CONFIG_FILE}' 命令进行编辑。"
read -p "按任意键继续进入管理菜单..." -n 1 -s
clear_screen
fi
}
check_root
initial_setup_check
while true; do
echo "--- Realm 服务管理菜单 ---"
echo "1. 启动 Realm 服务"
echo "2. 停止 Realm 服务"
echo "3. 重启 Realm 服务"
echo "4. 查看 Realm 服务状态"
echo "5. 手动编辑 Realm 配置文件 (${REALM_CONFIG_FILE})"
echo "6. 退出"
echo "--------------------------"
read -p "请输入你的选择 (1-6): " choice
echo
case $choice in
1)
echo "正在启动 Realm 服务..."
rc-service "$SERVICE_NAME" start || echo "启动失败,请检查日志或配置。"
;;
2)
echo "正在停止 Realm 服务..."
rc-service "$SERVICE_NAME" stop || echo "停止失败,请检查服务状态。"
;;
3)
echo "正在重启 Realm 服务..."
rc-service "$SERVICE_NAME" restart || echo "重启失败,请检查日志或配置。"
;;
4)
echo "正在查看 Realm 服务状态..."
rc-service "$SERVICE_NAME" status
;;
5)
echo "正在打开配置文件,请保存后退出。"
vi "$REALM_CONFIG_FILE"
;;
6)
echo "退出管理菜单。"
break
;;
*)
echo "无效的选择。请输入 1 到 6 之间的数字。"
;;
esac
read -p "操作完成。按任意键继续..." -n 1 -s
clear_screen
done
echo "脚本已退出。"需要将上述代码保存到 /root/realm.sh
然后赋予运行权限 chmod +x /root/realm.sh
接下来就可通过 ./realm.sh来运行shell脚本了
realm二进制文件我是选择下载的2.7.0版本,也并没有添加检测更新的功能,如果后续realm发行版更新,还需要手动将下载链接替换以做到更新使用。还有就是为什么说这个是半自动脚本呢,因为还需要自己写realm的转发配置。
realm转发配置的路径在 /etc/realm/config.toml 需要自行添加转发代码,下面给出模板
[network]
no_tcp = false
use_udp = true
[[endpoints]]
# 备注:
listen = "[::]:xxxxx"
remote = "x.x.x.x:xxxxx"
[[endpoints]]
# 备注:
listen = "[::]:xxxxx"
remote = "x.x.x.x:xxxxx"
[[endpoints]]
# 备注:
listen = "0.0.0.0:xxxxx"
remote = "x.x.x.x:xxxxx"添加完转发配置后,运行shell脚本 ./realm.sh 开启转发,并检查运行状态
此时realm转发就已经配置好了,可以正常使用了。