【Surface Pro3+Archlinux】基本系统+引导器+Secure Boot

基本系统+引导器

 

进入UEFI固件设置界面(SP3进入方法:关机>按住音量上>按开机键>直到进入设置界面再松开音量上键),关闭Secure Boot(一会装好再开)并修改启动项:U盘启动。【对于SP3来说,目前不知道如何TF卡引导,所以只能用U盘】

 

配置好UEFI以后再次重启,插U盘,进入Archlinux安装界面(弹出来的选单我选了第一个,大概是UEFI x86_64启动,不同机子需要自己决定)。


====联网====

首先,十分十分建议找一个不需要输密码且不需要网页或者客户端认证的wifi热点,因为用iw+wpa_supplicant输密码有点小麻烦,当然如果会用别的软件(network-manager、netctl等)连wifi就无视我,我还是喜欢用gui呵呵,比较懒。


# ip link

看一下接口(interface)名,SP3只有无线,当然被内核识别的,所以需要用iw(或者netctl等工具)联网。

 

这里说一下iw的用法:

----iw用法----

# ip link set interface up

激活网络接口。用你查到的接口名替换interface

 

# iw dev interface scan | less

扫描可用wifi。此时会进入一个可以用上下键滚动的界面,这是后面那个“less”的效果。上下滚动找你要的网,记下SSID。记好按“esc”退出。

 

# iw dev interface connect SSID

连接网络。用记好的SSID替换上面的。

 

#iw dev interface link

检查一下是否连接成功,如果没有(输出“Not connected”),检查上一步的SSID是否正确。

 

# dhcpcd interface

分配动态ip地址。

 

# ping www.baidu.com

看看网通了没有,ping用法可以百度一下。

----以上为iw简单用法----

====同步时间====

# timedatectl set-ntp true

启动时间同步服务。

 

# timedatectl

输出的倒数第三行代表服务是否开启,倒数第二行是是否已同步到时间。倒数第二行有可能是“no”,如果时间多可以稍等一会再输出一次,如果一直不变的话,把上一步的命令最后的“true”改“false”,关闭,然后再改“true”,再开,就这样尝试,直到两个“yes”都出现,当然如果一直不出现(猜测取决于网络状态,“true”指令输完等一会再看。),那就保证先开启,然后就继续吧。


====分区(使用gdisk)====

这里SP3使用GPT分区表,所以我们使用gdisk,gdisk具有自动的4k对齐功能,对于SP3的SSD来说是方便的。

 

# gdisk /dev/sdx

进入gdisk交互环境,根据提示操作吧。

 

根据各种针对SSD的分区方案,最终使用EFI+/分区,就两个,其中EFI系统分区是必须的,而且放在第一个,根据Archwiki建议分512M。Swap用交换文件,不专门分区了。

 

再说一下gdisk对于efi有专门的分区类型,在空间确定好以后会让选。


====格式化分区并建立文件系统====

先挂根分区到/mnt,然后在/mnt里建boot,此时由于/mnt已经挂到实际硬盘的根分区,所以boot目录就是建在刚刚分的区里了,最后再把efi分区挂到boot。简单说就是先挂根分区,然后建目录,再把别的分区挂到根分区下相应的目录。

 

# mkfs.ext4 /dev/sdxy

格式化根分区,用ext4文件系统。

 

# mkfs.fat -F32 /dev/sdxz

格式化efi分区,用fat32。必须是fat(DG默认是用fat16不知原因),否则efi固件无法读取。

 

# mount /dev/sdxy /mnt

先挂/mnt。

 

# mkdir /mnt/boot

在/mnt,也就是硬盘根分区下建/boot目录。

 

# mount /dev/sdxz /mnt/boot

最后挂载/boot分区。

交换文件等系统全部装好再说。

 

====下载并安装系统====

# vim /etc/pacman.d/mirrorlist

把分最高的中国源放第一个(推荐163放第一个,虽然它有时候不是高分,但确实快),然后 :wq 保存退出。

 

# pacstrap /mnt base base-devel

开始下载系统。

 

====配置系统====

# genfstab -U /mnt >> /mnt/etc/fstab

生成一个名叫“fstab”的文件,包含分区信息供系统开机挂载。

 

# arch-chroot /mnt

进入新系统。

 

====时区时间====

# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

命令的目的是把时区改为自己的本地时区;命令的作用是让对应的时区文件(第一参数)和自己账户的本地时间(第二参数)建立关联(ln命令)。这个地方,201701的镜像中装完以后已存在/etc/localtime文件,所以至今ln会提示出错,所以只能先把旧的删掉在ln。

 

# hwclock --systohc

用现在经过网络同步的UTC标准时间刷新BIOS硬件时间。

 

====本地化设置====

# nano /etc/locale.gen

打开上述文件,把需要的本地化设置前面的注释符去掉,保存退出,一般是en_US.UTF-8和zh_CN.UTF-8。

 

# locale-gen

生成本地化文件。

 

# nano /etc/locale.conf

打开(如果没有就是新建)文件,加入以下一行:

LANG=en_US.UTF-8

确保全局地域设置为英文。

 

====主机和root密码====

# nano /etc/hostname

建立一个新的文件并打开,在里面输入主机名(这里以“host”为例),保存退出。

 

# nano /etc/hosts

在打开的文件里::1的那行里的hostname改成上一步的主机名。

 

# passwd

根据提示输入两次root密码。

 

====生成启动镜像====

# mkinitcpio -p linux

生成启动镜像 


====启动引导器和双系统引导====

# pacman -S grub ntfs-3g efibootmgr

安装启动引导器grub、ntfs分区识别工具,EFI启动项编辑工具。

 

如果使用英特尔CPU的话(AMD跳过)

# pacman -S intel-ucode

安装一个额外的包。求大神科普下这个包,真心没明白它是做什么用的。接下来开始对付SecureBoot。

 

----UEFI & Secure Boot----

在Secure Boot开启的情况下,Win 8/8.1和Win 10是可以顺利安装的,还有少数其它系统,包括不限于Ubuntu也可以安装,但是对于Archlinux来说是不可以的,会提示签名无效无法加载。解决这个问题有几种方法,第一种最简单,关闭Secure Boot功能就可以了,但是这种方法可能会导致OEM预装的Win系统不能启动,而且对于SP3来说,关闭Secure Boot会导致开机界面变成红色,真的不怎么好看;第二种方法是自己签数字签名,但是SP3的UEFI-BIOS里似乎不可以添加钥匙,只能删空,如果能求指教,我真的没找到在哪里可以改,SP3的UEFI-BIOS功能太简单;所以我选择第三种方法,使用授权过的预加载器链式加载引导器(如grub2、systemd-boot),再引导系统启动。引导器是没有签过名的,所以不能被启动,但是预加载器是签过的,而且预加载器可以加载任何别的引导器或者系统镜像,所以我们让UEFI-BIOS验证能通过验证的预加载器,再用预加载器加载通不过UEFI-BIOS验证的普通引导器,从而引导各种系统启动,所以理论上用这个方法可以引导一切普通引导器能引导的系统。PreLoader.efi就是这样一个预加载器,它可以通过Secure Boot认证从而被启动,而PreLoader对它将要加载的系统或引导器也是有认证机制的,只不过这个认证是由用户说的算的,PreLoader加载系统或引导器之前首先要验证其hash值,如果hash值没有在Preloader记录过则不给启动,但是用户可以通过配套的HashTool.efi把要启动的hash添加到白名单,这样一切就顺利了。

 

首先,正常安装grub2:

# grub-install --target=x86_64-efi --efi-directory=esp_mount --bootloader-id=grub

 

# grub-mkconfig -o /boot/grub/grub.cfg

生成主配置文件

 

下载PreLoader.efi,Hashtool.efi。

 

# cp PreLoader.efi /boot/EFI/grub

# cp Hashtool.efi /boot/EFI/grub

把两个程序放到grub的启动目录下。

 

# efibootmgr --disk /dev/sdX --part Y --create --label "PreLoader" --loader /EFI/grub/PreLoader.efi

用efibootmgr为UEFI-BIOS添加PreLoader.efi启动项,使UEFI-BIOS直接启动PreLoader,由于PreLoader是签过名的,所以可以启动。

 

如果现在重启,我们已经可以进入PreLoader了,而Preloader启动后默认会加载名为loader.efi的文件,那么既然要让它加载grub2,只要把grub2的启动文件改名为loader.efi就好了。

# cp /boot/EFI/grub/grubx64.efi /boot/EFI/grub/loader.efi

 

完工,重启打开Secure Boot功能,再重启,首次使用,PreLoader加载loader.efi时会发现hash认证失败,因为我们没有把它的hash加入白名单,于是它会提示启动Hashtool.efi(就是蓝色的只有一个OK选项的界面。SP3用户注意,我的机器上此时键盘盖和触屏都没有用,所以还是外接键盘吧),选择OK,选择Enroll Hash,再选择loader.efi,最后选择yes,此时应该就能进grub了,重启再试一次,应该是“Surface”标志熄灭后直接进grub,完工!


资料:

archwiki:secrue boot:https://wiki.archlinux.org/index.php/Secure_Boot#Set_up_PreLoader

Managing EFI Boot Loaders for Linux --by Rod Smith:http://www.rodsbooks.com/efi-bootloaders/index.html

http://www.rodsbooks.com/efi-bootloaders/secureboot.html#preloader

你可能感兴趣的:(linux)