这是一次惨痛的经历,我的Arch在更新之后之后出现了无法关机的问题,并且我采用了不正确的方法处理——强制断电。最终的结果就是数据没有写入导致系统文件丢失。

于是我不得不重装一遍我的Arch,刚刚才写完Arch的配置篇没想到就用上了,但发现其实远远不够,许多配置根本想不起来了,所以谨以此文记录我的Arch重生之路的配置,以免下次又发生这样的惨剧。(系统更新后那一次非正常关机的问题仍无法解决,不过只存在在我的Arch上,大家不用担心)

下面描述一下重新配置的经过。(同样,下面引文不加说明均来自ArchWiki)

系统层面

The initial ramdisk

初始内存盘本质上是一个很小的运行环境(早期用户空间),用于加载一些核心模块,并在 init 接管启动过程之前做必要的准备。有了这个环境,才能支持加密根文件系统、RAID上的根文件系统等高级功能。mkinicpio 支持自定义的钩子扩展、运行时自动检测以及其他功能。

/etc/mkinitcpio.conf有关HOOK的修改
HOOKS=(base udev block keyboard autodetect modconf filesystems fsck)

Pacman

mirrorlist

/etc/pacman.d/mirrorlist 保留源
Server = https://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch
Server = http://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch

conf

/etc/pacman.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提供了两种安装方法:

Install oh-my-zsh via curl
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Install oh-my-zsh via wget
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键在命令前加上sudoz是快速目录跳转

用户权限

sudo

增加sudo权限的正确方法是使用visudo

sudo的配置文件是/etc/sudoersvisudo会锁住sudoers文件,保存修改到临时文件,然后检查文件格式,确保正确后才会覆盖sudoers文件。必须保证sudoers格式正确,否则sudo将无法运行。

简单来说,使用visudo就是在文件保存是会检查文件格式

visudo调用的默认编辑器是vi。官方仓库里的 sudo 编译时开启了--with-env-editor,会采用环境变量 VISUALEDITOR的设置。如果设置了VISUAL 就不会使用EDITOR

如果要临时使用其他编辑器,在该命令前加上EDITOR环境变量即可。例如,要使用 nano,用root运行以下命令:

EDITOR=vim visudo
/etc/sudoers
%wheel      ALL=(ALL) NOPASSWD: ALL 	# 去掉其注释,是wheel组的用户有sudo权限

polkit

Polkit 在系统层级进行权限控制,提供了一个低优先级进程和高优先级进程进行通讯的系统。和 sudo 等程序不同,Polkit 并没有赋予进程完全的 root 权限,而是通过一个集中的策略系统进行更精细的授权。

我们在刚安装好Arch的时候,关机需要sudo poweroff,但是用了一会之后就发现突然不用sudo了,因为图形化环境CinnamonDeepinGNOMEGNOME FlashbackKDELXDELXQtMATE、theShell 和 Xfce 各自都已有认证组件——也就是对于的polkit。

但是,我这次只使用i3wm作为桌面环境,所以需要pacman -S polkit以获取权限(包括在图形化界面使用NetworkManager的权限)

grub

取消grub默认的静默启动和关机,便于出现问题时捕获。找到下面这一行,去掉quiet参数

/etc/default/grub
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为中文输入法的引擎

设置以下环境变量,并重新登录:

~/.pam_environment
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的配置文件中加入

~/.asoundrc
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)

启动

~/.config/polybar/launch.sh
#!/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,在创建文件

/etc/udev/rules.d/backlight.rules
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生成配置文件

编辑配置修改配色方案:

~/.config/ranger/rc.conf
# 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截图:

i3i3