在之前的教程中,我们了解了什么是 dm-crypt 和 LUKS 以及如何加密单个磁盘分区。我们将采用一种略有不同的方法,使用 dm-crypt LUKS 加密整个磁盘并在其上安装 Archlinux。

让我们从磁盘擦除开始。运行 lsblk 以找到您的主磁盘并在需要的地方替换 /dev/sda :

1
shred --verbose --random-source=/dev/urandom --iterations=3 /dev/sda

我在我的 120GB SSD 上用 –iterations=15 运行了上面的命令一夜之间,它在 7 小时后完成。

完成后,对磁盘进行分区。除非你的主板使用的是 UEFI 固件,否则请确保选择 dos (msdos) 标签,否则在键入时使用 gpt:

1
cfdisk /dev/sda

img

之后创建引导加载程序分区:

1
New-> Partition Size: 100M -> primary -> Bootable

最后一个将是根分区。分区大小应自动设置为您的剩余可用空间。

1
New-> Partition Size: xxxGB -> primary

写入更改并从 cfdisk 退出。

为了引导您的加密根分区,将装载在 /boot 中的引导加载程序分区 /dev/sda1 不会被加密。我将在本文末尾放置几个链接,指导您如何加密甚至移动 CD/DVD/USB 上的启动分区。

在 LUKS 加密模式下创建加密设备映射器设备:

1
cryptsetup --verbose --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 --use-random luksFormat /dev/sda2

解锁分区,注意 cryptroot 将是我们要操作的设备映射器名称。

1
cryptsetup open --type luks /dev/sda2 cryptroot

创建引导和根文件系统:

1
2
mkfs.ext4 /dev/sda1
mkfs.ext4 /dev/mapper/cryptroot

安装它们:

1
2
3
mount -t ext4 /dev/mapper/cryptroot /mnt
mkdir -p /mnt/boot
mount -t ext4 /dev/sda1 /mnt/boot

安装基础和基础开发系统:

1
pacstrap -i /mnt base base-devel

生成 fstab:

1
genfstab -U -p /mnt >> /mnt/etc/fstab

Chroot 以配置基本系统:

1
arch-chroot /mnt

取消注释 en_US 语言环境:

1
sed -i 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen

生成语言环境:

1
locale-gen

创建配置文件,指示系统应该使用哪种语言环境:

1
echo LANG=en_US.UTF-8 > /etc/locale.conf

导出语言环境

1
export LANG=en_US.UTF-8

创建具有所需时区的符号链接:

1
ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime

将硬件时钟设置为 UTC:

1
hwclock --systohc --utc

设置所需的主机名:

1
echo CookieMonster > /etc/hostname

设置根密码:

1
passwd

添加系统用户:

1
useradd -m -g users -G wheel,games,power,optical,storage,scanner,lp,audio,video -s /bin/bash username

设置系统用户密码:

1
passwd username

安装 sudo (base-devel) 和引导加载程序 grub 和 os-prober:

1
pacman -S sudo grub-bios os-prober

允许系统用户使用 sudo 并以 root 身份运行命令(临时):

1
EDITOR=nano visudo

按 CTRL + W 并键入 wheel,然后取消注释以下行:

img

添加以下内核参数,以便能够在系统启动期间解锁您的 LUKS 加密根分区:

img

添加加密挂钩:

img

由于我们在 mkinitcpio 配置文件中添加了新的钩子,我们应该重新生成我们的 initrams 映像(ramdisk):

1
mkinitcpio -p linux

安装 grub 并保存其配置文件:

1
2
grub-install --recheck /dev/sda
grub-mkconfig --output /boot/grub/grub.cfg

退出 chroot,卸载分区,关闭设备并重新启动(移除安装介质):

1
2
3
4
5
exit
umount -R /mnt/boot
umount -R /mnt
cryptsetup close cryptroot
systemctl reboot

输入密码并以系统用户身份登录后,启动 dhcpcd。

img

1
2
sudo systemctl start dhcpcd
ping -c2 youtube.com

安装 Xorg 并将 .xinitrc 复制到您的 $HOME 目录:

1
2
sudo pacman -S xorg-server xorg-server-utils xorg-xinit mesa xterm xorg-twm xorg-xclock
cp /etc/X11/xinit/xinitrc ~/.xinitrc

有一个特殊的维基页面,其中包含有关 GPU 驱动程序的有用信息,请查看 https://wiki.archlinux.org/index.php/xorg#Driver_installation 如果您的 GPU 品牌恰好是 amd/ati、intel 或nvidia 安装那里列出的适当驱动程序。

输入startx,你应该会看到两个并排的终端,现在输入exit

在 .xinitrc 中注释以下行并添加一些以指定我们希望在成功登录时启动 xfce 桌面环境:

img

安装 xfce、外部显示管理器和网络管理器:

1
sudo pacman -S slim archlinux-themes-slim xfce4 networkmanager network-manager-applet

更换默认的苗条主题:

img

停止 dhcpcd,启用 slim,启用 NetworkManager,startx:

1
2
3
4
sudo systemctl stop dhcpcd
sudo systemctl enable NetworkManager
sudo systemctl enable slim
startx

img

如果你搞砸了你的系统并且不得不从可移动媒体上 chroot,命令是:

1
2
3
4
cryptsetup open --type luks /dev/sda2 cryptroot
mount -t ext4 /dev/mapper/cryptroot /mnt
mount -t ext4 /dev/sda1 /mnt/boot
arch-chroot /mnt

要卸载它们:

1
2
3
umount -R /mnt/boot
umount -R /mnt
cryptsetup close cryptroot

硬盘准备

分区

sda1 /boot

sda2 /

加密主分区,不加密 /boot 启动分区。

1
cryptsetup --verbose --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 --use-random luksFormat /dev/sda2

此步骤一定要输入大写的YES

解密主分区

1
cryptsetup open /dev/sda2 root

格式化主分区

1
mkfs.btrfs /dev/mapper/root

挂载主分区

1
mount /dev/mapper/root /mnt

格式化启动分区

1
mkfs.fat -F32 /dev/sda1

挂载启动分区

1
mount --mkdir /dev/sda1 /mnt/boot

设置 mkinitcpio

编辑 mkinitcpio.conf,找到 HOOKS,确保存在下面的内容

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

运行

1
mkinitcpio -P

引导

安装 grub 和 efibootmgr

运行 blkid -s UUID -o value /dev/sda2 命令获取 UUID

编辑 /etc/default/grub

GRUB_CMDLINE_LINUX=“loglevel=3 quiet cryptdevice=UUID=上面获取到的UUID:root root:/dev/mapper/root

进行联网

有线

默认启用 DHCP 客户端如果使用网线就能直接连接网络

1
ip a

无线

先使用 iwctl 查看是否有无线网卡

1
iwctl station list

iwctl检查不到网卡

如果没有找到可能是无线网卡被 rfkill 禁用了,通过以下命令解除禁用

1
rfkill unblock all

解除禁用后使用 iwctl 连接网络

设置 NTP

1
timedatectl set-ntp true

更换 pacman 换源

reflector 自动换源和手动换源选择其一即可

reflector

通过 reflector 自动选择最快的源

1
reflector -c China -a 6 --sort rate --save /etc/pacman.d/mirrorlist

手动更换中科大源

编辑 /etc/pacman.d/mirrorlist ,在文件的最顶端添加

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

换源之后进行更新

1
pacman -Sy

磁盘操作

查看磁盘

使用 lsblk 查看当前系统存在的磁盘

1
lsblk

设置分区格式

使用 parted 设置磁盘分区格式 (注意: 更换分区格式磁盘数据会丢失)

1
parted /dev/nvme0n1

在 parted shell 里执行

1
2
3
(parted) mktable
New disk label type? gpt
(parted) quit

分区

通过 cfdisk 命令通过 TUI 对磁盘进行分区

1
cfdisk /dev/nvme0n1

分区要求

  1. 512M EFI 分区 (不加密)
  2. 512M BOOT 分区 (不加密)
  3. 8G SWAP 交换分区 (加密) (内存小于 8G 交换分区和内存同大小,大于 8G 交换分区大小固定 8G)
  4. 剩下加入 root 分区,通过 btrfs 卷来进行功能划分

分区截图

格式化非加密分区

格式化 efi, boot 分区

1
2
mkfs.vfat /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p2

选择加密算法格式化 root 分区

测试加密算法性能

首先查看各种加密算法在当前 CPU 下的性能

1
cryptsetup benchmark

benchmark结果截图

综合加解密速度和安全性,我这里选择 aes-xts 密钥长度为 256b,因为 cbc 填充存在填充攻击因此不建议选择

加密格式化分区

因为默认使用的 aes-xts-512 加密,这里使用 -s 256 来指定使用 256b 密钥

1
cryptsetup luksFormat -s 256 /dev/nvme0n1p4

输入全大写 YES,然后输入加密密码并验证密码,等待一会儿就完成了磁盘加密

格式化分区截图

打开加密的分区

使用 cryptsetup open 打开加密的分区,这里的 archlinux 是解密之后的磁盘映射名(可自定义)

1
cryptsetup open /dev/nvme0n1p4 archlinux

输入正确的密码解密后就可以在 /dev/mapper/ 目录下看到磁盘映射文件了,解密映射文件可以被格式化、挂载就像正常的块文件一样

1
ls /dev/mapper/

查看磁盘映射文件截图

查看加密分区

1
cryptsetup status /dev/mapper/archlinux

加密分区信息截图

配置 Btrfs 文件系统

格式化磁盘映射为 btrfs 文件系统

1
mkfs.btrfs /dev/mapper/archlinux

创建 btrfs 卷

1
2
3
4
5
6
7
8
9
10
11
mount /dev/mapper/archlinux /mnt

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@tmp
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@swap
btrfs subvolume create /mnt/@var_log
btrfs subvolume create /mnt/@pacman_pkg
btrfs subvolume create /mnt/@snapshots

umount /mnt

挂载 btrfs 卷

1
2
3
4
5
6
7
8
9
10
11
12
13
mount -o noatime,ssd,space_cache=v2,compress=zstd,subvol=@ /dev/mapper/archlinux /mnt

mkdir -p /mnt/{boot,efi,home,var/log,var/cache/pacman/pkg,.snapshots,tmp,swap}

mount -o noatime,ssd,space_cache=v2,compress=zstd,subvol=@tmp /dev/mapper/archlinux /mnt/tmp
mount -o noatime,ssd,space_cache=v2,compress=zstd,subvol=@home /dev/mapper/archlinux /mnt/home
mount -o noatime,ssd,space_cache=v2,compress=zstd,subvol=@snapshots /dev/mapper/archlinux /mnt/.snapshots
mount -o noatime,ssd,space_cache=v2,compress=zstd,subvol=@var_log /dev/mapper/archlinux /mnt/var/log
mount -o noatime,ssd,space_cache=v2,compress=zstd,subvol=@pacman_pkg /dev/mapper/archlinux /mnt/var/cache/pacman/pkg
mount -o noatime,ssd,subvol=@swap /dev/mapper/archlinux /mnt/swap

mount /dev/nvme0n1p1 /mnt/efi
mount /dev/nvme0n1p2 /mnt/boot

lsblk 查看挂载结果

lsblk挂载结果

对 /var/log/ 和 警用 CoW

1
chattr +C /mnt/var/log

安装 ArchLinux

pacstrap 安装基础包

1
pacstrap /mnt base linux-zen linux-firmware neovim

安装微码

AMD

1
pacstrap /mnt amd-ucode

intel

1
pacstrap /mnt intel-ucode

生成 fstab 文件

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

进入 chroot 环境

1
arch-chroot /mnt

基础配置

参考 Installation guide - ArchWiki

1
2
3
4
5
6
7
8
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc

nvim /etc/locale.gen # 取消注释 en_US.UTF-8 zh_CN.UTF-8 zh_TW.UTF-8
locale-gen
nvim /etc/locale.conf # 添加 LANG=en_US.UTF-8

nvim /etc/vconsole.conf # 添加 KEYMAP=us

编辑 /etc/hosts

1
2
3
4
nvim /etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.1.1 star-laptop.localdomain star-laptop

编辑 /etc/hostname

1
2
nvim /etc/hostname
star-laptop

安装系统软件包

1
pacman -S grub efibootmgr networkmanager git reflector snapper grub-btrfs base-devel linux-zen-headers zsh sudo

启动配置

mkinitcpio.conf

编辑

1
nvim /etc/mkinitcpio.conf

在 MODULES 中添加 btrfs

1
MODULES=(btrfs)

更改 HOOKS

1
HOOKS=(base systemd autodetect keyboard sd-vconsole modconf block sd-encrypt filesystems fsck)

crypttab.initramfs

复制 crypttab 到 crypttab.initramfs

1
cp /etc/crypttab /etc/crypttab.initramfs

编辑 crypttab.initramfs

1
nvim /etc/crypttab.initramfs

在 vim 中查看磁盘 UUID

1
:read !lsblk -o name,uuid

磁盘UUID截图

然后填入以下内容并删除多余的内容

1
archlinux     UUID=<lsblk 显示的 root 分区磁盘的 UUID>    none

crypttab.initramfs文件截图

生成启动镜像

1
mkinitcpio -P

安装 GRUB

1
grub-install --target=x86_64-efi --efi-directory=/efi

编辑内核参数

1
2
nvim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="root=/dev/mapper/archlinux"

内核参数截图

生成 GRUB 配置文件

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

添加用户

1
2
useradd -mG wheel star
passwd star

使用 visudo 编辑 /etc/sudoers 运行 wheel 组用户可以使用 sudo

1
EDITOR=nvim visudo

visudo编辑截图

更换新默认 shell

1
chsh -s /bin/zsh star

配置 SWAP

创建 swapfile 并关闭 CoW 和压缩

1
2
3
4
5
6
7
8
touch /swap/swapfile
chmod 600 /swap/swapfile
truncate -s 0 /swap/swapfile
chattr +C /swap/swapfile
btrfs property set /swap/swapfile compression none # 无法执行
dd if=/dev/zero of=/swap/swapfile bs=1M count=16384 # 16G SWAP
mkswap /swap/swapfile
swapon /swap/swapfile

编辑 /etc/fstab 在末尾添加

1
/swap/swapfile         none         swap          sw          0 0

/etc/fstab截图

使用 btrfs_map_physical 获取 btrfs swapfile 的偏移量

下载 btrfs_map_physical.c

1
2
3
4
curl -O https://raw.githubusercontent.com/osandov/osandov-linux/master/scripts/btrfs_map_physical.c

# China
curl -O https://ghproxy.com/https://raw.githubusercontent.com/osandov/osandov-linux/master/scripts/btrfs_map_physical.c

编译

1
gcc btrfs_map_physical.c -o btrfs_map_physical

获取 swapfile offset

1
2
3
4
physical_offset=$(./btrfs_map_physical /swap/swapfile | awk '{ if ($1==0) print $NF; }')
offset_pagesize=(`getconf PAGESIZE`)
offset=$(( physical_offset / offset_pagesize ))
echo $offset > offset.txt

编辑 /etc/default/grub

1
GRUB_CMDLINE_LINUX_DEFAULT="root=/dev/mapper/archlinux resume_offset=2761984"

/etc/default/grub截图

重新生成 grub.cfg

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

退出 arch-chroot 取消挂载完成安装

1
2
3
4
exit
umount -R /mnt
cryptsetup close archlinux
reboot

快照策略配置

移除 /.snapshots 目录

1
sudo rm -r /.snapshots

创建 snapper 配置文件

1
2
sudo snapper -c root create-config /
sudo snapper -c home create-config /home/

重新挂载

1
mount -a

更改 snapper 配置文件

1
2
sudo nvim /etc/snapper/configs/root
sudo nvim /etc/snapper/configs/home

设置允许访问的用户组

设置允许访问的用户组截图

设置自动快照规则

设置自动快照规则截图

启用自动快照和自动快照清理

1
2
sudo systemctl enable --now snapper-timeline.timer
sudo systemctl enable --now snapper-cleanup.timer

开启 pacman 安装包自动打快照

首先确保已经安装了 yay

安装 snap-pac-grub

1
yay -S snap-pac-grub

安装 snapper-gui 工具 (可选)

1
yay -S snapper-gui