这是一次惨痛的经历,我的Arch在更新之后之后出现了无法关机的问题,并且我采用了不正确的方法处理——强制断电。最终的结果就是数据没有写入导致系统文件丢失。
于是我不得不重装一遍我的Arch,刚刚才写完Arch的配置篇没想到就用上了,但发现其实远远不够,许多配置根本想不起来了,所以谨以此文记录我的Arch重生之路的配置,以免下次又发生这样的惨剧。(系统更新后那一次非正常关机的问题仍无法解决,不过只存在在我的Arch上,大家不用担心)
下面描述一下重新配置的经过。(同样,下面引文不加说明均来自ArchWiki)
系统层面
The initial ramdisk
初始内存盘本质上是一个很小的运行环境(早期用户空间),用于加载一些核心模块,并在 init 接管启动过程之前做必要的准备。有了这个环境,才能支持加密根文件系统、RAID上的根文件系统等高级功能。mkinicpio 支持自定义的钩子扩展、运行时自动检测以及其他功能。
HOOKS=(base udev block keyboard autodetect modconf filesystems fsck)
Pacman
mirrorlist
Server = https://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch
Server = http://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch
conf
# Misc options
#UseSyslog
Color
ILoveCandy
#NoProgressBar
CheckSpace
#VerbosePkgLists
#ParallelDownloads = 5
# 末尾加上archlinuxcn的源
[archlinuxcn]
SigLevel = Never
Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch
注意:之前不知道,所以也没有提醒,pacman -Sc
命令可以删除已下载的旧的软件包的下载文件,建议每次升级Arch之后运行,pacman -Scc
是清除所有已下载的软件包的下载文件
Shell
zsh
使用zsh作为默认shell: pacman -S zsh
, 使用oh-my-zsh
作为管理
oh-my-zsh提供了两种安装方法:
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
但是raw.github对我不是很友好,所以我采用的手动安装了,先找到gitee的oh-my-zsh
在用户home目录
git clone https://gitee.com/mirrors/oh-my-zsh.git ~/.oh-my-zsh
复制提供的模板来创建新的 zsh 配置文件
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
手动安装需要自己修改用户的shell为zsh, 使用chsh
命令:
chsh -l # 查看有哪些shell
chsh -s /bin/zsh # 切换到zsh
source ~/.zshrc # 读取zshrc的配置,可能需要重新登录用户才能起效
zsh插件:
zsh-autosuggestions命令自动补全插件
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
zsh-syntax-highlighting高亮显示常用命令
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
在~/.zshrc
中启用插件:
plugins=(git sudo zsh-syntax-highlighting zsh-autosuggestions z)
其中sudo是连续按两下Esc
键在命令前加上sudo
,z
是快速目录跳转
用户权限
sudo
增加sudo
权限的正确方法是使用visudo
sudo的配置文件是
/etc/sudoers
。visudo
会锁住sudoers
文件,保存修改到临时文件,然后检查文件格式,确保正确后才会覆盖sudoers
文件。必须保证sudoers
格式正确,否则sudo将无法运行。
简单来说,使用visudo
就是在文件保存是会检查文件格式
visudo
调用的默认编辑器是vi
。官方仓库里的 sudo 编译时开启了--with-env-editor
,会采用环境变量VISUAL
和EDITOR
的设置。如果设置了VISUAL
就不会使用EDITOR
。如果要临时使用其他编辑器,在该命令前加上
EDITOR
环境变量即可。例如,要使用nano
,用root运行以下命令:
EDITOR=vim visudo
%wheel ALL=(ALL) NOPASSWD: ALL # 去掉其注释,是wheel组的用户有sudo权限
polkit
Polkit 在系统层级进行权限控制,提供了一个低优先级进程和高优先级进程进行通讯的系统。和 sudo 等程序不同,Polkit 并没有赋予进程完全的 root 权限,而是通过一个集中的策略系统进行更精细的授权。
我们在刚安装好Arch的时候,关机需要sudo poweroff
,但是用了一会之后就发现突然不用sudo
了,因为图形化环境Cinnamon、Deepin、GNOME、GNOME Flashback、KDE、LXDE、LXQt、MATE、theShell 和 Xfce 各自都已有认证组件——也就是对于的polkit。
但是,我这次只使用i3wm作为桌面环境,所以需要pacman -S polkit
以获取权限(包括在图形化界面使用NetworkManager的权限)
grub
取消grub默认的静默启动和关机,便于出现问题时捕获。找到下面这一行,去掉quiet参数
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3"
重新生成grub.cfg
grub-mkconfig -o /boot/grub/grub.cfg
桌面环境(i3wm)
启动
pacman -S xorg-server xorg-xinit i3-gaps # xorg-xinit使用xinit启动i3
在~/.xinitrc
的最后改成exec i3
Terminal
xfce4-terminal属于i3可自动识别的终端模拟器之一,也是xfce4的默认终端模拟器,轻量快速。同时在刚进入i3wm的时候第一个需求就是打开终端使用编辑器来编辑i3的config
配置
禁用滚动条(平常不用,看着难受),透明背景0.7透明度
字体
在终端使用FreeMono Regular 15
,中文字体只安装霞鹜文楷(比微软雅黑好看)
dmenu
dmenu是i3的默认的快速、轻量级的软件启动器,使用它来打开图形界面的应用
i3-gaps
i3-gaps是i3wm的一个可调节窗口间隙的变种。
我的部分配置如下:
自启动
# Start fcitx5
exec --no-startup-id fcitx5 # 启动i3的时候fcitx5自启动
# Start ploybar
exec_always --no-startup-id $HOME/.config/polybar/launch.sh # 启动i3的时候polybar自启动(同时要注释掉i3config最后面的i3status)
# Start picom
exec --no-startup-id picom -b # 启动i3的时候picom自启动以支持窗口透明
# Start feh to use wallpaper
exec --no-startup-id feh --bg-fill $HOME/Pictures/Wallpaper/1.jpg # 启动i3的时候feh启动壁纸,这里我只用了一张壁纸,并且用fill的方式填充
快捷键
# start web browsers in private mod
bindsym $mod+Shift+p exec firefox --private # 设置firefox隐私模式的快捷键,其他应用可以之间用dmenu打开,使用firefox的private可以减少cache的产生
# use maim to capture screen and save to $HOME/Pictures/Screenshot
# $(date +%s)格式不能错
# sreenshot the current active window
bindsym $mod+i exec maim -i $(xdotool getactivewindow) $HOME/Pictures/Screenshot/$(date +%s).png # 截取当前活动窗口
# screenshot the full screen
bindsym $mod+Print exec maim $HOME/Pictures/Screenshot/$(date +%s).png # 全屏截图
# screenshot a selected aera
bindsym $mod+Shift+Print exec maim -s $HOME/Pictures/Screenshot/$(date +%s).png # 自己选取截图区域
窗口样式
# design windows
default_border none # 设置窗口没有边框
default_floating_border normal # 浮动窗口边框正常
hide_edge_borders both # 隐藏与屏幕边缘相邻的边框(其实已经没有边框了,上面是none)
gaps inner 9 # 窗口之间的间距
gaps outer 3 # 窗口与上下栏的距离(outer + inner),如果outer设置为0,间距就和窗口之间一样
# 注意以下语法已经不再建议,并且将来可能不再支持
new_window none
new_float normal
fcitx5
基本配置
使用fcitx5作为输入法框架
pacman -S fcitx5-im fcitx5-chinese-addons # fcitx5-chinese-addons为中文输入法的引擎
设置以下环境变量,并重新登录:
GTK_IM_MODULE DEFAULT=fcitx
QT_IM_MODULE DEFAULT=fcitx
XMODIFIERS DEFAULT=\@im=fcitx
INPUT_METHOD DEFAULT=fcitx
SDL_IM_MODULE DEFAULT=fcitx
GLFW_IM_MODULE DEFAULT=ibus
词库
pacman -S fcitx5-pinyin-zhwiki fcitx5-pinyin-moegirl
分别是中文维基和萌娘百科的词库
主题
使用ssfconv将搜狗的皮肤转换成fcitx5的
然后自己调配色、位置、图片之类的
联网
在学校还是图形界面联网方便(特别是校园网)
pacman -S networkmanager network-manager-applet # 注意还要装polkit以获取权限
声音
alsa(Advanced Linux Sound Architecture)
pacman -S alsa-utils # 里面有alsamixer和amixer等
dmix混音
使用alsa的时候两个应用不能同时使用声音,所以需要开启dmix作为软件混音,在alsa的配置文件中加入
pcm.card0{
type hw
card 0
}
pcm.!default{
type plug
slave.pcm "dmix"
}
polybar
作为i3bar的替代品
pacman -S polybar
install -Dm644 /usr/share/doc/polybar/config $HOME/.config/polybar/config # 拷贝配置文件(也可以用cp)
启动
#!/usr/bin/env bash
# Terminate already running bar instances
killall -q polybar
# If all your bars have ipc enabled, you can also use
# polybar-msg cmd quit
# Launch bar1 and bar2
echo "---" | tee -a /tmp/polybar1.log /tmp/polybar2.log
polybar example 2>&1 | tee -a /tmp/polybar1.log & disown
# polybar bar2 2>&1 | tee -a /tmp/polybar2.log & disown
添加可执行权限:chmod +x ~/.config/polybar/launch.sh
在i3的配置文件中加入exec_always --no-startup-id $HOME/.config/polybar/launch.sh
配置
字体
font-0 = fixed:pixelsize=10;1
font-1 = FontAwesome6FreeSolid:pixelsize=12;1
font-2 = FontAwesome6Brands:pixelsize=8;1
键盘提示
; ===键盘提示===
; https://github.com/polybar/polybar/wiki/Module:-xkeyboard
[module/xkeyboard]
type = internal/xkeyboard
; 忽略列表
blacklist-0 = scroll lock
; <label-indicator>
format = <label-layout> <label-indicator>
format-spacing = 1
label-layout =
label-layout-foreground = #93b5cf
label-indicator-on-capslock =
label-indicator-off-capslock =
;label-indicator-on-numlock = 🅽
;label-indicator-off-numlock =
label-indicator-on-capslock-foreground = #ff5555
调节亮度
; ===屏幕亮度===
; https://github.com/polybar/polybar/wiki/Module:-xbacklight
[module/backlight]
type = internal/backlight
; 使用命令查询到设备文件:
; ls -1 /sys/class/backlight/
card = intel_backlight
; 滚轮调节亮度
; see /etc/udev/rules.d/backlight.rules
; Default: false
enable-scroll = true
format = <ramp> <label>
label = %percentage%%
; 用于 <ramp>
ramp-0 =
ramp-1 =
ramp-2 =
ramp-3 =
ramp-4 =
ramp-0-foreground = #3d3b4f
; 用于 <bar>
bar-width = 10
bar-indicator = |
bar-fill = -
bar-empty = -
其中调节亮度需要用户权限,根据xblight,在创建文件
RUN+="/bin/chgrp wheel /sys/class/backlight/intel_backlight/brightness"
RUN+="/bin/chmod g+w /sys/class/backlight/intel_backlight/brightness"
CPU组件
; ===CPU===
; https://github.com/polybar/polybar/wiki/Module:-cpu
[module/cpu]
type = internal/cpu
; 刷新间隔,默认: 1
interval = 0.5
;format = <label> <ramp-coreload>
format = <label>
label = %percentage%%
label-foreground = #2e4e7e
; Spacing between individual per-core ramps
ramp-coreload-spacing = 1
ramp-coreload-0 = ▁
ramp-coreload-1 = ▂
ramp-coreload-2 = ▃
ramp-coreload-3 = ▄
ramp-coreload-4 = ▅
ramp-coreload-5 = ▆
ramp-coreload-6 = ▇
ramp-coreload-7 = █
ramp-coreload-0-foreground = #aaff77
ramp-coreload-1-foreground = #aaff77
ramp-coreload-2-foreground = #aaff77
ramp-coreload-3-foreground = #aaff77
ramp-coreload-4-foreground = #fba922
ramp-coreload-5-foreground = #fba922
ramp-coreload-6-foreground = #ff5555
ramp-coreload-7-foreground = #ff5555
内存组件
; ===内存===
; https://github.com/polybar/polybar/wiki/Module:-memory
[module/memory]
type = internal/memory
; 刷新间隔,默认: 1
interval = 3
;format = <label> <ramp-used> <ramp-free>
format = <label>
label = %gb_used%/%gb_free%
label-foreground = #065279
; 用于 <ramp-used>
ramp-used-0 = ▁
ramp-used-1 = ▂
ramp-used-2 = ▃
ramp-used-3 = ▄
ramp-used-4 = ▅
ramp-used-5 = ▆
ramp-used-6 = ▇
ramp-used-7 = █
ramp-used-0-foreground = #aaff77
ramp-used-1-foreground = #aaff77
ramp-used-2-foreground = #aaff77
ramp-used-3-foreground = #aaff77
ramp-used-4-foreground = #fba922
ramp-used-5-foreground = #fba922
ramp-used-6-foreground = #ff5555
ramp-used-7-foreground = #ff5555
; 用于 <ramp-free>
ramp-free-0 = ▁
ramp-free-1 = ▂
ramp-free-2 = ▃
ramp-free-3 = ▄
ramp-free-4 = ▅
ramp-free-5 = ▆
ramp-free-6 = ▇
ramp-free-7 = █
ramp-free-0-foreground = #ff5555
ramp-free-1-foreground = #ff5555
ramp-free-2-foreground = #fba922
ramp-free-3-foreground = #fba922
ramp-free-4-foreground = #aaff77
ramp-free-5-foreground = #aaff77
ramp-free-6-foreground = #aaff77
ramp-free-7-foreground = #aaff77
日期时间
; ===日期时间===
; https://github.com/polybar/polybar/wiki/Module:-date
[module/date]
type = internal/date
; 更新间隔, 默认: 1.0
interval = 1.0
format = <label>
date = %Y-%m-%d%
time = %H:%M
; 另一种格式
date-alt = %A, %d %B %Y
time-alt = %H:%M:%S
label = %date% %time%
label-font = 1
label-foreground = #eefafafa
声音
; ===音量===
; https://github.com/polybar/polybar/wiki/Module:-pulseaudio
[module/alsa]
type = internal/alsa
sink = alsa_output.pci-0000_12_00.3.analog-stereo
use-ui-max = true
interval = 5
format-volume = <ramp-volume> <label-volume>
label-muted =
label-muted-foreground = #a1afc9
ramp-volume-0 =
ramp-volume-1 =
ramp-volume-2 =
; 左右键功能,pavucontrol 用于开关音量
click-left = pavucontrol
; click-middle =
电源
; ===电源提示===
; https://github.com/polybar/polybar/wiki/Module:-battery
[module/battery]
type = internal/battery
; 电量大于 99% 显示充电完成
full-at = 99
; 使用以下命令列出电池和适配器:
; ls -1 /sys/class/power_supply/
battery = BAT1
adapter = ACAD
poll-interval = 3
; 时间过格式,默认: %H:%M:%S
time-format = %H:%M
; 充电
format-charging = <animation-charging> <label-charging>
; 放电
format-discharging = <ramp-capacity> <label-discharging>
; 充电完成
format-full = <label-full>
; 充电状态
label-charging = %percentage%(%time%)
; 放电状态
label-discharging = %percentage%(%time%)
;充电完成
label-full = %percentage%
label-full-foreground = #aaff77
ramp-capacity-0 =
ramp-capacity-1 =
ramp-capacity-2 =
ramp-capacity-3 =
ramp-capacity-4 =
ramp-capacity-0-foreground = #ff461f
ramp-capacity-1-foreground = #eaff56
ramp-capacity-2-foreground = #bddd22
ramp-capacity-3-foreground = #7bcfa6
ramp-capacity-4-foreground = #3de1ad
bar-capacity-width = 10
animation-charging-0 =
animation-charging-1 =
animation-charging-2 =
animation-charging-3 =
animation-charging-4 =
animation-charging-0-foreground = #ff461f
animation-charging-1-foreground = #eaff56
animation-charging-2-foreground = #bddd22
animation-charging-3-foreground = #7bcfa6
animation-charging-4-foreground = #3de1ad
; 动画帧率(毫秒)
animation-charging-framerate = 750
;animation-discharging-0 =
;animation-discharging-1 =
;animation-discharging-2 =
;animation-discharging-3 =
;animation-discharging-4 =
; 动画帧率(毫秒)
;animation-discharging-framerate = 500
截图
图形界面的截图工具太冗余了,所以使用maim作为命令行截图工具,再加上i3的快捷键设置即可
# 其中$(date +%s)是自1970年以来经过的秒数,所以独一无二并且易排序,需要安装xdotool残能截取当前活动窗口
maim -i $(xdotool getactivewindow) $HOME/Pictures/Screenshot/$(date +%s).png # 截取当前活动窗口
maim $HOME/Pictures/Screenshot/$(date +%s).png # 全屏截图
maim -s $HOME/Pictures/Screenshot/$(date +%s).png # 自己选取截图区域
Ranger
首先运行ranger --copy-config=all
生成配置文件
编辑配置修改配色方案:
# Which colorscheme to use? These colorschemes are available by default:
# default, jungle, snow, solarized
set colorscheme solarized
一堆杂七杂八的软件(无需配置)
ristretto # 图片查看
vlc # 视频播放
firefox # 浏览器
typora # markdown编辑器,Linux下永久免费
pandoc # 文件转换
netease-cloud-music # 网易云
bat # cat的替代品
thunar # 文件管理器(虽然很少用)
neofetch # 用来展示系统信息的
ncdu # 磁盘空间查看
xclip # 用来与剪切板交互
arch-install-scripts # 用于安装arch
附上我的i3截图:
i3