联想 R7000p (2020) 的 Windows + Arch Linux 双系统 w/ 磁盘加密踩坑
最近因为有一个库需要在真实 Linux 环境下测试,所以花费了长达 5 小时后的精华就是本文了。
注:虽然本文可以帮助正在看文章的你完成这个目标,但是作者还是建议搭配着 Arch Linux Wiki 来食用,因为官方 Wiki 上的内容可能在本文写成之后改动了不少。
前言
首先,我已经安装好了 Windows 10 LTSC 并开启了 UEFI。我的想法是,用 GRUB 来成为 Arch Linux 和 Windows 的入口。
分区的话,我本来打算将 /home
和 swap
单独分出来,剩余的直接一个 /
解决。
至于加密,我本是打算加密整个 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_supplicant
和dhcpcd
?防止你安装完成重启进入系统之后没有网可以用。讲真,你想安装什么软件最好在教程结束后一并安装掉,否则重启可能没网,而你又不太会配置,导致你又需要进入 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 即可,闪烁情况会大幅度改善。
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。