ArchLinux 安装与配置
梦前要备床
在今年1月初,正逢固态价格较低的时候,我用¥578.98的价格买下了 SOLIDIGM P44 PRO 海力士固态硬盘,并另外购置了一个高端硬盘盒 DOCKCASE Type-C 3.2, 该硬盘盒附带屏幕,还具备断电保护,实际测试大约有5s的断电保护。
注意事项
含断电保护的硬盘盒一般在断电保护时会发生如下事情:
- 检测到断电,此时电容放电,然后为当前硬盘写入读写保护标志
- 在电容放电时间内更新FTL映射表
- 更新完成后在不到10%的电量下进行弹出硬盘操作(移除读写保护标志等)
- 电容放电完毕,停止一切操作
读写保护标志写入后,该盘会既无法读取,也无法写入任何数据,这意味着,当你关闭计算机时,PC断电后会立即触发硬盘盒断电保护的机制,如果在它未释放完所有电时启动计算机,此时硬盘仍处于读写保护状态,因此当计算机启动结束时用户会发现该盘无法读取/系统不识别该盘等类似问题。
入梦的开始
提前准备好 ArchLinux 的镜像之后,通过 Ventoy 把 TF 卡做成启动盘,将镜像放入之后, 用户可在此时考虑直接给盘划好分区,不管怎么说,图形化分区还是比命令行分区更友好方便。在保证 Secure Boot 【安全启动】处于关闭, 且启动方式为 UEFI 的情况下, 通过 BIOS 启动【Portable PC 一般按F12
即可自行选择启动项】镜像系统。一般安装镜像系统是无图形化界面的,会以终端的形式出现。
提示
【可选】执行sudo systemctl stop reflector.service
来禁用 reflector ,以避免镜像源筛选不准确的可能性,该事件存在一定的概率会发生。
【可选】如已遗忘 BIOS 启动方式是否为 UEFI 时,可执行ls /sys/firmware/efi/efivars
来查看,如若输出大量文字(EFI 变量),说明当前已在 UEFI 模式。
有线或无线联网
装机第一事,先连互联网。有线网络下插入网线即可【Portable PC可接入扩展坞后再接入网线】;无线网络下可使用 iwctl 接入,按照以下顺序依行键入命令:
iwctl # 执行iwctl命令,进入交互式命令行
device list # 列出设备名,一般无线网卡中会看到 wlan0
station wlan0 scan # 扫描可连接的所有无线网络
station wlan0 get-networks # 列出当前扫描到的所有无线网络
station wlan0 connect <YOUR-WIRELESS-NAME> # 进行连接,后面会提示键入密码
exit # 也可直接按 Ctrl + D 的热键退出 iwctl 程序,退出后可使用 ping 命令确认网络连接状态
提示
如果提示没有 iwctl 命令请先安装iwd
,并通过systemctl enable iwd
和systemctl start iwd
来启动。
如果你不能正常连接网络,首先确认系统已经启用网络接口:
ip link
ip link set wlan0 up
为保证网络正常连接,需要进行一次时间同步:
timedatectl set-ntp true # 将系统时间与网络时间进行同步
timedatectl status # 检查服务状态
硬盘分区
如果用户忘记在前面分区,这时还是可以直接进行分区的,首先执行lsblk
查看所有硬盘的分区情况,找出需要分区的盘【类似/dev/sdX
或者/dev/nvme0n1pX
,以实际情况为准】,然后执行parted /dev/xxxxxxx
进入程序。
一般情况下我们使用GPT分区表,进入程序后执行mktable
,这时会询问使用什么类型的分区表,键入gpt
即可,然后输入quit
退出。
接着执行cfdisk /dev/xxxxxxx
来为硬盘分区,划分好区并确认没问题之后,记得最后执行写入[w]
,cfdisk下面有提示。
【可选】键入fdisk -l
查看分区情况。
请留意一下分区类别
在使用fdisk -l
时请留意一下第一分区的 Type 是不是EFI System
,如果不是可以在cfdisk
中选中第一分区后在下方选择[Type]
,调整为EFI System
即可。
顺便给出我的分区情况:
Disk /dev/sda: 953.87 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: DSWC1P
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
Disklabel type: gpt
Disk identifier: C09E473C-91BF-49CF-A6E8-371D67B13335
Device Start End Sectors Size Type
/dev/sda1 4096 1052671 1048576 512M EFI System
/dev/sda2 1052672 630198271 629145600 300G Linux filesystem
/dev/sda3 630198272 1967132671 1336934400 629.5G Linux filesystem
/dev/sda4 1967132672 2000408575 33275904 23.9G Linux filesystem
说明
我另外分了约24G大小的分区,这个分区将被做成 Swap 分区。这种分区是用来缓解内存不足的问题,类似 Windows 的虚拟内存。事实上 Btrfs 文件系统允许使用 Swap 文件来代替 Swap 分区,不过仅能当作虚拟内存使用。而我划分成分区是为了支持系统休眠(Systemctl hibernate)的。
分好区后,就该接着进行格式化了,我个人倾向这样安排文件系统: EFI 分区使用 FAT32 文件系统,系统和数据要做物理隔离,系统分区和数据分区均使用 Btrfs 文件系统,最后剩下的这个分区则是 Swap 分区。
mkfs.vfat -L EFISYS /dev/xxxx1
mkfs.btrfs -m dup -d single -L SYSTEM /dev/xxxx2
mkfs.btrfs -m dup -d single -L DATA /dev/xxxx3
mkswap -L SWAP /dev/xxxx4
Btrfs
为了利用 Btrfs 的特性,需要先挂载一下然后创建子卷。挂载时可以开启透明压缩,执行命令mount -t btrfs -o compress=zstd /dev/xxxx2 /mnt
。
可以使用df -h
来确认挂载情况。
然后创建 Btrfs 子卷,执行:
btrfs subvolume create /mnt/@ # 创建 / 目录子卷
btrfs subvolume create /mnt/@home # 创建 /home 目录子卷
这样布局是因为 TimeShift 仅支持这种布局。
可以使用btrfs subvolume list -p /mnt
来确认子卷情况
创建好之后先卸载掉该分区,执行umount /mnt
警告
如果未来需要调整 Btrfs 分区,请严格按照以下执行顺序来做:
- 挂载 Btrfs 分区
- 通过 Btrfs 的工具缩小分区,执行
btrfs filesystem resize <TARGET_PARTITION_SIZE> <MOUNT_POINT>
- 使用
cfdisk
调整分区
如果不按照该顺序执行,将会导致 Btrfs 分区无法正常挂载,这是由 Btrfs 的基本原理决定的。
若不幸先使用了cfdisk
调整分区,如果这时还未执行额外操作,只是简单地缩小了 Btrfs 分区,对于出现的空闲空间没有做进一步操作,那么还可以使用cfdisk
调整回原有大小,这时 Btrfs 分区就可以正常挂载了。
若对空闲空间做了创建分区、格式化等操作,不保证删除该分区后通过cfdisk
调整回原有大小是否还能正常挂载 Btrfs 分区,这取决于进一步的操作是否影响 Btrfs 的 BTree 索引。
硬盘挂载
格式化完成之后,需要按照如下顺序进行挂载
mount -t btrfs -o subvol=/@,compress=zstd /dev/xxxx2 /mnt
mkdir /mnt/home
mount -t btrfs -o subvol=/@home,compress=zstd /dev/xxxx2 /mnt/home
mkdir /mnt/home/MyData
mount -t btrfs -o compress=zstd /dev/xxxx3 /mnt/home/MyData
mkdir -p /mnt/boot/efi
mount /dev/xxxx1 /mnt/boot/efi
swapon /dev/xxxx4
挂载完请使用df -h
确认一次挂载情况,确保没有挂载错误。对于 Swap 分区的挂载情况可以使用free -h
查看。
系统安装
参考资料
接下来要安装系统了,在此之前先选择好镜像源,执行vim /etc/pacman.d/mirrorlist
来查看当前所有镜像,并将中科大镜像源写到第一行中:
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
接下来执行该命令安装系统【先确保等待 pacman-init.service
服务启动后,才能执行,可通过systemctl status pacman-init
查看】:
pacstrap /mnt base base-devel linux linux-headers linux-firmware btrfs-progs
pacstrap /mnt dhcpcd vim bash-completion iwd
提示
如果你希望使用 linux-lts 内核,应执行以下这些命令:
pacstrap /mnt base base-devel linux-lts linux-lts-headers linux-firmware btrfs-progs
pacstrap /mnt dhcpcd vim bash-completion iwd
安装完毕后,执行genfstab -U /mnt >> /mnt/etc/fstab
来写入fstab
文件,可通过cat /mnt/etc/fstab
进一步查看是否有误。
一切都没有问题之后,就可以 chroot 了,执行arch-chroot /mnt
进入刚刚安装的系统。
初梦
设置系统时区、语言以及字符编码
参考资料
设置系统时区,并更新硬件时间:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
选择系统语言及编码:执行vim /etc/locale.gen
,寻找文件中en_US.UTF-8
和zh_CN.UTF-8
,取消其注释后保存,执行locale-gen
生成 Locale, 最后执行echo 'LANG=en_US.UTF-8' > /etc/locale.conf
完成系统语言及编码的选择。
设置 Hostname 与其解析
这时还需要设置主机名:执行echo 'YOUR_HOST_NAME' > /etc/hostname
,并将YOUR_HOST_NAME
换成自己的主机名即可,不建议使用中文。之后打开/etc/hosts
,执行vim /etc/hosts
,写入如下内容:
127.0.0.1 localhost
::1 localhost
127.0.1.1 YOUR_HOST_NAME
常见IP
- 127.0.0.1: 本机地址,主要用于测试
- 127.0.1.1: 127.0.0.0/8段下面的一个IP,可用来解析自己的主机名。
- 0.0.0.0: 非真正意义上的IP,表示所有在 本机的路由表里没有特定条目指明如何到达 的主机和目的网络。
- 255.255.255.255: 限制广播地址,对本机来说指本网段内(同一广播域)的所有主机,该地址不能被路由器转发。
创建用户与设置密码
记得为 root 用户设置密码,这是保障系统安全的重要一环,执行passwd root
即可。
应该注意到, 一般不以 root 用户登入系统,所以现在创建非 root 用户useradd -m -G wheel -s /bin/bash YOUR_USER_NAME
, 并为其设置密码passwd YOUR_USER_NAME
,之后编辑/etc/sudoers
, 找到#%wheel ALL=(ALL:ALL) ALL
, 取消其注释。
安装微码与引导程序
参考资料
之后安装微码:
pacman -S intel-ucode # For Intel
pacman -S amd-ucode # For AMD
为什么要安装微码?
微指令(英语:microcode),又称微码,是在 CISC 结构下,执行一些功能复杂的指令时,所分解一系列相对简单的指令。
处理器制造商会发布对处理器微码的稳定性和安全性更新。这些更新提供了对系统稳定性至关重要的错误修复。如果没有这些更新,则可能会遇到不明原因的崩溃或难以跟踪的意外停机。
使用 AMD 或 Intel CPU 的用户都应该安装微码更新以确保系统稳定性。在虚拟机或容器中,微码更新应在主机上实施,而不是在客户机系统中。
——摘自 Arch Linux 中文维基
最后要安装引导程序:
pacman -S grub efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ARCH # --removable 如果要装入移动硬盘内,一般要加上这个参数
有关 removable 参数有资料这样解释:
某些主板的 UEFI 固件在显示 UEFI NVRAM 引导条目之前,需要在特定的位置存放可引导文件,不支持自定义存放 efi 文件
因此使用--removable
参数解决一些主板 NVRAM 的兼容性问题。
紧接着vim /etc/default/grub
,去掉GRUB_CMDLINE_LINUX_DEFAULT
一行中最后的quiet
参数,并将log level
的值改到5
。
【可选】可以考虑再给GRUB_CMDLINE_LINUX_DEFAULT
加上nowatchdog
参数,但这有可能会引发未知问题,如果watchdog没有导致极严重的问题一般不建议添加,仅当非常清楚可能导致的后果后再做决定。
接着执行grub-mkconfig -o /boot/grub/grub.cfg
来生成grub配置后,至此系统安装就算正式完成了,执行以下命令即可进入新系统【记得拔掉系统镜像盘,修改启动项】:
exit # 退回系统镜像
umount -R /mnt # 递归卸载新系统分区
reboot # 重启
浅梦
开启网络服务
启动新系统之后,记得开启网络服务:
systemctl enable iwd
systemctl start iwd
之后可以执行iwctl
管理无线网络,方法已在前面给出。
添加 Archlinuxcn 软件镜像源
除了官方extra软件源以及其它软件源外,还有一个比较常见常用的软件源是 archlinuxcn 源,我们可以这样添加软件源【编辑/etc/pacman.conf
】:
[archlinuxcn]
SigLevel = Required DatabaseOptional TrustedOnly
Include = /etc/pacman.d/archlinuxcn-mirrorlist
与此同时,再创建文件/etc/pacman.d/archlinuxcn-mirrorlist
并写入以下内容:
#
# Arch Linux CN community repository mirrorlist
# Generated on 2019-12-03
#
# Our main server (ipv4, ipv6, http, https)
#Server = <https://repo.archlinuxcn.org/$arch>
# 中国科学技术大学 (ipv4, ipv6, http, https)
Server = <https://mirrors.ustc.edu.cn/archlinuxcn/$arch>
# 上海科技大学 (上海) (ipv4, http, https)
#Server = <https://mirrors-wan.geekpie.club/archlinuxcn/$arch>
# 网易 (ipv4, http, https)
Server = <https://mirrors.163.com/archlinux-cn/$arch>
# 腾讯云 (ipv4, https)
Server = <https://mirrors.cloud.tencent.com/archlinuxcn/$arch>
# 重庆大学 (ipv4, http, https)
Server = <https://mirrors.cqu.edu.cn/archlinuxcn/$arch>
# SJTUG 软件源镜像服务 (ipv4, https)
#Server = <https://mirrors.sjtug.sjtu.edu.cn/archlinux-cn/$arch>
# 莞工 GNU/Linux 协会 开源软件镜像站 (ipv4, http, https)
#Server = <https://mirrors.dgut.edu.cn/archlinuxcn/$arch>
# 清华大学 (ipv4, ipv6, http, https)
Server = <https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch>
# 浙江大学 (浙江杭州) (ipv4, ipv6, http, https)
Server = <https://mirrors.zju.edu.cn/archlinuxcn/$arch>
# xTom (Hong Kong server) (Hong Kong) (ipv4, ipv6, http, https)
#Server = <https://mirror.xtom.com.hk/archlinuxcn/$arch>
# xTom (US server) (US) (ipv4, ipv6, http, https)
#Server = <https://mirror.xtom.com/archlinuxcn/$arch>
# xTom (Netherlands server) (Netherlands) (ipv4, ipv6, http, https)
#Server = <https://mirror.xtom.nl/archlinuxcn/$arch>
# Open Computing Facility, UC Berkeley (Berkeley, CA, United States) (ipv4, ipv6, http, https)
#Server = <https://mirrors.ocf.berkeley.edu/archlinuxcn/$arch>
配置写好之后,还需要安装 Archlinuxcn 镜像源的 Keys ,执行:
pacman-key --init
pacman -Syy
pacman -S archlinuxcn-keyring
pacman-key --populate archlinuxcn
只有 Keys 安装正确后才能正常安装 Archlinuxcn 镜像源上的软件。
安装 Xorg 图形桌面服务
参考资料 Arch Linux 安装 Xorg
图形桌面服务有两个可选项:Xorg
和WayLand
。一般都使用Xorg
,我们以这样的方式安装Xorg
:
sudo pacman -S xorg-server # 安装 Xorg 服务, 另外 xorg-xinit 以及 xorg-apps 两者都是可选的
lspci -v | grep -A1 -e VGA -e 3D # 检查系统的显卡信息
sudo pacman -S xf86-video-intel nvidia nvidia-utils # 对于 Intel CPU 和 Nvidia GPU 则需要安装这三个
sudo pacman -Ss xf86-video # 自然可以考虑使用开源驱动程序
reboot # 建议重启机器保证驱动等安装正确,没出现其它问题
sudo pacman -S xorg-xinit xorg-twm xterm xorg-xclock # 重启后安装测试工具(可后删除)
cp /etc/X11/xinit/xinitrc ~/.xinitrc # 复制 .xinitrc 配置文件模板
startx # 启动 Xorg 进行图形桌面服务测试
深梦
安装 i3 桌面管理器及其常用的基础系统软件
个人偏好使用Tiling Window Manager
,先前尝试使用过Awesome Window Manager
,因此这次想尝试一些不一样的,于是选择了i3 Window Manager
,安装:
sudo pacman -S i3-wm
为了开机能以图形界面登陆,安装了 Sddm 程序:
sudo pacman -S sddm
sudo systemctl enable sddm
个人偏好
sudo pacman -S picom # 窗口透明化
sudo pacman -S rofi # 快速启动工具
sudo pacman -S feh # 壁纸设置工具,支持指定目录下随机,同时也是轻量的图片查看器
sudo pacman -S alacritty # 个人偏好的终端模拟器
sudo pacman -S zsh # 个人偏好的终端
sudo pacman -S polybar # 系统状态栏,可自定制
sudo pacman -S tree # 文件树展开,项目结构可一目了然
sudo pacman -S autorandr # 屏幕扩展的自动管理工具
sudo pacman -S rofimoji # rofi界面的Emoji表情输入
sudo pacman -S less # 功能强大的查看文件内容的工具
sudo pacman -S timeshift # 快照备份工具,BTRFS文件系统备份常用
sudo pacman -S qbittorrent # BT下载器
sudo pacman -S ark # 开源压缩软件
sudo pacman -S flameshot # 截屏工具,对多屏幕支持友好
sudo pacman -S vlc # 开源视频播放器
sudo pacman -S thunar gvfs # Thunar 资源管理器以及相关依赖 GVfs (方便挂载设备、使用回收站等功能) ,如需要挂载安卓设备,应当另安装 gvfs-mtp。
sudo pacman -S ranger # 终端资源管理器
sudo pacman -S xsel # 操作剪贴板的终端工具
sudo pacman -S xdotool # 可以模拟鼠标和按键操作的工具
sudo pacman -S telegram-desktop # Telegram聊天工具软件
yay -S i3lock-color # i3常用的屏幕锁定工具
yay -S wechat-appimage # 微信官方客户端
GVfs 可选后端
点击此处可访问 GVfs 官网。
extra/gvfs 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO
extra/gvfs-afc 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - AFC backend (Apple mobile devices)
extra/gvfs-dnssd 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - DNS-SD and WebDAV backend (macOS file sharing)
extra/gvfs-goa 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - Gnome Online Accounts backend (e.g. OwnCloud)
extra/gvfs-google 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - Google Drive backend
extra/gvfs-gphoto2 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - gphoto2 backend (PTP camera, MTP media player)
extra/gvfs-mtp 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - MTP backend (Android, media player)
extra/gvfs-nfs 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - NFS backend
extra/gvfs-onedrive 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - Microsoft OneDrive backend
extra/gvfs-smb 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - SMB/CIFS backend (Windows file sharing)
extra/gvfs-wsdd 1.57.2-3 (gnome)
Virtual filesystem implementation for GIO - Web Services Dynamic Discovery backend
(Windows discovery)
系统字体
对个人来说安装 Noto fonts 已经够用了:
sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra
Noto fonts 各字体包内容说明
noto-fonts
: 基础包,覆盖拉丁字母、希腊字母、西里尔字母、阿拉伯语、希伯来语等绝大多数非 CJK 字符。noto-fonts-cjk
: 专门覆盖简体中文、繁体中文、日文、韩文(CJK 统一表意文字),包含 Noto Sans CJK 和 Noto Serif CJK。noto-fonts-emoji
: 支持彩色 Emoji 符号(如 😊⭐🌍)。noto-fonts-extra
: 提供补充字体(如粗体、斜体变体及部分小众语言支持)。
安装 yay
依次执行以下命令来安装yay
:
请确保 base-devel 和 git 有正确安装,因为以下命令将会用到git
和makepkg
等工具。
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
提示
如果无法通过https://aur.archlinux.org/yay.git
来获取yay
,可考虑拉取 GitHub 源码后进行编译安装:
git clone https://github.com/Jguer/yay
cd yay
make install
# make uninstall # 如果需要卸载,可执行该命令进行卸载。
如果仍然无法正常访问https://github.com/Jguer/yay
,可使用 GitHub 镜像站,如https://githubfast.com/Jguer/yay
。
更多镜像站可参考MirrorSite - GitHub。
安装 Bluetooth
参考资料 蓝牙#安装 - ArchWiki 内核模块#获取信息 蓝牙工具 bluetoothctl 用法简介 [BlueZ] 2、使用bluetoothctl搜索、连接、配对、读写、使能notify蓝牙低功耗设备
执行sudo pacman -S bluez bluez-utils
来安装蓝牙协议栈以及相关的工具,然后执行以下命令来启动蓝牙服务:
sudo systemctl enable bluetooth.service
sudo systemctl start bluetooth.service
请确保通用蓝牙驱动有正常加载,执行lsmod | grep btusb
或者modinfo btusb
,正常情况是有输出内容。
此时蓝牙已经可以正常使用了,可通过bluetoothctl
来管理蓝牙设备配对和连接。
bluetoothctl
# 进入控制界面
devices # 查看可连接的设备
scan on # 扫描等待连接的设备
pair <MAC_ADDRESS> # 通过 MAC 地址与设备进行配对
connect <MAC_ADDRESS> # 通过 MAC 地址与设备进行连接
disconnect <MAC_ADDRESS> # 取消连接设备
scan off # 停止扫描
如果希望使用图形化界面来管理蓝牙连接,可以执行sudo pacman -S blueman
来安装图形管理工具。
屏幕亮度调节
执行sudo pacman -S acpilight
,安装之后我们还需要将当前用户组加入video
组内,执行sudo gpasswd video -a <YOUR_USER_NAME>
即可,如要确认该用户是否在组内,可以执行groups <YOUR_USER_NAME>
,在 i3 中就需要写入bindsym XF86MonBrightnessUp exec xbacklight -inc 10
和bindsym XF86MonBrightnessDown exec xbacklight -dec 10
类似的多媒体按键名称
XF86AudioRaiseVolume
XF86AudioLowerVolume
XF86AudioMute
XF86AudioPlay
XF86AudioNext
XF86AudioPrev
XF86AudioStop
系统音频控制
参考资料
Linux 如今内核已经内置alsa
了,一般不需要额外安装软件,但如果希望使用alsa-utils
来控制音频,可以执行sudo pacman -S alsa-utils
,然后通过amixer
或alsamixer
来控制即可。但由于 i3 桌面管理器一般自带pipewire
(可执行pacman -Qs pipewire
来确认是否已安装),所以打算继续沿用pipewire
。
提示
安装好alsa-utils
后可在 i3 配置文件中去掉XF86AudioRaiseVolume
、XF86AudioLowerVolume
、XF86AudioMute
的相关事件,并添加以下内容来控制音量:
bindsym XF86AudioRaiseVolume exec amixer set Master 5%+
bindsym XF86AudioLowerVolume exec amixer set Master 5%-
bindsym XF86AudioMute exec amixer set Master toggle
如果希望使用pulseaudio
来替代pipewire
,则需要装以下这些软件:
sudo pacman -S pulseaudio-utils pulseaudio pavucontrol playerctl # Alsa系的音频控制工具,含pavucontrol图形控制界面工具
使用pipewire
需要额外安装以下软件:
sudo pacman -S pipewire-alsa pipewire-pulse
由于 i3 配置中包含了以下内容:
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
要想这些配置生效,需要依次执行以下命令来启用:
systemctl --user enable pipewire pipewire-pulse
systemctl --user start pipewire pipewire-pulse
重要
--user
参数不可省略,因为systemctl
默认通过 System Manager 到系统空间下寻找service
和socket
,而对于pipewire
它应当通过 User Service Manager 在用户空间下寻找service
和socket
。
Optional for i3bar(with i3status) user
如果希望在 i3bar 状态栏上显示音量控制,在~/.config/i3status/config
文件中按以下内容编辑:
在order +=
块中添加一行:order += "volume master"
并在文件最后部分添加以下代码块:
volume master {
format = "Vol: %volume"
format_muted = "Vol: MUTED (%volume)"
device = "default"
}
然后重启 i3 即可。
最后如果想测试声音,可以执行speaker-test -c 2
来测试。
Authentication Agent 配置
参考资料 Polkit - ArchWiki
在linux使用过程中,难免会遇到一些软件,不能直接用sudo
运行,但需要root权限,比如via-bin
、gparted
,然后我在具体运行中遇到的错误信息如下:
UnhandledPromiseRejectionWarning: Error: No polkit authentication agent found.
于是我就明白这里是缺少了一个专用的助手来安全地授予我们权限,于是我花了一些时间查找,最后从Polkit - ArchWiki里的 1.1 节 Authentication agents 中选了比较合适的lxqt-policykit,这个可以直接用pacman安装。安装好之后我们只需要让它随系统启动即可,在 i3 config 中写入exec --no-startup-id lxqt-policykit
,重启 i3 即可。
梦魇
Efibootmgr 使用
参考资料: efibootmgr help doc
(base) ➜ ~ efibootmgr -h
efibootmgr version 18
usage: efibootmgr [options]
-a | --active Set bootnum active.
-A | --inactive Set bootnum inactive.
-b | --bootnum XXXX Modify BootXXXX (hex).
-B | --delete-bootnum Delete bootnum.
-c | --create Create new variable bootnum and add to bootorder at index (-I).
-C | --create-only Create new variable bootnum and do not add to bootorder.
-d | --disk disk Disk containing boot loader (defaults to /dev/sda).
-D | --remove-dups Remove duplicate values from BootOrder.
-e | --edd [1|3] Force boot entries to be created using EDD 1.0 or 3.0 info.
-E | --device num EDD 1.0 device number (defaults to 0x80).
--full-dev-path Use a full device path.
--file-dev-path Use an abbreviated File() device path.
-f | --reconnect Re-connect devices after driver is loaded.
-F | --no-reconnect Do not re-connect devices after driver is loaded.
-g | --gpt Force disk with invalid PMBR to be treated as GPT.
-i | --iface name Create a netboot entry for the named interface.
-I | --index number When creating an entry, insert it in bootorder at specified position (default: 0).
-l | --loader name (Defaults to "\EFI\arch\grub.efi").
-L | --label label Boot manager display label (defaults to "Linux").
-m | --mirror-below-4G t|f Mirror memory below 4GB.
-M | --mirror-above-4G X Percentage memory to mirror above 4GB.
-n | --bootnext XXXX Set BootNext to XXXX (hex).
-N | --delete-bootnext Delete BootNext.
-o | --bootorder XXXX,YYYY,ZZZZ,... Explicitly set BootOrder (hex).
-O | --delete-bootorder Delete BootOrder.
-p | --part part Partition containing loader (defaults to 1 on partitioned devices).
-q | --quiet Be quiet.
-r | --driver Operate on Driver variables, not Boot Variables.
-t | --timeout seconds Set boot manager timeout waiting for user input.
-T | --delete-timeout Delete Timeout.
-u | --unicode | --UCS-2 Handle extra args as UCS-2 (default is ASCII).
-v | --verbose Print additional information.
-V | --version Return version and exit.
-w | --write-signature Write unique sig to MBR if needed.
-y | --sysprep Operate on SysPrep variables, not Boot Variables.
-@ | --append-binary-args file Append extra args from file (use "-" for stdin).
-h | --help Show help/usage.
由于 Windows 的安装或修复机制,它总会自动修改 EFI 启动项,甚至会直接删除其它系统的启动项。对于这种情况,Linux 一般需要自行使用 LiveCD 或其它方式来添加/修复启动项。但对于启动顺序,比较稳妥的做法是使用 Efibootmgr 来调整。
提示
如果希望使用同一个界面来决定启动 Windows 或 Linux 等多个操作系统,首先需要启用 os-prober
。编辑/etc/default/grub
文件,找到如下内容并取消注释GRUB_DISABLE_OS_PROBER=false
:
# Probing for other operating systems is disabled for security reasons. Read
# documentation on GRUB_DISABLE_OS_PROBER, if still want to enable this
# functionality install os-prober and uncomment to detect and include other
# operating systems.
GRUB_DISABLE_OS_PROBER=false
这样在生成启动项时会自动检测是否存在其它操作系统的启动项,并将这些启动项加入到启动项界面。
可以通过执行efibootmgr -v
来查看当前 EFI 启动信息,将会得到类似如下的输出:
(base) ➜ ~ efibootmgr -v
BootCurrent: 0002
Timeout: 0 seconds
BootOrder: 0002,2001,0001,2002,2003
Boot0001* Windows Boot Manager HD(1,GPT,59685006-d751-438d-845a-8594ddf09c5c,0x800,0xf4000)/\EFI\Microsoft\Boot\bootmgfw.efi57494e444f5753000100000088000000780000004200430044004f0042004a004500430054003d007b00390064006500610038003600320063002d0035006300640064002d0034006500370030002d0061006300630031002d006600330032006200330034003400640034003700390035007d00000061000100000010000000040000007fff0400
dp: 04 01 2a 00 01 00 00 00 00 08 00 00 00 00 00 00 00 40 0f 00 00 00 00 00 06 50 68 59 51 d7 8d 43 84 5a 85 94 dd f0 9c 5c 02 02 / 04 04 46 00 5c 00 45 00 46 00 49 00 5c 00 4d 00 69 00 63 00 72 00 6f 00 73 00 6f 00 66 00 74 00 5c 00 42 00 6f 00 6f 00 74 00 5c 00 62 00 6f 00 6f 00 74 00 6d 00 67 00 66 00 77 00 2e 00 65 00 66 00 69 00 00 00 / 7f ff 04 00
data: 57 49 4e 44 4f 57 53 00 01 00 00 00 88 00 00 00 78 00 00 00 42 00 43 00 44 00 4f 00 42 00 4a 00 45 00 43 00 54 00 3d 00 7b 00 39 00 64 00 65 00 61 00 38 00 36 00 32 00 63 00 2d 00 35 00 63 00 64 00 64 00 2d 00 34 00 65 00 37 00 30 00 2d 00 61 00 63 00 63 00 31 00 2d 00 66 00 33 00 32 00 62 00 33 00 34 00 34 00 64 00 34 00 37 00 39 00 35 00 7d 00 00 00 61 00 01 00 00 00 10 00 00 00 04 00 00 00 7f ff 04 00
Boot0002* ARCH HD(1,GPT,59685006-d751-438d-845a-8594ddf09c5c,0x800,0xf4000)/\EFI\ARCH\grubx64.efi
dp: 04 01 2a 00 01 00 00 00 00 08 00 00 00 00 00 00 00 40 0f 00 00 00 00 00 06 50 68 59 51 d7 8d 43 84 5a 85 94 dd f0 9c 5c 02 02 / 04 04 30 00 5c 00 45 00 46 00 49 00 5c 00 41 00 52 00 43 00 48 00 5c 00 67 00 72 00 75 00 62 00 78 00 36 00 34 00 2e 00 65 00 66 00 69 00 00 00 / 7f ff 04 00
Boot2001* EFI USB Device RC
dp: 7f ff 04 00
data: 52 43
Boot2002* EFI DVD/CDROM RC
dp: 7f ff 04 00
data: 52 43
Boot2003* EFI Network RC
dp: 7f ff 04 00
data: 52 43
从中可以注意到每个启动项都是以Boot<ID> <Device Name>
为开头的,找到其中的 Windows Boot Manager 和 Linux Grub 启动项即可。
Linux Grub 启动项的名称取决于当初创建 Grub启动项时传递参数--bootloader-id
的值。
可以通过使用efibootmgr -o <Ordered Boot List>
(需要 Root 权限)来控制 EFI 启动顺序,其中<Ordered Boot List>
是各 ID 之间用,
隔开,如efibootmgr -o 2001,0001,0002
。
如果<Ordered Boot List>
没有包括全部的 ID,实际启动时将只会看到<Ordered Boot List>
内的所有启动项。
最后记得执行grub-mkconfig -o /boot/grub/grub.cfg
(需要 Root 权限)重新生成 Grub 配置,然后重启即可。
设置 Swap 文件或分区
设置交换文件/分区的做法如下,设置交换文件的话应当使用dd
工具创建特殊文件,设置好权限之后将其格式化
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress #创建4G的交换空间 大小根据需要自定
chmod 600 /swapfile #设置正确的权限
mkswap /swapfile #格式化swap文件
swapon /swapfile #启用swap文件
sudo echo '/swapfile none swap defaults 0 0' >> /etc/fstab
类似的,也可以自行裁出一块分区后,依次使用mkswap
和swapon
制作 Swap 分区,并在/etc/fstab
最后添加UUID=<YOUR_DISK_UUID> /swap swap swap,defaults 0 0
,不过这种做法一般在前面系统分区的章节里就可以做了。
Magic SysRq Keybinding
我曾经时常遇到 Linux 在关机时等待时间过长的情况(甚至等待超时后会自动延长等待时间),往往这种时候我是已经有保存好自己的数据的,加之经常要马上关机离开,要为这种没必要的事情等太长时间不值得,所以我了解到了这个。
相关信息
Magic SysRq 组合键是一串能直接与 Linux 内核沟通的组合键,允许用户就算在系统进入死循环濒临崩溃时,直接调用系统底层将资料写入文件系统或重启,避免尚未写入文件系统与硬盘的数据在关机后消失。效果类似于电脑上的电源键或重启键,但能执行更多操作。此组合键提供一系列在系统崩溃时常用到的功能,比如上述的写入数据,或关闭 X Server 、Kill 进程、卸载 文件系统,也通常是死机时的最后手段。但在 Linux 核心停止运作的情况下 Magic SysRq 无效,例如 kernel panic。
打开方式有两种:一种可以通过执行sysctl -w kernel.sysrq=1
临时开启,另一种可以通过执行echo "kernel.sysrq = 1" >> /etc/sysctl.conf
添加配置信息,接着执行sysctl -p
来更新配置,达到永久开启的目的。
KeyBoard Shortcut | Illustration |
---|---|
Alt +SysRq +R | 从 X 收回对键盘的控制 |
Alt +SysRq +E | 向所有进程发送SIGTERM 信号,使其正常终止 |
Alt +SysRq +I | 向所有进程发送SIGKILL 信号,强制立即终止 |
Alt +SysRq +S | 将待写数据写入磁盘 |
Alt +SysRq +U | 卸载所有硬盘然后重新按只读模式挂载 |
Alt +SysRq +B | 重启 |
通常我们在关机/重启之前都会做好保存工作,因此一般而言执行这三步就可以了:
Alt
+SysRq
+R
Alt
+SysRq
+E
Alt
+SysRq
+I
第二步和第三步之间最好隔开 1~2 秒,不然做完第二步后立刻做第三步的话有可能导致有些本可以正常结束的进程被意外终止掉的结果,因此稍微等一下是更妥当的做法。
当系统中有内核高耗的进程导致系统卡顿时,可以使用 Magic SysRq 组合键Alt
+SysRq
+F
唤醒 Linux Kernel 的 OOM(out of memory) Killer 杀死这些进程。使用这个组合键可以减少因内存高耗导致重启系统的次数,OMM Killer使用启发算法选取当前系统内存占用最高且不重要的进程进行杀死,所以当系统内存占用不高的情况下还是需要慎用。
有关 Magic SysRq 的所有功能按键
以下表格中的按键均与Alt
+SysRq
组合,如按键中写B
时表示按下Alt
+SysRq
+B
。
按键 | 功能 |
---|---|
0 ~9 | 设置控制台日志等级,这个可以控制内核信息打印的等级 |
B | 立即重启系统,不同步文件系统或者卸载文件系统 |
C | 发起内核 Crash 崩溃,如果配置了 kdump 服务的话,将会获得一个 crashdump 文件 |
D | 打印当前正在被持有的锁 Locks,CONFIG_LOCKEDP 内核选项需要开启 |
E | 发送一个 SIGTERM 信号至所有进程,除开 1 号进程(init 进程) |
F | 调用 oom_kill,选择一个最符合 oom 的进程杀死 |
G | 当使用 Kernel Model Setting 模式的时候,切换至内核的 Frame Buffer 控制台,如果正在使用 kdb 进行调试,那么直接切换到 debugger |
H | 将简洁的帮助文档打印至控制台 |
I | 发送一个 SIGKILL 信号至所有进程,除开 1 号进程(init 进程) |
J | 强制解冻由 FIFREEZE ioctl 冻结的文件系统 |
K | 杀死当前虚拟中断的所有进程(可以杀死 X 和 SVGAlib 进程),最初是为了模仿安全警示按键而设立的 |
L | 打印当前所有在线的 CPU 堆栈信息 |
M | 打印当前的内存信息在控制台 |
N | 重置所有的实时进程或者高优先级进程的 nice 值 |
O | 关闭系统 |
P | 打印当前的寄存器信息和 flags 信息在控制台 |
Q | 显示所有在线的高进度定时器和时钟源信息 |
R | 键盘从 raw mode 切出至 XLATE 模式,经常被 X11 或者 SVGALib 使用 |
S | 同步所有的已挂载的文件系统 |
T | 打印当前的进程列表,以及他们的详细信息 |
U | 重新挂载文件系统至只读模式 |
V | 强制还原帧缓冲控制台 |
W | 打印所有 D 状态(阻塞)的进程信息 |
Z | 转储 ftrace 缓冲区 |
Linux 与 Windows 时间同步
Linux 和 Windows 的时间总会存在“时差”,一般这种问题有两个解决办法:
其一,直接修改 Linux 系统
sudo timedatectl set-local-rtc true --adjust-system-clock
其二,修改 Windows 系统
可以打开 PowerShell 运行以下的命令:
Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
也可以自己新建一个文本文件,并修改后缀为
.reg
,在该文件中写入如下内容:Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] "RealTimeIsUniversal" = dword:00000001
然后运行该脚本,即可解决时间不同步的问题。
如果想移除该键,可以将
"RealTimeIsUniversal" = dword:00000001
改成"RealTimeIsUniversal"=-
。
原因分析
Windows 和 Linux 两个系统看待硬件时钟的方式不同:Windows 会将硬件时钟(RTC)看作本地时间;Linux 则会将 RTC 看作 UTC 时间,故 Windows 时钟 = UTC + Time Zone,即两系统之间的时差刚好就是时区。在中国(UTC+8),Linux 总是比 Windows 快 8 小时。
关于Linux系统下键盘的F1~F12键无法响应的问题
先说一下解决方案:
echo 0 | sudo tee s/module/hid_apple/parameters/fnmode
这个方案是临时解决方案,如果想永久生效的话,需要执行:
echo "options hid_apple fnmode=0" | sudo tee -a /etc/modprobe.d/hid_apple.conf
最后重启reboot
或者执行
sudo update-initramfs -u # For Ubuntu
mkinitcpio -P # For Arch Linux
这样每次重新启动计算机也能正常使用F1~F12了。
为什么能解决?
首先要知道Linux系统下一切皆是文件,设备也不是例外。而我们这个操作实际上在做的就是调整设备参数。fnmode
文件内存放的内容是一位二进制码,0
表示默认不按下Fn
,而1
自然表示默认按下Fn
了。这样问题自然很容易复现了:我们在尝试按下F1
~F12
的时候,Fn
键已经处于激活状态,这样自然是输入了其对应的多媒体功能键,那么就算我再按下Fn
也无济于事了,因此这个文件我们需要置零。
扩展知识 Linux伪文件
Linux/Unix系统的文件类型大致可分为三类:普通文件、目录文件和伪文件。
伪文件不用来存储数据,本身不占用任何空间。它是文件系统的一部分,并按目录进行组织。伪文件设置的目的在于提供一种服务,采取与常规文件相同的访问方式进行访问,而且在多数情况下,伪文件用来访问内核(操作系统的核心部分)提供的服务。
常见的伪文件分别有设备文件、命名管道及proc文件。
- 设备文件:又称特殊文件,是物理设备的内部表示,包括计算机和网络中的每个设备都可以当作特殊文件来访问,如键盘、显示器、打印机、磁盘驱动器等等,它们都存放在/dev目录中。
- 命名管道:管道功能的一个扩展,将一个进程的输出连接到另一个进程的输入。
- proc文件:提供一种简单的途径来检查多种类型的系统文件的伪文件,它直接从内核获取信息,而不是使用复杂的程序搜出数据。这些文件都存放在/proc目录中。
这里只是做一个简单介绍,想了解详情还是点开这里比较好,这位作者写的是相当详细的。
安装 Oh-my-zsh 并切换默认终端并安装插件
前面安装好 Zsh 之后,执行sudo chsh -s /bin/zsh
来切换默认终端(可选值可通过chsh -l
来查看)。
接下来可以安装 Oh-my-zsh 了,根据 GitHub 官方文档,可以通过执行sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
来直接安装 Oh-my-zsh。
我安装使用了如下插件:
plugins=(
z
fzf
sudo
extract
gitignore
web-search
zsh-autosuggestions
zsh-syntax-highlighting
)
可以依次执行以下命令来安装上面各插件:
cp -r ~/.oh-my-zsh/plugins/z ~/.oh-my-zsh/custom/plugins/
git clone --depth 1 <https://github.com/junegunn/fzf.git> ~/.fzf
~/.fzf/install
cp -r ~/.oh-my-zsh/plugins/sudo ~/.oh-my-zsh/custom/plugins/
cp -r ~/.oh-my-zsh/plugins/extract ~/.oh-my-zsh/custom/plugins/
cp -r ~/.oh-my-zsh/plugins/gitignore ~/.oh-my-zsh/custom/plugins/
cp -r ~/.oh-my-zsh/plugins/web-search ~/.oh-my-zsh/custom/plugins/
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
关于web-search
插件我在.zshrc
中添加了如下内容:
ZSH_WEB_SEARCH_ENGINES=(
blbl "https://www.bilibili.com"
grgr "https://www.google.com"
gh "https://github.com/"
)
关于 Oh-my-zsh 主题我使用的是robbyrussell
i3 WM 配置
On building...
安装配置 Terminal Simulator
Alacritty
执行sudo pacman -S alacritty
来安装即可。我主要配置了窗体透明度、字体、字体边距以及主题,更多的配置细节可以见上方参考链接。主题可以去alacritty/alacritty-theme - GitHub下载,或者直接执行git clone https://github.com/alacritty/alacritty-theme $HOME/.config/alacritty/themes/
,然后在$HOME/.config/alacritty/alacritty.toml
下添加以下内容即可:
[general]
import = [
"~/.config/alacritty/themes/themes/<THEME_NAME>.toml"
]
完整配置
# $HOME/.config/alacritty/alacritty.toml
# by Rito Ghosh 2023-10-06
# Alacritty now uses TOML formatting for its config files.
# This is a simple example.
# There are the specification here: https://github.com/alacritty/alacritty/blob/master/extra/man/alacritty.5.scd
# It is not obvious how it translates to TOML. But it is extremely straightforward.
# example: WINDOW, COLORS, etc. are tables, and should be represented as [window], [colors], respectively.
# specifics of variables go under them. e.g.- look under "dynamic_padding" under-
# https://github.com/alacritty/alacritty/blob/master/extra/man/alacritty.5.scd#window
# write `dynamic_padding = true` (without backticks -`) under the table [window]
# for variables with multiple values, use "dotted keys". Like setting `padding.x = 5` under [window].
# This is simple. If not clear, do several trials and errors.
# Below is my initial set-up. The TOML homepage (https://toml.io/en/v1.0.0) was very helpful in figuring this out.
# I put the file alacritty.toml in $HOME/.config/alacritty. However it can be kept anywhere among the places mentioned in
# https://github.com/alacritty/alacritty/tree/master#configuration
[window]
opacity = 0.65
padding.x = 10
padding.y = 10
decorations = "None"
decorations_theme_variant ="Dark" # Light or Dark
startup_mode = "SimpleFullscreen"
[font]
size = 18.0
[font.normal]
family = "MesloLGS NF"
[font.bold]
family = "MesloLGS NF"
[font.italic]
family = "MesloLGS NF"
[font.bold_italic]
family = "MesloLGS NF"
# Tip: for inspiration, look for values in the source code files of your favorite VS Code themes, and use the color picker in
# Google to test colors before setting a value, or simply using an editor such as VS Code where colors are displayed in a
# small box when a HEX is detected by the editor.
[general]
import = [
"~/.config/alacritty/themes/themes/catppuccin_frappe.toml"
]
URxvt
给URxvt添加多标签功能
修改 ~/.Xresources
文件,搜索其中的 URxvt.perl-ext-common
字样,在后面添加 ,tabbed
后执行 xrdb -merge ~/.Xresources
即可。
让URxvt支持组合键
如果你喜欢使用Ctrl
+Arrow
类的组合键,但是你发现它在URxvt这里并不生效,其实是需要修改 ~/.Xresources
配置文件的:
在该文件下任意一个比较合适的地方添加如下的配置:
! enable some control keymap.
URxvt.keysym.Control-Up: \033[1;5A
URxvt.keysym.Control-Down: \033[1;5B
URxvt.keysym.Control-Left: \033[1;5D
URxvt.keysym.Control-Right: \033[1;5C
更改URxvt字体
安装好字体后,需要编辑 ~/.Xresources
文件,找到其中的段落:
! fonts
URxvt.letterSpace: -1
URxvt.font: xft:Monospace:regular:size=11
URxvt.imFont: xft:Monospace:regular:size=11
URxvt.italicFont: xft:Monospace:italic:size=11
URxvt.boldFont: xft:Monospace:bold:size=11
URxvt.boldItalicFont: xft:Monospace:regular:size=11
! run :.!fc-list | grep <font-name>
改成如下即可:
! fonts
URxvt.letterSpace: -1
URxvt.font: xft:MesloLGS NF-20
URxvt.imFont: xft:MesloLGS NF-20
URxvt.italicFont: xft:MesloLGS NF-20
URxvt.boldFont: xft:MesloLGS NF-20
URxvt.boldItalicFont: xft:MesloLGS NF-20
! run :.!fc-list | grep <font-name>
保存退出后还需要执行 xrdb -m ~/.Xresources
重启一下终端,你就可以看到字体已被启用了。
然后执行 xrdb -merge ~/.Xresources
,重启一下,即可生效。
安装 Fcitx5 Rime 中文输入法
On building...
中文输入法折腾起来挺麻烦,当初我也是翻了好些个资料,现在我直接整合到一起了,首先应当安装以下这些软件
sudo pacman -S fcitx5-configtool fcitx5 fcitx5-gtk fcitx5-qt fcitx5-rime librime librime-prelude # 输入法及其可扩展的工具依赖
yay -S rime-cloverpinyin
sudo pacman -S python-jieba pypinyin opencc python-requests
接着编辑/etc/environment
文件, 写入以下这些内容:
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
fcitx5 &
接着编辑文件~/.local/share/fcitx5/rime/default.custom.yaml
, 写入以下配置,设置使用四叶草输入法,并设定候选词个数
patch:
"menu/page_size": 10
schema_list:
- schema: clover
接着先推荐一个主题,是我个人比较喜欢使用的一个主题:https://github.com/hosxy/Fcitx5-Material-Color
一般手动安装主题都是安装以下命令安装的:
git clone <link.to.github.repo>
cd <repo.name>
cp -r <theme.name> ~/.local/share/fcitx5/themes
安装好主题之后在这里编辑文件~/.config/fcitx5/conf/classicui.conf
,写入:
# 垂直候选列表
Vertical Candidate List=False
# 按屏幕 DPI 使用
PerScreenDPI=True
# Font (设置成你喜欢的字体)
#Font="思源黑体 CN Medium 13"
Font="Noto Sans CJK SC Bold 20"
# 主题
Theme=Material-Color-Indigo
接着安装一些常用词库,重启后就可以开始体验舒适的中文输入了:
yay -S rime-pinyin-zhwiki fcitx5-pinyin-moegirl-rime # 安装词库
安装 LaTeX & LaTeX Workshop in VS Code
要想在本地使用 LaTeX,安装这些后在 VS Code 上安装插件 LaTeX Workshop,
sudo pacman -S texlive-core texlive-langchinese texlive-latexextra texlive-fontsextra texlive-science texlive-xetex
打开其配置文件(Ctrl
+Shift
+P
后输入settings.json
, 打开 User Settings), 在{}
内加入如下内容:
User Settings.json 文件内容
"latex-workshop.latex.tools": [
{
"name": "latexmk",
"command": "latexmk",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"%DOC%"
]
},
{
"name": "xelatex",
"command": "xelatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
]
},
{
"name": "pdflatex",
"command": "pdflatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
]
},
{
"name": "bibtex",
"command": "bibtex",
"args": [
"%DOCFILE%"
]
}
],
"latex-workshop.latex.recipes": [
{
"name": "latexmk",
"tools": [
"latexmk"
]
},
{
"name": "xelatex",
"tools": [
"xelatex"
]
},
{
"name": "pdflatex -> bibtex",
"tools": [
"pdflatex",
"bibtex"
]
},
{
"name": "pdflatex -> bibtex -> pdflatex*2",
"tools": [
"pdflatex",
"bibtex",
"pdflatex",
"pdflatex"
]
},
{
"name": "xelatex -> bibtex -> xelatex*2",
"tools": [
"xelatex",
"bibtex",
"xelatex",
"xelatex"
]
}
],
"latex-workshop.view.pdf.viewer": "tab",
"latex-workshop.latex.clean.fileTypes": [
"*.aux",
"*.bbl",
"*.blg",
"*.idx",
"*.ind",
"*.lof",
"*.lot",
"*.out",
"*.toc",
"*.acn",
"*.acr",
"*.alg",
"*.glg",
"*.glo",
"*.gls",
"*.ist",
"*.fls",
"*.log",
"*.fdb_latexmk"
],
"latex-workshop.bibtex-format.tab": "4 spaces",
"latex-workshop.latex.autoBuild.run": "onSave",
"latex-workshop.latex.recipe.default": "lastUsed",
使用 Daed 科学上网
参考资料 archlinux 透明代理 / dae
科学上网,就用 Daed 保驾护航,首先需要安装并运行:
sudo pacman -S daed
sudo systemctl enable daed
sudo systemctl start daed
之后就可以通过访问localhost:2023来配置代理。**注意,订阅链接需要从机场的订阅链接获取。**获取到订阅链接之后可在右侧的订阅窗口里添加订阅,添加成功后手动将该元素手动拖动到左侧的群组中,如此一来便可以科学上网了。
通常情况下 DNS、Router 等配置采用默认的方案即可。
Linux 屏幕扩展
使用xrandr
就要记很多参数,而且一般要花很长时间才能调整好参数,往往调整好后又几乎不需要做修改,因此每次都查询xrandr
文档来调整屏幕扩张是麻烦且不必要的,因此使用arandr
和autorandr
可更方便快捷地配置屏幕扩展方案。
提示
autorandr
可以将当前屏幕方案保存下来,方便下次使用时直接调用。故可以在系统检测到接口插入时触发autorandr
加载对应屏幕方案。
Linux & Windows 共用蓝牙设备
参考资料
普遍存在这样的情况,Linux 和 Windows 系统都可以连接蓝牙设备的情况下,切换系统时蓝牙设备必须要重新配对连接。而这一情况对用户而言很不友好,事实上无论是在哪个系统,本机设备的 MAC 都不会发生变化,但由于某种原因,两个系统连接蓝牙设备时使用的 MAC 地址是不同的,由此可见,问题出在两个系统与蓝牙设备连接时的配对信息存在差别,下面就要解决这个异常。
首先让蓝牙设备和 Linux 系统进行配对,目的是为了在/var/lib/bluetooth/<Local Machine MAC Address>
目录下生成对应设备的配对信息。
然后回到 Windows 系统,先配对好蓝牙设备,再下载 PsTools。下载 PsTools 的原因是 Windows 默认隐藏注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys
下的信息,而这是进行后续操作所需要的信息。
确实存在不下载 PsTools 的解决方案,但是通过将 Windows 系统盘挂载到 Linux 系统下并使用
chntpw
来读取注册表信息的,这种方案本篇不是很推荐采用,理由是:除非必要情况,应尽量避免将 Windows 系统分区盘挂载到 Linux 系统下使用的情况,尤其是在 Windows 使用 NTFS 文件系统的情况下。
PsTools
PsTools 是 Sysinternals Suite 中一款排名靠前的一个安全管理工具套件,现已被微软收购。目前 PsTools 中含有各式各样的小工具。如果能灵活运用它们,渗透过程中将会收到奇效。
之后通过管理员身份运行命令提示符(CMD),进入到 PsTools 存放目录,执行
psexec -si /e <PATH\Anywhere\You\Like>\<ANY_NAME_YOU_LIKE>.txt HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys
提示
这个命令是使用 PsExec 将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys
目录下的所有注册表项导出到文本文件,该文本文件将会存放在你指定的/e
参数后面的路径。当然,注册表中的CurrentControlSet
也可以是ControlSet001
。
之后最好通过某种方式,能让 Linux 系统访问到文本文件的内容。在进行下一步操作之前,有一个知识点需要了解,了解这个知识点有利于解决本小节的核心问题。
重要
不同蓝牙设备之间使用的蓝牙协议未必相同,同时设备的蓝牙版本与使用的蓝牙协议类型无必然联系,从 2010 年蓝牙 4.0 出现以后就有了 LE 模式,因此不能看使用了高版本的蓝牙就断定设备使用的是低功耗蓝牙协议。
蓝牙它本身是蓝牙技术联盟(SIG)发布的技术,而它自己又分 BR、EDR、AMP 和 LE 四种 Controller 类型。其中 LE 就是蓝牙低功耗模式,其它三者则通常被统称为蓝牙经典模式。
经典蓝牙(BR/EDR)与 BLE(Bluetooth Low Energy)是蓝牙技术规范中的两个不同的协议栈,它们虽然共享相同的无线电硬件,但设计目标和应用场景不同。经典蓝牙更适合需要连续数据流的应用,而 BLE 则更专注于提供低功耗的周期性数据传输。随着蓝牙技术的发展,许多设备现在都支持这两种蓝牙模式,以满足不同的应用需求。
因此一般常见的蓝牙设备如鼠标、键盘等等涉及数据传输、位置服务、设备网络等方面的设备多都采用蓝牙低功耗模式,而其它如蓝牙耳机等音频设备则是采用蓝牙经典模式。
回到 Linux 下,如前文所述,蓝牙设备信息都存储在/var/lib/bluetooth/<Local Machine MAC Address>
目录下,需要留意该目录下有哪些设备,并找出要连接设备的 MAC 地址。然后执行su
登录 root 账户,进入到/var/lib/bluetooth/<Local Machine MAC Address>
,修改该目录下的蓝牙设备的 MAC(即重命名文件夹),使 Linux 解析的 MAC 值与 Windows 的值保持一致。注意 Linux 的 MAC 格式是XX:XX:XX:XX:XX:XX
,重命名时应给:
做转义,即XX\:XX\:XX\:XX\:XX\:XX
。
如果不清楚自己的设备应该是哪个 MAC 地址,这时候主要参考 MAC 文件夹的info
文件下[General]
小节的Name
键,它的值就是设备名称。而凭经验来看,Windows 和 Linux 两系统下同一蓝牙设备的 MAC 地址差别不大,通常只有后四位(两字节)是不同的,这个未经长期检验验证的经验或许可以帮助你快速定位到自己的设备。
现在就设备所采用的蓝牙协议类型进行分类讨论:
对于鼠标、键盘一类使用 BLE 的设备,需要修改info
文件下[LongTermKey]
一节下的三个键的值:LTK
、Rand
、EDiv
,因为 Linux 和 Windows 两个系统在这三个键上存储方式不同。
Key
<K
: Windows 和 Linux 都是使用十六进制存储,但 Windows 会每两位数(小写)之间用,
隔开,而 Linux 是直接连在一起(大写)。Rand
&ERand
: Windows 下该键的数据格式和 LTK 键一样,但采用大端存储方式存储,而 Linux 则采用小端存储,并使用十进制。EDiv
&EDIV
: Windows 采用十六进制存储,而 Linux 采用十进制存储。
接下来就是要根据上面所述对数值进行一次转换,本人则是使用 Python 的简单实现:
ltk_str = "63,e9,67,de,ef,17,4e,43,71,5d,93,e3,a8,ff,52,0c"
erand_str = "25,45,88,56,42,ec,b8,0b"
ediv_str = "00005240"
key = "".join( [ char.upper() for char in ltk_str.split(",") ] )
rand = "".join(reversed(erand_str.split(",")))
print("Key: ", key)
print("Rand: ", int(rand, 16))
print("EDiv: ", int(ediv_str, 16))
而对于蓝牙耳机等一类使用经典蓝牙协议的设备,它的信息结构反而没有上面那样复杂,甚至info
可能只有[General]
和[LinkKey]
两小节。对于这种设备,一般只需要修改[LinkKey]
下的Key
键值即可。
在 Windows 的注册表中,BLE 类型的设备都会存在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\<LOCAL_MAC_ADDRESS>
下的<DEVICE_MAC_ADDRESS>
内,而这类使用经典蓝牙协议的设备则是以键值对的形式(非文件夹结构)直接存放在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\<LOCAL_MAC_ADDRESS>
下的,键是设备的 MAC 地址,而值就是要寻找的[LinkKey]
的Key
键值,与 BLE 中 LTK 的处理方式类似,只需要 Windows 下的值去除,
后转成大写即可。
提示
如果想知道该蓝牙设备采用的是哪种蓝牙技术,可以留意info
文件[General]
小节下的SupportedTechnologies=<ANY_VALUE>;
,这里的值会直接表明当前设备使用的蓝牙技术类型,常见的值有:BR/EDR
和LE
两种。
最后,经过以上两种情况的操作,该问题便可得到解决。需要重启蓝牙服务,执行sudo systemctl restart bluetooth.service
,然后再尝试连接蓝牙设备即可。
Linux 查找软件安装目录的方法
Linux 一般安装的软件位置会在以下几个目录中,如有需要届时可以自行查找:
/usr/share
/usr/local
/opt
如果已知可执行程序,也可直接使用whereis
, which
等查看位置
Ark打开Zip压缩包出现中文乱码的解决方案
执行如下指令即可:
yay -S p7zip-natspec
# 中间会提示你是否要删除P7zip,选择是。
然后打开Ark,点击菜单栏中的设置,单击配置Ark,然后取消勾选Libzip,并且要选中P7zip,保存设置并重启Ark即可。
修改默认应用程序
随着使用时间增长,有些文件可以由许多应用打开,这难免会发生冲突,尤其在习惯以某个应用打开之后在近期装了新软件把默认配置覆盖掉的时候,就会直接高血压。但还好有办法解决这个问题。
首先要知道系统依靠什么来设定文件到应用的映射:通过/usr/share/applications
下的desktop
文件来设定关联。可以通过ls /usr/share/applications
来查看当前可以设定的关联。
因此修改的流程应该是:
- 先通过
ls /usr/share/applications
找到要找的关联desktop文件 - 执行命令
xdg-mime query filetype <你要查看文件的文件名>
,比如当前目录有file.md
,我就可以执行xdg-mime query filetype file.md
,这样就可以查询这个文件类型当前设置的默认应用程序是什么 - (可以不做)也可以执行命令
xdg-mime query default application/<文件后缀>
来查看这个文件类型当前设置的默认应用程序。 - 执行命令
xdg-mime default <第一步你选择的结果> application/<文件后缀>
来设定应用与文件类型的关联。
修改是立即生效的,不用重启计算机。
Virtual Machine Manager 安装与使用方法
首先要确保你的系统是支持虚拟化的,执行下列命令来查看:
LC_ALL=C lscpu | grep Virtualization
如果是使用Intel CPU的话,会看到 VT-x
,如果是使用AMD的话会看到 AMD-V
。
接下来我们要安装相关组件:
sudo pacman -S qemu libvirt ovmf virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat ebtables iptables libguestfs
之前确实是搞错了,不是只安装virt-manager就可以的,它只是一个GUI管理器,真正做虚拟服务的是qemu,它只是替我们去调用了qemu的API罢。安装好这些后需要继续进行配置:
首先我们需要启动服务:
sudo systemctl enable libvirtd.service
sudo systemctl start libvirtd.service
然后将我们的用户账户添加到libvirt组内:
sudo usermod -aG libvirt $(whoami)
newgrp libvirt
然后我们重启一下服务:
sudo systemctl restart libvirtd.service
之后我们打开 virt-manager
,新建连接。选择 QEMU/KVM
后保持默认就可以开始新建虚拟机了!
桌面壁纸配置
i3 窗口管理器下可以直接使用feh
来设置壁纸。
feh --bg-fill --no-fehbg --randomize "Path/to/your/Wallpaper/Folder"
对于 Awesome 窗口管理器,我推荐使用 Nitrogen。
nitrogen --head=<Your-Monitor-ID> --random --set-zoom-fill /path/to/your/wallpaper/directory > /dev/null 2>&1
将平板作为扩展屏幕使用
家里的显示器数量有限,但又不能因此就再买一个显示器。又考虑到我手中还有一个平板,那么我就有办法让平板作为我的第三个屏幕。
基本原理其实就是在电脑上自己手动添加一个视频信号输出,然后由服务端软件开放端口投出,最后由平板连接这个开放端口,达到显示第三屏幕的效果。
注意
这种操作并非不受限制:
- 你首先要知道你的计算机最多能扩展多少个屏幕,在这里我的电脑能支持同时输出3个显示器设备。
- 你还要知道你的每一个显卡的输出信号能力,即它最大的分辨率输出能力,比如我的显卡性能并不是特别强,最大只能输出1080P「1920✕1080」,那么如果我尝试让它输出2560✕1600的分辨率,这个肯定会失败的。
- 服务端软件一般系统并不自带,因此需要用户自行安装,可以执行
sudo pacman -S x11vnc
来直接安装。
了解了这些限制后我们就可以开始了:
首先我们应该确定要输出的分辨率,并获取相关参数,执行
cvt <X> <Y> <Z>
提示
这里的
<X>
、<Y>
、<Z>
分别表示分辨率宽、高和屏幕刷新率参数。如cvt 1920 1080 60
表示分辨率为1920✕1080,屏幕刷新率为60Hz。你会得到类似这个的输出:
❯ cvt 1920 1080 60 # 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
获取到这些参数后我们还要复制好这些参数,并执行下面这个命令:
xrandr --newmode "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
新建好这个输出模式后再执行下面这个命令:
xrandr --addmode <API> 1920x1080_60.00
提示
这里的
<API>
是指你输出的视频信号端口名称,如果觉得这里不清晰的话可以先执行xrandr
来看看,执行完上面指令的时候就可以看到你新添加的输出模式了。另外,如果是希望扩展屏幕,建议
<API>
选取未连接状态的端口。不过如果只是希望复制屏幕的话,大可不必用这种方法。接下来你还要开启输出模式,做屏幕扩展,执行
xrandr --output <API> --mode 1920x1080_60.00 --right-of <Other API>
提示
当然也可以使用其它参数,详细可以执行
xrandr --help
后关注--output
下的其它参数。最后你就需要使用
x11vnc
来开放端口,将这个新添加的屏幕输出出去,执行x11vnc -clip 1920x1080+X+Y
提示
这里的X表示扩展屏幕的起点横坐标,Y表示扩展屏幕的起点纵坐标。比如我现在在使用两个显示器,且分辨率都是1920✕1080,那么我在扩展第三个屏幕的时候就可以选择起点横坐标为3840,纵坐标为0。
当然如果你希望它在后台运行,可以添加-bg
来后台启动。如果希望设置密码,添加
-usepw
就可以了。使用这个参数时它会在~/.vnc/passwd
中或~/.vnc/passwdfile
第一行里找到密码,如果这些文件都不存在,则它会提示你输入密码,并保存在~/.vnc/passwd
中。如果想指定端口的话需要添加参数
-rfbport PORT
,其中PORT
要换为你想使用的端口号。
现在你可以在平板上连接电脑开放的端口来查看了。
通过 Systemctl 设置开机自启动服务
systemd
单元文件的语法来源于 XDG 桌面项配置文件.desktop
文件,最初的源头则是Microsoft Windows的.ini
文件。单元文件可以从多个地方加载,systemctl show --property=UnitPath
可以按优先级从低到高显示加载目录:
/usr/lib/systemd/system/
:软件包安装的单元
/etc/systemd/system/
:系统管理员安装的单元——ArchWiki
systemd的文件主要存放在/usr/lib/systemd 目录中,有系统(system)和用户(user)之分
/usr/lib/systemd/system/ #开机不登陆就能运行
/usr/lib/systemd/user/ #登陆后运行每一个服务以.service结尾,文件内一般会分为3部分:[Unit]、[Service]、[Install]
[Unit] 主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别
[Service] 是服务的关键,是服务的一些具体运行参数的设置,
Type=forking是后台运行的形式,
PIDFile为存放PID的文件路径,
ExecStart为服务的具体运行命令,
ExecReload为重启命令,
ExecStop为停止命令,
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
[Install] 是服务安装的相关设置,可设置为多用户的
——MregXN
对于语法问题,完全可以先看看该目录下的其他systemd单元文件,参照它们来写。
首先要准备好你希望每次开机都要启动的脚本,我姑且假设这个脚本名字叫做supsys.sh
然后需要给这个脚本授予权限,执行sudo chmod 0755 /path/supsys.sh
接着创建service文件,执行sudo vim /usr/lib/systemd/system/supsys.service
输入如下样例:
[Unit]
Description=run shell script
[Service]
ExecStart= /path/supsys.sh
Type = simple
[Install]
WantedBy=multi-user.target
其他具体操作请查看ArchWiki。
保存退出后,就可以直接执行sudo systemctl enable supsys.service
来达到你的开机自启动的目的。
常用的 Linux 清理命令
sudo pacman -Scc # 清除掉pacman的无用安装包
yay -Scc # 清除掉yay的无用安装包
sudo pacman -R $(pacman -Qdtq) # 清除掉无用的依赖
sudo journalctl --vacuum-size=50M # 只保留50M大小的日志。
# 当然你也可以使用 sudo journalctl --vacuum-time=1w,这样就是只保留最近一周的日志。
sudo rm /var/lib/systemd/coredump/* # 清除掉崩溃日志内容