
接着上一篇:这台 Surface Go 2 已经退回 Win10,C: 扩到 119GB。现在想在它上面再装一个 Ubuntu,做双系统。
听起来像「下个 ISO、做个 U 盘、下一步下一步」的标准流程。但这台机器集齐了三个不利条件:USB-C 口不能传数据 (做不了启动盘)、Secure Boot 开着 (不认第三方签名)、系统盘是 BitLocker 加密卷(Linux 内核读不了)。
我在这三个条件叠加下连续踩了五个坑,最后一个坑的答案只有两个字,但它藏得很深。下面是全过程。
一、约束决定了路线
| 常规做法 | 在这台机器上的状态 |
|---|---|
| Rufus / balenaEtcher 做 U 盘启动盘 | 无 USB 数据传输,做出来也引导不了 |
| 从 microSD 启动 | Surface UEFI 不认 SD 卡启动 |
| Ventoy 多合一 U 盘 | 同上 |
| PXE 网络引导 | 需要另一台机器搭 DHCP/TFTP,Surface 的 UEFI 网络栈支持不确定,风险最高 |
唯一还留在桌上的方案是:把 ISO 放在硬盘上,从硬盘引导安装器。
具体一点:ISO 丢进 C:\Ubuntu\;在 EFI 分区(ESP,FAT32)上放一个 GRUB;给 BCD 加一个菜单项指向这个 GRUB;GRUB 用 loopback 把 ISO 挂起来,加载里面的内核。
这条路线的好处是不需要任何外部介质,坏处是------每一个环节都可能踩坑,而且报错信息完全不指向真实原因。
二、坑 1:0xc0000007b
第一次部署完,启动菜单里多了「Ubuntu Installer」,选中回车,屏幕一闪:
0xc0000007b
这个错误码的含义很宽泛("无效的映像"),中文社区里常被解读成"文件损坏"。我先按这条路查:把 ISO 里原始的 grubx64.efi 抽出来对比,ESP 上的文件 MD5 与源文件完全一致,大小 2,328,456 字节一分不差。文件是好的。
那问题就在别处。查 Secure Boot:
powershell
Confirm-SecureBootUEFI # True
这才是原因。 bootmgr 在 Secure Boot 下只加载用微软证书签名 的 EFI 程序。Ubuntu 的 grubx64.efi 只有 Canonical 自家签名,bootmgr 直接拒绝执行------它甚至没走到读 grub.cfg 那一步,所以报的是"映像无效",而不是任何 GRUB 层面的错误。
正确姿势:走 shim 链
Windows 加载 Linux 的正规链路是三段:
bootmgr(验微软签名)
└─ shimx64.efi(微软签名的中转器)
└─ grubx64.efi(Canonical 签名,由 shim 验)
└─ 内核
ISO 的 EFI/boot/bootx64.efi 其实就是这个 shim(966,664 字节,微软签名)。把它放到 ESP 上,BCD 指向它:
powershell
# 从 ISO 抽出 shim,推到 ESP
Expand-Archive ... # 或用 7-Zip 解出 EFI\boot\bootx64.efi
Copy-Item bootx64.efi S:\EFI\ubuntu\shimx64.efi
# BCD 项改为指向 shim
bcdedit /set {新GUID} path \EFI\ubuntu\shimx64.efi
关键细节 :shim 会去自己所在目录 找 grubx64.efi,所以两个文件必须同目录,且 GRUB 必须叫这个名字。改名或分开放,shim 就找不到它。
改完重启,GRUB 菜单出来了------Secure Boot 不用关。这一点值得强调:网上大量教程让你先关 Secure Boot,但那会同时降低 Windows 侧的启动完整性保护,能走 shim 链就不要关。
三、坑 2:no such device
GRUB 界面出来了,选第一项,屏幕上滚出四行:
error: no such device: /Ubuntu/xubuntu-24.04.3-desktop-amd64.iso
error: file '/Ubuntu/xubuntu-24.04.3-desktop-amd64.iso' not found
error: no server is specified
error: you need to load the kernel first
四个错误是因果链:找不到设备 → 找不到文件 → 没法给内核传根目录 → 内核没加载。
第一反应是 GRUB 缺 NTFS 驱动 。这个判断有依据:很多发行版内置的 GRUB 镜像只带 ext2/iso9660,读 NTFS 需要额外模块。于是我把 ISO 里全部 269 个 GRUB 模块解出来推到 ESP 上,重写配置显式加载:
insmod ntfs
insmod loopback
insmod iso9660
set root=(hd0,gpt3) # 硬编码到 C: 分区,不用 search 猜
set isofile="/Ubuntu/xubuntu-24.04.3-desktop-amd64.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile
initrd (loop)/casper/initrd
重启。一模一样的四行报错。
四、坑 3:改了配置,为什么像没改
这里是最容易被自己骗过去的地方。
我把 ESP 上所有 grub.cfg 递归列了一遍:
powershell
Get-ChildItem S:\ -Recurse -Filter grub.cfg
结果是三份:
S:\EFI\ubuntu\grub.cfg
S:\EFI\Boot\grub.cfg
S:\boot\grub\grub.cfg ← 这一份是旧的,里面还有 search
GRUB 用的是「memprefix」机制:它把启动时的 prefix 记下来,去那个目录找配置。之前部署时我写到了三个位置,但后续只更新了前两个,而GRUB 实际读的是第三份。
所以「改了不生效」的真相是:我改的两份根本没被读过。
教训很硬:部署 GRUB 配置时,必须全盘清点 grub.cfg,逐个覆盖,逐个回读校验 MD5。只改你认为它该在的地方,是在赌 GRUB 的实现细节。
但我必须诚实地说:三份全改成同一份之后,报错依旧。 这说明三份 cfg 是一个真坑,却不是这一个症状的唯一成因------症状稳定不变时,更要怀疑自己看到的到底是不是同一个因。这也是下一节的内容。
五、坑 4:绕开 GRUB 读 NTFS
既然 GRUB 读分区这一步不可靠,那就干脆不让它读:把 ISO 里的内核和 initrd 直接抽到 ESP 上(FAT32,GRUB 一定能读),ISO 的查找交给 Linux 内核自己做。
vmlinuz 15,546,760 B
initrd 91,124,179 B
配置变成三行:
menuentry "Xubuntu 24.04 Live Installer" {
set root=(hd0,gpt1)
linux /EFI/ubuntu/casper/vmlinuz boot=casper iso-scan/filename=/Ubuntu/xubuntu-24.04.3-desktop-amd64.iso noprompt quiet splash ---
initrd /EFI/ubuntu/casper/initrd
}
这一次内核真的起来了------滚了几屏日志,然后掉进 BusyBox:
(initramfs) stdin: Invalid argument
Could not find the ISO /Ubuntu/xubuntu-24.04.3-desktop-amd64.iso
Dropping to a shell.
这是全程最关键的一个画面。 它不是失败,它是把问题缩小到了极致:引导链全通了,只剩「内核找不到 ISO」。
六、坑 5:blkid 一句话定案
在 (initramfs) 提示符下敲:
blkid
输出:
/dev/nvme0n1p1: LABEL="SYSTEM" TYPE="vfat" ← EFI 分区
/dev/nvme0n1p2: ← MSR
/dev/nvme0n1p3: TYPE="BitLocker" ← 你的 C: 盘
TYPE="BitLocker"。
C: 盘是 Surface 出厂默认开启的「设备加密」------BitLocker 的无人值守版本。这意味着:
- GRUB 读不了它(坑 2 的四行报错,真因在这里)
- Linux 内核的
ntfs3也读不了它(casper 找不到 ISO 的真因也在这里) - 我改了那么多遍配置文件,全在敲一堵墙
最阴的地方在于:Windows 里查状态,manage-bde -status C: 显示 Protection Off,且没有任何密钥保护器 。看到这个很容易误判成"没加密"。实际上「保护关闭」只表示密钥可以透明使用,磁盘上的数据仍然是加密的------Windows 自己能解,别的系统一概读不了。
解法:把加密关掉
因为没有任何密钥保护器、数据本来就处于明钥状态,解密是无风险操作:
powershell
manage-bde -off C:
进度可以这样盯(ConversionStatus 3 = 正在解密,0 = 完成):
powershell
(Get-WmiObject -Namespace 'root\cimv2\security\microsoftvolumeencryption' `
-Class Win32_EncryptableVolume -Filter "DriveLetter='C:'").ConversionStatus
已用空间加密的卷,119GB 解了约 7 分钟,数据无损。
重启,GRUB 第一项回车------这一次它自己找到了 ISO,直接进了 Xubuntu 桌面。 手工 mount 都不需要了。
七、安装:手动分区的三个要点
进桌面后双击安装器。分区这一屏是唯一有风险的地方:
- 选手动分区,不要选「清除整个磁盘」
- 末尾那块 32GB 的「空闲空间 / free space」 (不是已格式化分区)→ 新建 → 挂载点
/、ext4、勾格式化 - 引导器安装位置选
/dev/nvme0n1p1(那个 FAT32 的 EFI 分区) - 绝对不要动 :
p1(EFI)、p3(你的 Windows C:)
装完约 15 分钟。重启,出现了 GRUB 菜单,里面有 Xubuntu 和 Windows Boot Manager 两项------双系统成立。
八、然后我把它删了
这不是反转,这是一个必须写下来的结论。
Ubuntu 装成功之后,体验是不能用的 :屏幕分辨率固定在低档、字体发虚、触摸屏完全无响应、笔没反应、自动旋转和亮度传感器全失效。一台平板电脑失去触摸,就只剩一个带支架的厚笔记本。
原因很清楚:Surface 系列需要linux-surface 项目的内核补丁才能驱动触摸屏(iptsd)、摄像头、传感器。原版 Ubuntu 内核不认识这些硬件。
所以正确的顺序应该是:
- 先用这篇的方法把 Ubuntu 装进去
- 联网后立刻加 linux-surface 源,装
linux-surface内核 +iptsd - 重启验证触摸、笔、亮度、旋转
- 确认可用之后,再决定要不要长期保留
我跳过了第 2 步就下判断,这是我的问题;但对多数人来说,结论仍然成立:Surface 装 Linux 不是「装完就能用」,中间还有一个专用内核的门槛,而那个内核的维护质量直接决定这台机器值不值得装 Linux。
最终我选择了彻底删除。删除过程本身也有个坑值得记:Ubuntu 安装时会往 UEFI 的 NVRAM 写一个「Ubuntu」启动项,并且排到第一位。只删分区不删它,你会得到一个"指向空气"的启动项,每次开机都多一次等待甚至报错。
正确的卸载要三段全清:
powershell
# 1) NVRAM 固件启动项
bcdedit /delete "{NVRAM 里的 Ubuntu GUID}" /f
# 2) BCD 菜单项
bcdedit /delete "{Ubuntu Installer 的 GUID}" /f
# 3) ESP 上的文件
Remove-Item -Recurse -Force S:\EFI\ubuntu, S:\boot
Copy-Item S:\EFI\Microsoft\Boot\bootmgfw.efi S:\EFI\Boot\bootx64.efi -Force
然后删掉 Ubuntu 分区,Resize-Partition 把空间还给 C:(86.97GB → 118.97GB)。
九、这套方法什么情况下值得用
| 场景 | 建议 |
|---|---|
| 没有可用的 USB 口 / 只有这一台机器 | 值得。这套流程不需要任何外部介质 |
| 想在 Surface 上日常用 Linux | 先确认 linux-surface 内核对你这代机型的支持程度,再动手 |
| Secure Boot 打开且不想关 | 可以,走 shim 链就行,别听"先关 Secure Boot"的教程 |
| 系统盘开了设备加密 | 必须先用 manage-bde -off 解密,否则一切白费 |
| 只想试试 Linux | 别装双系统,先用虚拟机。这次我付出的成本是一个下午加一次完整卸载 |
十、五条可以直接抄走的经验
0xc0000007b不是文件坏了 ,先查Confirm-SecureBootUEFI,再查签名链- GRUB 报"找不到文件"时,先确认自己改的是不是它在读的那份配置 ------
Get-ChildItem -Recurse -Filter grub.cfg全盘列一遍 - 报错稳定不变时,怀疑另有其因。我改了四遍配置都报同一句,因为墙是 BitLocker,不在配置里
blkid是判断"这堵墙是什么"的最快工具 ,(initramfs)里敲一条胜过猜半天- 「保护关闭」不等于「没加密」 。
manage-bde -status的 Protection Off 极具误导性,看blkid的 TYPE
免责声明:以上仅代表我个人的实践记录,环境为 Surface Go 2(Win10 22H2 + Xubuntu 24.04.3)。分区、引导、加密卷操作存在数据丢失风险,请先完整备份再动手;不同机型、不同发行版与 Secure Boot 策略的行为可能有差异,具体请以你自己的实测结果为准。