磁盘加密
在之前的教程中,我们了解了什么是 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 |

之后创建引导加载程序分区:
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 | mkfs.ext4 /dev/sda1 |
安装它们:
1 | mount -t ext4 /dev/mapper/cryptroot /mnt |
安装基础和基础开发系统:
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,然后取消注释以下行:

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

添加加密挂钩:

由于我们在 mkinitcpio 配置文件中添加了新的钩子,我们应该重新生成我们的 initrams 映像(ramdisk):
1 | mkinitcpio -p linux |
安装 grub 并保存其配置文件:
1 | grub-install --recheck /dev/sda |
退出 chroot,卸载分区,关闭设备并重新启动(移除安装介质):
1 | exit |
输入密码并以系统用户身份登录后,启动 dhcpcd。

1 | sudo systemctl start dhcpcd |
安装 Xorg 并将 .xinitrc 复制到您的 $HOME 目录:
1 | sudo pacman -S xorg-server xorg-server-utils xorg-xinit mesa xterm xorg-twm xorg-xclock |
有一个特殊的维基页面,其中包含有关 GPU 驱动程序的有用信息,请查看 https://wiki.archlinux.org/index.php/xorg#Driver_installation 如果您的 GPU 品牌恰好是 amd/ati、intel 或nvidia 安装那里列出的适当驱动程序。
输入startx,你应该会看到两个并排的终端,现在输入exit
在 .xinitrc 中注释以下行并添加一些以指定我们希望在成功登录时启动 xfce 桌面环境:

安装 xfce、外部显示管理器和网络管理器:
1 | sudo pacman -S slim archlinux-themes-slim xfce4 networkmanager network-manager-applet |
更换默认的苗条主题:

停止 dhcpcd,启用 slim,启用 NetworkManager,startx:
1 | sudo systemctl stop dhcpcd |

如果你搞砸了你的系统并且不得不从可移动媒体上 chroot,命令是:
1 | cryptsetup open --type luks /dev/sda2 cryptroot |
要卸载它们:
1 | umount -R /mnt/boot |
硬盘准备
分区
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/grubGRUB_CMDLINE_LINUX=“loglevel=3 quiet cryptdevice=UUID=
上面获取到的UUID:root root:/dev/mapper/root
进行联网
有线
默认启用 DHCP 客户端如果使用网线就能直接连接网络
1 ip a无线
先使用
iwctl查看是否有无线网卡
1 iwctl station list
如果没有找到可能是无线网卡被
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分区要求
- 512M EFI 分区 (不加密)
- 512M BOOT 分区 (不加密)
8G SWAP 交换分区 (加密) (内存小于 8G 交换分区和内存同大小,大于 8G 交换分区大小固定 8G)- 剩下加入 root 分区,通过 btrfs 卷来进行功能划分
格式化非加密分区
格式化
efi,boot分区
1
2 mkfs.vfat /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p2选择加密算法格式化 root 分区
测试加密算法性能
首先查看各种加密算法在当前 CPU 下的性能
1 cryptsetup 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查看挂载结果
对 /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-ucodeintel
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
然后填入以下内容并删除多余的内容
1 archlinux UUID=<lsblk 显示的 root 分区磁盘的 UUID> none
生成启动镜像
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
更换新默认
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
使用 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"
重新生成
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





















