持续更新中的稀奇古怪技巧

或许家家都有本难念的经,而在我的电脑上常常有些奇怪的问题或需求。为了这样的内容单独写一篇文章真的很逊,但如果不找个地方记下来又怕哪日再寻找时完全忘记了。

不如在这里将这些奇怪的内容整理在一个页面中,方便快速搜索查找。

应用程序篇

Firefox强制启用阅读视图/打印简化版本

打印Firefox浏览器渲染的网页时,有时可以看到“格式”下存在一个 “精简” 选项,这个选项通常可以把网页的主要内容提炼出来,以紧凑的布局打印,效果还是很不错的。

然而,在有些网站上打开打印对话框时,并不能看到 “精简” 格式选项,这是因为,该选项实际上是先将网页渲染为Firefox的阅读视图再进行打印,而一部分网页并不能被Firefox自动识别并排版为阅读视图,自然无法打印。

那,我们能否强制Firefox不管结果,直接渲染网页为阅读试图呢?答案是肯定的。下面提供两种方法。不过,丑话说前头,这些方法都无法保证网页渲染结果正常,因此渲染成功后还需要自行检查格式和内容。

不修改设置不安装插件

在地址栏中,直接在整个URL最前面添加前缀:about:reader?url=。例如,如果当前正在访问http://www.example.com/abc,那么应当修改地址栏中的URL为:

1
about:reader?url=http://www.example.com/abc

此时,就可以强制将URL后的网页渲染成阅读视图。

修改Firefox设置

在Firefox中访问about:config,搜索设置项reader.parse-on-load.force-enabled,设置成true(boolean),就可以让进入阅读模式的按钮一直出现在地址栏中。

打印

开心地按下Ctrl + P键打印吧。


虚拟化篇

QEMU/KVM便捷地创建桥接网络

有时候,我们希望把虚拟机暴露到局域网LAN中,方便局域网内其他机器访问。然而,在Debian系统上使用QEMU/KVM虚拟化技术,配合libvirt,其默认创建的default网络是NAT模式的,不能满足以上要求。

目前网络上关于创建QEMU桥接网络的方法有很多,但通常很复杂,而且常常要求机器上有两个网卡。

问题在于,普通家用电脑上,通常很难找到两个同时连接到网络的网卡。

因此,这里推荐一种相对方便的,使用macvtap的桥接网络创建方法。

宿主机创建macvtap网络接口

在宿主机上使用以下命令创建一个macvtap网络接口:

1
nmcli connection add type macvlan dev eth0 mode bridge tap yes ifname macvtap0

其中,eth0是连接到网络,也就是虚拟机希望桥接到的网络的物理网卡接口。ifname后的macvtap0是可以任意指定的接口名称。

再执行以下命令:

1
2
nmcli connection modify macvlan-macvtap0 ipv6.method disabled
nmcli connection modify macvlan-macvtap0 ipv4.method disabled

根据前面接口名称的不同,modify后面的连接名称可能也有差异。

重新启动以上网络连接。

1
2
nmcli connection down macvlan-macvtap0
nmcli connection up macvlan-macvtap0

虚拟机连接到macvtap网络接口

打开virt-manager界面,修改虚拟机网卡NIC设置,网络类型选择Macvtap device。网络设备名称填写上面创建的接口名,例如macvtap0

保存后启动虚拟机,此时虚拟机就桥接连接到网卡所在网络中了。

宿主机和虚拟机的访问

macvtap的一大局限是,默认配置下,宿主机不能和虚拟机通过此网卡通信。即便分配到了局域网地址,宿主机访问虚拟机的局域网地址也是不通的。

为了允许宿主机也可以和虚拟机通信,一种解决方法是,额外在虚拟机上创建一个NIC,并连接到默认的NAT连接上。


Linux运维优化篇

Gnome应用列表按字母表排序

至今,我依然没有弄明白,GNOME的应用列表里,图标究竟遵循了怎样的排序规律。

或许翻阅源代码可以弄明白,但或许也不需要了,因为我更习惯按应用名称字母表排序。想要设置按字母表排序,只需要在命令行中执行以下命令即可:

1
gsettings set org.gnome.shell app-picker-layout "[]"

Debian系统列出可升级软件包所含Bug

前不久,Debian Testing更新内核版本号至6.10,导致默认软件源中的NVIDIA驱动535版本DKMS模块无法正常编译,我意识到:原来Debian Testing作为桌面系统也会产生严重Bug啊!

大家都知道,Debian软件包上发现的Bug,都会在Debian bug tracking system里被跟踪,但在近乎滚动更新的Debian Testing上,一次更新可能超过200个软件包,不可能一个个手动分开查询。

我们可以使用apt-listbugs工具完成这一操作。如果系统上没有,使用APT即可快速安装。

接着只需要执行以下命令,待更新的软件包中有哪些严重Bug就都知道了。

1
apt-listbugs -s critical,grave,serious list $(apt list --upgradable 2>/dev/null | awk -F/ '{print $1}' | grep -v "Listing" | tr '\n' ' ')

其中,-s参数指定了查询的Bug严重程度,默认就是上例中的critical,grave,serious,如果希望无论轻重列出所有Bug,只需要把这一串参数改成all即可。$()中的一大串是,将APT命令列出的可升级软件包列表格式化成apt-listbugs可接受的空格列表。

SSH Host Key遗忘

我,毋畏遗忘

虽然SSH Host Key在不可信网络上确实是验证SSH连接可信性的重要手段,但是,在会频繁刷新Host Key的如容器、虚拟机场景下,又显得不太方便。

然而,SSH并没有直接提供诸如“不记录本机Host Key”等功能,有一个选项StrictHostKeyChecking no,但其仍然会在Host Key不匹配时弹出大大的警告窗口。

这样的目标可以简单变通实现,只需要在 SSH Config 配置中设置 UserKnownHostsFile,将其指向黑洞即可。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
Host myserver
Hostname 192.168.1.2
Port 22
User root
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no

# Linux
# UserKnownHostsFile /dev/null

# Windows
UserKnownHostsFile \\.\NUL

Systemd限制用户计算资源

在多人使用的Linux服务器上,会遇到这样的情况:某些淘气的小伙伴把服务器资源都占满了,其他人完全无法使用,能不能做点限制呢?

限制用户CPU使用

假设服务器上一共有32个逻辑CPU(线程),如果有一个用户运行的程序将32个逻辑核全部吃满,会导致其他所有用户程序,即使是一些简单的小工作,都很难正常运行。

在这种时候,若希望保障其他用户进行小工作处理的能力,可以用Systemd对占满大量资源的用户进行限制。

在Systemd中,用户进程和服务都会受到user-<UID>.slice配置文件的管理。其中,就提供了计算资源限制相关的属性。

首先来看最简单的限制方法:限制用户使用的最大CPU时间。假设服务器上有32个逻辑核,可以只允许某一用户最多使用等价24个核的CPU计算时间。这样一来,CPU就有余力处理其他用户的请求。

1
2
3
USER_UID=$(id -u <限制目标用户名>)

sudo systemctl set-property "user-${USER_UID}.slice" CPUQuota=2400%

如果有需要,甚至可以把该用户的进程全部赶到前24个逻辑核上,这样其他用户就稳定地还有8个核可用,非常划得来。

1
sudo systemctl set-property "user-${USER_UID}.slice" CPUQuota=2400% AllowedCPUs=0-23

但这种方法会导致,即使没有其他用户使用服务器,被限制的用户也最多只能使用2400%的CPU时间,没法充分利用CPU算力资源。

而理想状态下,我们其实只是希望,要长时间高负载占用CPU的用户,能在其他用户使用时,稍微让出一条路,让其他用户的小工作能正常进行。

所以有第二种方法:限制用户的进程优先级

通过设置进程调度,可以将某个用户的进程优先级拉低,这样,其他用户进程会被分配更多时间片以保证交互流畅,而长时任务在没其他人时,依然可以满负载运行。

1
sudo systemctl set-property "user-${USER_UID}.slice" CPUQuota= CPUWeight=25 IOWeight=25

Linux默认的CPUWeight是100,权重越大,得到的CPU时间就越多。在这里,IOWeight也是同理,且IO优先级对一些程序的交互体验影响更加明显。

限制内存使用

假设系统总内存128G,若希望限制所有用户内存总使用量在限定范围内,杜绝OOM,可以试着这样操作:

1
sudo systemctl set-property user.slice MemoryHigh=96G MemoryMax=112G

实战中只拿来阻止过某个程序的 OOM Bug.

限制用户GPU访问

有时,资源管理也颇为无奈,曾遇到一个情况,已经脱离团队的人,却仍然在使用组内的GPU。

这时,其他成员急着用卡,碍于身份难以开口让其停止使用。而且,更不可能直接强制删除用户数据,再怎么说都要给人家下载数据的时间,怎么办呢?

能不能悄悄地把这名用户的GPU访问权限下掉,但同时保留正常的用户登录、文件访问权限呢?

这也可以通过Systemd设备管理实现。对于需要限制的用户,创建一个文件夹/etc/systemd/system/user-<UID>.slice.d/

1
mkdir /etc/systemd/system/user-${USER_UID}.slice.d

然后创建一个文件override.conf,填入以下内容:

1
2
3
4
5
6
7
8
# /etc/systemd/system/user-1001.slice.d/override.conf

[Slice]
DevicePolicy=closed

# Interactive terminals
DeviceAllow=/dev/tty rw
DeviceAllow=char-pts rw

实际上,这种限制等级比较高,对于该用户来说,不仅GPU无法使用,系统上位于/dev下的设备,包括未挂载的硬盘、USB等都无法访问。当然,在科学计算服务器上,普通用户往往也无需访问这些设备。

施加这一设置后,对被限制的用户来说,其运行nvidia-smi只会提示找不到GPU设备。同时,还不影响其访问/home路径下的数据,可以让其自行将数据导出带走。

密码强度设置

在Debian/Ubuntu下,怎么设置系统用户密码的最低强度标准?

首先需要安装libpam-pwquality包:

1
sudo apt install libpam-pwquality

然后编辑/etc/security/pwquality.conf文件,可参考文件注释进行调整:

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
# Number of characters in the new password that must not be present in the
# old password.
difok = 3

# Minimum acceptable size for the new password (plus one if
# credits are not disabled which is the default). (See pam_cracklib manual.)
# Cannot be set to lower value than 6.
minlen = 12

# The maximum credit for having digits in the new password. If less than 0
# it is the minimum number of digits in the new password.
dcredit = -1

# The maximum credit for having uppercase characters in the new password.
# If less than 0 it is the minimum number of uppercase characters in the new
# password.
ucredit = -1

# The maximum credit for having lowercase characters in the new password.
# If less than 0 it is the minimum number of lowercase characters in the new
# password.
lcredit = -1

# The maximum credit for having other characters in the new password.
# If less than 0 it is the minimum number of other characters in the new
# password.
ocredit = -1

上面的配置对应于以下密码强度约束:

  • 修改密码与原密码必须有3个字符以上不同
  • 密码最小长度为12字符
  • 密码必须包含大小写字母、数字、其他字符(标点)

快速设置命令特定的环境变量组

众所周知,在Linux中给普通应用设置环境变量,一般只需要在~/.bashrc等Shell配置文件中直接写export语句即可。

不过,有时候存在下面需求:

  1. 希望给不同的命令指定同名环境变量的不同值,例如MYENV=abc cmd1MYENV=def cmd2
  2. 不希望环境变量对所有命令全局生效,只对特定命令生效
  3. .bashrc中用更加简洁的语法管理环境变量

那么,相较于原始的大量独立export语句写法,可以试试下面的写法。

假设原先的.bashrc如下:

1
2
3
export MYAPP_ENV_1=abcd
export MYAPP_ENV_2=efg
export MYAPP_ENV_3=hijk

再假设需要设置上述环境变量的命令为myapp,那么可以将上面的export语句换成下面这种写法:

1
2
3
4
5
6
7
8
9
MYAPP_ENVS=(
MYAPP_ENV_1=abcd
MYAPP_ENV_2=efg
MYAPP_ENV_3=hijk
)

myapp() {
env "${MYAPP_ENVS[@]}" myapp "$@"
}

这样设置的好处包括:

  1. 在Shell中调用myapp命令与常规调用等价,不影响参数传递,也不影响argv等参数内容
  2. MYAPP_ENVS中定义的变量只影响myapp一个命令,对其他命令全无影响
  3. 增删环境变量只需直接按行修改,可按行注释掉不想要的环境变量,维护方便

若定义了多个环境变量数组,只需要在env命令后,程序命令之前添加即可:

1
2
3
4
5
6
7
8
ANOTHER_MYAPP_ENVS=(
MYAPP_ENV_4=hijk
MYAPP_ENV_5=xyz
)

myapp() {
env "${MYAPP_ENVS[@]}" "${ANOTHER_MYAPP_ENVS[@]}" myapp "$@"
}

Claude Code 快速安装使用

注意:npm安装方式未来可能有变动,请先行查阅官方文档

首先执行 npm install -g @anthropic-ai/claude-code

安装完成就要开始配置。如果使用A社官方模型API,记得设置好网络。

当然,我用的是Deepseek,其他第三方模型也可以参考下面的配置方法。

新建一个~/.claude.json文件,按需填写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic",
"ANTHROPIC_AUTH_TOKEN": "sk-12345678",
"ANTHROPIC_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-v4-flash",
"CLAUDE_CODE_SUBAGENT_MODEL": "deepseek-v4-pro[1m]",
"CLAUDE_CODE_EFFORT_LEVEL": "max",
"DISABLE_AUTOUPDATER": "1",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"ENABLE_TOOL_SEARCH": "1",
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1",
"IS_SANDBOX": "1"
},
// 这一行很重要,否则会在启动时连接A社API并提示地区不支持
"hasCompletedOnboarding": true
}