最近折腾了一下这款小鸡,默认的 Alpine 系统总觉得差点意思。看了一圈 Scaleway 的安装文档之后,我还是决定自己写个更顺手的脚本,直接在救援模式里装一套更轻一些的 Debian 13。
这份脚本的思路比较简单:
- 使用 SSH 密钥登录
- 自动添加 DNS64
- 使用 btrfs 文件系统 +
zstd透明压缩 - 针对小硬盘场景尽量压低系统占用
适用机型 #
这份脚本更适合下面这类机器:
- Scaleway 纯 IPv6 小鸡
- 需要通过救援模式重装系统的场景
- 系统盘设备名为
/dev/vda - 希望安装 Debian 13(
trixie)并使用 UEFI 启动
如果你的机器磁盘不是 /dev/vda,比如是 /dev/sda 或 /dev/nvme0n1,记得先改脚本里的 DISK 变量。
注意事项 #
救援系统登录必须使用 SSH 密钥登录。
正式执行前,建议先确认下面几件事:
- 开启救援模式之前,先去控制台添加好 SSH 公钥
- 入口在首页左侧的
Project Dashboard,进去后就能看到添加SSH Keys的地方 - 脚本会直接重分区并格式化磁盘,原系统和数据都会被清空
- 执行前请先把
SSH_PUB_KEY改成你自己的真实公钥 - 如果你有自己的主机名或镜像源,也可以一并调整
HOSTNAME和MIRROR
脚本说明 #
这份脚本主要做了这些事:
- 使用 GPT 分区,创建一个小型 EFI 分区和一个 Btrfs 根分区
- 根分区启用
compress=zstd和noatime - 通过
debootstrap安装最小化 Debian 13 - 自动写入 DNS 配置,方便纯 IPv6 环境下解析 IPv4 资源
- 仅启用 SSH 密钥登录,关闭密码登录
- 启用串口控制台,方便在面板里排查启动问题
- 安装 GRUB EFI 引导,并额外复制一份到默认启动路径
整体比较适合喜欢自己掌控系统布局、又不想手动一步步配置的人。
安装效果 #
脚本在救援模式执行,2G 的硬盘实测安装后占用大约 204M。


脚本正文 #
下面是完整脚本,直接在救援模式中执行即可:
#!/bin/bash
set -e
# ================= CONFIG =================
DISK="/dev/vda"
DEBIAN_RELEASE="trixie"
HOSTNAME="debian"
SSH_PUB_KEY="ssh-ed25519 AAAA_你的公钥内容_在这里_REPLACE_THIS"
MIRROR="http://deb.debian.org/debian/"
# ==========================================
GREEN='\033[0;32m'
NC='\033[0m'
if [ "$SSH_PUB_KEY" == "ssh-ed25519 AAAA_你的公钥内容_在这里_REPLACE_THIS" ]; then
echo "❌ 错误:请填入真实的 SSH 公钥!"
exit 1
fi
echo -e "${GREEN}==> 准备环境...${NC}"
apt-get update -y
apt-get install -y debootstrap btrfs-progs parted curl
echo -e "${GREEN}==> 磁盘分区...${NC}"
swapoff -a 2>/dev/null || true
umount -R /mnt 2>/dev/null || true
wipefs -a -f $DISK
parted -s $DISK mklabel gpt
parted -s $DISK mkpart "EFI" fat16 1MiB 41MiB
parted -s $DISK set 1 esp on
parted -s $DISK mkpart "Root" btrfs 41MiB 100%
partprobe $DISK
sleep 2
mkfs.vfat -F 16 -n EFI "${DISK}1"
mkfs.btrfs -f --mixed -L debian_root "${DISK}2"
echo -e "${GREEN}==> 挂载系统...${NC}"
mount -t btrfs -o compress=zstd,noatime "${DISK}2" /mnt
mkdir -p /mnt/boot/efi
mount "${DISK}1" /mnt/boot/efi
echo -e "${GREEN}==> 安装 Debian...${NC}"
debootstrap --arch=amd64 --variant=minbase --include=btrfs-progs,locales,openssh-server,curl,ca-certificates "$DEBIAN_RELEASE" /mnt "$MIRROR"
echo -e "${GREEN}==> 配置系统...${NC}"
cat > /mnt/etc/resolv.conf <<DNS
nameserver 2001:67c:2960::6464
nameserver 2a00:1098:2b::1
DNS
cat > /mnt/setup.sh <<EOF
#!/bin/bash
set -e
cat > /etc/apt/sources.list <<REPO
deb $MIRROR $DEBIAN_RELEASE main contrib non-free-firmware
deb $MIRROR $DEBIAN_RELEASE-updates main contrib non-free-firmware
deb http://security.debian.org/debian-security $DEBIAN_RELEASE-security main contrib non-free-firmware
REPO
apt-get update
apt-get install -y --no-install-recommends zstd linux-image-cloud-amd64 grub-efi-amd64 efibootmgr ifupdown kmod systemd-sysv
echo "${HOSTNAME}" > /etc/hostname
cat > /etc/network/interfaces <<NET
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet6 auto
hostname ${HOSTNAME}
NET
rm -f /etc/resolv.conf
cat > /etc/resolv.conf <<DNS
nameserver 2a00:1098:2c::1
nameserver 2a00:1098:2b::1
DNS
cat > /etc/fstab <<FSTAB
UUID=$(blkid -s UUID -o value "${DISK}2") / btrfs defaults,compress=zstd,noatime 0 0
UUID=$(blkid -s UUID -o value "${DISK}1") /boot/efi vfat defaults,umask=0077 0 2
FSTAB
mkdir -p /root/.ssh
echo "${SSH_PUB_KEY}" > /root/.ssh/authorized_keys
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
sed -i 's/#PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/default/locale
systemctl enable serial-getty@ttyS0.service
for i in {1..6}; do
systemctl mask getty@tty\${i}.service
done
sed -i 's/#NAutoVTs=6/NAutoVTs=0/' /etc/systemd/logind.conf
cat > /etc/default/grub <<GRUBCONF
GRUB_DEFAULT=0
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="Debian"
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 rootfstype=btrfs net.ifnames=0 biosdevname=0"
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_DISABLE_OS_PROBER=true
GRUBCONF
update-grub
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck --no-nvram
mkdir -p /boot/efi/EFI/BOOT
cp /boot/efi/EFI/debian/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI
apt-get clean
rm -rf /var/lib/apt/lists/*
EOF
chmod +x /mnt/setup.sh
mount -t proc /proc /mnt/proc
mount -t sysfs /sys /mnt/sys
mount -o bind /dev /mnt/dev
mount -o bind /dev/pts /mnt/dev/pts
DEBIAN_FRONTEND=noninteractive chroot /mnt /setup.sh
rm /mnt/setup.sh
sync
umount -R /mnt || true
echo -e "${GREEN}安装完成,请重启,并务必确保私钥已妥善保存。${NC}"