Archlinux个人生存手册.md
Archlinux个人生存手册
前两天(2023年03月22日)Gnome44
发布,心心念念的想着能体验一把。但奈何更新不给力,可能有Manjaro
有点商业版的意思,顺便一直想着能用上磁盘加密和TPM2,干脆直接将系统重装为Archlinux
了。之后所有对系统的重要更改就在此篇记录,方便自己之后查看。
安装
目标:实现安全启动
、磁盘加密
以及利用TPM2.0
存储磁盘加密
的密钥。
镜像:Arch2023.03.01
镜像,内核为6.2.1
镜像下载及校验
镜像地址: https://mirrors.nju.edu.cn/archlinux/iso/2023.03.01/archlinux-2023.03.01-x86_64.iso
https://mirrors.nju.edu.cn/archlinux/iso/2023.03.01/archlinux-2023.03.01-x86_64.iso.sig
- 校验
nsfoxer@ns-pc ~/Temp> ls
archlinux-2023.03.01-x86_64.iso archlinux-2023.03.01-x86_64.iso.sig
nsfoxer@ns-pc ~/Temp> gpg --keyserver-options auto-key-retrieve --verify archlinux-2023.03.01-x86_64.iso.sig
gpg: 目录‘/home/nsfoxer/.gnupg’已创建
gpg: 钥匙箱‘/home/nsfoxer/.gnupg/pubring.kbx’已创建
gpg: 假定被签名的数据在‘archlinux-2023.03.01-x86_64.iso’
gpg: 签名建立于 2023年03月01日 星期三 20时55分51秒 CST
gpg: 使用 EDDSA 密钥 3E80CA1A8B89F69CBA57D98A76A5EF9054449A5C
gpg: 签发者 "pierre@archlinux.org"
gpg: /home/nsfoxer/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 76A5EF9054449A5C:公钥 “Pierre Schmitz <pierre@archlinux.org>” 已导入
gpg: 密钥 7F2D434B9741E8AC:公钥 “Pierre Schmitz <pierre@archlinux.org>” 已导入
gpg: 处理的总数:2
gpg: 已导入:2
gpg: 未找到任何绝对信任的密钥
gpg: 完好的签名,来自于 “Pierre Schmitz <pierre@archlinux.org>” [未知]
gpg: 警告:此密钥未被受信任签名认证!
gpg: 没有证据表明此签名属于其声称的所有者。
主密钥指纹: 3E80 CA1A 8B89 F69C BA57 D98A 76A5 EF90 5444 9A5C
-
查看archlinux开发者指纹 https://archlinux.org/people/developers/
指纹匹配的上,镜像校验通过。
刻录镜像和启动
- 刻录u盘:
# 注意:此操作会导致u盘数据全部丢失
dd bs=4M if=path/to/archlinux-version-x86_64.iso of=/dev/sdx conv=fsync oflag=direct status=progress && sync
# 成功后,u盘目录
nsfoxer@ns-pc /r/m/n/ARCH_202303> ls
arch boot EFI shellia32.efi shellx64.efi
-
插入刻录好的u盘,启动电脑,进入BIOS设置,关闭安全启动,选择u盘启动。
-
选择第一个进入
# 登录界面 To install Arch Linux follow the installation guide: https://wiki.archlinux.org/title/Installation_guide For Wi-Fi, authenticate to the wireless network using the iwctl utility. For mobile broadband (WWAN) modems, connect with the mmcli utility. Ethernet, WLAN and WWAN interfaces using DHCP should work automatically. After connecting to the internet, the installation guide can be accessed via the convenience script Installation_guide. Last login: Sat Mar 25 04:10:50 2023 root@archiso ~ #
安装和磁盘加密
-
设置键盘布局,默认为us,不需要设置
-
暂时关闭恼人的蜂鸣声:
rmmod pcspkr
-
验证启动模式(我这里是UEFI)
root@archiso ~ # ls /sys/firmware/efi/efivars
有该文件夹即表示是
UEFI
启动 -
连接网络:无线网络使用
iwctl
,有线网络插入电缆(开箱即用)。ping baidu.com
验证联网是否成功。 -
验证时间是否正确:(默认会启用systemd-timesyncd ,在网络连接成功后会进行时间同步)
root@archiso ~ # timedatectl Local time: Sat 2023-03-25 04:14:26 UTC Universal time: Sat 2023-03-25 04:14:26 UTC RTC time: Sat 2023-03-25 04:14:24 Time zone: UTC (UTC, +0000) System clock synchronized: yes NTP service: active RTC in local TZ: no # 这里的时间是未进行本地化,我们是东8区,所以命令显示的时间会慢8小时。
-
磁盘分区:
我计划分区(虚拟机):
/boot 300M swap 1G / 其余
# 1. 查看硬盘 我只有一块硬盘 sda root@archiso ~ # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 688.5M 1 loop /run/archiso/airootfs sda 8:0 0 14.5G 0 disk sr0 11:0 1 810.3M 0 rom /run/archiso/bootmnt # 2. 分区 参考archwiki,按照计划分区分割 root@archiso ~ # fdisk /dev/sda Welcome to fdisk (util-linux 2.38.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0xcfc2e6a9. Command (m for help): g # 这个很重要,创建一个gpt分区表 Created a new GPT disklabel (GUID: F6C14734-9837-5340-A02B-B5C82D13DA64). Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): First sector (2048-30401119, default 2048): Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): Value out of range. First sector (2048-30401119, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-30401119, default 30401119): +300M Created a new partition 1 of type 'Linux' and of size 300 MiB. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): First sector (616448-30401119, default 616448): Last sector, +/-sectors or +/-size{K,M,G,T,P} (616448-30401119, default 30401119): +1G Created a new partition 2 of type 'Linux' and of size 1 GiB. Command (m for help): n Partition type p primary (2 primary, 0 extended, 2 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (3,4, default 3): First sector (2713600-30401119, default 2713600): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2713600-30401119, default 30401119): Created a new partition 3 of type 'Linux' and of size 13.2 GiB. Command (m for help): p Disk /dev/sda: 14.5 GiB, 15565373440 bytes, 30401120 sectors Disk model: VBOX HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xcfc2e6a9 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 616447 614400 300M 83 Linux /dev/sda2 616448 2713599 2097152 1G 83 Linux /dev/sda3 2713600 30401119 27687520 13.2G 83 Linux Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. # 3. 设置efi标志 # 没有EFI标志,会导致后续安装引导报错: # File system "/dev/sda1" has wrong type for an EFI System Partition (ESP). root@archiso / # gdisk /dev/sda GPT fdisk (gdisk) version 1.0.9.1 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help): t Partition number (1-3): 1 Current type is 8300 (Linux filesystem) Hex code or GUID (L to show codes, Enter = 8300): L Type search string, or <Enter> to show all codes: efi ef00 EFI system partition Hex code or GUID (L to show codes, Enter = 8300): EF00 Changed type of partition to 'EFI system partition' # 4. 查看分割后 root@archiso ~ # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 688.5M 1 loop /run/archiso/airootfs sda 8:0 0 14.5G 0 disk ├─sda1 8:1 0 300M 0 part # /boot目录 ├─sda2 8:2 0 1G 0 part # 作为缓冲区 └─sda3 8:3 0 13.2G 0 part # / 目录 sr0 11:0 1 810.3M 0 rom /run/archiso/bootmnt
-
磁盘加密及格式化
-
/boot
不进行加密,后期利用TPM保护/boot
的安全性。 -
swap
分区目前忽略 -
/
分区需要加密
我们使用
[dm-crypt](https://wiki.archlinuxcn.org/wiki/Dm-crypt)
进行加密。# 1. 测试加密性能 nsfoxer@ns-pc ~/N/Mbin> cryptsetup benchmark # 测试仅使用内存(无存储 IO)。 PBKDF2-sha1 2416073 iterations per second for 256-bit key PBKDF2-sha256 4554076 iterations per second for 256-bit key PBKDF2-sha512 1820444 iterations per second for 256-bit key PBKDF2-ripemd160 948079 iterations per second for 256-bit key PBKDF2-whirlpool 739475 iterations per second for 256-bit key argon2i 9 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time) argon2id 9 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time) # Algorithm | Key | Encryption | Decryption aes-cbc 128b 1302.7 MiB/s 5424.8 MiB/s serpent-cbc 128b 124.4 MiB/s 915.7 MiB/s twofish-cbc 128b 245.2 MiB/s 462.4 MiB/s aes-cbc 256b 1002.2 MiB/s 4397.5 MiB/s serpent-cbc 256b 127.8 MiB/s 925.8 MiB/s twofish-cbc 256b 251.6 MiB/s 466.4 MiB/s aes-xts 256b 4451.5 MiB/s 4497.5 MiB/s serpent-xts 256b 810.7 MiB/s 811.4 MiB/s twofish-xts 256b 444.1 MiB/s 443.7 MiB/s aes-xts 512b 3754.9 MiB/s 3746.5 MiB/s serpent-xts 512b 822.5 MiB/s 801.0 MiB/s twofish-xts 512b 446.1 MiB/s 444.1 MiB/s # aes-xts 性能最好,这也是cryptsetup默认采用格式。如果需要指定其他加密格式,请参考https://wiki.archlinuxcn.org/wiki/Dm-crypt/%E8%AE%BE%E5%A4%87%E5%8A%A0%E5%AF%86#%E4%BD%BF%E7%94%A8_dm-crypt_%E7%9A%84%E5%8A%A0%E5%AF%86%E9%80%89%E9%A1%B9 # 2. 加密/dev/sda3 (也就是根目录) root@archiso ~ # cryptsetup luksFormat /dev/sda3 WARNING! ======== This will overwrite data on /dev/sda3 irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/sda3: Verify passphrase: cryptsetup luksFormat /dev/sda3 6.04s user 0.39s system 44% cpu 14.610 total # 3. 解密加密设备 # cryptsetup open device dm_name root@archiso ~ # cryptsetup open /dev/sda3 root-crypt Enter passphrase for /dev/sda3: # 将/dev/sda3解密后的硬件映射为/dev/mapper/dm_name # 在这里及解密后的硬盘为 /dev/mapper/root-crypt root@archiso ~ # ls /dev/mapper control root-crypt # 为提高SSD性能,禁用工作队列 root@archiso ~ # cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent refresh root-crypt Enter passphrase for /dev/sda3: # 4. 格式化 # 将/dev/mapper/root-crypt格式化为ext4格式 root@archiso ~ # mkfs.ext4 /dev/mapper/root-crypt mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 3456844 4k blocks and 864960 inodes Filesystem UUID: 3cb0c8fb-2bab-4ba8-82c1-e48f971440ac Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done # 将/dev/sda1格式化为fat root@archiso ~ # mkfs.fat -F 32 /dev/sda1 mkfs.fat 4.2 (2021-01-31) # 5. 挂载 # 注意:必须先挂载根分区 # 挂载根分区 root@archiso ~ # mount /dev/mapper/root-crypt /mnt/ # 挂载/boot分区 root@archiso ~ # cd /mnt root@archiso /mnt # mkdir boot root@archiso /mnt # mount /dev/sda1 /mnt/boot # 最后挂载详情 root@archiso /mnt # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 688.5M 1 loop /run/archiso/airootfs sda 8:0 0 14.5G 0 disk ├─sda1 8:1 0 300M 0 part /mnt/boot ├─sda2 8:2 0 1G 0 part └─sda3 8:3 0 13.2G 0 part └─root-crypt 254:0 0 13.2G 0 crypt /mnt sr0 11:0 1 810.3M 0 rom /run/archiso/bootmnt
-
-
安装软件
# 1. 修改镜像源 默认排序还可以,虚拟机里不晓得为什么网络很慢,只能手动修改了 nsfoxer@ns-pc ~/N/Mbin> cat /etc/pacman.d/mirrorlist # 南京邮电大学 Server = https://mirror.nju.edu.cn/archlinux/$repo/os/$arch Server = https://mirrors.sjtug.sjtu.edu.cn/archlinux/$repo/os/$arch # 2. 安装必要的软件及网络 root@archiso /mnt # pacstrap -K /mnt base linux linux-firmware networkmanager neovim
-
生成
/etc/fstab
oot@archiso / # genfstab -U /mnt >> /mnt/etc/fstab
-
本地化设置
# 1. 进入新系统
root@archiso / # arch-chroot /mnt
# 2. 设置时区
[root@archiso /]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@archiso /]# date
Sun Mar 26 19:13:08 CST 2023
[root@archiso /]# hwclock --systohc
# 3. 设置locale
[root@archiso /]# cat /etc/locale.gen #(修改)
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
[root@archiso /]# locale-gen
Generating locales...
en_US.UTF-8... done
zh_CN.UTF-8... done
Generation complete.
[root@archiso /]# cat /etc/locale.conf #(新增文件)
LANG=en_US.UTF-8
# 4. 设置主机名
[root@archiso /]# cat /etc/hostname #(新增文件)
nf-vir
# 5. 设置root密码
[root@archiso /]# passwd
New password:
Retype new password:
passwd: password updated successfully
# 6. 设置vconsole
# 新增文件 /etc/vconsole.conf ,使用 美式键盘
[root@nf-vir ~]# cat /etc/vconsole.conf
KEYMAP=us
XKBLAYOUT=us
-
安装引导程序以及内核启动参数
# 1. 安装微码更新 amd-ucode (intel请安装intel-ucode) [root@archiso /]# pacman -S amd-ucode # 2. 使用systemd-boot (在systemd里已包含,systemd时NetworkManager的依赖,所以相当于已经安装了) [root@archiso /]# bootctl --path=/boot install Created "/boot/EFI". Created "/boot/EFI/systemd". Created "/boot/EFI/BOOT". Created "/boot/loader". Created "/boot/loader/entries". Created "/boot/EFI/Linux". Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi". Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI". Random seed file /boot/loader/random-seed successfully written (32 bytes). Successfully initialized system token in EFI variable with 32 bytes. Created EFI boot entry "Linux Boot Manager". # 3. 查看并记录/dev/sda3的UUID [root@archiso entries]# blkid /dev/sda3 /dev/sda3: UUID="bc31f0a4-436b-4849-a28c-46ae6c608643" TYPE="crypto_LUKS" PARTLABEL="Linux filesystem" PARTUUID="791c2d0d-ba27-4fff-9d51-e5b4225227b1" # 4. 新增systemd-boot的引导配置,并增加相关内核参数 # options 解释 cryptdevice=UUID=加密容器的UUID,可以通过 blkid 命令查看:映射设备名 root=根分区" [root@archiso /]# cat /boot/loader/entries/arch.conf #(新增文件) title Arch Linux linux vmlinuz-linux initrd amd-ucode.img initrd initramfs-linux.img options cryptdevice=UUID=bc31f0a4-436b-4849-a28c-46ae6c608643:root-crypted root=/dev/mapper/root-crypted quiet rw # 5. 查看boot配置是否正确 [root@archiso /]# bootctl list type: Boot Loader Specification Type #1 (.conf) title: Arch Linux (default) (not reported/new) id: arch.conf source: /boot//loader/entries/arch.conf linux: /boot//vmlinuz-linux initrd: /boot//amd-ucode.img /boot//initramfs-linux.img options: cryptdevice=UUID=bc31f0a4-436b-4849-a28c-46ae6c608643:root-crypted root=/dev/mapper/root-crypted quiet rw # 6. 增加内核 HOOKS # 修改 /etc/mkinitcpio.conf 文件, 增加encrypt配置 [root@archiso /]# grep '^HOOKS' /etc/mkinitcpio.conf #(修改文件,这个是修改完成之后的结果) HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block encrypt filesystems fsck) # 7. 重新构建镜像 [root@archiso /]# mkinitcpio -P ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img --microcode /boot/amd-ucode.img ==> Starting build: '6.2.8-arch1-1' ==> ********* ==> Generating module dependencies ==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux-fallback.img' ==> Image generation successful
到目前为止,一切正常的话,已经可以重启了。退出chroot
状态,执行reboot
。会看到系统提示输入加密密码:
安全启动
参考: https://bbs.archlinuxcn.org/viewtopic.php?pid=50161#p50161
Secure Boot(安全启动)是 Microsoft 在 UEFI 中引入的一项安全功能,旨在防止恶意代码在进入操作系统之前被加载,破坏操作系统的安全。
-
进入主机,启动
NetworkManager
(为使用网络,有线网络无需配置,无线网络请查找archwiki说明)# systemctl enable --now NetworkManager.service
-
配置
archlinuxcn
源和yay
# 1. 修改 /ect/pacman.conf # 在文件最后追加 [archlinuxcn] Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch # 2. 最后5行内容 [root@nf-vir ~]# tail -n 5 /etc/pacman.conf #[custom] #SigLevel = Optional TrustAll #Server = file:///home/custompkgs [archlinuxcn] Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch # 3. 更新数据库 [root@nf-vir ~]# pacman -Syy # 4. 安装archlinuxcn-keyring [root@nf-vir ~]# pacman -S archlinuxcn-keyring # 5. 安装yay,之后就用yay代替pacman吧 [root@nf-vir ~]# pacman -S yay
-
安装 shim-signed、sbsigntools和efibootmgr。
[root@nf-vir ~]# yay -S shim-signed sbsigntools efibootmgr
-
复制签名文件
cp /usr/share/shim-signed/shimx64.efi /boot/EFI/systemd/ cp /usr/share/shim-signed/mmx64.efi /boot/EFI/systemd/
-
增加
EFI
启动项[root@nf-vir ~]# efibootmgr --verbose --disk /dev/sda --part 1 --create --label "Shim" --loader /EFI/systemd/shimx64.efi
-
生成
MOK
密钥[root@nf-vir ~]# openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -days 3650 -subj "/CN=my Machine Owner Key/" -out MOK.crt [root@nf-vir ~]# openssl x509 -outform DER -in MOK.crt -out MOK.cer [root@nf-vir ~]# ls MOK.cer MOK.crt MOK.key
-
保存
MOK
密钥# 创建目录,保存MOK.key和MOK.crt # 并限制目录的读取权限,只允许root用户读取 [root@nf-vir ~]# mkdir /etc/mok/ [root@nf-vir ~]# mv MOK.crt MOK.key /etc/mok/ [root@nf-vir ~]# chmod 400 /etc/mok/ [root@nf-vir ~]# ls /etc/mok/ MOK.crt MOK.key # 移动MOK.cer至/boot下,稍后导入使用 [root@nf-vir ~]# mv MOK.cer /boot/
-
签名 systemd-boot
[root@nf-vir ~]# cp /boot/EFI/systemd/systemd-bootx64.efi /boot/EFI/systemd/grubx64.efi [root@nf-vir ~]# sbsign --key /etc/mok/MOK.key --cert /etc/mok/MOK.crt --output /boot/EFI/systemd/grubx64.efi /boot/EFI/systemd/grubx64.efi Signing Unsigned original image
-
签名内核
[root@nf-vir ~]# sbsign --key /etc/mok/MOK.key --cert /etc/mok/MOK.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux Signing Unsigned original image
-
新建pacman的
HOOK
,以便在内核升级或更新时自动签名# 新建文件 /etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook [Trigger] Operation = Install Operation = Upgrade Type = Package Target = linux Target = linux-lts Target = linux-hardened Target = linux-zen [Action] Description = Signing kernel with Machine Owner Key for Secure Boot When = PostTransaction Exec = /usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*' -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key /etc/mok/MOK.key --cert /etc/mok/MOK.crt --output {} {}; fi' ; Depends = sbsigntools Depends = findutils Depends = grep
为确认hook是否正确,再次安装内核,最后出现
Signing Unsigned original image
,表示hook设置没错。[root@nf-vir pacman.d]# yay -S linux -> Avoid running yay as root/sudo. warning: linux-6.2.8.arch1-1 is up to date -- reinstalling resolving dependencies... looking for conflicting packages... Packages (1) linux-6.2.8.arch1-1 Total Installed Size: 174.38 MiB Net Upgrade Size: 0.00 MiB :: Proceed with installation? [Y/n] (1/1) checking keys in keyring :: Running post-transaction hooks... (1/4) Arming ConditionNeedsUpdate... *************** ==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux-fallback.img' ==> Image generation successful (4/4) Signing kernel with Machine Owner Key for Secure Boot Signing Unsigned original image
-
重启系统,在bios里设置启用
Secure Boot
。初次会要你导入
MOK
,在/boot里找到后导入即可成功。如果能正常进入系统,即完成 Secure Boot 的设置,可以进入 BIOS 将默认启动功设为 shim 。
-
正常情况下,可以正常启动了
TPM2.0
保存磁盘密钥
参考:https://blog.men.ci/luks-with-tpm2-secure-boot/
TPM(Trusted Platform Module,可信平台模块)是一种安全芯片,提供了硬件级别的一些安全相关的功能。TPM 可以在内部实现不受恶意软件干扰的密码学操作。早年的 TPM 一般作为独立的模块,插入到计算机主板上的专用接口上,而近年的 CPU 往往内置了 TPM 的功能(如 Intel PTT 与 AMD fTPM),不再需要独立硬件。TPM 的规范由 TCG(Trusted Computing Group,可信计算组织)制定,目前最为广泛使用的版本是 2.0。
PCR 编号 | 测量值 | 备注 |
---|---|---|
0 | UEFI BIOS 固件代码 | 当升级 BIOS 固件时变化 |
1 | UEFI BIOS 固件配置 | 当修改 BIOS 设置时变化,改回后会恢复 |
2 | Option ROM 固件代码 | 一些硬件设备(如 PCIe 设备)在启动时执行的代码 |
3 | Option ROM 固件配置 | |
4 | UEFI 引导程序代码 | 即引导过程中加载的 .efi 可执行文件 (由 UEFI 设置,shim 也会设置) |
5 | GPT 分区表 | |
6 | S4/S5 挂起恢复状态 | |
7 | Secure Boot 配置 | 关闭 Secure Boot 或修改 MOK 后会变化 |
8 | GRUB 命令与内核参数 | 由 GRUB 设置 |
9 | GRUB 读取的所有文件 (包括 vmlinuz 与 initrd ) |
由 GRUB 设置 |
我们使用systemd-cryptenroll
:
要求systemd
版本高于248(也包含248版本)。
-
安装
tpm2-tools
工具[root@nf-vir ~]# pacman -S tpm2-tools
-
查看TPM支持
[root@nf-vir ~]# cat /sys/class/tpm/tpm0/tpm_version_major 2
-
查看
tpm
设备及mkinitcpio设置# 1. 查看设备 [root@nf-vir ~]# systemd-cryptenroll --tpm2-device=list PATH DEVICE DRIVER /dev/tpmrm0 MSFT0101:00 tpm_tis # 2. 增加内核启动加载模块 tpm_tis(为载入tpm) # 修改 /etc/mkinitcpio.conf 文件的MODULES= [root@nf-vir ~]# grep '^MODU' /etc/mkinitcpio.conf MODULES=(tpm_tis) # 3. 设置hooks。替换 /etc/mkinitcpio.conf文件的HOOKS # 将 udev, usr, resume 替换为 systemd # 将 keymap, consolefont 替换为 sd-vconsole # 将 encrypt 替换为 sd-encrypt [root@nf-vir ~]# grep '^HOOK' /etc/mkinitcpio.conf HOOKS=(base systemd autodetect modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck) # 4. 重构 initramfs [root@nf-vir ~]# mkinitcpio -P
-
设置内核启动参数
rd.luks.name=your-uuid=name rd.luks.options=tpm2-device=auto root=/dev/mapper/root
[root@nf-vir ~]# cat /boot/loader/entries/arch.conf title Arch Linux linux vmlinuz-linux initrd amd-ucode.img initrd initramfs-linux.img # options cryptdevice=UUID=bc31f0a4-436b-4849-a28c-46ae6c608643:root root=/dev/mapper/root options rd.luks.name=bc31f0a4-436b-4849-a28c-46ae6c608643=root rd.luks.options=tpm2-device=auto root=/dev/mapper/root
-
将磁盘密钥写入tpm
# /dev/sda3 是 root目录 # --wipe-slot 是擦除已有的密钥 # --tpm2-device=auto 指定tpm设备 # --tpm2-pcrs=0,2,4,7 PCR 0,2,4,7在释放解密密钥之前验证固件、内核和引导加载程序。 [root@nf-vir ~]# systemd-cryptenroll /dev/sda3 --wipe-slot=tpm2 --tpm2-device=auto --tpm2-pcrs=0,2,4,7 Please enter current passphrase for disk /dev/sda3: ****** New TPM2 token enrolled as key slot 1.
-
重启,正常下,启动时无需再输入硬盘密钥。
# 已经自动挂载了 [root@nf-vir ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 14.5G 0 disk ├─sda1 8:1 0 300M 0 part /boot ├─sda2 8:2 0 1G 0 part └─sda3 8:3 0 13.2G 0 part └─root 254:0 0 13.2G 0 crypt / sr0 11:0 1 810.3M 0 rom
-
配置swap。注意:这里的swap分区,不能进行休眠(不是suspend,是不能进行hibernate)。
参考: https://wiki.archlinux.org/title/dm-crypt/Swap_encryption
# 1. 配置 /etc/crypttab 进行解密 # 查找swap分区的固定设备 [root@nf-vir ~]# find -L /dev/disk -samefile /dev/sda2 /dev/disk/by-partuuid/24b907d6-8655-4800-ba7d-2695c2bc1db7 /dev/disk/by-partlabel/Linux\x20filesystem /dev/disk/by-path/pci-0000:00:0d.0-ata-1-part2 /dev/disk/by-path/pci-0000:00:0d.0-ata-1.0-part2 /dev/disk/by-id/ata-VBOX_HARDDISK_VB41b12607-57af3d01-part2 /dev/disk/by-diskseq/1-part2 # 2. 写入/etc/crypttab 启动时,会自动解密此/dev/sda2,使用随机密钥 [root@nf-vir ~]# cat /etc/crypttab # Configuration for encrypted block devices. # See crypttab(5) for details. swap /dev/disk/by-id/ata-VBOX_HARDDISK_VB41b12607-57af3d01-part2 /dev/urandom swap,cipher=aes-xts-plain64,size=256 # 3. 编辑/etc/fstab。为自动挂载 [root@nf-vir ~]# cat /etc/fstab # Static information about the filesystems. # See fstab(5) for details. # <file system> <dir> <type> <options> <dump> <pass> # /dev/mapper/root-crypt UUID=ed01b399-9575-4d59-b6a8-e258332062da / ext4 rw,relatime 0 1 # /dev/sda1 UUID=9419-E997 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2 # /dev/mapper/swap /dev/mapper/swap none swap defaults 0 0 # 4. 重启,一切正常的话,将看到swap已被挂载 [root@nf-vir ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 14.5G 0 disk ├─sda1 8:1 0 300M 0 part /boot ├─sda2 8:2 0 1G 0 part │ └─swap 254:1 0 1G 0 crypt [SWAP] # swap已被挂载 └─sda3 8:3 0 13.2G 0 part └─root 254:0 0 13.2G 0 crypt / sr0 11:0 1 810.3M 0 rom
-
由于内更新会导致tpm状态不一致,所以每次更新或切换内核都会导致密钥不可用,需要手动更新。这里再次使用hooks进行自动配置。
我们使用安全启动内核签名的hook。
# 1. 新增脚本并添加可执行权限 # 写入tpm密钥脚本 [root@nf-vir ~]# cat /usr/local/sbin/regenerate_tpm.sh #!/bin/sh echo 'Start update tpm key' /bin/systemd-cryptenroll /dev/sda3 --wipe-slot=tpm2 --tpm2-device=auto --tpm2-pcrs=0,2,4,7 [root@nf-vir ~]# chmod +x /usr/local/sbin/regenerate_tpm.sh # 签名内核脚本 [root@nf-vir ~]# cat /usr/local/sbin/sign_kernel.sh #!/bin/sh /usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*' -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key /etc/mok/MOK.key --cert /etc/mok/MOK.crt --output {} {}; fi' \; [root@nf-vir ~]# chmod +x /usr/local/sbin/sign_kernel.sh # 2. 更新内核hooks脚本 [root@nf-vir ~]# cat /etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook [Trigger] Operation = Install Operation = Upgrade Type = Package Target = linux Target = linux-lts Target = linux-hardened Target = linux-zen [Action] Description = Signing kernel with Machine Owner Key for Secure Boot And Update Tpm Key When = PostTransaction Exec = /usr/local/sbin/sign_kernel.sh && /usr/local/sbin/regenerate_tpm.sh Depends = sbsigntools Depends = findutils Depends = grep Depends = tpm2-tools # 3. 正常的话,此时在内核更新或切换时,都会自动重新签名内核以及重新写入tpm密钥
桌面
Gnome相关
其他部分可以参考之前的一篇:Gnome桌面使用
截止 2023年10月14日,Archlinux的Gnome已经更新至版本45.0
。
三重缓冲
Gnome
的窗口管理器是mutter
。截至2023年10月14日,目前有一个三重缓冲patch(mutter-dynamic-buffering
)可用,用于增加动画流畅度。至少我自己使用有这个补丁的mutter
,肉眼可见的流畅度比没有补丁好。
paru -S mutter-dynamic-buffering
Nvidia
显卡驱动,没有wayland模式
这个和gdm
有关。在nvidia驱动安装好之后,执行
# ln -s /dev/null /etc/udev/rules.d/61-gdm.rules
但目前(gnome 版本43.3)这会导致gnome-shell使用nvidia显卡,导致功耗增加。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.60.11 Driver Version: 525.60.11 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | N/A |
| N/A 44C P3 7W / N/A | 2MiB / 4096MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1763 G /usr/bin/gnome-shell 1MiB |
+-----------------------------------------------------------------------------+
目前已有issue: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6146
详细查看:https://wiki.archlinux.org/title/GDM#Wayland_and_the_proprietary_NVIDIA_driver
我就故且暂时禁用掉nvidia了,的确除了打游戏,目前也没有什么用到显卡的地方。
nvidia与amd双显卡驱动
参考:
我的nvidia显卡为gtx1650,内核为linux-tls
,根据手册安装nvidia-open-dkms
驱动
# 安装以下4个软件
nsfoxer@ns-pc /t/n/Temp> yay -Qq | grep nvidia
nvidia-open-dkms
nvidia-prime
nvidia-settings
nvidia-utils
# 之后启动 nvidia-suspend.service
nsfoxer@ns-pc /t/n/Temp> systemctl enable nvidia-suspend.service
# nvidia-prime 用于开启独立显卡的软件
# 比方说,想用nvidia启动shotcut,则运行 prime-run shotcut
# 对应Gnome桌面,想要在以独立显卡启动应用,安装switcheroo-control并启动服务
nsfoxer@ns-pc /t/n/Temp> yay -Qq switcheroo-control
switcheroo-control
nsfoxer@ns-pc /t/n/Temp> systemctl status switcheroo-control.service
● switcheroo-control.service - Switcheroo Control Proxy service
Loaded: loaded (/usr/lib/systemd/system/switcheroo-control.service; enabled; preset: disabled)
GSCconnect
作为kdeconnect的gnome版本,在使用挂载手机文件可能会错误,需要启用rsa支持。编辑文件 ~/.ssh/config
nsfoxer@ns-pc /t/n/Temp> cat ~/.ssh/config
Host 192.168.*.*
HostKeyAlgorithms +ssh-rsa
链接:https://github.com/GSConnect/gnome-shell-extension-gsconnect/issues/1203
录屏
使用录屏可能发现不生效,安装[gst-plugin-pipewire](https://archlinux.org/packages/?name=gst-plugin-pipewire)
和[gst-plugins-good](https://archlinux.org/packages/?name=gst-plugins-good)
。
联想小新系列笔记本
以下仅在联想小新pro16下测试:
切换野兽模式
参考:https://wiki.archlinux.org/title/Lenovo_IdeaPad_5_Pro_14ACN6
首先安装acpi
内核模块
# 1. 安装 acpi 模块
nsfoxer@ns-pc /t/nsfoxer> yay -Qi acpi_call-lts # 对于 linux内核安装 acpi_call软件包,其他内核请参考archwiki
# acpi模式切换 已验证
# 省电模式
echo '\_SB.PCI0.LPC0.EC0.VPC0.DYTC 0x0013B001' > /proc/acpi/call
# 性能模式
echo '\_SB.PCI0.LPC0.EC0.VPC0.DYTC 0x0012B001' > /proc/acpi/call
# 智能模式
echo '\_SB.PCI0.LPC0.EC0.VPC0.DYTC 0x000FB001' > /proc/acpi/call
# 快速充电
# 打开快充
echo '\_SB.PCI0.LPC0.EC0.VPC0.SBMC 0x07' > /proc/acpi/call
# 关闭快充
echo '\_SB.PCI0.LPC0.EC0.VPC0.SBMC 0x08' > /proc/acpi/call
软件
软件名 | 介绍 | 分类 | 备注 |
---|---|---|---|
neovim | vim的升级版 | 编辑器 | |
sublime text | 性能很强的编辑器 | 编辑器 | 由于协议原因,安装可以参考官网 |
linuxqq | 腾讯出品 | 社交 | |
typora | markdown编辑器 | 编辑器 | |
wps | 办公生产力工具 | 编辑器 | 说实话,在gnome的wayland下显示效果一般 |
vscode | 代码编辑器 | 编辑器 | |
gthumb | 照片整理器 | 查看器 | 用来整理大量拍摄照片 |
rust-rover | idea的rust的IDE | IDE |
番外
文件系统修复
前几天把树莓派直接断电,导致无法启动。实在懒得重装配环境了,所以尝试修复一下,结果真成功了。忍不住赞美一句,文件系统的修复功能还是很顶的。
-
插入树莓派SD卡;
-
查看SD分区:
卸载SD卡(umount /dev/mmcblk0p1)
-
修复
boot
分区:sudo fsck /dev/mmcblk0p1
检测到错误,选择
2(从备份数据复制到现有数据)
,再选择1(确认写入磁盘)
-
重新插入SD卡,树莓派正常开机了。Nice
加密磁盘挂载失败
今天关机时,等了一会一直关不掉,直接按ctrl
+alt
+print
+ reisub
直接关机。结果重启时挂载不上。报错大概是:Failed to start File System Check on /dev/mapper/lvm-encrypted.
。
十有八九是文件系统有损坏,需要repair
。找到相关解决方案: manjaro
-
因为系统已经完全进不去,所以先刻录一个最新archlinux的镜像,从U盘的系统进入(当然进去之前应该先关闭安全启动模式);
-
打开对应的加密盘。我的盘是
/dev/nvme0n1p2
# 这个是我正常使用时的格式 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 476.9G 0 disk ├─nvme0n1p1 259:1 0 300M 0 part /boot ├─nvme0n1p2 259:2 0 467.8G 0 part │ └─lvm-encrypted 254:0 0 467.8G 0 crypt / └─nvme0n1p3 259:3 0 8.8G 0 part └─swap 254:1 0 8.8G 0 crypt [SWAP]
# 打开加密磁盘,将其映射为 /dev/mapper/luks # 需要输入磁盘的加密密钥 无回显 cryptsetup open /dev/nvme0n1p2 luks
-
执行修复操作
e2fsck -v /dev/mapper/luks # 有检查结果,需要优化。全部输入'y'就好 # 顺便一提,e2fsck是一个ext2 ext3 ext4的文件修复关工具 # e2fsck - check a Linux ext2/ext3/ext4 file system # 我理解等价于 fsck.ext4 这个指令吧
-
打开安全模式,输入加密密钥,重启。ok
关于fsck
原理,这里找到一篇描述,看起来挺有趣的: fsck是怎样工作的