如何在 Surface 上安装 Linux/Ubuntu

这篇文章介绍了如何在 Surface 中安装 Linux 系统(以 Ubuntu 为例),特别详细说明了如何解决安装后无法重启到 Ubuntu 的问题。
目录

最近尝试在我的 Surface Laptop Studio (以下简称 SLS )上安装 Ubuntu。与一些其他品牌的 PC 相比,Surface 设备的硬件和设置相对特殊和封闭。所以,我在安装的过程中,颇费了一番周折。Github 上有一个 Surface Linux 项目,一些大佬专门为了在 Surface 上使用 Linux 而制作特殊的内核。尽管这个项目有详细的安装指导,并且网上还能找到一些其他的安装指导123,依照我自己的经验,还是需要一些补充的说明。这篇文章就是为那些在 Surface 上安装 Linux (以 Ubuntu 为例) 遇到典型困难的人准备的。

1.快捷答案

您可能是因为遇到在 Surface 上安装 Ubuntu 后重启无法再进入 Ubuntu 系统问题才找到这篇文章的。那么,您可以制作 Linuxmint 21.3 的 USB 安装介质来修复这个问题。在 UEFI 的“Secure”菜单中选择第 2 个选项,以开启安全启动。然后从该介质启动,会进入蓝色的 Mok 界面,其中可能有“Enroll Mok”的选项,选中它,输入一个随机的密码(如果您在安装 Ubuntu 时没有选择安装第三方软件,且没有设置安全启动密码话,否则,输入当时填写的密码)。之后重启到 UEFI,再尝试从 Ubuntu 启动。如果不成功。则尝试重启,进入 Linuxmint 的引导界面(无需安装),之后再重启进入 UEFI 以关闭安全启动,再尝试进入 Ubuntu。此时应该没有问题了。详情参见第 48 部分。

2.准备工作

相关的准备工作可以参考其他一些网站

2.1Surface Linux 项目

要为自己的 Surface 设备安装 Linux,首先要考虑的问题是安装哪一个发行版。我建议先尝试 Ubuntu,这也是对任何初次尝试 Linux 的人的建议(或许,Fedora 也是一个不错的选择)。然后,仔细研究 Surface Linux 项目的安装指导,以及在 Linux 下 Surface 设备的功能矩阵

正如 Surface Linux 项目所说,在默认的最新 Linux 内核下,大部分 Surface 设备的大部分功能可用,比如键盘、扬声器、无线网卡、蓝牙、显示器、触控板等等,只有少部分功能不可用,比如触摸屏、相机、平板模式(特别是对于 Surface Pro 或 Surface Book)。所以,如果您在安装了带有默认内核的 Linux 系统后,发现大部分功能已经满足您的要求,大可不必再安装 Surface-Linux 内核,毕竟这会非常麻烦。

2.2为 Linux 准备磁盘空间。

在 Windows 系统中,通过磁盘管理为 Linux 系统压缩出至少 50GB 的磁盘空间。压缩后,不要再进行其他操作,比如,格式化(即使系统提示也不要)。如果不熟悉这个操作,可以自行搜索。

2.3创建 Linux 安装介质

在 Windows 系统中,首先,下载 Ubuntu 22.04 的 iso 镜像(以当前的 LTS 为准,不建议安装非 LTS版本)。下载和安装用于制作安装介质的工具 Etcher 。另外,下载 Linuxmint 21.3 的 iso 镜像。此镜像用于后面的启动修复,这一点很重要。

准备一个空间大于 8GB 的USB 3.0 的优盘。先用 Etcher 烧制 Ubuntu 的安装介质。

2.4UEFI 设置

烧录完成后,在 Windows 系统中选择关机(而不是重启)。屏幕彻底关闭的 5 秒后,按一下电源按钮,在微软徽标亮起后立即松开,并立即按住 音量+ 键,直到进入 UEFI。

在“Boot Configuration”菜单中,将“Windows Boot Manager”等其他选项取消选择,并勾选“USB Storage”。

在“Security”菜单中,在“Secure Boot”下点击“Change Configuration”,选择第 3 项“None”,以关闭安全启动。

在“Exit”菜单中,点击“Restart Now”,以重启设备。

详情参见微软的官方说明

3.安装 Ubuntu

如果您头一次在您的 Surface 上安装 Ubuntu,那么您肯定能够进入 Ubuntu 的系统引导界面和安装界面。Ubuntu 的 grub 系统引导界面是黑色的,点击第一项 “Try and install Ubuntu”,就进入了 Ubuntu 的安装界面。

此时,您的鼠标可能无法使用,甚至触控板也无法使用(亲测 SLS 不能使用,但 Surface Laptop 3 可以,在更老的设备上,可能触摸屏能够直接使用),因此您只能用键盘来执行安装操作。或许您可以事先准备一个有线鼠标。如果您连键盘都无法使用,那么请准备一个有线键盘。

在您只能使用键盘的情况下,尝试使用方向键(在键盘的右下角)以及 Tab 键来在不同的选项和菜单中选择。

进入如下界面后,按住向下方向键来快速切换到“中文(简体)”(假如您需要使用中文的界面的话)。然后,按 Tab 键导航到“安装 Ubuntu”,并按下 Enter 键。

图1

可能会要求您选择键盘。假如您前面选定了中文,则默认键盘会是“汉语”,请不要更改,因为这个选项会为您自动配置中文键盘和输入法,不至于安装系统后,还需要其他配置才能使用中文输入法。

然后,进入网络设置界面,通过方向键来选择“I don't want to connect to a Wi-Fi network right now”。然后,通过 Tab 键来选择“继续”。

图2

然后进入“更新和其他软件”界面,通过方向键来选择“最小安装”,通过 Tab 键来选择“继续”。不要勾选任何其他选项。

图3

然后进入“安装类型”界面,通过方向键来选择“安装 Ubuntu,与 Windows Boot Manager”并存。(这一选择是为了保险,其实可以选择第二项“清除整个磁盘并安装 Ubuntu”。在双系统下,Ubuntu 的系统引导菜单会包含一个启动到 Windwows 的选项。)通过 Tab 键来选择“继续”,安装程序会自动选中您在 Windows 中为 Ubuntu 准备的磁盘空间,并自动分区(新手建议如此)。这时候会弹出一个对话框,以 Tab 键来选择“继续”。

图4

图5

然后进入账户创建界面。密码可以随便设,即使提示“密码强度:过短”。以 Tab 键来选择“安装”。

图6

这样就进入安装了。中间可能会弹出选择时区的界面,输入“shanghai”,以继续。

图7

大约 5 到 10 分钟,安装完毕,以 Tab 键选择“现在重启”。

图8

4.修复 Ubuntu 的启动

重启后,您有可能无法进入 Ubuntu 系统,而是卡在了微软徽标上。此时,重启进入 UEFI, 在“Boot Configuration”中,将“Windows Boot Manager”勾选,并将“Ubuntu“等其他选项取消选择。重启进入 Windows 系统。

在 Windows 系统中烧录 Linuxmint 的 USB 安装介质。然后,重启,再次进入 UEFI,在“Secure”菜单中,选择第 2 个选项(这一点非常重要)以开启安全启动,并在“Boot Configuration”菜单中,只勾选“USB Sorage”,然后回到“Exit”,点击“Restart now”以重启。

此时设备会启动到一个蓝色的 Mok 界面。可能会是如下界面。选择“Continue Boot”即可。

图9

但是,正常情况下,会是如下界面,此时,选择“Enroll Mok”,然后选择“Continue”,您可能需要输入一个随意的密码,比如“linux”。

图10

图11

也可能直接进入 Linuxmint 的系统引导界面(类似 Ubuntu 的)。

也可能是上面的操作执行后,重启会进入这个界面。不要安装 Linuxmint(如果您并不想安装它)。

不清楚这其中的机制是什么,反正如此这番操作之后,重启进入 UEFI,关闭安全启动,然后勾选启动项中的“Ubuntu”后,您就能进入 Ubuntu 系统了。

5.安装 surface-linux 内核

现在我们成功重启到 Ubuntu。您可能会发现,大部分硬件都能正常工作。如果您满足以此,那么就不必安装 surface-linux 内核了。在网络不好的情况下(比如,当您没有 VPN),这项工作会特别麻烦。

可能您仍然坚持安装 surface-linux 内核,并且您的设备恰好像我的 SLS 一样,在进入 Ubuntu 后,似乎只能用键盘。下面假设您进入 Ubuntu 后似乎只能使用键盘等输入设备。

首先,您的蓝牙应该能工作,为了摆脱只能用键盘的处境,建议先把蓝牙鼠标连上。在连接蓝牙鼠标之前,先使您的蓝牙鼠标进入连接状态,从而让其他设备能够发现它。然后,快速按下微软徽标,进入 Dashboard 界面,输入“Blue”,用方向键导航到“蓝牙”设置,按 Enter 键选中。

此时系统会搜寻蓝牙设备,如果您的蓝牙鼠标刚进入连接状态,那么系统应该能够发现它。一旦发现,快速用方向键导航到您的鼠标名称,按下 Enter 键来连接。如果发现不了,可能是因为您开启蓝牙鼠标的连接状态的不是时机,比如,开启的过早,在进入蓝牙设置后,系统早已发现您的鼠标设备,因此它位于列表的靠后部分,但是通过方向键无法导航到隐藏的靠后的列表。如果您还没有从列表中发现您的鼠标,可以反复开启连接状态,并迅速进入蓝牙设置。

假设您连接蓝牙鼠标不成功。您可能需要一个有线鼠标。对于 SLS,您可以执行以下操作,尝试激活触控板。

(1)按下 Enter 键搜索“Gedit”,打开它。

(2)在其中添加如下内容:

[Microsoft Surface Laptop Studio Touchpad]
MatchVendor=0x045E
MatchProduct=0x09AF
MatchUdevType=touchpad
AttrPressureRange=25:10
AttrPalmPressureThreshold=500

(3)Ctrl+S,保存为“local-overrides.quirks”(务必在主目录中)。

(4) Ctrl+Alt+T 打开终端,运行:

cd /etc
sudo mkdir libinput
cd ..
sudo mv local-overrides.quirks /etc/libinput/
reboot

重启后,您应该能够使用触控板。

或者按照下面的提示,继续使用键盘来操作。首先,按下微软徽标,进入 Dashboard 界面,输入 “Wi”,用方向键导航到“Wi-Fi”设置,按 Enter 键选中。

然后,在“Wi-Fi”设置界面中,以方向键导航到无线网列表,按下 Enter 来选择您的无线网络,然后输入密码,之后再按下 Enter 来连接。此时您的电脑已经联网了,这是很重要的一步。

此时,按下微软徽标,进入 Dashboard 界面,输入“Fire”,以方向键导航至“Firefox”,按下 Enter 以选中。按下 Ctrl+K 来在地址栏输入这篇文章的地址:https://pathos.page/blog/how-to-install-linux-on-surface/ 。(如果您无法使用鼠标,那么进入 Surface Linux 项目的网站:https://github.com/linux-surface/linux-surface/wiki/Installation-and-Setup 为宜,因为您在那里可以更方便地复制代码。)

假设您进入了 Surface Linux 项目的网站。以 Tab 和方向键,来导航到安装指导。导航到特定的代码时,可以按 Tab 来选中代码框右侧的复制按钮,然后按下 Enter 来复制。这对于只能使用键盘来输入的人来说至关重要,因为在这种情况下,您无法选择和复制文本。

啰嗦一句,如果您的宽带是电信的,且有联通手机,则最好共享手机网络。

1.按下 Ctrl+Alt+T 来启动终端,复制、粘贴(在终端中,粘贴的快捷键是 Ctrl+Shift+V)和运行:

echo "deb [arch=amd64] https://pkg.surfacelinux.com/debian release main" \
	| sudo tee /etc/apt/sources.list.d/linux-surface.list

2.接下来,复制、粘贴和运行:

sudo apt update

3.此时,会提示您“无法验证下列签名: NO_PUBKEY 56C464BAAC421453”,则运行:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 56C464BAAC421453

可能会由于网络不畅通而失败,多试几次。特别建议换成联通网络。如果实在无法成功,则建议使用 VPN。或者尝试运行:

wget -qO - https://portn.kbai.cc:82/hexo&kbai/doc/surfaceazkali/surface.asc.txt \
| gpg –dearmor | sudo dd of=/etc/apt/trusted.gpg.d/linux-surface.gpg

如果上述网址失效,您可以将

https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc

贴在浏览器的地址栏中手动下载到主目录,然后尝试运行:

sudo ./surface.asc \
| gpg –dearmor | sudo dd of=/etc/apt/trusted.gpg.d/linux-surface.gpg

或者上传到一个您易于访问的地址,并替换以上地址。

如果成功,则进行下一步,如下图所示。

图12

4.运行sudo apt update,可能会提示您:“密钥存储在过时的 trusted.gp 密钥环中”,则运行:

cd /etc/apt
sudo cp trusted.gpg trusted.gpg.d
cd..
sudo apt update

如下图所示。

图13

5.接下来,运行:

sudo apt install linux-image-surface linux-headers-surface libwacom-surface iptsd

如下图所示。

图14

这可能需要 30 分钟,速度取决于您的网络。如果您的网络是联通的,会快很多。如果下载失败,可以重复进行。重复的方式是,在终端中按下向上方向键来选择上一次运行的命令,无需重复输入命令。(连续按下向上方向键,会选择更早运行的命令。按下向下方向键则会选择更晚运行的命令)。

如果您始终无法成功下载 surface-linux 内核,则考虑使用 VPN。

6.在 Surface Linux 项目的安装指导中,会要求您安装 Mok。这一点特别重要。如果您打算在后面开启安全启动,则这一操作是必须的。但是,如果您不打算开启安全启动,这一点似乎不是必须的。依照我的经验,运行:

 sudo apt install linux-surface-secureboot-mok

这会提示您注意,在重启后,会进入蓝色的 Mok 管理界面。

图15

之后,重启,进入 UEFI,开启安全启动,然后再重启进入 Ubuntu,千万不要直接重启进入 Ubuntu。按照 Surface Linux 项目的安装指导,似乎重启会直接进入这个界面。

图10

小心翼翼地输入“surface”这个密码。然而依照我的经验,重启可能不会进入这个界面(比如您忘了先开启安全启动,再进入 Ubuntu 系统),而是再次卡在微软徽标。这时候,请进入 UEFI 开启安全启动,再尝试进入 Ubuntu。

如果还不能进入 Ubuntu,则重启到 Windows 系统,重新制作 Linuxmint 的安全介质,然后尝试从这个 USB 介质启动。如果顺利,则会进入上图所示的界面。然后再次尝试启动 Ubuntu。

注意,如果所进入的 Mok 界面并没有“Enroll Mok”这个选项,比如是这个界面:

图9

那么很有可能是因为,您没有开启安全启动。此时,重新进入 UEFI,开启安全启动后,再次尝试从 Linuxmint 的 USB 启动介质中启动,看看是会进入有“Enroll Mok”的 Mok 界面。

7.Ubuntu 安装后的设置

您现在安装的 Ubuntu 系统保留了几个内核。运行:

uname -r

以查看您现在正在使用的内核。如果其中包含“surface”字样,那么恭喜,您正在使用 surface-linux 内核。默认的 Linux 内核被用于前者出问题时的备选。如果您还需要安装 Nvidia 显卡的驱动,那么我建议您删除所有其他内核,只保留 surface-linux 内核,这是因为,如果存在其他内核,那么 Ubuntu 将会把驱动安装到默认内核,而不是当前的内核中。或者即使您用 DKMS 手动将驱动安装到 surface-linux 内核,也可能无法正常使用。

所以,对于那些有独立显卡的 Surface 设备,运行:

dpkg --list | grep linux-image

以检查有哪些内核安装在当前系统,运行:

sudo apt-get autoremove --purge <linux-image>

图16

来删除多余内核。务必不要删除带有“surface”字样的内核文件,一般位于列表的靠后部分。注意,系统可能不仅删除多余内核,而还安装了其他新的内核。持续重复以前命令,确保没有多余内核。

可以在 /usr/src 中查看内核和其他模块的文件夹。确保只有 surface-linux 内核的文件夹。重启

如果接下来打算安装 Nvidia 显卡驱动,那么我强烈建议永久关闭安全启动。否则,您还需要再被可恶的 Mok 恶心一番。并且即使如此,驱动随时可能会失效。

再次检查 /usr/src。确保没有其他内核, surface-linux 是当前系统的唯一内核。确保您已经关闭了安全启动!现在运行:

sudo ubuntu-drivers install

来安装 Nvidia 驱动。不要尝试其他安装方式!参考 Ubuntu 的官方指导。您会看到系统将驱动安装到 surface-linux 内核之中。重启。

如果您坚持要开启安全启动,并要安装 Nvidia 显卡驱动,那么在安全启动以后,运行sudo ubuntu-drivers install,安装最后会弹出一个对话框,要求您设置 Mok 密码。首先是一个说明,按下 Tab 键导航至“确定”,按下 Enter 键选中。然后设置 8 位以上的密码(输入两次)。确保您能记住它。

然后重启进入 UEFI,选择从 USB 启动,并启动到 Linuxmint 的 USB 安装介质。顺利的话,您又可以看到带有“Enroll Mok”选项的 Mok 界面。选中它,两次输入刚才的密码。确定以后,会返回到没有“Enroll Mok”选项的 Mok 界面。此时,按住电源键以强制关机。再重启进入 UEFI,开启 Ubuntu 的启动选项。

之后,在系统“设置”中检查是否正确加载了 Nvidia 显卡的驱动。如果“显卡”项显示如“NVIDIA Corporation GA107M [GeForce RTX 3050 Ti Mobile] / Mesa Intel® Xe Graphics (TGL GT2)”,则意味着成功加载。如果“/”左右都是 Mesa 显卡,或者 N 卡的名称为“NVV“等字样,则意味着没有成功加载。也可以运行nvidia-smi来检查,如果显示如:

Fri Apr  5 20:47:32 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 3050 ...    Off | 00000000:F3:00.0 Off |                  N/A |
| N/A   38C    P8              N/A /  10W |      7MiB /  4096MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      2291      G   /usr/lib/xorg/Xorg                            4MiB |
+---------------------------------------------------------------------------------------+

则意味着加载成功。如果发现加载失败,则再次尝试卸载全部其他内核,并重新运行sudo ubuntu-drivers install来安装驱动。

8.关键步骤概要

  1. 在关闭安全启动的情况下,首次安装 Ubuntu。
  2. 在关闭安全启动的情况下,进入 Ubuntu 来安装 surface-linux 内核;
  3. 在开启安全启动的情况下,从 Linxumint 的 USB 安全介质启动,进入 Mok 界面,执行“Enroll Mok”操作。
  4. 在卸载全部其他多余内核的情况下,安装 Nvidia 显卡驱动。如果在开启安全启动的情况下安装驱动,则重复步骤 3 。
  5. 对于系统,如果无法进入有“Enroll Mok”选项的 Mok 界面,则尝试在 Ubuntu 中卸载和重新安装 Mok ,再尝试步骤 3。 (运行 sudo apt remove linux-surface-secureboot-mok 以卸载,运行 sudo apt install linux-surface-secureboot-mok 以重新安装。)
  6. 对于显卡驱动,如果无法进入有“Enroll Mok”选项的 Mok 界,则尝试在 Ubuntu 中卸载和重新安装显卡驱动,再尝试步骤 3。 (运行sudo apt --purge remove '*nvidia*' 来卸载,运行sudo ubuntu-drivers install来重新安装。)

下一篇将介绍一些实用的 Ubuntu 配置。如果遇到问题,请跟我联系。

Footnotes

  1. https://www.bilibili.com/video/BV17d4y1A7qm/

  2. https://blog.kbai.cc/Surface%20Pro%20%207%E5%AE%89%E8%A3%85Kali&Windows%E5%8F%8C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/

  3. https://www.youtube.com/watch?v=6_EHEmz_j4o&t=2s