持续更新中的稀奇古怪技巧
或许家家都有本难念的经,而在我的电脑上常常有些奇怪的问题或需求。为了这样的内容单独写一篇文章真的很逊,但如果不找个地方记下来又怕哪日再寻找时完全忘记了。
不如在这里将这些奇怪的内容整理在一个页面中,方便快速搜索查找。
应用程序篇
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 | nmcli connection modify macvlan-macvtap0 ipv6.method disabled |
根据前面接口名称的不同,modify后面的连接名称可能也有差异。
重新启动以上网络连接。
1 | nmcli connection down 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 | Host myserver |
Systemd限制用户计算资源
在多人使用的Linux服务器上,会遇到这样的情况:某些淘气的小伙伴把服务器资源都占满了,其他人完全无法使用,能不能做点限制呢?
限制用户CPU使用
假设服务器上一共有32个逻辑CPU(线程),如果有一个用户运行的程序将32个逻辑核全部吃满,会导致其他所有用户程序,即使是一些简单的小工作,都很难正常运行。
在这种时候,若希望保障其他用户进行小工作处理的能力,可以用Systemd对占满大量资源的用户进行限制。
在Systemd中,用户进程和服务都会受到user-<UID>.slice配置文件的管理。其中,就提供了计算资源限制相关的属性。
首先来看最简单的限制方法:限制用户使用的最大CPU时间。假设服务器上有32个逻辑核,可以只允许某一用户最多使用等价24个核的CPU计算时间。这样一来,CPU就有余力处理其他用户的请求。
1 | USER_UID=$(id -u <限制目标用户名>) |
如果有需要,甚至可以把该用户的进程全部赶到前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 | # /etc/systemd/system/user-1001.slice.d/override.conf |
实际上,这种限制等级比较高,对于该用户来说,不仅GPU无法使用,系统上位于/dev下的设备,包括未挂载的硬盘、USB等都无法访问。当然,在科学计算服务器上,普通用户往往也无需访问这些设备。
施加这一设置后,对被限制的用户来说,其运行nvidia-smi只会提示找不到GPU设备。同时,还不影响其访问/home路径下的数据,可以让其自行将数据导出带走。
密码强度设置
在Debian/Ubuntu下,怎么设置系统用户密码的最低强度标准?
首先需要安装libpam-pwquality包:
1 | sudo apt install libpam-pwquality |
然后编辑/etc/security/pwquality.conf文件,可参考文件注释进行调整:
1 | # Number of characters in the new password that must not be present in the |
上面的配置对应于以下密码强度约束:
- 修改密码与原密码必须有3个字符以上不同
- 密码最小长度为12字符
- 密码必须包含大小写字母、数字、其他字符(标点)
快速设置命令特定的环境变量组
众所周知,在Linux中给普通应用设置环境变量,一般只需要在~/.bashrc等Shell配置文件中直接写export语句即可。
不过,有时候存在下面需求:
- 希望给不同的命令指定同名环境变量的不同值,例如
MYENV=abc cmd1和MYENV=def cmd2 - 不希望环境变量对所有命令全局生效,只对特定命令生效
- 在
.bashrc中用更加简洁的语法管理环境变量
那么,相较于原始的大量独立export语句写法,可以试试下面的写法。
假设原先的.bashrc如下:
1 | export MYAPP_ENV_1=abcd |
再假设需要设置上述环境变量的命令为myapp,那么可以将上面的export语句换成下面这种写法:
1 | MYAPP_ENVS=( |
这样设置的好处包括:
- 在Shell中调用
myapp命令与常规调用等价,不影响参数传递,也不影响argv等参数内容 MYAPP_ENVS中定义的变量只影响myapp一个命令,对其他命令全无影响- 增删环境变量只需直接按行修改,可按行注释掉不想要的环境变量,维护方便
若定义了多个环境变量数组,只需要在env命令后,程序命令之前添加即可:
1 | ANOTHER_MYAPP_ENVS=( |
Claude Code 快速安装使用
注意:npm安装方式未来可能有变动,请先行查阅官方文档
首先执行 npm install -g @anthropic-ai/claude-code。
安装完成就要开始配置。如果使用A社官方模型API,记得设置好网络。
当然,我用的是Deepseek,其他第三方模型也可以参考下面的配置方法。
新建一个~/.claude.json文件,按需填写:
1 | { |