标签归档:ArchLinux

Archlinux KDE Apache JMeter 配置高分屏缩放

ArchLinux 下安装 jmeter 很简单:

yay -S jmeter

但是在现代高分辨率显示器下 GUI 的字体和图标都很小 :

JMeter 缩放前

TL;DR

查阅文档后发现只需带有一个参数运行即可:

JVM_ARGS="-Dsun.java2d.uiScale=200%" jmeter

也可以把这个参数写入启动脚本中:

➜  which jmeter    
/usr/bin/jmeter  
➜  sudo vi /usr/bin/jmeter
#! /bin/sh
...
JVM_ARGS="-Dsun.java2d.uiScale=200%"
...

再启动就可以了:

JMeter 缩放后

KDE 下效果还不错。

其他平台处理方法类似,注入变量启动即可。

References

ArchLinux pacman 一键找到最快的镜像源清单

curl -s "https://archlinux.org/mirrorlist/?country=CN&protocol=https&use_mirror_status=on" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 5 -

运行这个命令,即可自动从 archlinux 官方 mirror 清单获取中国 (CN) 的镜像清单,并调用 rankmirrors 测速得到速度最快的前5个。

配置到 /etc/pacman.d/mirrorlist 目录中即可使用。

References

ArchLinux 休眠到交换文件

来源: ArchLinux 休眠到交换文件

Linux 使用交换分区来休眠,首先冻结所有进程并申请足够的交换内存(位于磁盘),把当前内存都存进去。 然后下次启动时,initramfs 会直接加载上次休眠时的内存状态,跳过内核的 init 过程。 因此首先需要有足够大的交换分区或交换文件;再把内核指向到休眠的分区上;最后再配置 initramfs 让它加载休眠的内存文件。 官方文档请参考 Power_management/Suspend_and_hibernate#Hibernation, 本文细述如何休眠到交换文件,并对其中一些概念和细节进行了解释。

在本文讨论的范围内, 挂起(suspend)是指冻结当前的进程,保留它们的内存,并把几乎除了内存之外的设备都断电。 休眠(hibernate)是指把挂起后的内存写入磁盘并完全关机。 锁定(lock)则只是显示一个模态的全屏软件输入正确的密码才能退出。

交换文件

安装系统 前需要创建交换分区,现在的机器普遍内存较大不太需要交换分区来扩展内存空间, 而且磁盘一般使用读写快速但读写次数有限 SSD,因此我的交换分区也很小根本不够用来休眠。

你可以通过 swapiniss 来让你的交换分区只用于休眠。

所以我们用交换文件来替代交换分区,在创建交换文件之前首先需要知道系统休眠需要多大空间。 可以从 sysfs 来看查看:

cat /sys/power/image_size

可以参考 [官方教程][https://wiki.archlinux.org/index.php/Swap#Swap_file] 来创建:

按照你需要的大小创建,bs * count 是最终文件大小
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
chmod 600 /swapfile
# 检查大小和权限
ls -l /swapfile

# 初始化交换文件并立即应用到系统
mkswap /swapfile
swapon /swapfile

# 在 /etc/fstab 中写入以下内容,交换文件会在重启后生效
/swapfile none swap defaults 0 0

重启后通过 swapon -s 来检查是否生效:

> sudo swapon -s
Filename    Type    Size     Used    Priority
/swapfile   file    12582908    0    -2

让内核找到交换文件

我们需要设置 resume 和 resume_offset 两个内核参数,告诉内核在挂起时把内存写入到哪里。

  • 第一个参数是交换文件所在的磁盘分区,可以用任何 fstab 中接受的名字格式。比如 resume =/dev/sda1,或者 resume = UUID = xxx。如果你在上一步中创建的交换文件和 / 在同一分区下,可以复制已有的 root 内核参数的值。
  • 第二个参数是交换文件的偏移量,就是它在分区中的什么位置。因此这个参数给交换文件用的,如果是交换分区则不需要填写。可以通过 filefrag -v /swapfile | awk '{ if($1=="0:"){print $4} }' 命令得到。

可以通过 cat /proc/cmdline 来查看当前的内核参数,但是在哪里设置取决于你的 Boot Loader。 以 rEFInd 为例,打开 /boot/refind_linux.conf 写入 resume 和 resume_offset:

"Boot with standard options" "ro root=/dev/sda3 resume=/dev/sda3 resume_offset=3192832"

重启后用 journalctldmesg 来找到写入休眠镜像的日志:

Oct 19 13:57:56 harttle.arch.mac kernal: PM: Creating hibernation image:
Oct 19 13:57:56 harttle.arch.mac kernel: PM: Need to copy 596422 pages
Oct 19 13:57:56 harttle.arch.mac kernel: PM: Normal pages needed: 596422 + 1024, available pages: 1477067

如果看到这样的错误说明设置有误,请检查你交换文件所在分区和 filefrag 给出的偏移量:

Oct 19 13:57:56 harttle.arch.mac kernal: PM: Image not found (code -22)

让 initramfs 加载休眠的内存

initramfs 是由 Boot Loader 直接加载的一个早期的用户空间,其中已经加载了一些内核模块。 它会进行设备初始化、挂载文件系统、运行磁盘检查等工作,之后再交给内核的 init 过程。 加载休眠的内存也是它的工作,但 ArchLinux 默认并未开启,需要去 /etc/mkinitcpio.conf 中添加 resume 钩子:

HOOKS=(base udev resume autodetect modconf block filesystems keyboard fsck)

注意因为 resume 参数用到了磁盘设备名称,resume 需要写在 udev 之后。 然后重新编译 initramfs(就像更新内核时一样):

默认使用当前系统的内核,如果你现在位于启动盘的系统则需要指定宿主环境上的内核版本。
mkinitcpio -p linux

至此配置工作都完成了,通过 systemctl hibernate 来休眠,再按下电源键开机来检查休眠功能是否正常。

开着盖子无法挂起

MacBook Pro 的显示器盖子开着默认会阻止挂起,可能会出现挂起屏幕变黑后立即结束挂起。 这是因为显示器盖子默认可以唤醒休眠,在 /proc/acpi/wakeup 中可以查看哪些设备可以唤醒,其中 LID0 是显示器盖子:

> cat /proc/acpi/wakeup 
Device  S-state   Status   Sysfs node
P0P2      S3    *disabled
EC    S4    *disabled  platform:PNP0C09:00
HDEF      S3    *disabled  pci:0000:00:1b.0
RP01      S3    *enabled   pci:0000:00:1c.0
RP02      S3    *enabled   pci:0000:00:1c.1
RP03      S3    *enabled   pci:0000:00:1c.2
ARPT      S4    *disabled  pci:0000:03:00.0
RP05      S3    *enabled   pci:0000:00:1c.4
RP06      S3    *enabled   pci:0000:00:1c.5
XHC1      S3    *enabled   pci:0000:00:14.0
ADP1      S4    *disabled  platform:ACPI0003:00
LID0      S4    *enabled  platform:PNP0C0D:00

我们可以 echo LID0 > /proc/acpi/wakeup 来更改它的状态,然后再试休眠。 我们希望它的状态默认就是 disabled,需要一个这样的 systemd 服务:

[Unit]
Description=Disable LID0 wakeup triggers in /proc/acpi/wakeup

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo LID0 > /proc/acpi/wakeup"
ExecStop=/bin/sh -c  "echo LID0 > /proc/acpi/wakeup"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

把它添加到 /etc/systemd/system 并启用即可。

自动休眠

自动休眠和其他电源管理功能,由很多不同的软件和配置方式来实现。为避免混淆先介绍几个常见的软件:

systemd-logind:ArchLinux 的默认安装包含了 systemd,其中的 systemd-logind 是自动启用的。 它包含了一些非常简单的电源管理功能,比如按下电源按钮时关机、笔记本合上盖子时挂起。 因此 ArchLinux 装好之后就基本可以用了。

acpidacpid 是一个比较基础的电源管理工具,工作方式是响应 ACPI 事件,做相应的处理比如关机还是休眠。注意 acpid 只是电源管理工具,ACPI 是设备配置接口跟它没关系。

dpmsdpms 是 xorg 提供的显示器电源管理服务,用来控制显示器关闭等动作。有 standby, suspend, off 等阶段,跟 systemd 事件一样需要有人来订阅(比如 xss-lock)才能执行具体操作。可以通过 xorg.conf 的 StandbyTime, SuspendTime, OffTime 等来配置,也可以在运行时用 xset s 来配置。

tlptlp 是一个比较无脑的电源管理工具,提供类似电池模式、电源模式、性能优先这样级别的配置。

xss-lock, xidle, xautolock:这些是 X11 下的工具用来在用户无操作时执行挂起等操作,有些还会监听 ACPI 事件,这样在 suspend 时屏幕也能锁定。

无操作自动休眠

自动休眠和自动挂起需要桌面环境(DE)或者 X11 软件的支持。 如果你在用 Gnome 或 KDE 在控制面板中配置后,会把 idle 信息报告给 systemd-logind,后者接管具体操作。

如果你像 Harttle 一样没有桌面系统和登录管理器的话, 需要安装一个类似 xss-lock, xidle 这样的工具来靠 X11 事件计时, 然后调用 systemctl hibernatesystemctl syspend

先挂起后休眠

合上盖子后 systemd-logind 的默认行为是挂起,可以在 /etc/systemd/logind.conf 中把它重新设置为休眠,或先挂起再休眠:

HandleLidSwitch=suspend-then-hibernate

挂起后休眠前的时间可以在 /etc/systemd/sleep.conf 中设置:

HibernateDelaySec=15min

除了合上盖子之外,其他场景也可以直接调用 systemctl suspend-then-hibernate

电量低自动休眠

这件事情需要具体的软件来做,或者直接安装 tlp 并启动 tlp, tlp-sleep 两个 systemd 服务。 下面提供一个简单的 udev 规则,在电量小于等于 5% 时休眠:

SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[0-5]", RUN+="/usr/bin/systemctl hibernate"

把它写入 /etc/udev/rules.d/99-lowbat.rules,重启即可生效。

References

ArchLinux 快速本地部署 DeepSeek

在 ArchLinux 下借助 Ollama 可以快速运行一个小参数体量的 DeepSeek 本地模型,在我的环境上 纯 CPU 推理也可以获得很快的体验。

安装环境

一行命令即可装好 ollama

$ sudo pacman -S ollama

模型

ollama 的 DeepSeek-R1模型页面 可以看到可拉取的模型,包括全量的 671b 模型,以及精炼的小模型表现同样出色。:

  • DeepSeek-R1
  • DeepSeek-R1-Distill-Qwen-1.5B
  • DeepSeek-R1-Distill-Qwen-7B
  • DeepSeek-R1-Distill-Llama-8B
  • DeepSeek-R1-Distill-Qwen-14B
  • DeepSeek-R1-Distill-Qwen-32B
  • DeepSeek-R1-Distill-Llama-70B

模型能力统计

运行

首先打开一个 终端,运行 ollama 服务端

$ ollama serve  
2025/02/18 14:57:36 routes.go:1187: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0  
OLLAMA_HOST:http://127.0.0.1:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_KV_CACHE_TYPE: OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/home/songtianlun/.ollama/models OLLAMA_MULTIU  
SER_CACHE:false OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.  
0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://* vscode-webview://*] OLLAMA_SCHED_SPREAD:false ROCR_VISIBLE_DEVICES: http_proxy: https_proxy: no_proxy:]"  
time=2025-02-18T14:57:36.900+08:00 level=INFO source=images.go:432 msg="total blobs: 11"  
time=2025-02-18T14:57:36.900+08:00 level=INFO source=images.go:439 msg="total unused blobs removed: 0"  
time=2025-02-18T14:57:36.900+08:00 level=INFO source=routes.go:1238 msg="Listening on 127.0.0.1:11434 (version 0.5.7)"  
time=2025-02-18T14:57:36.901+08:00 level=INFO source=routes.go:1267 msg="Dynamic LLM libraries" runners="[cpu cpu_avx cpu_avx2]"  
time=2025-02-18T14:57:36.901+08:00 level=INFO source=gpu.go:226 msg="looking for compatible GPUs"  
time=2025-02-18T14:57:36.944+08:00 level=INFO source=gpu.go:392 msg="no compatible GPUs were discovered"  
time=2025-02-18T14:57:36.944+08:00 level=INFO source=types.go:131 msg="inference compute" id=0 library=cpu variant=avx2 compute="" driver=0.0 name="" total="30.7 GiB" available="7.2 GiB"

不要关闭窗口,在另外一个 shell 窗口运行以下命令启动并使用 deepseek-r1:1.5b 模型:

$ ➜  ~ ollama run deepseek-r1:1.5b  
>>>    
Use Ctrl + d or /bye to exit.  
>>>    
Use Ctrl + d or /bye to exit.  
>>> hello  

<think>  

</think>  

Hello! How can I assist you today? 😊e  

>>>

也可以用 cherry-studio 之类的工具对接使用:

CherryStudio 配置截图

CherryStudio 运行截图

实测 1.5B 模型运行非常流畅,可根据实际情况同样的方法尝试其他更多模型。

其他操作

ollama 其他常用操作如下:

# 在命令行中运行模型
ollama run <模型名称>

# 列出可用模型
ollama list

# 查看模型状态
ollama ps

# 删除模型
ollama rm <模型名称>

# 启动 API 服务
ollama serve

更多详情参见各官网。

References

VirtualBox VERR_NO_LOW_MEMORY 解决

Archlinux 下内存有很多,但 VB 报错内存不足 VM 无法启动,free 可以看到内存大部分被 buffer 占用。

free -h
              total        used        free      shared  buff/cache   available  
内存:          30Gi        13Gi        1Gi       2.3Gi       18.7Gi        17Gi  
交换:          31Gi       1.7Gi        30Gi

论坛找到一种强制驱逐 buffer 占用的方法:

echo 3 > /proc/sys/vm/drop_caches

执行后可正常启动。

References

ArchLinux 图片压缩工具

在 Arch Linux 下有几个优秀的 PNG 图片压缩工具:

  1. OptiPNG
    
    # 安装
    sudo pacman -S optipng

使用示例

optipng -o5 image.png # o5 表示优化级别,范围是 0-7 c“`

  1. pngquant
    
    # 安装
    sudo pacman -S pngquant

使用示例

pngquant –quality=65-80 image.png # 设置质量范围在65-80之间


3. **Trimage**
- 这是一个带 GUI 界面的工具,可以同时压缩 PNG 和 JPEG
```bash
# 安装(从 AUR)
yay -S trimage
  1. oxipng
    
    # 安装(从 AUR)
    yay -S oxipng

使用示例

oxipng -o 4 image.png # o4 表示优化级别,范围是 0-6


个人推荐:
- 如果喜欢命令行,推荐使用 **optipng** 或 **pngquant**
  - optipng 无损压缩,但压缩率相对较低
  - pngquant 有损压缩,但压缩率高,且视觉效果通常很好
- 如果需要 GUI 界面,可以使用 **Trimage**

所有这些工具都可以通过 pacman 或 AUR 轻松安装。你也可以将它们结合使用,以获得最佳的压缩效果。

## OptiPNG

```bash
$ optipng -o5 10ti5a3.png 
** Processing: 10ti5a3.png
2345x1243 pixels, 4x8 bits/pixel, RGB+alpha
Reducing image to 3x8 bits/pixel, RGB
Input IDAT size = 2715319 bytes
Input file size = 2719369 bytes

Trying:
  zc = 9  zm = 9  zs = 0  f = 1         IDAT size = 2669468
  zc = 9  zm = 8  zs = 0  f = 1         IDAT size = 2664950
  zc = 9  zm = 9  zs = 1  f = 1         IDAT size = 2636506
  zc = 9  zm = 8  zs = 1  f = 1         IDAT size = 2634703
  zc = 9  zm = 9  zs = 0  f = 2         IDAT size = 2460587
  zc = 9  zm = 8  zs = 0  f = 2         IDAT size = 2454191
  zc = 9  zm = 9  zs = 0  f = 4         IDAT size = 2337037
  zc = 9  zm = 8  zs = 0  f = 4         IDAT size = 2332616
  zc = 9  zm = 9  zs = 1  f = 4         IDAT size = 2294549
  zc = 9  zm = 8  zs = 1  f = 4         IDAT size = 2289899
  zc = 9  zm = 9  zs = 3  f = 4         IDAT size = 2279697

Selecting parameters:
  zc = 9  zm = 9  zs = 3  f = 4         IDAT size = 2279697

Output IDAT size = 2279697 bytes (435622 bytes decrease)
Output file size = 2279775 bytes (439594 bytes = 16.17% decrease)

# optipng 会覆盖原始文件,这里仅展示大小对比
$ ls -lha 10ti5a3*
-rw-r--r-- 1 songtianlun songtianlun 2.2M 11月22日 09:46 10ti5a3-c.png
-rw-r--r-- 1 songtianlun songtianlun 2.6M 11月22日 09:46 10ti5a3.png

pngquant

$ pngquant --quality=65-80 10ti5a3.png
$ ls -lha 10ti5a3*
-rw-r--r-- 1 songtianlun songtianlun 2.2M 11月22日 09:46 10ti5a3-c.png
-rw-r--r-- 1 songtianlun songtianlun 987K 11月22日 09:50 10ti5a3-fs8.png
-rw-r--r-- 1 songtianlun songtianlun 2.6M 11月22日 09:46 10ti5a3.png

Trimage

Trimage 软件截图

效果类似 OptiPNG,灵活性不及,好在有 GUI,按需选择。

除此之外还有类似 tinypng 在线方案,也很好用。

#ArchLinux #GNU_Linux