前言

终于还是入了 Arch 的坑
之前一直想懒,不想搞 Arch,但最近遇到软件包不够新,apt -t experimental install 不仔细看把系统关键包卸了,直接炸了,修不了一点,其实也不用修反正我有快照,但是软件版本没解决,所以气急败坏之下终于决定开始搞 Arch
Linux 入门快四年,算是水到渠成吧。有之前的基础,第一遍从零开始安装大半个下午就搞定了,但后面的复盘和延伸,吭哧吭哧搞了好久

安装

虚拟机安装

  1. 使用 VMware,记得在高级选项中打开 UEFI 引导(VMware 只有 Windows 虚拟机可以开安全启动,但暂时先别考虑安全启动,除非你想折腾)

  2. 搜几个好点的教程一步步安装,不要用 archinstall-2.7.2-1,byd总是报错,而且虽然 archinstall 有中文翻译,但在安装的 tty 界面里默认显示为乱码

分区和格式化

前面的一些流程,对我来说比较固定,没什么特别要注意的,当然你可以用自己的编辑器、分区工具、分区方案,任凭君意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nano /etc/pacman.d/mirrorlist

lsblk
fdisk /dev/nvme0n1
g
n
[Enter]
[Enter]
+512M
t
1
n
[Enter]
[Enter]
[Enter]
t
[Enter]
23
p
w

mkfs.fat -F 32 /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p2

参考
https://blog.yoitsu.moe/arch-linux/installing_arch_linux_for_complete_newbies.html
https://zhuanlan.zhihu.com/p/596227524

修改 ESP 的挂载权限

后面 bootctl install 会有警告

! Mount point ‘/boot’ which backs the random seed file is world accessible, which is a security hole! !
! Random seed file ‘/boot/loader/random-seed’ is world accessible, which is a security hole! !

所以这里提前处理一下

1
2
mount /dev/nvme0n1p2 /mnt
mount --mkdir -o fmask=0137,dmask=0027 /dev/nvme0n1p1 /mnt/boot

这里用挂载参数修改了挂载权限,可以防止等会报警告。因为是 fat32 所以 chmod 没用,所以要在挂载时就改
再安装基本系统

1
pacstrap -K /mnt base linux linux-firmware

但是等会装完进系统 /boot 的 umask 还是 0022,所以把生成的 fstab 也修改一下

1
genfstab -U /mnt | sed -e 's/fmask=0022/fmask=0137/g' -e 's/dmask=0022/dmask=0027/g' >> /mnt/etc/fstab

参考
https://bbs.archlinux.org/viewtopic.php?pid=2113977#p2113977
https://discourse.nixos.org/t/nixos-install-with-custom-flake-results-in-boot-being-world-accessible/34555
https://gist.github.com/orhun/02102b3af3acfdaf9a5a2164bea7c3d6?permalink_comment_id=4755423#gistcomment-4755423
https://github.com/NixOS/nixpkgs/issues/279362#issuecomment-1883970541
https://forum.endeavouros.com/t/bootctl-install-outputs-some-warnings-about-efi-mount-point-and-random-seed-file-in-the-terminal/43991/8

进入系统

好的现在装完基础软件包了,可以进去了

1
arch-chroot /mnt

时区和本地化

1
2
3
4
5
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
nano /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" >> /etc/locale.conf

配置一个主机名

1
echo "yourhostname" >> /etc/hostname

账户管理

不要忘了设置 root 密码,不然会被锁在系统外面!

1
passwd

添加日常管理员账户(建议重启后安装了 sudo 再加)

1
2
useradd -m -G wheel -u 1000 archie
passwd archie

安装 systemd-boot 到 ESP

这里的 ESP 就是 /boot 或者 /efi

1
# bootctl install

理论上这样就可以了,中文教程里经常出现的

1
# bootctl install --path=/boot

我甚至在 bootctl(1) 里都找不到,只有 --esp-path= --boot-path= --root=
找到了,--path--esp-path= 的向后兼容参数,fbf45d2

再写三个 systemd-boot 的配置文件

1
2
3
4
5
# blkid /dev/nvme0n1p2
/dev/nvme0n1p2: UUID="8c8f9ce0-a7d8-42c6-a571-45fac8753e37" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="d16c5367-0896-40ce-a52a-88bd640baae8"

# blkid -s PARTUUID -o value /dev/nvme0n1p2
d16c5367-0896-40ce-a52a-88bd640baae8

看清楚是 UUID 还是 PARTUUID,弄错了可是进不去系统的哦(我为什么会知道)

1
2
3
cp /usr/share/systemd/bootctl/arch.conf /boot/loader/entries/
cp /usr/share/systemd/bootctl/arch.conf /boot/loader/entries/arch-fallback.conf
nano /boot/loader/entries/arch.conf

配置文件内容

1
2
3
4
5
6
7
8
9
## This is just an example config file.
## Please edit the paths and kernel parameters according to your system.

title Arch Linux
linux /vmlinuz-linux
+ initrd /amd-ucode.img
initrd /initramfs-linux.img
- options root=PARTUUID=XXXX rootfstype=XXXX add_efi_memmap
+ options root=PARTUUID=d16c5367-0896-40ce-a52a-88bd640baae8 rw rootfstype=ext4 add_efi_memmap

使用 initrd 选项在初始 initramfs 之前加载微代码
必须在单独的 initrd 中指定,并且始终放在主 initramfs 映像之前
安装 amd-ucode 会自动安装微代码到 /boot/amd-ucode.img,intel 同理
但是虚拟机不需要安装 microcode(也无法加载)
再写一个 fallback 引导,在默认 Boot Loader 进不去的时候可以尝试后备加载

1
nano /boot/loader/entries/arch-fallback.conf

配置文件内容

1
2
3
4
5
title   Arch Linux (fallback initramfs)
linux /vmlinuz-linux
initrd /amd-ucode.img
initrd /initramfs-linux-fallback.img
options root=PARTUUID=d16c5367-0896-40ce-a52a-88bd640baae8 rw rootfstype=ext4 add_efi_memmap

最后一个

1
nano /boot/loader/loader.conf

配置文件内容

1
2
3
4
5
6
- #timeout 3
- #console-mode keep
+ default arch.conf
+ timeout 3
+ console-mode max
+ editor no

参考
https://blog.yoitsu.moe/arch-linux/using_systemd_boot.html
https://archguide.cn/p/20210607/30-install-and-use-systemd-boot.html
https://zhuanlan.zhihu.com/p/656680599
https://ivonblog.com/posts/replace-grub-with-systemd-boot/
https://zhangjk98.xyz/systemd-boot/
https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

联网

我选择 systemd-networkd + systemd-resolved
但这时候还没有 /run 目录,这一部分也可以等到重启进入系统再做

1
2
3
4
5
6
7
8
9
# /etc/hosts
# 从 Debian 12 抄来的
127.0.0.1 localhost
127.0.1.1 hostname

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

下面进行网络配置

1
2
3
4
5
6
7
# /etc/systemd/network/20-wired.network
# 这就是一个虚拟机有线网络的最小配置,真的很简洁
[Match]
Name=ens32

[Network]
DHCP=ipv4

如果想打开 mDNS,打开 IPv6 无状态地址,关闭 LLMNR

1
2
3
4
5
6
7
8
9
10
11
[Match]
Name=ens32

[Network]
DHCP=ipv4
+ LLMNR=no
+ MulticastDNS=yes
+ IPv6PrivacyExtensions=yes

+ [Link]
+ Multicast=yes

/etc/systemd/resolved.conf 对应默认空配置

1
2
3
# 可以编辑但不推荐

[Resolve]

/run/systemd/resolve/stub-resolv.conf 对应 stub 模式(文档推荐的模式)
想设置不同的模式就创建对应的符号链接

1
ln -sf ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
1
2
3
4
5
# 由 systemd-resolved 管理,不要编辑

nameserver 127.0.0.53
options edns0 trust-ad
search .

/usr/lib/systemd/resolv.conf 对应 static 模式

1
2
3
4
5
# 由 systemd-resolved 管理,不要编辑

nameserver 127.0.0.53
options edns0 trust-ad
search .

/run/systemd/resolve/resolv.conf 对应 uplink 模式

1
2
3
4
# 由 systemd-resolved 管理,不要编辑

nameserver 192.168.138.2
search .

如果什么都不链接就是默认的 foreign 模式,此时 systemd-resolved 将读取 /etc/resolv.conf 以获取 DNS 配置数据

如果想自定义 DNS
/etc/systemd/resolved.conf.d/dns_servers.conf

1
2
3
[Resolve]
DNS=1.1.1.1 2606:4700:4700::1111
Domains=~.

后备 DNS
/etc/systemd/resolved.conf.d/fallback_dns.conf

1
2
[Resolve]
FallbackDNS=127.0.0.1 ::1

使用加密的 DoT
/etc/systemd/resolved.conf.d/dns_over_tls.conf

1
2
3
[Resolve]
DNS=1.1.1.1#貌似不支持域名,或许是我没配 fallback
DNSOverTLS=yes

如果想禁用 LLMNR,这里的才是全局设置,而 systemd-networkd 维护每个链接的 LLMNR,如果要禁用,记得两边一起关闭
/etc/systemd/resolved.conf.d/disable_multicast.conf

1
2
[Resolve]
LLMNR=no

参考
https://wiki.archlinux.org/title/Systemd-networkd
https://wiki.archlinux.org/title/systemd-resolved
https://man.archlinux.org/man/systemd.network.5
https://man.archlinux.org/man/systemd-resolved.8
https://man.archlinux.org/man/networkd.conf.5
https://man.archlinux.org/man/resolved.conf.5
https://xuanwo.io/2019/06/13/switch-to-systemd-networkd/

软件包

进系统后安装一些有用的软件包,这里只记录一些基础的实用软件
我安装的是 linux-lts,降低更新出问题的概率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ pacman -Qe | rg -o '^\S+'
$ pacman -Qe | grep -o '^[a-zA-Z0-9.-]\+'
archlinuxcn-keyring
base
bat
bind
fd
fzf
git
htop
linux-firmware
linux-lts
lsd
lsof
nano
neofetch
openssh
python
ripgrep
sd
sudo
tmux
yay

基础配置

编辑 sudo

1
EDITOR=nano visudo

顺便再把几个全局配置文件的修改项记录一下,至于用户配置 dotfiles 则用 git 管理

1
2
3
/etc/sudoers
+ Defaults editor=/usr/bin/rnano, !env_editor
+ %wheel ALL=(ALL:ALL) NOPASSWD: ALL
1
2
3
/etc/pacman.conf
+ Color
+ VerbosePkgLists

软件源

pacman

倒没什么要记录的,几个常用的就是安装卸载查询,大部分时候可以用 yay 兼容替代

aur

需要设置代理,可以解决大多数网络问题
如果是 VMware 虚拟机,最简单的方法就是宿主局域网共享代理
放在 .bashrc 里面

1
2
export HTTPS_PROXY=http://192.168.138.1:1080
export HTTP_PROXY=http://192.168.138.1:1080

或者用 proxychains-ng 代理链
需要注意的是 yay go 静态编译无法使用 proxychains,需要使用 gcc-go 编译以链接 libc(不是很想用 gcc-go,感觉性能会差)
或者

1
alias yay='https_proxy=socks5://127.0.0.1:1080 http_proxy=socks5://127.0.0.1:1080 yay'

参考
https://github.com/Jguer/yay/issues/951

archlinuxcn

作为自定义源,可以提供一些便利的二进制包,避免老从 aur 安装(也防止编译不过)