跳到主要内容
  1. 最近文章/

Scaleway纯v6小鸡救援模式dd debian13脚本

最近折腾了一下这款小鸡,默认的 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 改成你自己的真实公钥
  • 如果你有自己的主机名或镜像源,也可以一并调整 HOSTNAMEMIRROR

脚本说明 #

这份脚本主要做了这些事:

  • 使用 GPT 分区,创建一个小型 EFI 分区和一个 btrfs 根分区
  • 根分区启用 compress=zstdnoatime
  • 通过 debootstrap 安装最小化 Debian 13
  • 自动写入 DNS 配置,方便纯 IPv6 环境下解析 IPv4 资源
  • 仅启用 SSH 密钥登录,关闭密码登录
  • 启用串口控制台,方便在面板里排查启动问题
  • 安装 GRUB EFI 引导,并额外复制一份到默认启动路径

整体比较适合喜欢自己掌控系统布局、又不想手动一步步配置的人。

安装效果 #

脚本在救援模式执行,2G 的硬盘实测安装后占用大约 204M。

image

image

脚本正文 #

下面是完整脚本,直接在救援模式中执行即可:

#!/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}"
作者
梦影
这里会发布博客文章、笔记和项目更新。