把 Surface Go 2 装成 Linux 开发本,这句话说出来轻巧,实际折腾过的人都知道,问题基本都集中在驱动上。尤其你选的还是 Ubuntu 20.04 双系统,官方内核在触摸屏、摄像头、WiFi 这几个关键点上的表现都很勉强,属于“能进系统但没灵魂”的状态。这篇文章我会把整个流程完整过一遍,从制作启动盘、关 BitLocker、分区装系统,到安装 linux-surface 内核、配置触摸屏和电源管理,每一步都尽量说清楚“为什么这么做”,能帮你少踩的坑尽量提前避开。
如果你手里正好有一台 Surface Go 2,又想在保留 Windows 的前提下拿它当 Linux 开发机跑 ROS、写代码、做实验,那这篇就是照着抄作业的版本。我不会用太新的发行版,尊重标题里的 20.04,但会告诉你哪些地方需要额外处理,哪些坑是官方文档不会写的。
1. 为什么是 Surface Go 2 + Ubuntu 20.04?
1.1 这台小机器的硬件底子
Surface Go 2 在 Windows 阵营里不算性能机器,但作为便携开发本有它独特的生态位:10.5 英寸、无风扇被动散热、体积小、续航大半天。它有 4425Y 和 Core m3-8100Y 两种 CPU,内存常见 4GB 或 8GB,硬盘则分 eMMC 和 NVMe SSD 两种方案。
这几点直接决定了你在 Ubuntu 里的后续体验。比如 eMMC 版本的磁盘在 Linux 下会显示为/dev/mmcblk0,而 SSD 版本是/dev/nvme0n1,分区的时候如果认错了盘,后果会比较严重。再比如散热方面,无风扇设计意味着你在高负载编译时会看到明显的降频,这是被动散热的物理限制,Ubuntu 下不会比 Windows 更热,但也别指望靠软件解决。
对我来说,这台机器的最大价值在于“随手拿出来就能写点东西”。屏幕小但分辨率不低,1920x1280 的 10.5 英寸屏幕配合触控笔,码字、看文档、改配置都很舒服。缺点是接口只有一个 USB-C,后面所有关于外设的准备工作,都是围绕这个唯一的接口展开的。
1.2 20.04 的执念与理性取舍
很多人会问:都 2025 年了,为什么还装 Ubuntu 20.04?答案对每个人不一样。对我这类做机器人、嵌入式相关开发的人来说,Ubuntu 20.04 是 ROS Noetic 的官方支持系统,很多课程、开源项目、工控设备的环境依赖都锁死在这套组合上。装新版本固然漂亮,但你想跑的老代码可能连依赖都装不上。
另外,linux-surface 这个社区维护的内核仓库对 Ubuntu 20.04 有稳定的打包支持,它不要求你升级到 22.04 或 24.04,而是通过独立内核包解决 Surface 驱动问题。所以从 20.04 入手,后续想升级再走升级路线,完全来得及。
我的建议是:如果你只是想要一个好看的 Linux 桌面做日常使用,那就别守 20.04,直接上 22.04 或 24.04 更省事。但如果你和我一样,需要在 ROS Noetic 生态里做开发、跑实验、跟教程,那 20.04 就是最稳妥的底座。这篇文章后面所有的分区和驱动步骤,都按 20.04 展开。
2. 安装前的准备工作:每一步都可能决定成败
2.1 制作启动盘:用 DD 模式而不是默认 ISO
Ubuntu 20.04 的镜像建议用 20.04.6 版本,这是该系列最后一个维护版本,内置的安装器对较新硬件的兼容性比初版好很多。下载地址用清华大学镜像站或者阿里云镜像站都行,下载完顺手做一次 SHA256 校验,避免拿到损坏的镜像。
Windows 下制作启动盘,我用的是 Rufus。重点在写入模式上:打开 Rufus 选择 U 盘后,分区类型选 GPT,目标系统选 UEFI,文件系统保持默认,但写入方式建议直接选 DD 模式,而不是 ISO 镜像模式。
注意:DD 模式会把镜像按字节写入 U 盘,ISO 模式则是解包写入,两种模式在多数机器上都能启动,但 Surface 的 UEFI 固件对某些 ISO 模式启动盘的兼容性不佳。如果你插上 U 盘后开机找不到启动项,先把写入方式改成 DD 模式重做一次,这是最常见的启动失败原因。
Linux 或者 macOS 下就简单了,一条dd命令搞定:
sudo dd if=ubuntu-20.04.6-desktop-amd64.iso of=/dev/sdX bs=4M status=progress这里的/dev/sdX是你的 U 盘设备节点,千万别写错。写完后系统可能会提示“无法读取介质”,不用管,弹出重插就行。
2.2 关闭 BitLocker 和 Secure Boot 的顺序问题
Surface 设备出厂默认开启“设备加密”,也就是 BitLocker。很多教程告诉你要关 Secure Boot,但没说顺序,结果一堆人折腾完以后 Windows 直接弹恢复密钥界面,要输入 48 位密钥才能进系统。
正确顺序分三步:先在 Windows 里彻底解密,再关闭 Secure Boot,然后重新启动确认 Windows 正常。
在 Windows 里以管理员身份打开 PowerShell,输入:
manage-bde -off C:它会开始解密 C 盘,这个过程需要一段时间。用manage-bde -status查看状态,直到Conversion Status显示为Fully Decrypted,再往下走。如果把 BitLocker 关掉后重启 Windows 出现要求恢复密钥的情况,大概率是只做了“暂停保护”而没真正解密。
注意:BitLocker 未解密时,Ubuntu 的安装器在手动分区里能看到 Windows 分区,但无法读取里面的文件,而且如果你在后面操作中动过 EFI 分区,Windows 很可能直接进不了系统。所以解密和备份永远放在最前面。
Secure Boot 的关闭方法:完全关机,按住音量加键再按电源键开机,会进入 Surface UEFI,然后到 Security 菜单里把 Secure Boot 设为 Disabled。这一项关掉后,Windows Hello 人脸和指纹登录可能不可用,这是硬件层面的限制,不是系统坏了。
2.3 硬盘空间与分区规划
在 Windows 磁盘管理里找到 C 盘,右键压缩卷,给 Ubuntu 留出足够空间。Space Go 2 的硬盘容量有限,不同型号差异还很大,我给个参考。
| 硬件方案 | 磁盘情况 | 我的建议 |
|---|---|---|
| 4425Y / 4GB / 64GB eMMC | 空间极紧张 | 不推荐双系统,建议单 Ubuntu 或直接用 WSL |
| m3 / 8GB / 128GB SSD | 勉强够用 | 压缩 60-80GB 给 Ubuntu |
| m3 / 8GB / 256GB SSD | 比较宽裕 | 压缩 100GB 给 Ubuntu |
为什么我不建议在 64GB eMMC 上做双系统?因为 Windows 本身加 Surface 驱动和预装软件就要占掉四十多 GB,剩下空间给 Ubuntu 最多三十 GB,还要算上根分区和交换分区,更新几次系统就满了。开发机最怕的就是磁盘被塞满后编译中途报错,那个感觉很痛苦。
分区这一步不需要提前做好,Ubuntu 安装器里可以处理。但建议你先在 Windows 里把空间压缩出来,形成一个“未分配”的连续区域,后面安装时直接选这块区域新建分区,比在安装器里调整 Windows 分区要安全得多。压缩出来的空间不用新建卷,保持未分配状态就行。
3. 双系统安装实操:从 U 盘启动到进入系统
3.1 启动方式与安装界面导航
U 盘插上后,有两种方式进入启动设备选择。第一种是关机后按住音量加键再按电源开机,进入 Surface UEFI 的 Boot Configuration,然后从列表里选 U 盘。第二种是在 Windows 里设置 -> 系统 -> 恢复 -> 高级启动,然后选择“使用设备”里的 U 盘。
这里有个特别容易翻车的问题:安装界面下,Surface 的原装键盘盖很可能没反应。因为官方内核还没来得及加载 Surface 的键盘固件,键盘盖在安装器里表现为完全失灵。而触屏在安装界面通常也不可用,所以你必须准备一个外接 USB 键盘鼠标,或者一个 USB-C 扩展坞把键盘鼠标接上。
注意:Surface Go 2 只有一个 USB-C 口,如果被 U 盘占用了,就没法同时插键盘鼠标。我自己的做法是买了一个带 PD 供电的 USB-C Hub,一边插 U 盘一边插键鼠,还能顺便给机器供电。不带 PD 的 Hub 在安装过程中有可能因为外设耗电导致充电变慢,这是很实际的经验。
安装界面选择语言、键盘布局时,用鼠标点击即可。如果只是键盘能用鼠标没反应,可以用 Tab 切换焦点、回车确认,再配合方向键操作,也能撑过安装向导,但体验很折磨。所以外接键鼠真的不能省。
3.2 手动分区:选择 Something Else
安装类型界面里,有三个常见选项:Erase disk、Install alongside Windows、Something else。这里我建议直接选 Something else,也就是手动分区。Install alongside 虽然能做双系统,但它对分区大小的自动调整策略不够透明,有时会把 swap 建在不合适的位置,不太推荐。
进入分区界面后,先确认磁盘设备,再找到那块“未分配空间”。假设你的机器是 128GB SSD,你在 Windows 里压缩出 80GB,这里会看到类似这样一块空闲区域。选中它,点击加号新建分区:
- 大小:比如 72GB,类型为主分区,使用为 ext4,挂载点选
/ - 剩余 8GB,类型为主分区,使用为“交换空间”
如果后续想单独给/home分一个区,可以在分配根目录后,再从剩余空间里划一块,挂载点选 /home。但 Surface Go 2 的磁盘总量不大,我个人不推荐过度细分,一个/加一个 swap 就是最稳的组合。
关键的一步:窗口底部的“安装启动引导器的设备”选择整块磁盘,比如/dev/nvme0n1或/dev/mmcblk0,而不是某个分区。安装器会自动找到现有的 EFI 分区写入 GRUB,保留 Windows 启动项。如果选错了目标磁盘的分区,可能导致 GRUB 找不到 EFI 位置,或者干脆把 Windows 引导信息弄乱。
3.3 第一次进系统后先做三件事
安装过程大概十分钟,完成后拔掉 U 盘重启。正常情况会看到 GRUB 菜单,第一项是 Ubuntu,第二项是 Windows Boot Manager。如果你进的是纯黑屏或者直接进 Windows,优先检查 UEFI 启动顺序,在 Surface UEFI 里把 GRUB 或 Ubuntu 设为第一启动项。
进入 Ubuntu 后,第一件事是打开终端确认系统状态:
uname -r20.04 默认内核版本大概率是 5.4 或 5.15(取决于你下载的是不是 20.04.6),此时触摸屏可能没反应,WiFi 可能搜不到网络,但这都是正常的,因为还没装 Surface 专用内核。
第二件事是连接网络。建议手边准备一根 USB-C 转网口的线,或者直接手机开 USB 共享网络。WiFi 如果暂时不能用,USB 共享是最快的应急方案。
第三件事,很多人会忽略,但双系统一定会遇到——Windows 和 Ubuntu 时间相差 8 小时。执行这条命令可以根治:
sudo timedatectl set-local-rtc 1 --adjust-system-clock原理很简单:Windows 认为主板 RTC 存的是本地时间,Linux 默认认为存的是 UTC,两边一换算就差了 8 小时。设置 local-rtc 后,Linux 会按照 Windows 的习惯去读取硬件时间,两边就一致了。
接着更新系统:
sudo apt update && sudo apt upgrade基础工作做完,接下来进入驱动配置重头戏。
4. 驱动配置:让 Surface Go 2 真正“活”过来
4.1 为什么要用 linux-surface 内核
官方 Ubuntu 内核不是不能用,只是对 Surface 设备的支持非常有限。Surface 的触摸屏走的是 Intel Precise Touch 协议,摄像头、传感器、固件校验都需要专门补丁。这些补丁没有合入 Ubuntu 官方内核,所以你可以看到的现象是:系统装好了,但触摸屏像块砖头,摄像头黑屏,合盖睡眠之后电量跑得飞快。
linux-surface 项目就是干这个的。它把 Surface 设备需要的驱动补丁维护到一套独立内核源码里,并且为 Debian/Ubuntu 提供了现成的软件仓库。装它的内核不会影响 Windows,因为 GRUB 和 Windows Boot Manager 是分开的启动项,同时它和 Ubuntu 自带的官方内核也不冲突,装完后你可以通过 GRUB 高级选项在内核版本之间自由切换。
| 功能 | Ubuntu 官方内核 | linux-surface 内核 |
|---|---|---|
| 触摸屏 | 基本不可用 | iptsd 支持 |
| 触控笔压感 | 无效 | libwacom-surface 支持 |
| 摄像头 | 可能黑屏 | firmware-surface 补齐 |
| WiFi/蓝牙固件 | 看型号碰运气 | 固件包覆盖更全 |
| 键盘盖 | 有时能识别 | 基本即插即用 |
所以这一步不是“锦上添花”,而是整个方案的核心。装不装 linux-surface 内核,决定了 Surface Go 2 是“一台能跑 Ubuntu 的平板”还是“一台可用的 Linux 笔记本”。
4.2 添加仓库并安装内核:几条命令搞定
先安装必要工具:
sudo apt install wget ca-certificates apt-transport-https gpg然后导入 linux-surface 仓库的 GPG 公钥并添加软件源:
wget -qO- https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/repos/linux-surface.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/linux-surface.gpg echo "deb [arch=amd64] https://pkg.surfacelinux.com/deb release main" | sudo tee /etc/apt/sources.list.d/linux-surface.list sudo apt update接着安装内核和关键驱动包:
sudo apt install linux-surface linux-headers-surface iptsd libwacom-surface firmware-surface如果你的仓库列表里找不到firmware-surface,可以先执行apt-cache search surface看看当前仓库实际提供了哪些包。不同时期包名可能略有差别,以实际输出为准,但linux-surface、iptsd、libwacom-surface这三个基本稳定存在。
关于 Secure Boot:因为我前面已经关掉了,所以不用额外装 MOK 签名包。如果你出于某些原因不想关 Secure Boot,需要装linux-surface-secureboot-mok,并在首次重启时完成 MOK 密钥注册,这一步比较麻烦,而且平板按键少,操作起来更费力,所以我个人还是推荐直接关闭。
装完以后重启,在 GRUB 菜单里选择刚装的新内核。进入系统后执行:
uname -r看到内核版本后缀带-surface,就说明启动到了新内核。同时确认触摸服务正常:
sudo systemctl enable --now iptsd systemctl status iptsdiptsd 是驱动 Intel Precise Touch 和触控笔的服务,如果这里状态是 failed,触摸屏和笔基本都没法用。
4.3 触摸屏、触控笔与键盘盖的验证和微调
触摸屏在 GNOME 桌面下几乎不需要额外配置。你可以用“设置 -> 设备”里找触控相关选项,或者直接用软件验证。终端执行:
libinput list-devices能看到Touchscreen和Tablet Pen相关的设备条目,说明内核已经正确识别。
触控笔压感这块,我常用的验证方法是打开 GIMP 或者 GNOME 自带的“画图”应用,用笔在画布上试一笔,粗细随压力变化就说明 iptsd 和 libwacom 工作正常。如果没反应,多半是 iptsd 服务没起来,或者 Wayland/Xorg 的会话配置有问题。可以先切到 Wayland 再试,因为 Wayland 对笔事件的传递比 Xorg 更直接。
键盘盖的问题通常出现在启动阶段。如果合盖开机后键盘没反应,优先检查:
dmesg | grep -i -E "surface|keyboard|hid"正常能看到 hid 键盘设备的注册信息。如果完全没有,试着在 Surface UEFI 里确认 Type Cover 固件没有被禁用,然后在 Windows 固件更新里升级一次键盘固件。我踩过的坑是在启动 U 盘安装时键盘失灵,但装完新内核后重启就好,这属于内核驱动缺失,不是硬件问题。
声卡方面,Ubuntu 20.04 默认可能缺少 SOF 固件,导致没有声音。直接安装:
sudo apt install sof-firmware装完重启,如果还是没声音,执行一次sudo alsa force-reload,再在声音设置里检查输出设备。Surface Go 2 的扬声器在 linux-surface 内核下工作正常,至少我手头这两台都稳定。
5. 日常使用调优:从“能开机”到“好用”
5.1 电源管理、睡眠与充电
Surface Go 2 的电池在 Ubuntu 下基本不需要额外驱动就能显示电量,但电源管理策略还是值得调一调。我习惯装 TLP:
sudo apt install tlp tlp-rdw sudo tlp startTLP 会自动管理 CPU 频率、磁盘休眠、USB 自动挂起等参数。对无风扇的 Surface Go 2 来说,最明显的好处是轻度使用时的发热和耗电会收敛一些。
睡眠是 Surface 设备在 Linux 下的老话题。默认内核的睡眠模式是s2idle,也就是现代待机,合盖看似睡了,实际还在低功耗运行,一晚上能掉好几格电。你可以先看一下当前支持的睡眠模式:
cat /sys/power/mem_sleep输出一般是:
s2idle deep其中方括号标出的是当前默认项。如果你想让系统在 suspend 时使用 deep(真正的 S3 睡眠),可以临时测试:
echo deep | sudo tee /sys/power/mem_sleep sudo systemctl suspend秒睡秒唤醒或者正常睡眠都可以,那就说明这台机器能用 deep。想永久生效,可以在 GRUB 配置里加内核参数:编辑/etc/default/grub,把GRUB_CMDLINE_LINUX_DEFAULT里加上mem_sleep_default=deep,然后运行sudo update-grub。
但注意:不同批次 Surface Go 2 对 deep 的兼容性不完全一样,我手头有一台 deep 模式稳得很,另一台唤醒后触摸屏就丢设备,只能回滚回 s2idle。所以这个参数务必自己测,别抄作业抄出问题。
5.2 亮度、自动旋转与系统细节
亮度调节在 Surface Go 2 上建议直接用 brightnessctl:
sudo apt install brightnessctl brightnessctl set 60%亮度键在 linux-surface 内核下通常能映射到 GNOME 的快捷键里,但如果按键没反应,brightnessctl 是最可靠的后备方案。
自动旋转依赖加速度传感器,Ubuntu 20.04 桌面默认带了iio-sensor-proxy,你可以在“设置 -> 显示”里打开自动旋转。如果转屏不跟手,检查一下设备是否被识别:
systemctl status iio-sensor-proxy还有一个细节:10.5 英寸屏幕配上 1920x1280 分辨率,默认缩放对很多人来说都偏小。我建议在“设置 -> 显示”里把缩放调成 150%,键鼠摸起来会舒服很多。Wayland 会话下缩放和旋转的体验比 Xorg 好不少,所以我在登录界面左下角直接把会话切成 Ubuntu on Wayland。
5.3 开发环境配置与性能取舍
系统稳定以后,这台机器才算是真正能干活。Ubuntu 20.04 + ROS Noetic 是嵌入式、机器人方向最常见的组合,安装方式走 ROS 官方源即可。装完以后,Surface Go 2 就能当成移动测试平台,跑节点、看日志、连串口设备都没有问题。
我日常还会装这些基础工具:
sudo apt install build-essential git curl vim htop ssh net-toolsVS Code 有 Ubuntu 20.04 的 deb 包,装上以后写代码、远程开发都顺手。Docker 在 linux-surface 内核里跑起来很干净,容器网络没有遇到过问题。
性能方面,受制于内存和硬盘,Surface Go 2 不适合做大规模编译,但轻量开发完全够用。8GB 内存版本建议用 zram 压缩交换来缓解内存压力:
sudo apt install zram-tools默认配置已经能工作,你可以在/etc/default/zramswap里调整ALGO=zstd和PERCENT=50,系统会在内存紧张时自动压缩换页,相当于变相给内存扩容。对 4GB 内存版本来说,这个优化非常重要,不开它开几个浏览器标签加 IDE 就可能卡。
6. 常见问题与排查技巧实录
6.1 高频问题速查表
我把折腾过程中遇到过和身边朋友经常问的问题整理成了一张表,遇到问题先对照排查。
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 安装后直接进 Windows | 启动顺序还是 Windows 优先 | 按住音量加开机进 UEFI,把 Ubuntu/GRUB 调为第一启动项 |
| GRUB 菜单没有 Windows | os-prober 没检测到 | 执行sudo update-grub |
| WiFi 搜不到网络 | 固件缺失或驱动未加载 | 先用手机 USB 共享联网,安装 linux-surface 仓库和firmware-surface |
| 触摸屏没反应 | iptsd 未启动 | sudo systemctl enable --now iptsd,确认服务状态 |
| 触控笔有光标但没有压感 | libwacom 配置缺失 | 安装libwacom-surface,切换 Wayland 会话 |
| 没有声音 | 缺少 SOF 固件 | 安装sof-firmware,执行sudo alsa force-reload |
| 摄像头黑屏 | 官方内核不支持 Surface Camera | 使用 linux-surface 内核并安装firmware-surface后测试 |
| 合盖睡眠一晚上掉电 30% | s2idle 逗留功耗 | 测试deep睡眠模式,能稳定则设置mem_sleep_default=deep |
| 键盘盖偶尔不识别 | 驱动或固件问题 | 重新插拔,查看dmesg,在 Windows 下更新键盘固件 |
| 时间和 Windows 相差 8 小时 | RTC/UTC 规则不同 | sudo timedatectl set-local-rtc 1 --adjust-system-clock |
这些都不是玄学,基本都能通过日志找到线索。重点是别急着一个一个乱试,先看服务状态和内核日志,再决定方向。
6.2 几个我反复用到的排查技巧
第一个技巧:任何驱动异常,先看这两条命令的输出。
journalctl -b -p err dmesg | grep -i -E "surface|ipts|firmware|error"大部分驱动问题在日志里都有明确提示,比盲目重装包高效得多。
第二个技巧:改坏配置或者新内核不稳定时,不要慌。重启后在 GRUB 的“Advanced options for Ubuntu”里选旧内核启动,系统就能回来。如果确认是 surface 内核的问题,可以暂时卸载:
sudo apt purge linux-surface然后重启回到官方内核。这个回滚路径非常干净,所以“尝试新内核”这件事本身风险很小。
第三个技巧:动手分区或者调整 EFI 之前,先把启动项现状记录下来。在 UEFI 界面拍个照片,或者在本子上写好磁盘布局。因为 Surface Go 2 的 UEFI 菜单比较简陋,万一操作失误导致启动项失踪,有原始记录能快速定位问题。
最后再分享一个我自己的使用习惯:Surface Go 2 上网本属性和开发属性并存,但我基本不依赖合盖睡眠。离开的时候直接关机,回来开机到进桌面大概十几秒,比折腾 deep sleep、s2idle 和各种唤醒异常省心得多。这台机器关机状态下的电量损耗几乎可以忽略,这也算是我实测下来最“无脑但稳妥”的方案。