注意:本文仅针对我本人使用的真实机器,如果参考本文请谨慎。
注意:命令行中带有 ! 的地方可能表示变量,可能需要将值更改为实际情况。
安装前 #
准备安装介质 & 启动实时环境 #
官方安装映像不支持安全启动,需要禁用安全启动才能启动安装介质。
我们使用ISO,启动后选择 Arch Linux install medium 并按 Enter 进入安装环境。
设置控制台字体 #
控制台字体位于 /usr/share/kbd/consolefonts/ 中,可以使用 setfont 进行字体设置:
# setfont ter-132b
验证启动模式 #
# cat /sys/firmware/efi/fw_platform_size
如果系统以 UEFI 模式启动,并具有64位 UEFI ,命令返回64。
连接到互联网 #
对于 Wi-Fi ,使用 iwctl 进行连接:
$ iwctl
[iwd]# device list
[iwd]# station !name scan
[iwd]# station !name get-networks
[iwd]# station !name connect !SSID
[iwd]# quit
使用 ping 验证连接:
# ping ping.archlinux.org
更新系统时钟 #
在实时环境中,一旦建立互联网连接,时间将自动同步。
使用 timedatectl 确保系统时钟同步:
# timedatectl
对磁盘分区 & 格式化 & 加密( LUKS 上的 LVM 方案) #
磁盘布局为:
+-----------------------------------------------------------------------+ +----------------+
| Logical volume 1 | Logical volume 2 | Logical volume 3 | | Boot partition |
| | | | | |
| [SWAP] | / | /home | | /boot |
| | | | | |
| /dev/MyVolGroup/swap | /dev/MyVolGroup/root | /dev/MyVolGroup/home | | |
|_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _| | (may be on |
| | | other device) |
| LUKS encrypted partition | | |
| /dev/sda1 | | /dev/sdb1 |
+-----------------------------------------------------------------------+ +----------------+
识别磁盘设备:
# fdisk -l
以 rom ,loop 或 airootfs 结尾的可以忽略。 mmcblk* 设备以 rpbm ,boot0 和 boot1 结尾的可以忽略。
准备驱动器 #
注意:如果驱动器持续的作为加密设备,则不需要擦除相关的步骤
分区之前,请检查驱动器是否使用最佳逻辑扇区大小:
使用 blkdiscard 擦除卷:
# blkdiscard --secure /dev/!device
如果不支持安全擦除,使用 -z 或 --zeroout 选项用 0 填充设备(或者不使用选项?后面还会擦除设备)。
要检查 NVMe 驱动器的逻辑块地址大小,可以使用 nvme-cli 程序:
# nvme id-ns -H /dev/!nvme0n1 | grep "Relative Performance"
-----------------------------------------------------------
LBA Format 0 : Metadata Size: 0 bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good (in use)
LBA Format 1 : Metadata Size: 0 bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better
Metadata Size 最好选择值为 0 的格式( linux 不支持此功能)。
要更改逻辑块大小,使用 nvme format 并带有 --lbaf 参数以指定首选值:
# nvme format --lbaf=1 /dev/!nvme0n1
-----------------------------------------------------------
You are about to format nvme0n1, namespace 0x1.
WARNING: Format may irrevocably delete this device's data.
You have 10 seconds to press Ctrl-C to cancel this operation.
Use the force [--force] option to suppress this warning.
Sending format operation ...
Success formatting namespace:1
接下来擦除和准备驱动器:
Tip:在继续操作之前,请检查您的高级格式化驱动器是否使用了最佳逻辑扇区大小。Cryptsetup 强烈建议将驱动器的逻辑扇区大小更改为 4096 字节,以获得最佳加密性能。
首先,在要加密的分区(使用形式 sdXY )或完整设备(使用形式 sdX)上创建一个临时加密容器:
# cryptsetup open --type plain --key-file /dev/urandom --sector-size 4096 /dev/!block-device to_be_wiped
您可以验证是否存在:
# lsblk
---------------------------------------------------
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
└─to_be_wiped 252:0 0 1.8T 0 crypt
用 0 擦除容器:
# dd if=/dev/zero of=/dev/mapper/to_be_wiped status=progress bs=1M
--------------------------------------------------------------------
dd: writing to ‘/dev/mapper/to_be_wiped’: No space left on device
最后关闭临时容器:
# cryptsetup close to_be_wiped
分区 #
所选设备需要以下分区:
- 一个分区用于根目录
/ - 为了以 UEFI 模式启动: EFI 系统分区
使用 fdisk 修改分区表, 例如:
# fdisk /dev/!the_disk_to_be_partitioned
首先用 fdisk 创建一个挂载到 /boot 的分区,大小为 1GB 或更大。然后使用剩余空间创建之后将包含加密容器的分区。
接下来创建加密容器:
# cryptsetup luksFormat /dev/sda1
打开容器:
# cryptsetup open /dev/sda1 cryptlvm
解密的容器在 /dev/mapper/cryptlvm 上有效。
在打开的 LUKS 容器上创建一个物理卷
# pvcreate /dev/mapper/cryptlvm
创建一个卷组(在本例中为 MyVolGroup ,但您可以根据需要命名),并将之前创建的物理卷添加到其中。
# vgcreate MyVolGroup /dev/mapper/cryptlvm
在卷组上创建逻辑卷:
注意:如果要使用 ext4 格式化逻辑卷,请在卷组中至少留出 256MiB 的可用空间,在使用
-l 100%FREE创建最后一个卷后,使用lvreduce -L -256M MyVolGroup/home来减少大小。
# lvcreate -L 4G -n swap MyVolGroup
# lvcreate -L 32G -n root MyVolGroup
# lvcreate -l 100%FREE -n home MyVolGroup
# lvreduce -L -256M MyVolGroup/home # for ext4 format
格式化逻辑卷上的文件系统,这里我们选择使用 ext4 :
# mkfs.ext4 /dev/MyVolGroup/root
# mkfs.ext4 /dev/MyVolGroup/home
# mkswap /dev/MyVolGroup/swap
挂载文件系统:
# mount /dev/MyVolGroup/root /mnt
# mount --mkdir /dev/MyVolGroup/home /mnt/home
# swapon /dev/MyVolGroup/swap
Btrfs #
注意:此小节的分区不涉及 EFI 分区和交换分区,需要单独为它们考虑 如果使用 btrfs ,没必要创建这么多逻辑卷,只需创建很少的逻辑卷即可:
# mkfs.btrfs -L !mylabel /dev/MyVolGroup/!partition # File system on a single device
# mkswap /dev/MyVolGroup/swap
接下来创建并挂载子卷,以下是一个示例:
# mount !device /mnt/ -o subvolid=5,compress=zstd
# btrfs subvolume create /mnt/subvol_root/
# btrfs subvolume create /mnt/subvol_home/
# umount /mnt/
# mount -o subvol=/subvol_root,compress=zstd !device /mnt/
# mount -o subvol=/subvol_home,compress=zstd --mkdir !device /mnt/home/
# swapon /dev/MyVolGroup/swap
Snapper 建议的文件系统布局:

subvolid=5
|
├── @ -|
| contained directories:
| ├── /usr
| ├── /bin
| ├── /.snapshots
| ├── ...
|
├── @home
├── @snapshots
├── @var_log
└── @...
注意:如果创建 @snapshots 卷并挂载到 .snapshots , 在使用 btrfs-assistant 时会出现无法创建
/的配置文件的问题,所以应可以不需创建 @snapshots 卷。
准备启动分区 #
之前已经创建了启动分区,现在将其格式化:
# mkfs.fat -F 32 /dev/sdb1
警告:仅当您在分区步骤中创建了 EFI 系统分区时才需要对其进行格式化。如果磁盘上之前已经存在 EFI 系统分区,重新格式化该分区可能会破坏其他已安装操作系统的引导加载程序。
将分区挂载到 /mnt/boot :
# mount --mkdir /dev/sdb1 /mnt/boot
安装 #
选择镜像 #
我们使用 reflector 获取镜像,根据自己喜好编辑 /etc/xdg/reflector/reflector.conf ,然后运行:
# systemd start reflector
reflector 示例:
reflector --country France,Germany --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist
上面示例将位于德国、法国的最近 12 小时同步的 https 镜像源按速度排序。
要想查看获取的镜像源:
# cat /etc/pacman.d/mirrorlist
安装必要的软件包 #
# pacstrap -K /mnt base linux linux-firmware lvm2 btrfs-progs vi vim intel-ucode networkmanager base-devel reflector bash-completion zsh less
配置系统 #
Fatab #
生成 fstab 文件:
# genfstab -U /mnt >> /mnt/etc/fstab
检查生成的 /mnt/etc/fstab 文件。
Chroot #
# arch-chroot /mnt
时间 #
设置时区:
# ln -sf /usr/share/zoneinfo/!Region/!City /etc/localtime
# hwclock --systohc
启用/启动 systemd-timesyncd.service 。
本土化 #
编辑 /etc/locale.gen 并取消注释 en_US.UTF-8 UTF-8 以及其他所需的 UTF-8 语言环境。运行以下命令生成语言环境:
# locale-gen
创建 locale.conf 文件,并相应地设置 LANG 变量:
/etc/locale.conf
-----------------
LANG=en_US.UTF-8
网络配置 #
创建主机名文件:
/etc/hostname
----------------
!yourhostname
注意:只能使用小写字母和
-,并且-不能在开头
Initramfs #
将 keyboard, sd-encrypt 和 lvm2 钩子添加到 /etc/mkinitcpio.conf (注意钩子间顺序和位置,如下):
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)
重新生成 initramfs :
# mkinitcpio -P
root密码 #
设置 root 密码:
# passwd
引导加载程序 #
我们使用 GRUB 。
首先,安装 grub 和 efibootmgr 软件包:
# pacman -S grub efibootmgr
执行以下命令将 GRUB EFI 应用程序 grubx64.efi 安装到 esp/EFI/GRUB/ 并将其模块安装到 /boot/grub/x86_64-efi/ :
# grub-install --target=x86_64-efi --efi-directory=!esp --bootloader-id=GRUB
esp 为你的 EFI 分区挂载点。
对于加密分区,还要添加以下内核参数:
rd.luks.name=device-UUID=cryptlvm root=/dev/MyVolGroup/root
device-UUID 在本例中指的是 /dev/sda1 (即加密分区)的 UUID ,使用 lsblk -f >> uuid.txt 命令在 uuid.txt 中查看并复制。
注意:所有 rd.luks 参数可以多次指定,以解锁多个 LUKS 加密卷
要在 GRUB 上添加内核参数,编辑 /etc/default/grub 并将内核参数附加到 GRUB_CMDLINE_LINUX_DEFAULT 行的引号之间。
使用以下命令生成主配置文件:
# grub-mkconfig -o /boot/grub/grub.cfg
重启 #
# exit
# umount -R /mnt
# reboot
移除安装介质,然后使用 root 账户登陆新系统。
安装后 #
连接网络 #
启用并启动 NetworkManager.service 。
使用 nmcli 连接 Wi-Fi 网络:
$ nmcli device wifi list
$ nmcli device wifi connect !SSID_or_BSSID password !password
添加用户 #
# useradd -m !archie
# passwd !archie
安全 #
使用 sudo #
# visudo
拒绝 root SSH 登录 #
/etc/ssh/sshd_config.d/20-deny_root.conf
-----------------------------------------
PermitRootLogin no
防火墙 #
安装 firewalld 包。
# pacman -S firewalld
启用并启动 firewalld.service 。
锁定 BIOS #
在 BIOS 中添加密码。
Clamav #
安装 clamav 包。
更新数据库:
# freshclam
测试:
$ curl https://secure.eicar.org/eicar.com.txt | clamscan -
输出结果必须包含:
stdin: Win.Test.EICAR_HDB-1 FOUND
扫描病毒(分别扫描特定文件、用户主目录、整个系统):
$ clamscan myfile
$ clamscan --recursive --infected /home/archie
# clamscan --recursive --infected --exclude-dir='^/sys|^/dev' /
您可能还需要扫描更大的文件。在这种情况下,请在 clamscan 命令后添加 –max-filesize=4000M 和 –max-scansize=4000M 选项。“4000M” 是最大值,可以根据需要降低该值。
实际使用来看,应该是 2GiB
使用 -l /path/to/file 选项 clamscan 会将日志打印到文本文件中,以便查找已报告的感染病例。
Clamav 扫描整个系统所耗费时间较长,大概是2小时以上
系统维护 #
# pacman -S rebuild-detector archlinux-contrib
为 pacdiff , checkrebuild , checkupdates , checkservices 。
另外还可以配置 reflector ,参考 reflector 示例。
图形界面 #
现在,使用自己创建的账户进行登录,我们不再使用 root 账户。
显示驱动程序 #
# pacman -S mesa vulkan-intel
SDDM #
安装 sddm 包,启用 sddm.service,这应该可以直接启用。
安装 weston 以启用 wayland 支持,在 /etc/sddm.conf.d/ 下创建一个配置文件,给它起一个有意义的名字并添加以下内容:
/etc/sddm.conf.d/wayland.conf
----------------------------------
[General]
DisplayServer=wayland
桌面环境 #
我目前并没有使用完整的桌面环境,如果考虑使用完整的桌面环境,可以考虑 gnome, kde, xfce4 等。
dotfiles #
由于之前我使用的一个用户的点文件仓库已经不再使用 Hyprland ,因此我自己私下创建了一个仓库,通过修改1amSimp1e/dots这个仓库的配置文件以适应最新的 Hyprland 版本,目前我不再依赖其他人的点文件。
其他的图形软件 #
- 浏览器:firefox firefox-i18n-zh-cn chromium
- 文件管理器:thunar gvfs file-roller thunar-archive-plugin thunar-media-tags-plugin thunar-volman tumbler ffmpegthumbnailer
- 密码管理器:keepassxc
- 备份:rclone restic
- gnome 系列:gnome-firmware gnome-disk-utility gnome-system-monitor eog baobab
- 音乐:spotify-launcher
- 输入法:fcitx5-im fcitx5-chinese-addons fcitx5-pinyin-zhwiki fcitx5-nord
- 录屏:obs-studio
- email: thunderbird thunderbird-i18n-zh-cn
- 通讯:telegram-desktop
- 播放器:vlc vlc-plugins-all
- 图片编辑:drawing
- Btrfs 相关:btrfs-assistant snapper btrfsmaintenance
- 其他工具:yt-dlp hugo git qbittorrent foliate helix code
fcitx5 #
主要描述一些环境变量的设置(wayland)。
有以下环境变量(全局):
QT_IM_MODULE=fcitx
QT_IM_MODULES="wayland;fcitx;ibus"
XMODIFIERS=@im=fcitx
对于 GTK2,将以下内容添加到 ~/.gtkrc-2.0 :
gtk-im-module="fcitx"
对于 GTK3,将以下内容添加到 ~/.config/gtk-3.0/settings.ini :
[Settings]
gtk-im-module=fcitx
对于 GTK4,将以下内容添加到 ~/.config/gtk-4.0/settings.ini :
[Settings]
gtk-im-module=fcitx
电源管理 #
注意:如果系统安装了桌面环境或者自己组装的桌面里有考虑到电源管理的情况,可以不需要看这一节
tlp #
安装 tlp 包。
启用/启动 tlp.service 。
还应该屏蔽 (mask) 服务 systemd-rfkill.service 和套接字 systemd-rfkill.socket 。
CPU 调频 #
安装 cpupower 包。
cpupower 的配置文件位于 /etc/default/cpupower ,请根据设备情况进行编辑。
启用/启动 cpupower.service 。
存档和压缩 #
安装 7zip 和 unzip 包。
蓝牙 #
如果系统没有完整的桌面环境(例如 GNOME ),可以:
安装 bluez 和 bluez-utils 包。
如果你所使用的桌面没有相关界面,可以安装 blueman 包。
启用/启动 bluetooth.service 。
Windows 兼容性相关 #
安装 ntfs-3g 包。
创建自己的软件仓库 #
参考:
- https://wiki.archlinux.org/title/Makepkg#Configuration
- https://wiki.archlinux.org/title/Makepkg#Disable_debug_packages_and_LTO
- https://wiki.archlinux.org/title/Pacman/Package_signing
- https://wiki.archlinux.org/title/Pacman/Tips_and_tricks#Custom_local_repository
配置 makepkg #
系统配置可在 /etc/makepkg.conf 中找到。
设置 PACKAGER 打包者信息。
注意:使用
pkg build构建包时,目前表现来看会根据上述配置文件进行打包,这好像与 ArchWiki 上的描述不符。
在干净的 chroot 环境里构建(需要安装 devtools 包):
pkgctl build [-c] [-I ~/packages/foobar/foobar-2-1-any.pkg.tar.zst]
-c参数会重置 chroot 矩阵,这在 chroot 环境出现故障时非常有用。但在干净的 chroot 环境中构建时则不需要此参数。
-I参数将软件包安装到 chroot 的工作副本中。
删除 chroot 环境只需删除 chroot 目录(在 /var/lib/archbuild 里)及其对应的 .lock 文件即可。
对生成的软件包进行签名:
gpg --local-user "USER ID" --detach-sign foobar-2-1-any.pkg.tar.zst
创建本地仓库 #
注意:使用 rclone 同步到远程仓库时应该需要添加
--copy-links标志
创建本地仓库目录:
$ mkdir repo
使用 repo-add 脚本为个人仓库生成数据库,软件包数据库是一个 tar 文件,可以压缩。有效的扩展名是 .db 或 .files ,后跟存档扩展名 .tar、.tar.gz、.tar.bz2、.tar.xz、.tar.zst 或 .tar.Z。
要向数据库添加新包,或替换数据库中现有包的旧版本,请运行:
$ repo-add --verify --sign --key keyid /path/to/repo.db.tar.zst /path/to/package-1.0-1-x86_64.pkg.tar.zst
使用 repo-add 时,数据库和软件包不需要位于同一目录中,但请记住,使用 pacman 时,数据库和软件包应该放在一起。
注意:如果软件使用了签名,需要将生成的签名文件连同软件包一并加入到仓库目录中。
将所有要包含在仓库中的构建软件包存储在一个目录中,还允许使用 shell 全局扩展一次性添加或更新多个软件包:
$ repo-add --verify --sign --key keyid /path/to/repo.db.tar.zst /path/to/*.pkg.tar.zst
警告:repo-add 会按照命令行传入的顺序将条目添加到数据库中。如果涉及同一软件包的多个版本,则必须小心确保最后添加正确的版本。
repo-remove 用于从软件包数据库中删除软件包,但命令行上仅指定软件包名称:
$ repo-remove --verify --sign --key keyid /path/to/repo.db.tar.zst pkgname
完成本地存储库数据后,将存储库添加到 pacman.conf 中,自定义存储库示例也位于 pacman.conf 中,存储库名称是数据库名,省略了文件拓展名,在上述示例中,存储库名称为 repo,可以使用 URL 或 HTTP 引用存储库位置。
一般来说,启用了签名后只需要指明仓库链接即可。
添加非官方密钥 #
即是添加自己的密钥,首先获取密钥ID,如果提供了密钥文件的链接,请下载它然后运行:
# pacman-key --add /path/to/downloaded/keyfile
建议验证指纹:
$ pacman-key --finger keyid
最后,在本地对导入的密钥进行签名:
# pacman-key --lsign-key keyid