如何在 Surface 上安装 Linux/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。此时应该没有问题了。详情参见第 4 、 8 部分。
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 键。
可能会要求您选择键盘。假如您前面选定了中文,则默认键盘会是“汉语”,请不要更改,因为这个选项会为您自动配置中文键盘和输入法,不至于安装系统后,还需要其他配置才能使用中文输入法。
然后,进入网络设置界面,通过方向键来选择“I don’t want to connect to a Wi-Fi network right now”。然后,通过 Tab 键来选择“继续”。
然后进入“更新和其他软件”界面,通过方向键来选择“最小安装”,通过 Tab 键来选择“继续”。不要勾选任何其他选项。
然后进入“安装类型”界面,通过方向键来选择“安装 Ubuntu,与 Windows Boot Manager”并存。(这一选择是为了保险,其实可以选择第二项“清除整个磁盘并安装 Ubuntu”。在双系统下,Ubuntu 的系统引导菜单会包含一个启动到 Windwows 的选项。)通过 Tab 键来选择“继续”,安装程序会自动选中您在 Windows 中为 Ubuntu 准备的磁盘空间,并自动分区(新手建议如此)。这时候会弹出一个对话框,以 Tab 键来选择“继续”。
然后进入账户创建界面。密码可以随便设,即使提示“密码强度:过短”。以 Tab 键来选择“安装”。
这样就进入安装了。中间可能会弹出选择时区的界面,输入“shanghai”,以继续。
大约 5 到 10 分钟,安装完毕,以 Tab 键选择“现在重启”。
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”即可。
但是,正常情况下,会是如下界面,此时,选择“Enroll Mok”,然后选择“Continue”,您可能需要输入一个随意的密码,比如“linux”。
也可能直接进入 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
或者上传到一个您易于访问的地址,并替换以上地址。
如果成功,则进行下一步,如下图所示。
4.运行sudo apt update
,可能会提示您:“密钥存储在过时的 trusted.gp 密钥环中”,则运行:
cd /etc/apt
sudo cp trusted.gpg trusted.gpg.d
cd..
sudo apt update
如下图所示。
5.接下来,运行:
sudo apt install linux-image-surface linux-headers-surface libwacom-surface iptsd
如下图所示。
这可能需要 30 分钟,速度取决于您的网络。如果您的网络是联通的,会快很多。如果下载失败,可以重复进行。重复的方式是,在终端中按下向上方向键来选择上一次运行的命令,无需重复输入命令。(连续按下向上方向键,会选择更早运行的命令。按下向下方向键则会选择更晚运行的命令)。
如果您始终无法成功下载 surface-linux 内核,则考虑使用 VPN。
6.在 Surface Linux 项目的安装指导中,会要求您安装 Mok。这一点特别重要。如果您打算在后面开启安全启动,则这一操作是必须的。但是,如果您不打算开启安全启动,这一点似乎不是必须的。依照我的经验,运行:
sudo apt install linux-surface-secureboot-mok
这会提示您注意,在重启后,会进入蓝色的 Mok 管理界面。
之后,重启,进入 UEFI,开启安全启动,然后再重启进入 Ubuntu,千万不要直接重启进入 Ubuntu。按照 Surface Linux 项目的安装指导,似乎重启会直接进入这个界面。
小心翼翼地输入“surface”这个密码。然而依照我的经验,重启可能不会进入这个界面(比如您忘了先开启安全启动,再进入 Ubuntu 系统),而是再次卡在微软徽标。这时候,请进入 UEFI 开启安全启动,再尝试进入 Ubuntu。
如果还不能进入 Ubuntu,则重启到 Windows 系统,重新制作 Linuxmint 的安全介质,然后尝试从这个 USB 介质启动。如果顺利,则会进入上图所示的界面。然后再次尝试启动 Ubuntu。
注意,如果所进入的 Mok 界面并没有“Enroll Mok”这个选项,比如是这个界面:
那么很有可能是因为,您没有开启安全启动。此时,重新进入 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>
来删除多余内核。务必不要删除带有“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.关键步骤概要
- 在关闭安全启动的情况下,首次安装 Ubuntu。
- 在关闭安全启动的情况下,进入 Ubuntu 来安装 surface-linux 内核;
- 在开启安全启动的情况下,从 Linxumint 的 USB 安全介质启动,进入 Mok 界面,执行“Enroll Mok”操作。
- 在卸载全部其他多余内核的情况下,安装 Nvidia 显卡驱动。如果在开启安全启动的情况下安装驱动,则重复步骤 3 。
- 对于系统,如果无法进入有“Enroll Mok”选项的 Mok 界面,则尝试在 Ubuntu 中卸载和重新安装 Mok ,再尝试步骤 3。 (运行
sudo apt remove linux-surface-secureboot-mok
以卸载,运行sudo apt install linux-surface-secureboot-mok
以重新安装。) - 对于显卡驱动,如果无法进入有“Enroll Mok”选项的 Mok 界,则尝试在 Ubuntu 中卸载和重新安装显卡驱动,再尝试步骤 3。 (运行
sudo apt --purge remove '*nvidia*'
来卸载,运行sudo ubuntu-drivers install
来重新安装。)
下一篇将介绍一些实用的 Ubuntu 配置。如果遇到问题,请跟我联系。