Archlinux On SurfaceBook2
win10的内置linux还是效率低,和真正的linux环境还是不一样,但是原来使用子系统就是linux对surfacebook2的适配太差了
但是最近找到了github上的一个surfacebook2的内核包,可以完美适配,因此换了个win/arch双系统,在此记录配置经历。
最终结果是获得win+arch 支持secureboot和适配surface硬件的自定义内核的双系统。
备注:我的方式是先win10后linux,如果反过来请参考
[https://wiki.archlinux.org/index.php/Dual_boot_with_Windows#Important_information](dual boot with windows)
截图:

烧录u盘启动盘
没必要用烧录软件,下载archlinux最新镜像,我的版本是archlinux-2020.05.01-x86_64,解压缩iso镜像到u盘,进入loader\entries目录,编辑archiso-x86_64.conf,看到类似archisolabel=ARCH_202005的信息,将ARCH_202005作为自己的设备名。
禁用secureboot,重启按住音量+,禁用secureboot
设置u盘优先启动
基本系统安装
参考arch wiki
[https://wiki.archlinux.org/index.php/Installation_guide](Installation guide)
进入u盘的linux安装环境。
分区
- fdisk -l查看区块状态,fdisk内- w写入修改,- fdisk -h帮助
- 分区自己的磁盘,我的磁盘是nvme协议的磁盘且预留了50G, - fdisk /dev/nvme0n1
- 创建EFI逻辑分区,512MB就够了。 - 创建efi目录(efi启动目录,所有boot loader相关) - mkdir -p /boot/efi- 创建efi分区, - n创建新分区,回车确定分区起始地址,- +512M给出分区大小,这个逻辑分区名是:- nvme0n1p7修改分区类型,- t命令指定类型,输入- 1,确定自己换的就是EFI SYSTEM。- 创建swap分区,这个看个人,随意大小,格式化swap分区 - mkswap /dev/nvme0n1p8,挂载交换区- swapon /dev/nvme0n1p8- 创建mnt主分区,要有其他文件夹想自设分区可以随意 - n->- 回车确定开始地址->- 回车确定结束地址,自动获得了剩余所有空间的逻辑分区- nvme0n1p9,格式化分区- mkfs.ext4 /dev/nvme0n1p9
挂载分区
- mkswap /dev/nvme0n1p8: 缓存
- swapon /dev/nvme0n1p8
- mount /dev/nvme0n1p9 /mnt: 主分区
- mkdir -p /mnt/boot/efi- mount /dev/nvme0n1p7 /mnt/boot/efi:挂载efi分区
- wifi-menu:设置网络连接
- vim /etc/pacman.d/mirrorlist:将CN的放在最前面
安装系统
- pacstrap -i /mnt base base-devel linux linux-firmware:安装系统和基本开发组件
- genfstab -U /mnt >> /mnt/etc/fstab:生成挂载信息,以后系统启动执行挂载
- arch-chroot /mnt:进入安装好的系统
用户管理
- 不建议直接使用root用户操作,很多软件yaourt和chromium等不可以root执行
- useradd -m -g users tr:- -m为生成主目录(不生产可能导致软件无法运行,因为无法在主目录写配置)- -g users为将用户放入users组
- passwd tr:设置密码
- chmod u+w /etc/sudoers:给用户权限文件write权限
- visudo:在root下面写上类似语句- tr ALL=(ALL) ALL,此操作可让用户执行root命令
- passwd:设置root密码
时区+本地化+驱动设置
- pacman -S root:安装root管理
- echo TrArch >/etc/hostname:设置主机名
- pacman -S vim , vim /etc/locale.gen:!!本地化设置,将en_US和zn_CN等取消注释!!
- locale-gen:生成本地化配置
- ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime:设置时区
- hwclock --localtime:防止和windows时间冲突,将时间设为本机时间而不是UTC时间
- pacman -S dialog wpa_supplicant netctl wireless_tools chcpcd:安装网络工具,防止待会启动无法联网
- pacman -S xf86-video-intel xf86-input-synaptics:安装显卡和触摸板驱动
重要!:设置启动管理器(bootloader)
启动项管理器负责管理启动项,在uefi启动表中添加启动项,在uefi配置界面可以看到。在linux中这是由efibootmgr管理的,bootloader是存放在efi系统格式分区的引导器,在机器通电后,首先根据启动项加载对应bootloader,bootloader负责继续引导操作系统内核的启动,在kernel真正启动前,会引导执行initramfs:init ram file system,确保内核能够访问文件系统,然后执行init线程启动内核。
- 安装bootloader管理器:pacman -S efibootmgr
这里推荐两个常用的bootloader:grub2 和 refind
grub
- pacman -S grub-efi-x86_64
- grub-install --efi-directory=/boot/efi/ --bootloader-id=archlinux --recheck:–efi-directory 参数指定自己的efi分区位置,- bootloader都是存放在efi分区内单独管理的,如果没有按照前文操作,现在划点空间生成一个efi分区挂载即可- mount /dev/... /boot/efi。–bootloader-id:为生成的文件夹的名字,文件夹位于/boot/efi/EFI/archlinux
- pacman -S os-prober:双系统检测windows的
- grub-mkconfig -o /boot/grub/grub.cfg:生成引导文件,这步会自动识别boot/efi分区内的系统,生成引导文件。
- reboot即可
rEFInd
推荐使用,比较美观,secureboot配置方便,配置简单,后面有讲解配置secureboot。
- 在确保挂载了efi分区的情况下(mount /dev/.. /boot/efi) - pacman -S refind
- pacman -S os-prober
- refind-install
安装桌面环境
- pacman -S accountsservice gvfs gvfs-mtp gvfs-afc ntfs-3g exfat-utils:安装基本包
- pacman -S networkmanager network-manager-applet gnome-keyring:安装网络管理器等
- systemctl enable NetworkManager.service:开机自启动网络控制
- pacman -S gnome gnome-extra gdm:安装gnome
- systemctl enable gdm
- 这时候重启,可能存在缺少字符 - terminal无法打开和无法显示中文文字的问题,下载中文字符:- pacman -S wqy-zenhei ttf-fireflysung- locale-gen
- 重启后若还是无法打开 - terminal,按下- windows键,打开- settings,在- region&language内添加英文系统,- logout即可
surface-archlinux 自定义内核配置
生成内核
使用了refid作为bootloader,如果没有最好下载配置一个。
- pacman -S wget:安装下载器
- vim /etc/hosts:防止githubcontent无法访问,文件内配置- 151.101.76.133 raw.githubusercontent.com
- wget https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc:下载key文件
- pacman-key --add surface.asc:添加key文件
- pacman -Syy:更新下载库
- pacman -S linux-surface-headers linux-surface surface-ipts-firmware:
| 1 | NOTE:总共大概80m下载很慢的话,配置一个aria2,`vim /etc/pacman.conf `配置aria2加速,这样pacman下载的时候会显示下载地址,把地址拷贝下来,用其他软件下载,下载好后`pacman -U xxx`安装 或者 `rm /var/cache/pacman/pkg/linux-surface-*` 删除pacman下载缓存,`cp linux-surface-headers-5.6.14.arch1-1-x86_64.pkg.tar.zst surface-ipts-firmware-20200402-1-any.pkg.tar.zst /var/cache/pacman/pkg/`,再执行`pacman -S linux-surface-headers linux-surface surface-ipts-firmware` | 
- 内核安装完成,在/boot下面会多出vmlinuz-linux-surface等文件,此时refind-install会出问题,建议手动配置refind
refind手动配置启动项
以下所有操作建议在u盘arch内执行,否则可能无法执行
进入u盘的archlinux live cd
- wifi-menu
- mount /dev/nvme0n1p9 /mnt
- mount /dev/nvme01p7 /mnt/boot/efi
- arch-chroot /mnt
- vim /boot/efi/EFI/refind/refind.conf配置内容。
| 1 | 以下为配置的标准模板,需要注意的是`volume`,`loader`,`initrd`,`PARTUUID`,这四个要是配置不对就启动失败。 | 
reboot应该可以看到手动配置的两个内核了,如果没错两个都是可以正常启动。uname -a如果是surface内核可以看到带surface字样。
支持SecureBoot配置
SecureBoot原理,这东西的存在是为了防止在引导的时候被恶意软件控制,它的作用机制是使用MOK(machine own key 系统内置签名)来验证引导的东西。如果签名符合,那么系统准许引导,反之不许。
但是微软比较流氓,默认只允许自家的windows启动,但是也支持其他系统的启动引导(需要工具)。
首先进入SeruceBoot,开启第三方(third party)支持。这里用的是rEFInd+shim,shim支持签名和hash。另一个工具叫PreLoader,不做介绍
shim原理,secureboot启动会做一个验证,微软支持shim和PreLoader,所以检测到shim,由于信任机制会继续启动,shim来启动shim所信任的系统内核,所以这是一个信任链,那么shim怎么信任内核呢。两种方式,hash或者签名,如果shim内存在系统的hash(最简单的方法)或者签名,那么这个系统就是被信任的系统,可以被继续加载。这就是下面要做的配置。
shim签名
shim在AUR库内,这里用yaourt安装shim
- vim /etc/pacman.conf:写入:- 1 
 2- [archlinuxfr] 
 Server = http://repo.archlinux.fr/$arch
- pacman -Sy同步库
- pacman -S yaourt
- yaourt shim-signed:安装shim
- pacman -S sbsigntools:安装签名工具
- refind-install --shim /usr/share/shim-signed/shimx64.efi --localkeys:配置refind的shim keys目录,可以在/boot/efi/EFI/refind/keys存放内核的签名了。
- sbsign --key /etc/refind.d/keys/refind_local.key --cert /etc/refind.d/keys/refind_local.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux:可以在/boot/efi/EFI/refind/keys内看到签名,这里可以再执行几次签名其他自定义内核,本质上是将启动的内核引导文件添加签名信息。
NOTE: 实际可以不用添加key,直接refind启动界面,使用enroll hash,将/boot/vmlinuz-linux(或者其他内核文件)引入即可,系统启动bootloader,bootloader启动内核文件查看签名或者hash
- reboot:打开secureboot支持第三方(third party),重启。进入shim控制界面,选择- Enroll KEY,点击文件系统,找到- /boot/efi/EFI/refind/keys/.....key确定添加,然后重启即可。
独显和集显交火
常用配置
桌面环境Gnome
| 1 | sudo pacman -S gnome gnome-extra gdm xorg xorg-server xorg-xinit | 
如果不需要开机自启动gnome,systemctl disable gdm
手动启动: systemctl start gdm
输入法
| 1 | sudo pacman -S fcitx fcitx-configtool fcitx-im fcitx-googlepinyin | 
字体
| 1 | sudo pacman -S wqy-microhei wqy-microhei-lite wqy-bitmapfont wqy-zenhei ttf-arphic-ukai ttf-arphic-uming adobe-source-han-sans-cn-fonts adobe-source-han-serif-cn-fonts noto-fonts-cjk ttf-dejavu ttf-liberation | 
power line fonts:
| 1 | git clone https://github.com/powerline/fonts.git --depth=1 |