注意:本文仅针对我本人使用的真实机器,如果参考本文请谨慎。
注意:命令行中带有 ! 的地方可能表示变量,可能需要将值更改为实际情况。
安装前 #
准备安装介质 & 启动实时环境 #
官方安装映像不支持安全启动,需要禁用安全启动才能启动安装介质。
我们使用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 方案) #
注意:在下文中,所提到的 EFI 系统分区的挂载点都可以为 /efi(即不用 boot 挂载),对于仅使用 UKI 的话。
磁盘布局为:
+-----------------------------------------------------------------------+ +----------------+
| 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 BetterMetadata 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分区 #
在开始之前,或许可以查看设备的 TRIM 支持:
$ lsblk --discard检查 DISC-GRAN(丢弃粒度)和 DISC-MAX(丢弃最大字节数)列的值。非零值表示支持 TRIM 指令。
所选设备需要以下分区:
- 一个分区用于根目录
/ - 为了以 UEFI 模式启动: EFI 系统分区
使用 fdisk 修改分区表, 例如:
# fdisk /dev/!the_disk_to_be_partitioned首先用 fdisk 创建一个挂载到 /boot 的分区,大小为 1GB 或更大。然后使用剩余空间创建之后将包含加密容器的分区。
接下来创建加密容器:
# cryptsetup luksFormat /dev/sda1打开容器:
# cryptsetup --allow-discards --perf-no_read_workqueue --perf-no_write_workqueue --persistent open /dev/sda1 cryptlvm如果为了更高的安全性,不要添加第一个选项
第二和第三个选项是为了 SSD
可以通过查看 cryptsetup luksDump 输出来确认该标志是否已在 LUKS2 标头中持续设置:
# cryptsetup luksDump /dev/sdaX | grep Flags
--------------------------------------------
Flags: allow-discards解密的容器在 /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/swapBtrfs #
注意:此小节的分区不涉及 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,discard=async,noatime
# btrfs subvolume create /mnt/subvol_root/
# btrfs subvolume create /mnt/subvol_home/
# umount /mnt/
# mount -o subvol=/subvol_root,compress=zstd,discard=async,noatime !device /mnt/
# mount -o subvol=/subvol_home,compress=zstd,discard=async,noatime --mkdir !device /mnt/home/
# swapon /dev/MyVolGroup/swapNote:大多数挂载选项适用于整个文件系统,只有第一个挂载的子卷的选项才会生效。这是由于尚未实现,将来可能会有所改变。
Snapper 建议的文件系统布局:

subvolid=5
|
├── @ -|
| contained directories:
| ├── /usr
| ├── /bin
| ├── /.snapshots
| ├── ...
|
├── @home
├── @snapshots
├── @var_log
└── @...注意:如果创建 @snapshots 卷并挂载到 .snapshots , 在使用 btrfs-assistant 时会出现问题,可以不用创建 @snapshot 卷,或者进行额外的操作,创建 @snapshot 卷并挂载到 .snapshot 的好处是快照卷可以与 @ 卷分离,甚至可以在另一个磁盘上。
准备启动分区 #
之前已经创建了启动分区,现在将其格式化:
# mkfs.fat -F 32 /dev/sdb1警告:仅当您在分区步骤中创建了 EFI 系统分区时才需要对其进行格式化。如果磁盘上之前已经存在 EFI 系统分区,重新格式化该分区可能会破坏其他已安装操作系统的引导加载程序。
将分区挂载到 /mnt/boot :
# mount -o fmask=0077,dmask=0077 --mkdir /dev/sdb1 /mnt/boot额外添加的挂载选项解决此问题:https://bbs.archlinux.org/viewtopic.php?id=287695
安装 #
选择镜像 #
我们使用 reflector 获取镜像,根据自己喜好编辑 /etc/xdg/reflector/reflector.conf ,然后运行:
# systemd start reflectorreflector 示例:
reflector --country France,Germany --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist上面示例将位于德国、法国的最近 12 小时同步的 https 镜像源按速度排序。(不用 --age 选项默认会选择最近同步的镜像)
离中国大陆较近的代码:
- China
- Hong Kong
- Japan
- South Korea
- Singapore
提示:仅使用单一国家镜像往往不合适。
要想查看获取的镜像源:
# cat /etc/pacman.d/mirrorlist安装必要的软件包 #
注意:在运行安装命令前,可以先看下内核日志有没有有关网络相关的大量奇怪日志,与这里有关
# pacstrap -K /mnt base linux linux-firmware lvm2 btrfs-progs ex-vi-compat vim helix intel-ucode networkmanager base-devel reflector bash-completion zsh less配置系统 #
Fatab #
生成 fstab 文件:
# genfstab -U /mnt >> /mnt/etc/fstab检查生成的 /mnt/etc/fstab 文件。
如果要启用 Swap 分区的 TRIM,在 fstab 的 swap 条目里添加 discard=once 选项。
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 变量:
LANG=en_US.UTF-8网络配置 #
创建主机名文件:
!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)如果你没有使用非美式控制台键盘映射或非默认控制台字体,可以去除 sd-vconsole 钩子。
重新生成 initramfs :
# mkinitcpio -Proot密码 #
设置 root 密码:
# passwd引导加载程序 #
我们使用 systemd-boot,并搭配 UKI 启动 。
UKI 构建见这篇文章。
对于加密分区,需要添加以下内核参数:
rd.luks.name=device-UUID=cryptlvm root=/dev/MyVolGroup/rootdevice-UUID 在本例中指的是 /dev/sda1 (即加密分区)的 UUID ,使用 lsblk -f >> uuid.txt 命令在 uuid.txt 中查看并复制。
注意:所有 rd.luks 参数可以多次指定,以解锁多个 LUKS 加密卷
systemd-boot #
bootctl 在 pid 命名空间中运行受限,先退出 chroot:
# exit重新进入 chroot:
# arch-chroot -S /mnt将 systemd-boot 安装到 ESP:
# bootctl install要完成安装,请配置 systemd-boot。
更新 systemd-boot:
- 手动:
# bootctl update- 自动:启用
systemd-boot-update.service
配置:
提示:更改配置后,运行 bootctl(不带任何参数)以确保 systemd-boot 能够正确解析它。
加载器配置,加载器配置存储在 esp/loader/loader.conf 中,下面提供了一个示例:
default arch.conf
timeout 4
console-mode max
editor no提示:
- default 可以设置为 UKI 文件名,或者设置为
@saved以记住上次选择的条目 - timeout 可以设置为 0,可以通过按空格来访问启动菜单
- 如果在选择启动项是,显示器显示不当,可以将 console-mode 设置为
auto或者keep
重启 #
# exit# umount -R /mnt# reboot移除安装介质,然后使用 root 账户登陆新系统。
安装后 #
或许你可以现在先配置快照,请见:https://nichijou.pages.dev/notes/snapper/
Btrfs #
CoW #
默认情况下 Btrfs 对所有文件始终使用写时复制(CoW)。
禁用 CoW #
警告:在 Btrfs 文件系统中禁用写时复制 (CoW) 也会禁用校验和。Btrfs 将无法检测到损坏的 nodatacow 文件。
对于频繁修改现有文件(尤其是大文件内部的随机写)的操作,禁用 CoW 是合适的,这里仅对单个文件/目录禁用 CoW:
$ chattr +C /dir/fileNote:当在目录上设置此属性时,所有新创建的文件都将继承此属性。由于实现上的限制,此标志只能在空文件上设置/取消设置。
Tip: 根据以上说明,您可以使用以下技巧禁用目录中现有文件的写时复制功能:
$ mv /path/to/dir /path/to/dir_old
$ mkdir /path/to/dir
$ chattr +C /path/to/dir
$ cp -a --reflink=never /path/to/dir_old/. /path/to/dir
$ rm -rf /path/to/dir_old请确保在此过程中不使用这些数据。
仍然还会触发 CoW 的情况 #
如果具有 NOCOW 属性 (+C) 的文件有多个引用(例如,通过使用 reflink 创建的副本或 Btrfs 创建的快照), 则仍会触发写时复制。
- 对复制的影响:
使用 cp Reflink 复制文件时,NOCOW 属性并非由源文件决定,而是由目标路径决定——目标路径要么继承自目录,要么取决于子卷是否使用 nodatacow 选项挂载。只有当源文件和目标文件都具有或不具有 NOCOW 属性时,才能进行 Reflink 复制。实际行为取决于 --reflink 选项,可能有三种结果:
- –reflink=auto(默认):如果 NOCOW 属性匹配,则使用 reflink;否则,进行深拷贝。
- –reflink(或 –reflink=always):如果 NOCOW 属性匹配,则使用 reflink;如果不同,则操作失败。
- –reflink=never:始终执行深度复制。
- 对快照的影响:
如果文件禁用了写时复制 (NOCOW),并且进行了快照,则快照后对文件块的首次写入将是写时复制 (COW) 操作,因为快照会锁定原有的文件块。但是,文件将保留 NOCOW 属性,并且对同一文件块的任何后续写入都将是原地写入,直到下一次快照。
频繁的快照会降低 NOCOW 的有效性,因为首次写入时仍然需要 COW。为了完全避免此类文件使用写时复制,请将它们放在单独的子卷中,并且不要对该子卷进行快照。
子卷管理 #
创建子卷:
# btrfs subvolume create /path/to/subvolumeNote:如果父目录不存在,您可以使用 --parents 选项自动创建父目录。
列出子卷:
# btrfs subvolume list -t path删除子卷:
# btrfs subvolume delete /path/to/subvolume如果子卷包含其他需要删除的子卷,请添加 -R/--recursive 选项。或者,也可以像删除常规目录一样删除子卷(rm -r,rmdir)。
警告:删除子卷之前,请确保该子卷未挂载。删除已挂载的子卷可能会导致文件系统不一致。
连接网络 #
启用并启动 NetworkManager.service 。
使用 nmcli 连接 Wi-Fi 网络:
$ nmcli device wifi list$ nmcli device wifi connect !SSID_or_BSSID password !passwordTRIM #
可以再次查看设备的 TRIM 支持:
$ lsblk --discard启用 fstrim.timer。
添加用户 #
# useradd -m !archie# passwd !archie安全 #
使用 sudo #
# visudo拒绝 root SSH 登录 #
PermitRootLogin no防火墙 #
安装 firewalld 和 firewall-config 包。
# 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 示例。
用户目录 #
安装 xdg-user-dirs 包。
图形界面 #
现在,使用自己创建的账户进行登录,我们不再使用 root 账户。
显示驱动程序 #
# pacman -S mesa vulkan-intel intel-media-driverSDDM #
安装 sddm 包,启用 sddm.service,这应该可以直接启用。
安装 weston 以启用 wayland 支持,在 /etc/sddm.conf.d/ 下创建一个配置文件,给它起一个有意义的名字并添加以下内容:
[General]
DisplayServer=wayland对于主题,我目前使用的是SlientSDDM,安装后替换当前主题并设置环境变量:
# Make sure these options are correct:
[General]
InputMethod=qtvirtualkeyboard
GreeterEnvironment=QML2_IMPORT_PATH=/usr/share/sddm/themes/silent/components/,QT_IM_MODULE=qtvirtualkeyboard
[Theme]
Current=silent最后,测试主题以确保一切正常运行:
cd /usr/share/sddm/themes/silent/
./test.sh更改预设主题配置:
预设主题位于 ./configs/,要更改当前配置,编辑 /usr/share/sddm/themes/silent/metadata.desktop 并替换 ConfigFile= 的值:
ConfigFile=configs/<your_preferred_config>.conf每次更改完主题后,请测试主题以保证一切正常运行。
更改用户头像:
cd /usr/share/sddm/themes/silent/
./change_avatar <username> <path_to_image_file>桌面环境 #
我目前并没有使用完整的桌面环境,如果考虑使用完整的桌面环境,可以考虑 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 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电源管理 #
我目前使用的桌面组件中考虑了电源管理情况,所以我不再需要关心此部分内容。
存档和压缩 #
安装 7zip 和 unzip 包。
蓝牙 #
如果系统没有完整的桌面环境(例如 GNOME ),可以:
安装 bluez 和 bluez-utils 包。
如果你所使用的桌面没有相关界面,可以安装 blueman 包。
启用/启动 bluetooth.service 。
Windows 兼容性相关 #
安装 ntfs-3g 包。
如需运行 windows 程序,可以考虑用 flatpak 安装 bottles 应用,实际体验下来能够运行部分应用,不过遇到了些问题和值得注意的地方:
- 输入法不能够使用(估计要用 flatseal 配下环境变量?)
- 在运行 Clannad 游戏全屏后鼠标偏移,但是运行 Localsend 倒是没问题(估计要开虚拟桌面?)
- 使用时应直接把执行文件相关的东西都放进 C 目录下,另外创建 bottles 时的目录应要保持默认?
删除映射的 Z 驱动器,以便不必要的映射主机系统目录?虽说我看 flatpak 设置的权限并没有开放文件系统权限,Z 盘中的映射文件看样子也只是主机上的一小部分。不过感觉还是删除 Z 驱动器并用自定义驱动器取代吧。先删除 Z 驱动器,然后再下载 cjkfonts 后会出现中文乱码,还是在程序内开启沙盒而不删 Z 驱动器?- 程序内开启专用沙盒?虽说 flatpak 有权限限制。
如果尝试运行 windows 程序无果的话,还是直接使用虚拟机吧。wine 之类的还是太吃操作了。
虚拟机 #
安装 qemu-full、libvirt、swtpm 以及 virt-manager 包。
要以普通用户身份使用,我们还需要进行配置。
将 UNIX 域套接字的所有权设置为 libvirt,并将 UNIX 套接字的权限设置为读写,具体操作如下:
...
unix_sock_group = 'libvirt'
...
unix_sock_rw_perms = '0770'
...将您的用户添加到 libvirt 用户组:
# gpasswd -a !user libvirt将您的用户添加到 /etc/libvirt/qemu.conf。否则,QEMU 在尝试访问本地驱动器时会显示权限被拒绝的错误:
搜索 user = "libvirt-qemu" 或 group = "libvirt-qemu",取消注释这两个条目,并将 libvirt-qemu 更改为您的用户名或 ID。编辑后,它应该看起来像下面这样:
# Some examples of valid values are:
#
# user = "qemu" # A user named "qemu"
# user = "+0" # Super user (uid=0)
# user = "100" # A user named "100" or a user with uid=100
#
user = "username"
# The group for QEMU processes run by the system instance. It can be
# specified in a similar way to user.
group = "username"打开 Virt-Manager 时,它将默认使用 QEMU 连接的系统变体(root),您需要自己添加用户会话连接,如果需要,可以断开并移除系统连接。
对于 3D 加速,勾选 OpenGL 和 Virtio 3D 加速。
遇到的问题 #
pacstrap 后出现“ERROR: file not found: /etc/vconsole.conf”
#
参考来源:
目前的解决方法:创建相关的空文件。
连接上 WIFI 后随着时间的增长网速变慢 #
参考来源:
通过此评论的方法解决:
[connection]
wifi.powersave = 2创建自己的软件仓库 #
参考:
- 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