Surface 装 Ubuntu 双系统

接着上一篇:这台 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 都不需要了。

七、安装:手动分区的三个要点

进桌面后双击安装器。分区这一屏是唯一有风险的地方:

  1. 选手动分区,不要选「清除整个磁盘」
  2. 末尾那块 32GB 的「空闲空间 / free space」 (不是已格式化分区)→ 新建 → 挂载点 /、ext4、勾格式化
  3. 引导器安装位置选 /dev/nvme0n1p1(那个 FAT32 的 EFI 分区)
  4. 绝对不要动 :p1(EFI)、p3(你的 Windows C:)

装完约 15 分钟。重启,出现了 GRUB 菜单,里面有 Xubuntu 和 Windows Boot Manager 两项------双系统成立。

八、然后我把它删了

这不是反转,这是一个必须写下来的结论。

Ubuntu 装成功之后,体验是不能用的 :屏幕分辨率固定在低档、字体发虚、触摸屏完全无响应、笔没反应、自动旋转和亮度传感器全失效。一台平板电脑失去触摸,就只剩一个带支架的厚笔记本。

原因很清楚:Surface 系列需要linux-surface 项目的内核补丁才能驱动触摸屏(iptsd)、摄像头、传感器。原版 Ubuntu 内核不认识这些硬件。

所以正确的顺序应该是:

  1. 先用这篇的方法把 Ubuntu 装进去
  2. 联网后立刻加 linux-surface 源,装 linux-surface 内核 + iptsd
  3. 重启验证触摸、笔、亮度、旋转
  4. 确认可用之后,再决定要不要长期保留

我跳过了第 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 别装双系统,先用虚拟机。这次我付出的成本是一个下午加一次完整卸载

十、五条可以直接抄走的经验

  1. 0xc0000007b 不是文件坏了 ,先查 Confirm-SecureBootUEFI,再查签名链
  2. GRUB 报"找不到文件"时,先确认自己改的是不是它在读的那份配置 ------Get-ChildItem -Recurse -Filter grub.cfg 全盘列一遍
  3. 报错稳定不变时,怀疑另有其因。我改了四遍配置都报同一句,因为墙是 BitLocker,不在配置里
  4. blkid 是判断"这堵墙是什么"的最快工具 ,(initramfs) 里敲一条胜过猜半天
  5. 「保护关闭」不等于「没加密」 。manage-bde -status 的 Protection Off 极具误导性,看 blkid 的 TYPE

免责声明:以上仅代表我个人的实践记录,环境为 Surface Go 2(Win10 22H2 + Xubuntu 24.04.3)。分区、引导、加密卷操作存在数据丢失风险,请先完整备份再动手;不同机型、不同发行版与 Secure Boot 策略的行为可能有差异,具体请以你自己的实测结果为准。

相关推荐
额额额对了1 小时前
【项目实战】从IMX6ULL环境监测到N647 AI视觉加速
linux·开发语言·嵌入式硬件
Elastic 中国社区官方博客1 小时前
Elastic 重大事件功能如何将 100 条日志样本转化为检测规则
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎
柏慧通云报餐1 小时前
政企清廉食堂数字化建设方案:基于一体化报餐平台的全链路管控落地思路
大数据·运维·人工智能·物联网·sass
方便面不加香菜1 小时前
Docker安装详解--基于Ubuntu环境
运维·docker·容器
snpgroupcn1 小时前
SAP迁移工程下篇:模板复用、自动化执行与阶段内置校验的实现(下篇)
运维·自动化
dingdingfish1 小时前
TLPI 第49章 读书笔记:Memory Mapping
linux·mmap·munmap·tlpi·msync
Ya_Chuan_2 小时前
实验室防排烟系统与通风排风系统联动控制逻辑讲解
运维·数据中心·实验室·dcom·ibms 集成平台技术
EVEN-09132 小时前
Linux-进程(2)
linux·运维·服务器
u0109053592 小时前
(永久免费)树莓派 / 香橙派等开发板,安装神卓互联巴比达内网穿透安装教程(Linux ARM 版 V9.4.1)
linux·运维·arm开发