backup list, 备份列表

backup list, 备份列表 什么是 chezmoi chezmoi 是一个 dotfiles 管理工具,用来把本机配置文件统一纳入版本管理。 常见用法是把配置保存到一个仓库,在新机器上快速拉取并还原一致的开发环境。 在我当前系统里,输入法配置、kitty 配置、AI agent skill 配置都通过 chezmoi 管理和备份。 system config(chezmoi) 输入法配置、kitty 配置、AI agent skill 配置已统一通过 chezmoi 备份和管理。 PC - home maven setting heidisql config fcitx 码表 /home/wiloon/.config/fcitx/table/*.mb jetbrain.dic ~/bin IDEA settings PC - work maven setting heidisql config email fcitx 码表 /home/wiloon/.config/fcitx/table/*.mb idea.dic ~/bin Emacs configuration file: ~/.emacs IDEA settings. wiloon.com enx.war enx db router /etc/hosts android 照片 > NAS Contacts

Created 30306-07-30 · Updated 4046-06-04 · 1 min · 70 words · -

Linux OOM Killer

Linux OOM Killer OOM Killer 会触发业务退出逻辑吗 通常不会。 Linux OOM Killer 选中目标进程后,现代内核通常会直接发送 SIGKILL(9)终止进程。SIGKILL 不能被捕获、阻塞或忽略,因此大多数“优雅退出”逻辑都不会执行,例如: 注册的退出回调(如 atexit) Java shutdown hook 依赖信号捕获的清理代码 所以 OOM 场景应按“强制中断”来设计:关键状态及时落盘、写操作幂等、依赖外部重启拉起,而不是依赖进程退出时做收尾。 业务代码中的退出逻辑由什么触发 通常由“可捕获的退出路径”触发,而不是 OOM Killer 这类强制终止。 常见触发源: 收到可处理信号(如 SIGTERM、SIGINT),应用捕获后进入优雅停机流程 应用主动正常退出(如主流程结束、显式调用 exit) 进程编排系统发起优雅终止(如 systemd、Kubernetes 先发 SIGTERM,宽限期后再决定是否 SIGKILL) 不会触发退出逻辑的典型场景: SIGKILL(包括 OOM Killer) 内核崩溃、断电等非正常中断 因此,退出回调适合做“尽力而为”的清理,不应承载必须完成的关键一致性动作。 一个协议解析服务在生产环境被 OOM Killer 杀进程并引发滚动离线的案例,可参考 物联网平台协议解析服务生产环境 OOM:MySQL 迁移 InfluxDB。 https://blog.csdn.net/GugeMichael/article/details/24017515 Linux - 内存控制之oom killer机制及代码分析 2014年04月18日 15:04:29 阅读数: 28048 最近,线上一些内存占用比较敏感的应用,在访问峰值的时候,偶尔会被kill掉,导致服务重启。发现是Linux的out-of-memory kiiler的机制触发的。 http://linux-mm.org/OOM_Killer oom kiiler会在内存紧张的时候,会依次kill内存占用较高的进程,发送Sig15(SIGTERM)或Sig9(SIGKILL),取决于内核版本(可见uname -a,>= 2.6.32只会发送sigkill https://elixir.free-electrons.com/linux/v2.6.18/source/mm/oom_kill.c),。并在/var/log/message中进行记录。里面会记录一些如pid,process,。并在/var/log/message中进行记录。里面会记录一些如pid,process) name,cpu mask,trace等信息,通过监控可以发现类似问题。今天特意分析了一下oom killer相关的选择机制,挖了一下代码,感觉该机制简单粗暴,不过效果还是挺明显的,给大家分享出来。 oom killer初探 ...

Created 4046-06-04 · Updated 3036-06-03 · 4 min · 801 words · -

硬盘扩容, PVE, Archlinux

硬盘扩容 PVE ext4 disk resize (parted) PVE 上 VG、瘦池、local-lvm 与多台 VM 如何抢空间,见 Proxmox VE 存储:VG、瘦池与虚拟机磁盘。 理论上 parted 可以在根分区正在被使用的情况下扩容根分区,但实际操作中发现根分区无法卸载,导致 parted 报错 Error: /dev/sda: unrecognised disk label,解决方法是直接进入 parted,parted 会提示修复,输入 Fix 即可修复分区表,然后就可以正常扩容了。 [Online Lossless Expansion of EXT4 Partition](https://tech.he-sb.top/posts/online-lossless-expansion-of-ext4-partition/) 在 pve 里给硬盘扩容: vm>hardware> Hard Disk> Disk Action> resize: 填写新增的容量 ### 查看分区表类型 ```bash parted -l 回显有可能是以下其中一种 Partition Table: msdos Partition Table: gpt Partition Table: loop msdos: MBR gpt: GPT loop: loop 设备(虚拟磁盘) ...

Created 5056-05-05 · Updated 2026-06-02 · 9 min · 1882 words · -

PVE

PVE 存储分层(VG、瘦池、local-lvm、与 K8s 节点根盘关系)见 Proxmox VE 存储:VG、瘦池与虚拟机磁盘。 # 查看 pve 版本 pveversion macos hdiutil convert proxmox-ve_8.3-1.iso -format UDRW -o proxmox-ve_8.3-1.dmg diskutil list # insert the USB flash drive diskutil list diskutil unmountDisk /dev/diskX # rdiskX, instead of diskX, in the last command is intended. It will increase the write speed. sudo dd if=proxmox-ve_8.3-1.dmg bs=1M of=/dev/rdisk5 创建安装盘 U盘 wiloon.com/ventoy dd bs=1M conv=fdatasync if=./proxmox-ve_*.iso of=/dev/XYZ 去除 Proxmox 企业源 apt update && apt install vim vim /etc/apt/sources.list.d/pve-enterprise.list #deb https://enterprise.proxmox.com/debian/pve buster pve-enterprise 更新源 pve9 # ceph.sources Types: deb URIs: https://mirrors.bfsu.edu.cn/proxmox/debian/ceph-squid Suites: trixie Components: no-subscription Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg # debian.sources Types: deb URIs: https://mirrors.bfsu.edu.cn/debian/ Suites: trixie trixie-updates Components: main contrib non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg Types: deb URIs: https://mirrors.bfsu.edu.cn/debian-security/ Suites: trixie-security Components: main contrib non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg pve 6.x vi /etc/apt/sources.list ...

Created 10106-09-10 · Updated 2026-06-02 · 3 min · 590 words · -

archlinux AUR Helper, paru, yay

archlinux AUR Helper AUR(Arch User Repository)里的包不能直接用 pacman -S 安装,需要 AUR helper 来搜索、构建和更新。目前最常用的是 paru 和 yay,命令与 pacman 高度一致,且都能同时管理官方仓库与 AUR 包。 paru https://github.com/Morganamilo/paru paru 是用 Rust 编写的 AUR 助手,由 yay 核心贡献者 Morganamilo 维护,常被视为「下一代 AUR helper」。它是 pacman 的超集:装/卸/更新官方包仍走 pacman,AUR 包由 paru 负责下载 PKGBUILD 并构建,日常只需记住 paru 一套命令即可。 名字由来 paru 不是 Pacman + AUR 的缩写(所以不是 paur)。作者说明它只是与 pacman、Arch、AUR、Rust 等相关的音节组合,没有特定含义;本想找一个好听的 3 字母名,未果后用了 4 字母的 paru。见 GitHub Discussion #1279。 paru 安装 paru 不在 Arch 官方仓库,不能 pacman -S paru。首次安装不依赖 yay 或其它 AUR helper,标准做法与 yay 一样:从 AUR 取 PKGBUILD,用 makepkg 构建后由 pacman 安装。 ...

Created 1016-01-01 · Updated 29296-05-29 · 4 min · 744 words · -

ventoy, 安装盘, 多合一启动盘制作工具, 多个系统 Win/PE/Linux 镜像装在1个U盘里

ventoy, 安装盘, 多合一启动盘制作工具, 多个系统 Win/PE/Linux 镜像装在 1 个 U 盘里 ventoy 是一款国人开发的新一代多 ISO 启动引导程序,这款工具最大的优点就是无需格式化优盘,用户只需要将所需的 ISO 镜像文件拷贝至优盘中即可在Ventoy 界面中选择自己想要的 ISO 镜像文件。 Ventoy 五大优势 广泛兼容:支持包括 Windows 10、Windows 8.1、Windows 7、WinPE 系统以及 Ubuntu 等多种 Linux 发行版。 无需格盘:该工具可以直接安装到U盘上且不需要将其他镜像刻录U盘,用户需要做的仅仅是将ISO复制到U盘中。 启动兼容:无差别支持Legacy BIOS 和UEFI模式,无论你的电脑主板使用什么模式Ventoy都可以自动检测识别。 大型文件:该工具也支持将超过4GB的镜像文件复制到U盘,这点很重要因为Windows 10 镜像文件已超过4GB。 其他优势:可并存多个操作系统镜像无需每次使用重新格盘刻录、启动过程中支持写保护、版本升级不丢失数据。 安装命令 yay -S ventoy-bin # 或者直接下载 # 下载 Linux 版本:ventoy-1.0.35-linux.tar.gz sudo ./Ventoy2Disk.sh -i /dev/sdx # 复制各种 iso 到 /dev/sdb1 https://www.ventoy.net/ WinPE ISO https://www.ventoy.net/en/distro_iso/winpe.html

Created 11116-02-11 · Updated 27276-05-27 · 1 min · 62 words · -

top command

top command top 命令是常用的性能监控工具之一,用于监控系统整体性能和进程信息. top 界面分为两个部份,上面部份显示关于系统整体性能,下面部份显示各进程信息。 第一行显示的内容和 uptime 命令一样, 可以显示和折叠 cpu 使用信息. top: 这个没有什么意思,只是个名称而已 01:47:56 : 系统当前时间 up 1:26 : 系统开机到现在经过了多少时间 2 users: 当前两个用户在线 load average: 0.00,0.00,0.00: 系统 1 分钟, 5 分钟, 15 分钟的 CPU 负载信息 Tasks: 38 total: 当前有38个任务/进程 1 running: 1个进程正在运行 37 sleeping: 37个进程睡眠 0 stopped: 停止的进程数 0 zombie: 僵死的进程数 0 zombie: 僵死的进程数 zombie 进程 : 不是异常情况。 一个进程从创建到结束在最后那一段时间遍是僵尸。留在内存中等待父进程取的东西便是僵尸。任何程序都有僵尸状态,它占用一点内存资源,仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的stop模式: 与sleep进程应区别,sleep会主动放弃cpu,而stop是被动放弃cpu ,例单步跟踪,stop(暂停)的进程是无法自己回到运行状态的。 Cpu(s): 表示这一行显示 CPU 总体信息 在 macOS 的活动监视器或 iStat Menus 里,经常能看到 System、User、Idle 这三个指标。它们和 top 的字段可以直接对应: ...

Created 6066-01-06 · Updated 24246-05-24 · 2 min · 418 words · -

Inotify

Inotify 概述 Inotify 是 Linux 内核提供的一个文件系统事件监控机制,从 Linux 2.6.13 版本开始引入。它允许应用程序监控文件系统的变化,如文件的创建、修改、删除、移动等操作。 核心特性 实时监控:基于事件驱动,当文件系统发生变化时立即通知应用程序 高效性:相比轮询方式,inotify 不需要不断检查文件状态,大大降低了系统开销 灵活性:可以监控单个文件或整个目录树 多事件支持:支持多种文件系统事件类型 工作原理 初始化:应用程序创建一个 inotify 实例(通过 inotify_init() 系统调用),返回一个文件描述符(fd) 添加监控:为需要监控的文件或目录添加 watch(通过 inotify_add_watch()),将 watch 与 inotify 实例关联 事件通知:当被 watch 的文件系统发生变化时,内核会将事件放入该 inotify 实例的事件队列 读取事件:应用程序从 inotify 文件描述符读取事件信息(通过 read() 系统调用) 简单来说: inotify 实例就像一个"邮箱"(用文件描述符标识) 添加 watch 就是告诉内核:“这些文件有变化就往我的邮箱里放消息” 文件变化时,内核自动把事件"投递"到这个邮箱 应用程序通过读取这个文件描述符来"收取邮件"(获取事件) 代码示例: #include <sys/inotify.h> #include <unistd.h> #include <stdio.h> int main() { // 1. 创建 inotify 实例,得到文件描述符 int fd = inotify_init(); // 2. 添加 watch,监控文件的修改事件 int wd = inotify_add_watch(fd, "/path/to/file", IN_MODIFY); // 3. 当文件被修改时,内核会把事件放入 fd 对应的队列 // 4. 应用程序从 fd 读取事件 char buffer[1024]; int length = read(fd, buffer, sizeof(buffer)); // 阻塞等待事件 // 5. 处理事件... struct inotify_event *event = (struct inotify_event *)buffer; printf("文件被修改了!\n"); // 清理 close(fd); return 0; } 关键点: ...

Created 19196-11-19 · Updated 14146-05-14 · 6 min · 1114 words · -

pacman

pacman 参数, options -Sy # 仅同步源 -Syy # 两个 y 代表强制更新 database 文件, 即使文件看起来是最新的, 回退到旧版本的时候会用到 -Syyuu # 降级软件包的时候用 -Q # 查询 本地 pacman 数据库, 比如查询某一个已经安装的包的版本 pacman -Q openssl -Qd, -d, --deps # list packages installed as dependencies [filter] -Qt, -t, --unrequired # list packages not (optionally) required by any package (-tt to ignore optdepends) [filter] -Qh, -Q -h, print help -Ql <boost-libs> #D isplay file list provided by local package -Qk # Check the local package database -Qo /path/to/file # Check if the file is owned by any package, 查看某个文件属于哪个包 -Qq, -q, --quiet show less information for query and search, 省略版本号 -Qs 关键字: 搜索已安装的软件包。 -Qi 软件名: 查看某个软件包详细信息(简介、架构、依赖、大小、安装原因、Required By 等) -Qu: 列出所有可升级的软件包 -Qdtq 显示了不必要的依赖关系列表 -Qqe 列出所有显式安装(-e,explicitly显式安装;-n忽略外部包AUR) -Qqd 列出自动安装的包(-d,depends 作为依赖项) -Qqdt 列出孤立的包(-t 不再被依赖的 "作为依赖项安装的包") -F 查询远程仓库里的软件包 -Fl 比如在安装软件包之前查询一下远程仓库, 看看会有哪些文件安装到本地 --needed 已经是最新版本的包,不会再重新安装 -R 删除软件包 -b 指定 database 路径, 默认 /var/lib/pacman -r 指定安装软件包的 root 路径, 默认 / -Rdd 要删除软件包,但是不删除依赖这个软件包的其他程序, pacman -Rdd package_name -Qqo '/path/to/dir' 查看文件关联的包 -Rsn -Rs, -s, --recursive remove unnecessary dependencies, 同时删除本机上只有该软件依赖的软件。有其他包可选依赖这个包的话 pacman 会警告你,有其他包依赖这个包的话 pacman 会阻止你 -Ru 软件名: 删除软件,同时删除不再被任何软件所需要的依赖。 -Sg 软件包组: 查看某软件包组所包含的所有软件包。 -Sc:清理未安装的包文件,包文件位于 /var/cache/pacman/pkg/ 目录。 -Scc:清理所有的缓存文件。 commands # 查看安装了多少个包 pacman -Qq|wc -l 查看软件包依赖, pactree # pactree 由 pacman-contrib 包提供 pacman -S pacman-contrib # 查看 package_0 依赖了哪些软件包(正向依赖树) pactree package_0 # 查看 package_0 被哪些软件包依赖(反向依赖树) # 追溯到顶层显式安装的包 pactree -r package_0 用 -Qi 查看直接依赖 # Required By 字段列出直接依赖该包的包 pacman -Qi package_0 | grep "Required By" 例:追踪 haskell-wai-app-static 属于哪个工具 pactree -r haskell-wai-app-static # haskell-wai-app-static # └─haskell-servant-server # └─haskell-pandoc-server # └─pandoc-cli ← 顶层显式安装的包 删除 pandoc-cli 及其引入的全部依赖 # -Rs 递归删除仅被 pandoc-cli 依赖的包 sudo pacman -Rs pandoc-cli 把 openssl 包安装到指定的目录 pacman -Sy openssl -b /var/lib/pacman -r 2022-11-04 在仓库里搜索有关 foo 的包 pacman -Ss foo # pacman 的 help pacman -h # -Q 的 help pacman -Q -h pacman -Q # 列出已经安装的软件包 pacman -Q boost-libs # Display version pacman -Ql boost-libs # Display file list provided by local package # 查看文件/命令属于哪个包, Check if the file is owned by any package, 查看命令由哪个包提供. pacman -Qo /etc/profile # 检查包对应的文件有没有缺失, #Check the local package database pacman -Qk filesystem # 打印详细信息,比如 文件 是否有修改 修改时间, 大小 , md5 pacman -Qkk filesystem # 安装下载的 gvim 包,或新编译的 gvim 包 pacman -U /var/cache/pacman/pkg/gvim-8.2.4106-1-x86_64.pkg.tar.zst downgrade 降级软件包 去 archive 时手动下载 https://archive.archlinux.org/packages/, 然后 pacman -U 安装 ...

Created 6066-02-06 · Updated 14146-05-14 · 5 min · 1062 words · -

curl command

curl command curl [kɜrl] options --version, print version -s, --silent, 不显示下载进度, 不显示 error message -S, --show-error 在使用 -s 时, 打印 curl error message -C, --continue-at, 断点续传 -o, --output <file>, write output to <file> instead of stdout --connect-timeout <fractional seconds>, 建连接超时, 比如 tcp 三次握手 -m, --max-time <fractional seconds>, 单位: 秒, 可以用小数 0.5 代表 500ms, 传输超时, 比如 http 请求发送之后长时间没有响应, tcp 的 ack 收到了, 但是长时间没收到 http response. -G/--get 以 get 的方式来发送数据 -i, --include 输出时包括 protocol 头信息, 显示 response header, 例如: HTTP/1.0 200, Content-Type: text/plain -v, verbos -N, Disables the buffering of the output stream -I, --head 只返回头信息, 比如 FTP 服务器只返回文件大小. -H, --header LINE Custom header to pass to server (H) -d, --data # DATA HTTP POST data, 如果使用 -d 命令,curl 会以 application/x-www-url-encoded 格式上传参数。 从文件中读取数据 -d @/path/to/foo.json -b, --cookie <data|filename>, 发送请求时附带 cookie。可以直接传入 cookie 字符串,或从文件中读取 cookie --retry, 重试次数 -F curl 会以 multipart/form-data 的方式发送 POST 请求。-F 以 key=value 的形式指定要上传的参数,如果是文件,则需要使用 key=@file 的形式。 -k, --insecure flag to skip certificate validation. -L, --location: 追踪重定向, 如果服务器报告请求的页面已移动到其他位置(用 location: header 和 3xx 响应代码),此选项将使 curl 在新位置上重新执行请求。 -x, 参数指定 HTTP 请求的代理 -X, --request <method> Specify request method to use, -X POST, -X PUT -w, 完成请求传输后,使 curl 在 stdout 上显示自定义信息 --cacert, curl 用来验证对端的 CA 证书 -E, --cert, 客户端证书 --key, 客户端私钥 --pass, 客户端私钥的密码 --trace-ascii /tmp/curl.log, 把交互的数据打印到日志里, https 协议也能把明文打在日志里 -tlsv1.x 这个参数并不是说客户端按你指定的tls版本去跟服务端匹配,不是==的关系,是在≥的关系里面desc降序匹配, 比如支持tls1.0/1.1/1.2的Server,客户端分别以--sslv3、--tlsv1.0、--tlsv1.1、--tlsv1.2这些参数去请求,最终的结果都是以--tlsv1.2去建联,这就是我说的“在≥的关系里面desc降序匹配” --tls-max 1.x 这个参数则是限定死了,最大按哪个来, 比如说服务端最大支持到tlsv1.2,客户端限定最大按tlsv1.3来,那最终肯定就是以tlsv1.2建联了;如果服务端不变,我指定客户端以--tls-max 1.1请求,那最终肯定是以tlsv1.1建联了 -f, --fail 快速失败, 在服务器出错时不显示HTTP错误信息, 直接返回 error 22 -w -w 的作用 完成请求传输后,使 curl 在 stdout 上显示自定义信息 格式是一个字符串,可以包含纯文本和任意数量的变量 ...

Created 8086-05-08 · Updated 8086-05-08 · 6 min · 1261 words · -

清空文件

清空文件 在处理服务器磁盘占用时, 比如有比较大的日志文件, 服务还在运行, 所以文件是不能删的, 又因为文件太大了不适合用文本编辑器打开, 比如 vi 之类, 想清空文件就要用以下方法了. BTW: 删除一个正在使用的文件是另外一个问题… wiloon.com/deleteonwrite truncate truncate -s 0 foo.log -s 0 表示将文件大小设置为 0 字节,即清空文件内容。也可以指定其他大小,truncate 从文件末尾截断,保留开头部分(即最旧的数据): truncate -s 100M foo.log # 保留前 100MB(最旧的数据) truncate -s 1G foo.log # 保留前 1GB truncate -s 500K foo.log # 保留前 500KB 如果想保留最新的 100MB,需要用 tail: tail -c 100M foo.log > foo.log.tmp && mv foo.log.tmp foo.log truncate 可被用来将一个文件缩小或者扩展到某个给定的大小。 你可以利用它和 -s 参数来特别指定文件的大小。要清空文件的内容, 则在下面的命令中将文件的大小设定为 0 本命令缩减或扩充指定文件的大小为指定值。 参数所指定的文件如果不存在, 那么该命令会创建这个文件。 如果一个文件的大小比参数指定的大, 那么超出的部分就会被丢弃。 如果一个文件比参数指定的小, 那么文件会被扩充, 并且被扩充的部分 (空洞) 在被读取的时候是字节0。 ...

Created 7076-05-07 · Updated 7076-05-07 · 4 min · 789 words · -

centos basic

centos basic RHEL-based 发行版(CentOS EOL 后) CentOS 在 2024 年完全 EOL 后,主流的 RHEL 下游发行版: 免费的 1:1 RHEL 重建版(CentOS 直接替代): AlmaLinux — 社区驱动,由 CloudLinux 公司支持,目前最流行 Rocky Linux — 由 CentOS 原创始人 Gregory Kurtzer 创建,同样非常流行 商业版: RHEL(Red Hat Enterprise Linux)— 上游源,通过 Red Hat 开发者计划可免费用于最多 16 个生产系统 Oracle Linux — Oracle 的重建版,免费使用,付费支持 其他: CentOS Stream — 仍然存在,但现在是下一个 RHEL 版本的滚动预览(位于 RHEL 上游而非下游),稳定性不如旧版 CentOS AlmaLinux 和 Rocky Linux 都提供迁移工具(almalinux-deploy / migrate2rocky),可将现有 CentOS 系统原地转换。 AlmaLinux AlmaLinux 是 CloudLinux 公司主导的 RHEL 下游发行版。 ...

Created 7076-05-07 · Updated 7076-05-07 · 3 min · 554 words · -

ssh client config

后量子密钥交换警告 连接到旧版 OpenSSH 服务器时,新版客户端(OpenSSH 9.9+)会显示如下警告: ** WARNING: connection is not using a post-quantum key exchange algorithm. ** This session may be vulnerable to "store now, decrypt later" attacks. ** The server may need to be upgraded. See https://openssh.com/pq.html 原因: OpenSSH 9.9 引入了后量子密钥交换算法(如 mlkem768x25519-sha256),当服务端不支持该算法时,连接回退到经典算法,客户端发出警告,提示存在「先存后解」攻击风险。 推荐解决方案: 升级服务端 OpenSSH 到 9.9 或更高版本。 临时屏蔽警告(仅客户端): 如果无法升级服务端,可以在 ~/.ssh/config 中对该主机设置 LogLevel ERROR,屏蔽 WARNING 级别的提示: Host bwg LogLevel ERROR 注意:此方法只是屏蔽了警告输出,并不能消除安全风险,仅适合临时或已评估风险的场景。 SSH 连接的两个阶段 SSH 建立连接时分为两个独立阶段,使用完全不同的密钥: 阶段一:密钥交换(Key Exchange) 在连接建立之初(握手阶段),客户端和服务器通过密钥交换算法协商出一个临时的共享会话密钥,用来加密后续所有通信。这个过程发生在身份认证之前,使用的是 DH/ECDH 等算法(如 curve25519-sha256)。 ...

Created 7076-05-07 · Updated 7076-05-07 · 2 min · 350 words · -

Linux 显示器分辨率问题修复:手动加载 EDID 固件

EDID 简介 什么是 EDID? EDID (Extended Display Identification Data) 是一种标准化的数据结构,用于显示器向计算机系统描述自己的能力和特性。可以将它理解为显示器的"身份证"或"技术规格说明书"。 EDID 包含的信息: 基本标识信息: 制造商 ID(如 Dell = “DEL”, Samsung = “SAM”) 产品型号代码和序列号 生产日期(周数/年份) 显示能力参数: 支持的分辨率列表(如 1920x1200, 1600x1200, 1280x1024) 支持的刷新率(如 60Hz, 75Hz) 原生(推荐)分辨率 色彩深度和色域信息 物理特性: 屏幕物理尺寸(以毫米为单位,用于计算正确的 DPI) 显示接口类型(模拟/数字) Gamma 值(2.2 是常见值) 系统如何读取 EDID? 是的,操作系统从显示器读取 EDID 信息。 这是一个自动化的初始化过程: ┌─────────────────────────────────────────────────────────────┐ │ 1. 物理连接 │ │ 显示器连接到主机(HDMI/DisplayPort/DVI/VGA) │ │ 硬件检测到连接 │ └──────────────────┬──────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 2. DDC 通信初始化 │ │ 主机 → 显示器:发起 DDC (Display Data Channel) 请求 │ │ 使用 I2C 总线协议 │ └──────────────────┬──────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 3. EDID 数据传输 │ │ 显示器 → 主机:返回 EDID 数据(128 或 256 字节) │ │ 通过显示线缆内的专用数据通道 │ └──────────────────┬──────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 4. 内核处理 │ │ GPU 驱动解析 EDID → 验证校验和 → 提取支持的模式 │ └──────────────────┬──────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 5. 自动配置 │ │ 选择最佳分辨率(通常是原生分辨率)→ 配置显示输出 │ └─────────────────────────────────────────────────────────────┘ 通信协议细节: ...

Created 1016-05-01 · Updated 1016-05-01 · 17 min · 3517 words · -

inode

inode An inode stores all the information about a regular file, directory, or other file system object, except its data and name. 每个文件都对应一个 inode, inode 存储了除文件名和文件内容之外的所有信息。 inode (发音: eye-node) 译成中文就是索引节点, 它用来存放文件和目录的基本信息, 包含时间、档名、使用者,群组,权限, 一个文件占用一个inode,同时记录此文件的数据所在的 block 号码; http://www.ruanyifeng.com/blog/2011/12/inode.html inode是什么? inode是一个重要概念, 是理解 Unix/Linux 文件系统和硬盘储存的基础。 我觉得,理解 inode, 不仅有助于提高系统操作水平, 还有助于体会 Unix 设计哲学, 即如何把底层的复杂性抽象成一个简单概念, 从而大大简化用户接口。 下面就是我的inode学习笔记,尽量保持简单。 理解inode 作者: 阮一峰 inode是什么? Inode 用于存储文件或目录的信息. 理解inode, 要从文件储存说起。 扇区 (Sector) 文件储存在硬盘上, 硬盘的最小存储单位叫做"扇区" (Sector) 。每个扇区储存 512 字节。(现在新的硬盘每个扇区有4K) 注意:硬盘的最小存储单位就是扇区了,而且硬盘本身并没有 block 的概念。 ...

Created 27276-04-27 · Updated 27276-04-27 · 4 min · 702 words · -

netstat 命令

netstat 用于查看网络连接、路由表、接口统计等信息。在较新的 Linux 发行版中,推荐使用 ss 命令替代。 常用命令 # 查看所有 TCP 监听端口及对应进程 netstat -ntlp # 过滤特定端口 netstat -tulpn | grep 9100 常用选项 选项 说明 -n 以 IP 地址代替主机名显示 -t 显示 TCP 协议的连接情况 -u 显示 UDP 协议的连接情况 -l 只显示监听状态的 Socket -p 显示使用该 Socket 的程序名称和 PID -a 显示所有 Socket(包括监听和非监听) 安装 netstat 包含在 net-tools 包中: # RHEL/CentOS yum install net-tools # Debian/Ubuntu apt install net-tools

Created 23236-04-23 · Updated 23236-04-23 · 1 min · 61 words · -

排序算法, Sorting Algorithm

常见排序算法: 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 堆排序 计数排序 桶排序 基数排序 推荐学习顺序: 冒泡 → 选择 → 插入 → 快速 → 归并 → 堆 冒泡排序 Bubble Sort 相邻元素两两比较,大的往后"冒泡",每轮将最大值沉到末尾。 时间复杂度:O(n²) 空间复杂度:O(1) 稳定排序 def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(n - i - 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr # 测试 arr = [64, 34, 25, 12, 22, 11, 90] print("排序前:", arr) bubble_sort(arr) print("排序后:", arr) 执行过程(以 [5, 3, 1] 为例): 第1轮: j=0: 5 > 3,交换 → [3, 5, 1] j=1: 5 > 1,交换 → [3, 1, 5] ← 最大值 5 沉底 第2轮: j=0: 3 > 1,交换 → [1, 3, 5] ← 次大值 3 到位 第3轮:只剩1个,已有序 外层 i 控制轮数,每轮确定一个最大值的位置 内层 n - i - 1 让已排好的尾部不再参与比较 a, b = b, a 是 Python 交换变量的惯用写法 选择排序 Selection Sort 每轮从未排序部分找最小值,放到已排序部分的末尾。 ...

Created 18186-04-18 · Updated 18186-04-18 · 2 min · 237 words · -

zsh, oh-my-zsh, oh my zsh

zsh, oh-my-zsh, oh my zsh # 查看已经安装的 shell 列表 cat /etc/shells ## 查看当前 shell echo $SHELL # archlinux install zsh sudo pacman -S git zsh # ubuntu install zsh sudo apt install zsh install oh my zsh # install oh-my-zsh, will set default shell to zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" # after oh my zsh installed, ubuntu user should logout and login. update oh my zsh # need vpn to access github omz update 错过更新提示后手动触发更新,直接运行: ...

Created 9096-04-09 · Updated 9096-04-09 · 3 min · 514 words · -

Prometheus Pushgateway

Prometheus 的拉取模型(pull model)要求被监控目标必须持续运行并暴露 HTTP /metrics 端点。但有些场景不适合这种模式: 批处理作业(Batch Job):运行几秒或几分钟就退出,Prometheus 来不及抓取 CronJob:定时执行,完成后进程消失 短暂任务:数据管道、一次性脚本 Pushgateway 就是为这类场景设计的中间缓冲层。 工作原理 Batch Job → POST metrics → Pushgateway ← scrape ← Prometheus → Grafana 批处理作业完成后,主动将指标 推送(push) 到 Pushgateway Pushgateway 将指标持久保存在内存中 Prometheus 按照正常 pull 机制定期抓取 Pushgateway 的 /metrics 端点 Grafana 查询 Prometheus 展示数据 安装(Kubernetes) apiVersion: apps/v1 kind: Deployment metadata: name: pushgateway spec: replicas: 1 template: spec: containers: - name: pushgateway image: prom/pushgateway:v1.11.0 ports: - containerPort: 9091 默认端口 9091,Web UI 可以查看当前存储的所有指标。 ...

Created 3036-04-03 · Updated 3036-04-03 · 2 min · 226 words · -

Shell 创建文件并写入内容

选型总结 场景 推荐方式 单行字符串 printf '%s\n' "..." > file 多行内容 cat > file << 'EOF' ... EOF 追加内容 >> file 需要 root 写入 echo "..." | sudo tee file 脚本内变量展开 heredoc 不加引号:<< EOF 禁止变量展开 heredoc 加单引号:<< 'EOF' 单行字符串:推荐 printf printf '%s\n' 'Hello, World!' > foo.txt printf 简介 printf 在 Linux/Unix 系统上普遍可用,有两种形式: 内建命令(built-in):bash、zsh、dash 等 shell 均内置,不依赖外部程序 外部命令:/usr/bin/printf,由 coreutils 包提供,几乎所有发行版默认安装 printf 的作用是格式化输出,语法来自 C 语言的 printf(): printf FORMAT [ARGUMENTS...] 常用格式占位符: 占位符 含义 %s 字符串 %d 整数 %f 浮点数 \n 换行 \t Tab echo 在 bash 里需要加 -e 才能解析 \n,而 sh/dash 的 echo 行为又不同,跨 shell 不可靠;printf 行为在所有 shell 里一致,脚本中优先使用 printf。 ...

Created 3036-04-03 · Updated 3036-04-03 · 2 min · 251 words · -