更新(2026.01.10):
- 重要提示:从自制镜像中读取到的 alpine virt iso 救援系统,在 VNC 执行 setup-alpine,将正式系统写入到硬盘后,该临时系统还运行在内存中,必须要重启!必须要重启!必须要重启!重启后进入到的 alpine 系统,才是从系统硬盘中读取的正式系统,才可以进行设置 DNS、配置源、清除硬盘标签、执行脚本重装等后续工作。
更新(2026.01.06):
-
援引源网站证书于 2026 年 1 月 4 日失效,且网站开启了 HSTS,无法为此网站添加例外以访问,web archive 里也没有存档,我保存了一份在本地,看来得补档了。
-
已补档至本站。
援引 & 致谢:
使用阿里云CDT 享受每月200G/4元高速流量如果以上链接无法打开,请访问本站补档:
【补档】使用阿里云CDT 享受每月200G/4元高速流量
补正:援引文章“五. 安装系统” → 过程 → 一:安装”中的“这样配置好用户名和密码及时区,代理跳过”文字下方的流程演示有一个坑,需要我们手动回避,在选择 APK Mirror 的时候,一定要摁“(s) Show mirror list”,然后按空格翻页,找到阿里云(aliyun)镜像源所属的序号,再做选择,如果只按原文图示直接按“49”,有可能会连接到一个速度极慢的源,因为这个镜像列表是实时更新的,截止我做测试时,阿里云的镜像源序号是“44”,这个序号未来还会根据该列表的更新而随时变化,切勿刻舟求剑。
本篇教程的目的,是我们用自制镜像,启动阿里云极低配置的抢占式实例后,需要在新安装的系统内,清除掉手动安装 Alpine Linux virt 版后,其为了兼容性而在硬盘上,打了 gpt 分区、iso 镜像的标签,进而导致我们手动修复 grub 受阻,使重装系统脚本失效,为什么不用阿里云自带的重装功能,非要自己挂载镜像安装? 援引文章里说了,官方镜像的使用条件,最低要求 20GB 硬盘才能灌入系统,即使是社区镜像,最低也要 16 GB 硬盘,硬盘容量越低,使用费用越低,16 GB 还是太大,缩减到 10 GB,甚至是 5 GB,并且能用脚本自由重装系统,才是我们的目标。
教程成果 check list:
- wipefs -n /dev/vda 仅剩 dos
- 执行 grub-install /dev/vda 无报错
- 存在 /boot/grub/grub.cfg
- 重启出现 grub 菜单,并能被引导进入系统
声明:本教程案例系统盘为“vda”及“/dev/vda”,强烈建议先确认系统盘设备名。
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE
若系统盘不是 /dev/vda(如 /dev/sda 或 /dev/nvme0n1),则以下所有命令中的 vda 需替换,后续 dd 命令执行的是破坏性写入操作,操作前请务必确认好扇区起始位置、目标硬盘、扇区计数等参数,由于个人失误造成的操作系统无法重启、数据损坏等后果自负,切勿盲目照抄。由于修改的主要是磁盘头部扇区数据,所以理论上低于 10 GB 以下的硬盘也可以按本 SOP 指示完成操作。
安装好 alpine 并重启后的操作:
- 更新源
apk update
- 安装编辑器
apk add vim
- 启用更多源
开启社区源。
vim /etc/apk/repositories
将 #http://mirrors.aliyun.com/alpine/v3.23/community 注释去掉(把“http”前面的井字符号删除即可)。
- 安装其它必要组件
apk add bash curl util-linux parted e2fsprogs
- 使用 wipefs 查看磁盘标签,如若类似于以下结果:
wipefs -n /dev/vda
DEVICE OFFSET TYPE UUID LABEL
vda 0x8001 iso9660 2025-12-17-07-03-17-00 alpine-virt 3.23.2 x86_64
vda 0x1fe dos
vda 0x200 gpt
说明 gpt 分区表、iso 标签的存在,会影响到后续 grub 的配置与引导,需要清除:
- 确认 /boot 分区正在被挂载在本机硬盘 vda 上
mount | grep -E '/boot|vda' || true
/dev/vda3 on / type ext4 (rw,relatime)
/dev/vda1 on /boot type ext4 (rw,relatime)
- 如果第 6 步确认为是(非空),卸载 /boot 分区,以免被干扰
umount /boot
- 确认 vda1 的起始位置(可选)
parted -s /dev/vda unit KiB print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 10485760kiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1024kiB 308224kiB 307200kiB primary ext4 boot
2 308224kiB 1199104kiB 890880kiB primary linux-swap(v1) swap
3 1199104kiB 10485760kiB 9286656kiB primary ext4
因为第 10 步会清除 32 KiB - 1024 KiB 区间,若 vda1 起始扇区小于 1024 KiB,会直接使 vda1 分区数据遭到破坏。
- 用 wipefs 清除 iso、gpt 标签的做法更为规范,但经常会遇到设备忙的问题(wipefs: error: /dev/vda: probing initialization failed: Resource busy),如果执行本步清除命令不成功,直接跳转到第 10、11 步,继续用 dd 命令强制清除
确认 swap 挂载状态,如果为空,不需要卸载:
swapon --show || true
NAME TYPE SIZE USED PRIO
/dev/vda2 partition 870M 0B -2
卸载 swap:
swapoff -a
再次确认 swap 挂载状态,如果卸载失败,请根据报错自行解决权限等问题:
swapon --show || true
清除硬盘 vda 上的 iso 9660 标签:
wipefs -a -t iso9660 -f /dev/vda
清除硬盘 vda 上的 gpt 标签:
wipefs -a -t gpt -f /dev/vda
wipefs 成功后,再次:
wipefs -n /dev/vda
结果应该不再出现 iso 9660 / gpt,若二者仍然存在,或 wipefs 报错/忙,再按照第 10、11 步 dd。
- 确认系统盘第一个分区起点大于 1024KiB(见第8步),否则不要执行本条 dd 命令
alpine linux virt ISO 的 iso 9660 签名 / 卷描述符,会落在磁盘早期区域(非 0 扇区),而本机 vda1 从 1 MiB 对齐开始,所以清除 32 KiB - 1 MiB 区块,可以抹掉 iso 签名且不损伤分区内其他数据,以 10GB ESSD 硬盘,以上 wipefs 查询结果为例,清除“ISO 9660 签名区域”,32 KB - 1 MB,安全区:
dd if=/dev/zero of=/dev/vda bs=1K seek=32 count=992 conv=notrunc
992+0 records in
992+0 records out
1015808 bytes (992.0KB) copied, 0.174056 seconds, 5.6MB/s
sync
- 清除“GPT 头/表”,LBA1 开始的 33 个扇区,不要动 MBR 的 LBA0
dd if=/dev/zero of=/dev/vda bs=512 seek=1 count=33 conv=notrunc
33+0 records in
33+0 records out
16896 bytes (16.5KB) copied, 0.000082 seconds, 196.5MB/s
sync
- 重新挂载 /boot 分区
“vda1”在其他环境可能有所不同,需要用“lsblk”事先确认:
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
NAME SIZE FSTYPE MOUNTPOINT
vda 10G
├─vda1 300M ext4
├─vda2 870M swap
└─vda3 8.9G ext4 /
再根据实际硬盘名挂载 /boot:
mount /dev/vda1 /boot
- 验证 gpt、iso 标签,是否已被清除
wipefs -n /dev/vda
DEVICE OFFSET TYPE UUID LABEL
vda 0x1fe dos
- 如果在硬盘末尾 33 个扇区,还发现了残留的 gpt 分区标签,则需要继续清理
SECTORS=$(cat /sys/block/vda/size)
dd if=/dev/zero of=/dev/vda bs=512 seek=$((SECTORS-33)) count=33 conv=notrunc
sync
-
确认清除后,参考 alpine linux 官方指南,安装并配置 grub:
-
安装 grub,grub-bios 组件
apk add grub grub-bios
- 用 lsblk 确认自己的系统盘符名,阿里云 ECS 系统盘默认为“vda”(如果不是,请自行修改)
lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
vda
├─vda1 ext4 53a935b3-8725-4c1e-9d2d-2b685d3ab97f 225.3M 10% /boot
├─vda2 swap 05554c58-807d-420f-ad8a-cbf054f32faf
└─vda3 ext4 3c9fca1f-4161-4a64-a94b-03da3fe216d5 8G 1% /
然后以 BIOS 模式,将 MBR 与 GRUB 二进制文件安装到系统盘:
grub-install --recheck /dev/vda
显示以下结果,说明安装成功:
Installing for i386-pc platform.
Installation finished. No error reported.
如果 grub-install 在执行后,报以下错误,说明 gpt、iso 等标签未被清除干净,需要重新运行步骤 5 确认:
grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels. This is not supported yet..
grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
grub-install: error: will not proceed with blocklists.
以上各类错误发生的原因,是 alpine 的 virt 版 ISO,为了保证能以光盘模式发行,被制成可引导启动的镜像的同时,还可以被安装在硬盘上启动,以及在 BIOS 与 UEFI 两种固件的机型上兼容运行,采取了 isohybrid(混合引导)模式,它自带:
- iso 9660(光盘文件系统签名)
- dos(MBR 签名,0x55AA)
- gpt(GPT 头/表签名)
然而用户在安装并配置 grub 时,grub 认为,硬盘“/dev/vda”上,同时存在不止一种分区表签名(比如 MBR(msdos) + 残留的 GPT 头/尾),所以提示:
disk with multiple partition labels
然后直接禁止 embedding(嵌入 core.img),只能退回到 blocklists,而 grub2 默认拒绝 blocklists → will not proceed with blocklists,这就会触发 grub 的写保护逻辑,导致配置失败。
- 读取硬盘 vda 的第一个扇区,并以 16 进制的形式,输出最后部分,确认 MBR 扇区结尾为 55 aa(MBR 签名),能否被成功引导,以第 21 步重启出现 grub 菜单为准
dd if=/dev/vda bs=512 count=1 | hexdump -C | tail
1+0 records in
1+0 records out
512 bytes (512B) copied, 0.000021 seconds, 23.3MB/s
00000170 be 95 7d e8 34 00 be 9a 7d e8 2e 00 cd 18 eb fe |..}.4...}.......|
00000180 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20 |GRUB .Geom.Hard |
00000190 44 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f 72 |Disk.Read. Error|
000001a0 0d 0a 00 bb 01 00 b4 0e cd 10 ac 3c 00 75 f4 c3 |...........<.u..|
000001b0 00 00 00 00 00 00 00 00 8e 55 75 6a 00 00 80 00 |.........Uuj....|
000001c0 21 02 83 08 b8 63 00 08 00 00 00 60 09 00 00 08 |!....c.....`....|
000001d0 b9 63 82 0f ff ff 00 68 09 00 00 30 1b 00 00 0f |.c.....h...0....|
000001e0 ff ff 83 0f ff ff 00 98 24 00 00 68 1b 01 00 00 |........$..h....|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
- 编辑“/etc/default/grub”文件,在最后一行加上一条用于启动当前系统的命令行:
vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet rootfstype=ext4"
如遇极少数环境下,initramfs 未包含 virtio 模块,才考虑追加参数“modules=virtio,virtio_pci,virtio_blk”。
- 自动生成配置文件并使grub生效
grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-virt
Found initrd image: /boot/initramfs-virt
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done
出现“Warning”提示是,grub 不会自动扫描并添加其它系统(如 Windows、其它 Linux 发行版)到其引导项,单系统环境下,该问题视同可被忽略。
- 重启系统,在 VNC 下可看出,alpine linux 已由 grub 引导启动。

- 已确认 VNC 显示 grub 菜单并进入 alpine,删除 alpine linux virt 默认的 syslinux 引导工具。
apk del syslinux
- grub 引导问题解决,再次进入 alpine,用一键脚本重装其他系统就没问题了,alpine linux 虽然也折腾不少了,但果然还是没有 Debian 顺手。

- 重装成 Debian 13。
下载:
wget --no-check-certificate -qO InstallNET.sh 'https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh' && chmod a+x InstallNET.sh
安装 Debian 13,推荐使用来自阿里云内网“aliyuncs.com”域名的源,该源不对外提供服务,外界同样无法访问,但阿里云任何地域机器都可以访问当地的内网源,延迟、传输速度对阿里云机器来说,可谓是最爽的,指定为其分配 512 MB 虚拟内存(-swap '512'),强制关闭安装云内核(--cloudkernel "0")、开启 bbr(--bbr)、开启 ssh 登录时类 Ubuntu 的系统状态显示(--motd)、强制将 DNS 修改成 Cloudflare 与 Google,不走云服务商自己提供的 DNS 配置(--setdns),以免 DNS 解析被污染。
bash InstallNET.sh -debian 13 -port "端口自定,默认跟随原系统" -pwd '密码自定,默认 LeitboGi0ro' -mirror "http://mirrors.cloud.aliyuncs.com/debian/" -swap '512' --cloudkernel "0" --bbr --motd --setdns