2

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

 2 years ago
source link: https://blog.251.sh/r7000p-install-arch-with-encryption-and-dualboot-with-windows
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

January 28, 2022

最近因为有一个库需要在真实 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. 我踩到的坑

  • 如果要用 Wayland,千万不要用开源的 NVIDIA 驱动。KDE 桌面环境的额外步骤看这里
  • 然而 NVIDIA 对 Wayland 简直就是不屑一顾,我还是用 X11 吧。
  • 对于 Wayland 下闪烁问题,去 Nvidia Settings(先安装 nvidia-settings)里找到 OpenDL Settings,并关闭 Allow Flipping 即可,闪烁情况会大幅度改善。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK