联想 R7000p (2020) 的 Windows + Arch Linux 双系统 w/ 磁盘加密踩坑

最近因为有一个库需要在真实 Linux 环境下测试,所以花费了长达 5 小时后的精华就是本文了。

注:虽然本文可以帮助正在看文章的你完成这个目标,但是作者还是建议搭配着 Arch Linux Wiki 来食用,因为官方 Wiki 上的内容可能在本文写成之后改动了不少。

前言

首先,我已经安装好了 Windows 10 LTSC 并开启了 UEFI。我的想法是,用 GRUB 来成为 Arch Linux 和 Windows 的入口。

分区的话,我本来打算将 /homeswap 单独分出来,剩余的直接一个 / 解决。

至于加密,我本是打算加密整个 Arch Linux,但这一折腾就长达数个小时,最后我妥协了。我单独创建了一个不加密的 /boot 分区。

注:加密整个 / 理论上是可行的。而我在尝试时基本都死在了配置 GRUB 引导的地方(LUKS2 与 GRUB2 的爱恨情仇……),如果你成功了,欢迎在互联网上记录下你的方法。

桌面环境,当然是 KDE 啦!

开始吧

Step 0. 修改 Windows 10 的时间方案

使用 regedit 创建这个 DWORD 值,并将其值设置为十六进制的 1

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal

为什么?Arch Wiki 讲的很清楚了。这样可以确保两个系统的时间显示不冲突。

Step 1. 联网

从官网下载之后,写入 U 盘并重启进入 live 环境。第一件事情当然是联网!因为我们后面要往 Arch Linux 内安装软件包并进行一系列配置,你可以理解为 “新安装的 Arch Linux 什么都不带”。

首先,输入 iwctl 开始联网。

# device list

然后我发现,Powered 那一栏怎么是 off 呢?通过这个指令可以发现被 Softlock 了:

# rfkill list

此时直接运行 rfkill unblock wifi 即可。重新运行 iwctl 来联网——先扫描,然后看网络列表,最后连接到你的网络!

# station wlan0 scan
# station wlan0 get-networks
# station wlan0 connect <YOUR-SSID>

Step 2. 校准你的系统时间

# timedatectl set-ntp true

这一步单独拿出来说的原因是,我遇到了看似时间正确但无法完成 keyring 的 trust 操作,总说我时间不对。原来是我后面调的时间,导致与 gpg 认为的时间不一样了(?)所以这里强调一下。

Step 3. 分区

加密这里采用 LVM on LUKS

首先用 fdisk -l 找到你要安装到哪块盘。我这是后加的 SSD,所以挂载点是 /dev/nvme1n1。开始分区吧!

因为我们的 /boot 是不加密的,所以不能上来直接开始加密操作,先分两个大区,一个给不加密的 /boot,另一个用于加密。

# fdisk /dev/nvme1n1
: p
: n, 回车, 回车, +1GB
: t, 20
: n, 回车, 回车, 回车
: t, 30
: p
: w

其中,20 代表 Linux Filesystem,30 代表 Linux LVM

随后先对我们的 /boot 进行格式化:

mkfs.ext4 /dev/nvme1n1p1

接下来,我们对后一个分区进行加密操作。先加密,后分区。

# cryptsetup --use-random luksFormat /dev/nvme1n1p2

这里提示 Are you sure? 的时候需要输入大写的 YES,随后打开加密分区,并开始分区。

# cryptsetup open —type luks /dev/nvme1n1p2 251Arch
# pvcreate —data alignment 1m /dev/mapper/251Arch
# vgcreate 251ArchGroup /dev/mapper/251Arch
# lvcreate -L 32G 251ArchGroup -n swap
# lvcreate -L 256G 251ArchGroup -n home
# lvcreate -l 100%FREE 251ArchGroup -n root

随后,挨个挨个进行格式化并挂载。

# mkfs.ext4 /dev/251ArchGroup/root
# mkfs.ext4 /dev/251ArchGroup/home
# mkswap /dev/251ArchGroup/swap
# mount /dev/251ArchGroup/root /mnt
# mkdir -p /mnt/home
# mount /dev/251ArchGroup/home /mnt/home
# swapon /dev/251ArchGroup/swap
# mkdir -p /mnt/boot
# mount /dev/nvme1n1p1 /mnt/boot

有人会问了,诶你都挂了 /boot 那 Windows 的 EFI 分区怎么办?可以随便挂别的地方啊,比如 /boot/efi,记得 fdisk -l 看看 EFI 是哪个区:

# mkdir -p /mnt/boot/efi
# mount /dev/nvme0n1p1 /mnt/boot/efi

注:这么做的原因是,Windows 的 EFI 分区只有 100 MB,如果直接把 EFI 分区挂载为 /boot 的话,后面 mkinitcpio -P 的操作会导致空间爆满。

Step 4. 安装最小化系统

在此之前,首先看看 /etc/pacman.d/mirrorlist,你会发现一堆海外镜像,直接从这些地方安装的话以国内网络肯定会很痛苦。

# vi /etc/pacman.d/mirrorlist

虽然在 nano 里没有快捷键直接删除全部,但 vi 里面有啊!首先全选,然后删除,最后进入输入模式:

ggVG
d
i

输入你喜欢的镜像,这里我选择中科大的,虽然一开始我选择的是阿里云的源,但不知道为什么我这里连 8 Mbps 都跑不到。

Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch

然后保存+关闭:

:wq

随后开始安装吧!

# pacstrap -i /mnt base linux linux-firmware nano vim

Step 5. 配置系统

先生成 /etc/fstab

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

然后将解密的 lvm 分区挂载到新系统里并同时进入新系统。如果不这么做的话,可能后面用 grub 命令生成 grub.cfg 的时候需要等很久

# mkdir /mnt/hostlvm
# mount —bind /run/lvm /mnt/hostlvm
# arch-chroot /mnt
# ln -s /hostlvm /run/lvm

然后调整时区并同步硬件时间,随后安装后续需要用到的:

# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# hwclock —systolic
# pacman -S lvm2 grub efibootmgr wpa_supplicant dialog amd-ucode git os-prober sudo dhcpcd

注:这里为什么有 wpa_supplicantdhcpcd?防止你安装完成重启进入系统之后没有网可以用。讲真,你想安装什么软件最好在教程结束后一并安装掉,否则重启可能没网,而你又不太会配置,导致你又需要进入 live 环境来搞。

接下来编辑区域设置,首先找到 /etc/locale.gen 然后取消 en_US.UTF-8 的注释。完成后运行生成指令:

# locale-gen

随后,创建 /etc/locale.conf 并输入 LANG=en_US.UTF-8

继续,我们要给系统设置一个 hostname:

# echo "251Arch" > /etc/hostname

接下来,我们要编辑一下 /etc/mkinitcpio.conf,找到 HOOKS 这一行,然后编辑成这个样子:

HOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck)

最后运行生成初始内存盘的指令:

# mkinitcpio -P

Step 6. GRUB

最关键的地方来了,Wiki 里会告诉你这里用 UUID,其实可以用别的来代替!我就因为这里烦躁了将近一小时。

编辑 /etc/default/grub,然后在 GRUB_CMDLINE_LINUX 这个地方加入东西,就像这样:

GRUB_CMDLINE_LINUX="cryptdevice=/dev/nvme1n1p2:251ArchGroup root=/dev/mapper/251ArchGroup-root"

其中,/dev/nvme1n1p2 是你的大加密分区。不要着急退出这个文件,还有两个地方我们要取消注释:

GRUB_ENABLE_CRYPTODISK=y 
GRUB_DISABLE_OS_PROBER=false

随后用命令开始安装 GRUB 相关的文件:

# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
# grub-mkconfig -o /boot/grub/grub.cfg

Step 7. 收尾

安装过程到此结束了,你可以继续添加用户,或者安装窗口环境并配置,或者直接退出:

# exit
# umount -R /mnt
# reboot

Step 8. 我踩到的坑


如果喜欢本文,欢迎点击下方的「鼓掌」按钮!


如果喜欢本文,欢迎点击下方的「鼓掌」按钮!

如果上面没有加载出任何东西,可以点击这里