ArchLinux 启动! Hyprland 启动! Genshin Impact 启动!

ArchLinux 启动! Hyprland 启动! Genshin Impact 启动!

RayAlto OP

废话

几年前我把我的 Intel NUC11 PAHi5 装上了 Sway ,这个机器只有一个 Intel Iris 核心显卡,所以 Sway 能正常工作是板上钉钉的,甚至还能中画质 40 帧左右畅玩原神。我的另一台 I + N 双显卡笔记本还在跑 Xorg + I3wm ,当时觉得 Sway 可太酷了,鼠标的那种 Responsive 真的让那时候的我很震撼,但看久了有点腻, I3wm 还能用 picom 之类的 compositor 整一点动画啥的,但 Sway 自己直接负责 compositing , Sway 可以调整的有:透明度、透明度…还有透明度,实在是枯燥,而且 Sway 还有一些其它问题,比如:

robot sticker: grudgingly1
  • zwp_text_input_v3 实现不完整,导致 Kitty 之类没有做 D-Bus 兼容的应用在使用输入法时不能显示后选词
  • 对于像我这样先买了 Nvidia 芯片,然后才知道社区对 Nvidia 的态度的普通用户不是特别友好

遇见 Hyprland

Hyprland 看板娘

当时选择 sway 主要是因为对比当时的 Wayland Compositor (Sway, river, Weston, wayfire) 得出了 Sway 是相对 feature-rich & stable 的一个,那时的 Hyprland 甚至没有一个开箱即用的 Status Bar , waybar 在当时需要 patch 才能配合 Hyprland 。

但现在不一样了, Hyprland 不光通过自己的 xdg-desktop-portal-hyprland 实现了很多其他 Compositor 没有的 feature 、 waybar 也支持了 Hyprland ,甚至我装完才发现 Hyprland 甚至实现了完整的 zwp_text_input_v3 ,在 kitty 里也可以正常使用输入法了。

Windows 11

闲得没事我又把电脑上的 Windows 10 扬了装了个 Windows 11 ,实话实说我是后悔的,当时不如搭个脚。

robot sticker: shit

估计是地区选择中国的原因,装好后联网(此处省略“跳过登录”过程 114514 个字), Windows 自动安装了微软电脑管家,我操你妈,设计这个功能的人是不是自己的母亲出去卖赚的钱不够自己出去嫖了,来这里发癫。

任务栏宽的一批,我又不是触摸屏,还改不成以前的那种窄的。这还不算难受,最逆天的是任务栏位置还改不了,我平时都放在左侧,它现在宽的一坨在下面把我本来就嫌宽的 16:9 的屏幕弄得更宽了。 UX 团队能不能死一死啊?

新的文件管理器也是丑的一批,内容密度低到让我有一种幼教软件的感觉,这时我发现在某个狗屎菜单里有“紧凑模式”什么的,我大喜之后发现被骗了,只有 nobody gives a shit 的地方变得紧凑了,它的额头、它的没什么营养的工具栏都和他妈的逼一样松松垮垮,整体内容密度跟食堂里卖的粥一样。 UX 你好,没活可以搭个脚,没必要来这咬打火机。

右键菜单脱裤子放屁,我都点右键了,不就是为了进行更详细的操作吗?现在这个菜单只有几个快捷键都能实现的基础操作,虽然外观好看了一点,那也只是有设计感的一坨屎而已。

Windows Defender 拒绝被禁用,之前用策略组可以关闭 Defender ,现在关掉之后 Windows Defender 会把“<禁用 Windows Defender >被启用”作为高危威胁汇报给你,然后自动解除禁用。谢谢你,我操你妈。

1. 硬件环境

我的笔记本是神船 Z7-KP7EC ,买的时候属于自认为很懂,买了神船,但实际上买的却不是准系统一类真正香的机型,而是一个显卡和 CPU 都是 BGA 上去的,甚至 CPU 都不是桌面端的。 CPU 是 Intel I7 8750h ,带一个 UHD 630 核显,独立显卡是 Nvidia GTX 1060 。

robot sticker: sad

我的目的是用核心显卡运行 Hyprland 和 Firefox 之类的轻量级应用,然后用独立显卡运行原神之类的游戏。

2. ArchLinux ,启动!

ArchLinux 看板娘

这里当然要选择 Linux 中的原神 ArchLinux ,安装还是那几件事:联网、同步时间、磁盘分区、格式化、挂载、安装软件、设置时区、语言、配置用户等 。这次安装了的软件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# ===== Linux =====
base base-devel intel-ucode linux-firmware linux-zen linux-zen-headers

# ===== 图形 =====
intel-gpu-tools intel-media-driver libva libva-mesa-driver mesa mesa-utils
nvidia-dkms nvidia-prime v4l2loopback-dkms vdpauinfo vulkan-intel vulkan-tools
glfw-wayland lib32-nvidia-utils lib32-vulkan-intel

# ===== 音频 =====
alsa-utils helvum pipewire pipewire-alsa pipewire-jack pipewire-pulse
pipewire-zeroconf

# ===== 网络 =====
dhcpcd hostapd ifplugd inetutils iwd netctl openresolv wireless-regdb wpa_supplicant bind

# ===== 蓝牙 =====
bluez-utils

# ===== 维护 =====
chntpw cifs-utils dialog dmidecode dosfstools efibootmgr evtest gparted gperf
grub hdparm ntfs-3g openssh os-prober pacman-contrib usbutils
arch-install-scripts

# ===== 桌面环境 =====
bemenu-wayland hyprland hyprpaper kvantum kvantum-theme-materia lxappearance
lxsession-gtk3 mako materia-gtk-theme papirus-icon-theme pcmanfm-gtk3 polkit
qt5-wayland qt5ct qt6-wayland qt6ct waybar wf-recorder wl-clipboard wtype
xcursor-vanilla-dmz-aa xdg-desktop-portal xdg-desktop-portal-gtk
xdg-desktop-portal-hyprland xdg-user-dirs xorg-xwayland

# ===== 日常 =====
aria2 atril brightnessctl btop ffmpeg firefox gimp grim imagemagick imv inkscape
kdenlive kitty kooha krita mpv ncdu neofetch nginx obs-studio openbsd-netcat
p7zip pandoc-cli perl-image-exiftool ranger rsync slurp texlive-bin thunderbird
tmux traceroute tree unrar unzip virt-manager websocat wev wget whois wine zip
zsh zsh-autosuggestions zsh-completions zsh-history-substring-search
zsh-syntax-highlighting yt-dlp zxing-cpp

# ===== 开发相关 =====
gdb git jq man-db man-pages moreutils texinfo bear clang cmake go gtkmm-4.0
jdk-openjdk jdk17-openjdk jupyterlab libvirt libwebsockets libzip neovim nodejs
npm opencv pyright python-beautifulsoup4 python-jupyter-server-terminals
python-matplotlib python-opencv python-pylint python-pymupdf python-pynvim
python-requests qemu-base qrencode rust rust-analyzer tldr valgrind yapf yarn

# ===== 输入法 =====
fcitx5-im fcitx5-anthy fcitx5-chinese-addons fcitx5-material-color
fcitx5-pinyin-zhwiki

# ===== 游戏 =====
gameconqueror gamemode gamescope lib32-gamemode steam

# ===== 字体 =====
$(pacman -Ssq adobe-source) $(pacman -Ssq noto-fonts) ttf-fantasque-nerd
terminus-font

之前一直在用 yay 作为 AUR Helper ,最近发现了 paru 还挺好用的

2.1. netctl-auto 没有调用 resolvconf

使用 netctl-auto 自动管理无线网络时经常遇到 DNS 没有被自动配置好的情况(尤其是设置了静态 IP ),这时要手动调用 resolvconf 更新 /etc/resolv.conf

1
echo 'nameserver <你的DNS>' | resolvconf -a <你的网络适配器>

比如我使用我家路由器作为默认 DNS ,网络适配器为 wlan0

1
echo 'nameserver 10.10.10.1' | resolvconf -a wlan0

2.2. TTY 自动登录

ArchLinux 默认使用 agetty 作为 getty ,通过 systemd drop in 配置文件可以实现某个 TTY 的自动登录,比如我的用户名为 rayalto ,我想要 TTY1 自动为我登录:

1
systemctl edit getty@tty1 --drop-in=autologin

像这样写:

1
2
3
[Service]
ExecStart=
ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin rayalto %I $TERM

2.3. Fcitx5 启用云拼音

Fcitx5 是支持云拼音的,我的安装下可用的有 Baidu, Google, GoogleCN

Fcitx 配置云拼音的截图

它甚至考虑到使用中文的大多是哗人,这个选项下面就可以配置 Proxy ,在我测试下比较好用的是 Baidu ,但使用频率一旦高起来经常会出现刷不出候选词的情况。

3. Hyprland ,启动!

ハ イ パ ー

我配置的 Hyprland 桌面截图

Hyprland 跟 Sway 不一样,它有更多 graphical 的东西,比如:模糊、圆角、动画、阴影、渐变色等等。虽然不及 Wayfire 华丽,我觉得也是比较好看的一档了。

3.1. Hyprland 配置

Hyprland 配置文件的语法比较奇特, # 后面表示注释, ## 表示实际的单个 # (比如某些命令行要传 Hex Color 可以写成 ##RRGGBBAA ), $key = val 可以定义变量, key = val1[, val2, ...] ,表示某个规则,一些规则又属于某个分类,要放进 key { ... } 里,但总体来说配置文件比 Sway/I3wm 灵活一些,只是不太好看,详细文档在 wiki.hyprland.org 。我的配置文件:

点击展开:我的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# 我的电脑下 card1 为 Intel 核显、 card0 为 Nvidia 独显,这行使 Hyprland 默认使用核显
env = WLR_DRM_DEVICES, /dev/dri/card1:/dev/dri/card0
# 修复外接显示器光标不显示的问题
env = WLR_NO_HARDWARE_CURSORS, 1

# 常用变量
$terminal = kitty
$filemanager = pcmanfm
$webbrowser = firefox
$mailmanager = thunderbird
$menu = bemenu-run --no-exec --bottom --prompt ' :' --fn 'FantasqueSansM Nerd Font 14' --fbb '##ffffff00' --ab '##ffffff00' --tb '##2b303b80' --fb '##ffffff00' --cb '##ffffff00' --nb '##ffffff00' --hb '##64727d80' --sb '##ffffff00' --scb '##ffffff00' --fbf '##ffffff' --af '##ffffff' --tf '##ffffff' --ff '##ffffff' --cf '##ffffff' --nf '##ffffff' --hf '##ffffff' --sf '##ffffff' --scf '##ffffff' --hp 8 | xargs hyprctl dispatch -- exec --
$mod = SUPER

# 启动一次的命令
exec-once = /usr/bin/lxpolkit
exec-once = /usr/bin/fcitx5 -d -r
exec-once = /usr/bin/hyprpaper
exec-once = /usr/bin/waybar
exec-once = /usr/bin/gsettings set org.gnome.desktop.interface gtk-theme 'Materia-dark'
exec-once = /usr/bin/gsettings set org.gnome.desktop.interface icon-theme 'Papirus-Dark'
exec-once = /usr/bin/gsettings set org.gnome.desktop.interface cursor-theme 'Vanilla-DMZ-AA'

# 屏幕配置, eDP-1 是笔记本内屏, HDMI-A-1 为外接屏,以外接屏为准,内屏在外接屏右边
monitor = eDP-1, preferred, 1920x0, 1
monitor = HDMI-A-1, preferred, 0x0, 1

# 给两个屏幕分配默认的 workspace
workspace = 10, monitor:eDP-1, default:true
workspace = 1, monitor:HDMI-A-1, default:true

# 顾名思义
general {
border_size = 2
gaps_in = 2
gaps_out = 4
gaps_workspaces = 20
col.inactive_border = rgb(283048) rgb(859398) 30deg
col.active_border = rgb(7f7fd5) rgb(86a8e7) rgb(91eae4) 30deg
col.nogroup_border = rgb(ed213a) rgb(93291e) 30deg
col.nogroup_border_active = rgb(403a3e) rgb(be5869) 30deg
layout = master
resize_on_border = true
}

# 顾名思义
decoration {
rounding = 8
inactive_opacity = 0.75
drop_shadow = false
}

# 这贝塞尔可太贝塞尔了嗷
animations {
bezier = ease_out_back, 0, 0.9, 0.2, 1.2
#bezier = ease_out_quint, 0.2, 1, 0.3, 1
animation = global, 1, 4, ease_out_back
}

# 我还是更喜欢 master layout ,表示新窗口不要占 master 位置
master {
new_is_master = false
}

# 顾名思义
misc {
disable_hyprland_logo = true
animate_manual_resizes = true
animate_mouse_windowdragging = true
disable_autoreload = true # use `hyprctl reload`
}

# 禁用 Xwayland 的缩放,可以避免游戏之类 Xwayland 应用模糊,但我这里没有任何显示器设置了缩放,所以没啥用
xwayland {
force_zero_scaling = true
}

# 热键绑定
bind = $mod, Return, exec, $terminal
bind = $mod, D, exec, $menu
bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = , XF86MonBrightnessUp, exec, brightnessctl set 5%+
bindel = , XF86MonBrightnessDown, exec, brightnessctl set 5%-
#bindl = $mod, BackSpace, exec, sleep 1 && hyprctl dispatch dpms toggle
bind = $mod Shift, N, exec, makoctl dismiss -a
bind = $mod Shift, B, exec, killall -SIGUSR1 waybar
bindl = $mod Shift, Delete, exec, ~/.local/bin/hypr.toggle.monitors
bind = $mod Shift, Slash, exec, notify-send "$(hyprctl activewindow)"

bind = $mod, F1, exec, $filemanager
bind = $mod, F2, exec, $webbrowser
bind = $mod, F3, exec, $mailmanager
bind = $mod, BackSlash, exec, $terminal --title '󱞁 ' zsh -c 'nvim ~/Documents/note/note.md'
bind = $mod Shift, BackSlash, exec, $terminal --title ' ' sudo intel_gpu_top
bind = $mod, grave, exec, hyprpicker -f rgb -n -a

bind = $mod, F12, exec, grim
bind = $mod Control, F12, exec, grim -g "$(slurp)"
bind = $mod Shift, F12, exec, grim - | wl-copy
bind = $mod Control Shift, F12, exec, grim -g "$(slurp)" - | wl-copy

bind = $mod Shift, Q, killactive
bind = $mod Shift, Space, togglefloating
bind = $mod Shift, T, pin, active
bind = $mod Shift, F, fullscreen, 0
bind = $mod Shift, O, toggleopaque
bind = $mod Shift, End, exit

bind = $mod, H, movefocus, l
bind = $mod, L, movefocus, r
bind = $mod, K, movefocus, u
bind = $mod, J, movefocus, d

bind = $mod Control, H, swapwindow, l
bind = $mod Control, L, swapwindow, r
bind = $mod Control, K, swapwindow, u
bind = $mod Control, J, swapwindow, d

bind = $mod, 1, workspace, 1
bind = $mod, 2, workspace, 2
bind = $mod, 3, workspace, 3
bind = $mod, 4, workspace, 4
bind = $mod, 5, workspace, 5
bind = $mod, 6, workspace, 6
bind = $mod, 7, workspace, 7
bind = $mod, 8, workspace, 8
bind = $mod, 9, workspace, 9
bind = $mod, 0, workspace, 10

bind = $mod Shift, 1, movetoworkspace, 1
bind = $mod Shift, 2, movetoworkspace, 2
bind = $mod Shift, 3, movetoworkspace, 3
bind = $mod Shift, 4, movetoworkspace, 4
bind = $mod Shift, 5, movetoworkspace, 5
bind = $mod Shift, 6, movetoworkspace, 6
bind = $mod Shift, 7, movetoworkspace, 7
bind = $mod Shift, 8, movetoworkspace, 8
bind = $mod Shift, 9, movetoworkspace, 9
bind = $mod Shift, 0, movetoworkspace, 10

bindm = $mod, mouse:272, movewindow
bindm = $mod, mouse:273, resizewindow

# 一些窗口规则,这里比较蠢的是一行只能给符合条件的窗口设置唯一一个规则
windowrulev2 = float, title:󱞁
windowrulev2 = move 49% 4%, title:󱞁
windowrulev2 = size 50% 50%, title:󱞁
windowrulev2 = opacity 0.7, title:󱞁

windowrulev2 = float, title:
windowrulev2 = move 49% 4%, title:
windowrulev2 = size 50% 50%, title:
windowrulev2 = opacity 0.7, title:

# 不知道为啥,开机鼠标默认在笔记本内屏上,这样手动让鼠标回到 workspace 1
exec-once = hyprctl dispatch workspace 1

3.2. Nvidia 配置

Hyprland 文档里有一节 专门介绍了 Nvidia 的配置方式,里面是安装了 nvidia-dkms ,但其实不是必须 dkms 的,如果安装的内核是 linux 可以安装 nvidia 、如果安装的内核是 linux-lts 可以安装 nvidia-lts ,只需要在每次 nvidia 升级时手动重新生成 initramfs ,或者使用 Pacman Hook

nvidia-opennvidia-open-dkms 已经能在 Arch 官方源找到了,那个 Open Kernel Modules 真的能用了,可惜貌似只支持 20 系以上,但还是要给老黄点赞

这下 Torvalds 不得不给 Nvidia 点赞了

3.2.1. 过程

我使用 linux-zen 对应 header 为 linux-zen-headers ,因为是 custom 内核所以选择 nvidia-dkms

1
pacman -S linux-zen-headers nvidia-dkms

为了 Wayland 能正常工作,需要启用 DRM ,我采用 GRUB 作为 bootloader ,只需要在 /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT 加上 nvidia_drm.modeset=1 ,然后重新生成 grub.cfg

1
2
3
nvim /etc/default/grub
# 在 GRUB_CMDLINE_LINUX_DEFAULT 里加上 nvidia_drm.modeset=1
grub-mkconfig -o /boot/grub/grub.cfg

为了确保 Nvidia 驱动在 Hyprland 之前被加载,需要把 Nvidia 内核模块放进 initramfs 里,在 /etc/mkinitcpio.confMODULES 里加上 nvidia, nvidia_modeset, nvidia_uvmnvidia_drm ,然后刷新一下 initramfs 即可

1
2
3
nvim /etc/mkinitcpio.conf
# 在 MODULES 里加上 nvidia nvidia_modeset nvidia_uvm nvidia_drm
mkinitcpio -P

因为安装的是 nvidia-dkms ,这个包每次更新都会触发一次 initramfs 的更新,所以以后不需要手动更新。

还可以手动配置 Hyprland 使用的显卡

1
lspci | grep -E 'VGA|3D'

可以看到显卡对应 PCI 地址, /dev/dri/by-path/pci-<地址>.0-card<N> 对应的 N 就是显卡的 id ,我这里 card1 为核显, card0 为独显,配置第二行使 Hyprland 等默认核显:

1
env = WLR_DRM_DEVICES, /dev/dri/card1:/dev/dri/card0

这时外接一个屏幕就会发现外接屏上的光标是隐身的,上面 Hyprland 配置文件第四行就是为了解决这个问题

1
env = WLR_NO_HARDWARE_CURSORS, 1

除此之外,最好启用 nvidia-suspend, nvidia-hibernatenvidia-resume ,可以解决笔记本睡眠&休眠后唤醒导致独显花屏&不可用的问题:

1
2
3
systemctl enable nvidia-suspend
systemctl enable nvidia-hibernate
systemctl enable nvidia-resume

同时把 nvidia.NVreg_PreserveVideoMemoryAllocations=1 放进内核参数(比如 Grub 的 /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT )。

3.2.2. 仍然存在的问题

  1. 笔记本内屏完全没有问题,但外接屏上如果使用核显运行图形程序会掉帧,用 glxgears 测试,全屏能跑 47 帧左右,窗口能跑 33 帧左右(估计是因为 Hyprland 的透明度、渐变色边框之类的占用了一部分显卡资源);而使用独显,无论在哪个屏幕上运行图形程序都不会掉帧,都能跑满我垃圾屏幕的 60 刷新率。

在外接屏上分别用核显和独显跑 glxgears 的结果

这个说法有问题,昨天晚上我在内屏挂崩铁刷遗器的时候发现外接屏上的直播异常丝滑,这时候用核显在外接屏运行 glxgears 能稳定 60 帧了,我觉得可能是因为我的电脑 HDMI 接口因为是与独显直连的,所以独显功率上去了之后核显在这边的输出也能更高效了?不是很确定问题在哪里

2024.03.20 14:23:18 在 hyprland 升级到 0.37.1-1 后, glxgears 用核显在外接屏上也能跑 60 帧了,但其他的东西比如 hyprland 自己的动画、 firefox 运行 UFO 测试依然只能 30 帧出头,感觉后面 hyprland 可以完全修复这个问题

  1. initramfs 非常大,我这里 initramfs 有 144Mb , initramfs-fallback 有 202Mb ,我给 EFI 分区分了 512Mb 有时候都不太够,要手动删掉旧版 initramfs 再更新。

  2. 窗口切换后 Fcitx 有概率失去焦点,目前没弄明白怎么百分百复现,所以也没办法确定问题在哪。

3.2.3. 相比 Windows 的优点

纯纯个人观点,不包含客观评价

你让它优先核显,它绝对不会碰独显一下。我在 Windows 上运行一个游戏,再想用核显看直播时 Windows 就不能满足我, Windows 非要自以为是的都用独显(即使你在图形设置里把浏览器设置为优先核显),导致我本来就性能堪忧的 GTX 1060 的表现雪上加霜。

我觉得渲染游戏画面更加“鲜艳”了,不知道是不是跟 DXVK 有关,感觉整体色彩更有活力了,看久了显得 Windows 上死气沉沉的。

我觉得性能释放更好了, watch -n 1 nvidia-smi 监测显卡情况发现真的没有其他应用在占用独显,只有游戏和 Hyprland 躺在里面,而且 Hyprland 只占了一点显存,完全没占运算能力,在 Windows 上开 1.2 精度卡的一批的崩铁在 Hyprland 上不卡了。

4. 原神,启动!

为了可持续发展,这里不标明任何项目的名字、地址

互联网上的某处存在着一个 Patch ,可以扬了米家游戏的反作弊,以实现 Wine + DXVK 运行米家游戏,如果嫌麻烦的话,现在互联网上某处还存在着一个“冻鳗游戏们的启动器”,可以帮你完成这些步骤。下面是我在 Hyprland 上运行米家游戏的截图:

冻鳗游戏们的启动器的运行截图
Hyprland 运行原神的截图

嘿嘿嘿🤤纳西妲的小脚一定是软软的🤤嘿嘿嘿,还有一股花草的清香🤤

总结

怎么嗦呢,我有了一个丐版 NAS 之后弄了一个 Windows 10 LTSC 虚拟机专门用来运行 QQ 、网易云音乐、百度网盘之类的毒瘤,本来这台电脑装 Windows 基本就只是为了原,现在原也能在 Linux 上用我的 GTX 1060 玩了(之前在 NUC11 PAHi5 上玩因为 Intel Iris 核显性能不够),感觉可以把 Windows 彻底删掉了。