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

2026-04-23 · 1 min · 61 words · -

grub

grub 判断是否由 grub 引导 journalctl -b | grep -i grub https://www.gnu.org/software/grub/manual/grub/grub.html#Simple-configuration GRUB 来自 GRand Unified Bootloader 的缩写。它的功能是在启动时从 BIOS 接管掌控、加载自身、加载 Linux 内核到内存,然后再把执行权交给内核。一旦内核开始掌控,GRUB 就完成了它的任务,也就不再需要了。 GRUB 支持多种 Linux 内核,并允许用户在启动时通过菜单在其中选择。 GRUB 菜单提供了一个 “救援rescue” 内核,用于故障排除或者由于某些原因导致的常规内核不能完成启动过程。 grub.cfg 文件是 GRUB 配置文件。它由 grub2-mkconfig 程序根据用户的配置使用一组主配置文件以及 grub 默认文件而生成。/boot/grub2/grub.cfg 文件在 Linux 安装时会初次生成,安装新内核时又会重新生成。 grub.cfg 文件包括了类似 Bash 脚本的代码以及一个按照安装顺序排序的已安装内核列表。 grub.cfg 的主要配置文件都在 /etc/grub.d 目录。该目录中的每个文件都包含了最终会整合到 grub.cfg 文件中的 GRUB 代码。这些配置文件的命名模式以排序方式设计,这使得最终的 grub.cfg 文件可以按正确的顺序整合而成。每个文件都有注释表明该部分的开始和结束,这些注释也是最终的 grub.cfg 文件的一部分,从而可以看出每个部分是由哪个文件生成。 grub config file path check grub version grub2-install --version GRUB1.配置文件: /boot/grub/menu.lst GRUB2.配置文件: /boot/grub/grub.cfg,/etc/grub.d/下是生成配置文件的模板,/etc/default/grub是生成配置文件的参数 If you change this file, run ‘update-grub’ afterward to update ...

2026-04-20 · 2 min · 361 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 每轮从未排序部分找最小值,放到已排序部分的末尾。 ...

2026-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 错过更新提示后手动触发更新,直接运行: ...

2026-04-09 · 3 min · 514 words · -

compact/extract 压缩/解压

compact/extract 压缩/解压 .tar.gz 和 .tgz .tgz 和 .tar.gz 是同一个东西, .tgz 可以认为是 .tar.gz 是简写, 在远古时代比如 DOS 系统, 文件扩展名只能是三个字符, 所以有了 .tgz, 后来限制解除之后就能支持 .tar.gz 这种后缀了, 后者能更清晰地表达打包格式和压缩方式. https://stackoverflow.com/questions/11534918/are-tar-gz-and-tgz-the-same-thing 这种格式是我使用得最多的压缩格式。它在压缩时不会占用太多 CPU 的,而且可以得到一个非常理想的压缩率 默认 tar 打包和系统默认的压缩工具是单线程的,pigz 是 gzip 的多线程实现, 默认用当前逻辑 cpu 个数来并发压缩,无法检测个数的话,则并发8个线程 压缩 tar -czvf all.tar.gz *.jpg # 排除掉文件 tar -czvf tomcat.tar.gz --exclude=tomcat/logs tomcat # 设置压缩级别 GZIP=-9 tar cvzf file.tar.gz /path/to/directory 压缩到指定目录 tar -zcvf /data/tmp/foo.tar.gz /data/server/source # 解压到指定目录 tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.6.1.tgz tar.gz, tgz 解压 tar -xf foo.tar.gz # 解压 tar.gz 文件时, 不使用 z 参数, 貌似 tar 会检测文件类型 自动 用 gzip 解压... tar xvf all.tar.gz tar zxvf all.tar.gz tar -zxvf all.tar.gz 解压到指定目录 tar zxvf /path/to/foo.tar.gz -C /path/to/target/dir/ tar -zxvf /path/to/foo.tar.gz -C /path/to/target/dir/ sudo pacman -S pigz # 压缩 tar --use-compress-program=pigz -cvpf package.tgz ./package # 解压 tar --use-compress-program=pigz -xvpf package.tgz -C ./package #tar –use-compress-program=pigz表示指定pigz来进行打包 #c表示create创建 x表示extract解压 v表示verbose详细 f表示指定压缩文件 C表示指定目录 #-cvpf package.tgz ./ 表示将./package目录打包为package.tgz #-xvpf package.tgz -C ./表示将package.tgz解压到./package目录下 \-v, --verbose #详细显示处理的文件 \-f, --file [HOSTNAME:]F #指定存档或设备 (缺省为 /dev/rmt0) \-z, --gzip, --ungzip #用 gzip 对存档压缩或解压 \-x, --extract, --get #从存档展开文件 解压多个文件 ls *.gz|xargs -t -n1 gunzip gunzip *.gz .rar # 解压 unrar x foo.rar # 压缩 rar e FileName.rar # 解压 rar a FileName.rar 解压并指定输出目录 gunzip -c /data/tmp/foo.tar.gz | tar xf - -C /data/server/bar .7z yum install p7zip pacman -S p7zip sudo apt install p7zip-full p7zip-rar # 压缩 7z a -t7z -r manager.7z /home/manager/* # a 代表添加文件/文件夹到压缩包 # -t 是指定压缩类型 一般我们定为7z # -r 表示递归所有的子文件夹,manager.7z 是压缩好后的压缩包名,/home/manager/* 是要压缩的目录,*是表示该目录下所有的文件。 7z x filename.7z .zip pacman -S zip unzip zip 压缩 zip all.zip *.jpg # 指定压缩文件目录 zip ~/all.zip *.jpg # 压缩的是个文件夹, -r 表示调用递归压缩 zip -r temp.zip temp # 密码 zip -P password0 foo.zip foo.txt # 压缩目录并加密码 (-r 递归, -P 指定密码) zip -r -P password0 foo.zip foo/ # 交互式输入密码(更安全,密码不会暴露在命令历史中) zip -r -e foo.zip foo/ # 指定压缩某几个文件 zip foo.zip foo.txt bar.txt zip 分卷压缩 # 分卷压缩的话,需要先将文件打包成一个zip包,然后执行 zip -s SIZE origin.zip --out new.zip # SIZE为分卷的大小4m,4g,4t等 # 解压的时候需要先将它合并才能正常解压 zip spiltfile.zip -s=0 --out single.zip zip 解压 unzip all.zip unzip -o -d /home/sunny myfile.zip # 解压 多个文件 ls *.zip | xargs -n1 unzip -o # -o: 不必先询问用户,unzip执行后覆盖原有的文件; # -P<密码>: 使用zip的密码选项; # -d 指定解压的目标目录 # 解压最近4天的zip文件 find . -maxdepth 1 -mtime -4 -type f -name "*.zip"|xargs -t -n1 unzip zip 解压并指定目录 unzip /path/to/source.zip -d /path/to/target/path Zstandard, zstd, .zst 解压 zstd -d foo.zst zstd 不能压缩目录, -r 参数会把目录里的文件压缩成单独的文件 ...

2026-04-07 · 5 min · 1034 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 可以查看当前存储的所有指标。 ...

2026-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。 ...

2026-04-03 · 2 min · 251 words · -

linux apps

Linux apps 必装软件(重装系统后优先安装) app source notes kitty pacman terminal neovim pacman 编辑器 flameshot pacman 截图+标注 bitwarden pacman 密码管理 btop pacman 颜值不错的 top 替代 wechat aur visual-studio-code-bin aur VSCode 官方二进制版 说明 pacman — sudo pacman -S aur — yay -S apt — sudo apt install go — go install Browser app source notes chromium pacman 开源版 Chrome google-chrome aur google-chrome-beta aur google-chrome-dev aur ubuntu install chrome curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install ./google-chrome-stable_current_amd64.deb Terminal app source notes hyper pacman terminal termite pacman 支持32位色 tmux pacman Text Editor / Notes app source notes mousepad pacman 轻量文本编辑器 typora aur markdown 编辑器 obsidian pacman 知识管理 nixnote2-git aur Evernote Linux 客户端 Screenshot / Recording app source notes spectacle pacman KDE 原生截图 simplescreenrecorder pacman 录屏 gtk-recordmydesktop aur 录屏 shutter aur 截图,需配合 perl-goo-canvas System Monitor app source notes ncdu pacman/apt 命令行磁盘空间分析 netdata pacman 系统资源监控 indicator-sysmonitor apt 任务栏系统资源监控 nethogs pacman 网络流量监控 dstat pacman 查看系统性能 dstat -cdlmnpsy slurm aur 网络监控 hardinfo-git aur 硬件信息查看 System Info app source notes fastfetch pacman 打印发行版 logo neofetch pacman/apt 系统信息(已停止维护) stress pacman 压力测试 hdparm pacman 磁盘参数查看 procmon aur 微软的进程监控工具 File Management app source notes filelight pacman 图形化磁盘空间管理 baobab apt 硬盘占用分析工具 catfish pacman 文件搜索 tree apt 树形目录显示 tree -L N nautilus apt Ubuntu 默认文件管理器 Archive / Compression app source notes ark pacman KDE 压缩包管理器 file-roller pacman zip/7z/rar 支持 zstd pacman 多线程快速压缩工具 rar/unrar apt Media / Graphics app source notes digikam pacman KDE 最佳图片管理 gwenview pacman KDE 图片查看 eog apt Eye of Gnome 图片查看 inkscape pacman 矢量图形编辑,SVG audacity pacman 音频处理 okular pacman PDF reader gpick pacman 颜色拾取工具 Download app source notes aria2 pacman 下载工具 axel pacman 下载工具 Remote Desktop app source notes remmina pacman GTK 远程桌面客户端 freerdp pacman remmina RDP 支持包 rdesktop pacman Communication app source notes thunderbird apt 邮件客户端 telegram-desktop pacman feishu aur 飞书 dingtalk aur 钉钉 zoom aur Office app source notes libreoffice-fresh pacman wps-office aur 需 ttf-wps-fonts ttf-wps-fonts aur WPS 字体依赖 Development Tools app source notes git pacman/apt lazygit go go install github.com/jesseduffield/lazygit@latest gitkraken aur Git GUI,Free for non-commercial github-desktop-bin aur base-devel pacman 编译工具链 cmake pacman kotlin pacman iperf3 pacman 网络测试 wireshark-qt pacman lsof pacman hexyl pacman 彩色 hex 编辑器 lrzsz pacman zmodem binutils pacman 二进制文件处理工具集 inetutils pacman telnet 等网络工具 zeal pacman 离线文档 platformio aur 物联网开发生态系统 IDE app source notes code pacman Visual Studio Code vscodium-bin aur VSCode 社区版(无遥测) jetbrains-toolbox aur JetBrains 工具管理器 intellij-idea-community-edition pacman IDEA 社区版 intellij-idea-ultimate-edition aur yay -S intellij-idea-ultimate-edition intellij-idea-ultimate-edition-jre goland aur yay -S goland goland-jre webstorm-jre aur yay -S webstorm webstorm-jre clion aur yay -S clion clion-jre claude-code aur Java app source notes jdk-openjdk pacman Latest OpenJDK jdk8-openjdk pacman OpenJDK 8 openjdk8-src pacman OpenJDK 8 源码 openjdk-8-jdk apt OpenJDK 8 maven pacman gradle pacman graphviz pacman PlantUML 依赖 jd-gui-bin aur Java 反编译 eclipse-mat aur Eclipse Memory Analyzer Node.js / Rust app source notes nvm pacman Node.js 版本管理 rust pacman Database app source notes redisinsight aur Redis GUI redis-desktop-manager aur RDM sqlectron-gui pacman heidisql aur MySQL 客户端 tableplus aur MySQL client datagrip — 官网下载 Fonts app source notes ttf-jetbrains-mono pacman JetBrains Mono adobe-source-code-pro-fonts pacman Adobe 编程字体 ttf-wqy-microhei apt 文泉驿-微米黑 ttf-wqy-zenhei apt 文泉驿-正黑 xfonts-wqy apt 文泉驿-点阵宋体 ttf-consolas-with-yahei-powerline-git aur Consolas+雅黑 KDE sudo pacman -S powerdevil kmix kscreen ark gwenview kcolorchooser app source notes powerdevil pacman 电源管理,休眠按钮 kmix pacman 音量调节 kscreen pacman 多显示器管理 kcolorchooser pacman 颜色拾取 KDE Widget name notes netspeed widget 网络监控 resources monitor CPU/内存监控 Plasma Week Number 显示周数 Virtualization / Container app source notes docker pacman podman pacman podlet aur kvm pacman wine pacman 需开启 Multilib 仓库 playonlinux pacman Wine 图形前端 Utilities app source notes qalculate-gtk pacman 全宇宙最好用的计算器 rsibreak pacman 番茄钟 gnome-shell-pomodoro apt Pomodoro openvpn pacman pavucontrol apt Chrome 音频输出设置 sl pacman 小火车 x11-apps apt xclock, xserver 测试用 pamac-aur aur 图形界面的 pacman libiconv aur 编码转换 Ventoy — 各种 ISO 安装盘引导工具 References Arch Linux List of Applications

2026-04-03 · 3 min · 615 words · w10n

IO, 输入输出

IO, 输入输出 https://my.oschina.net/u/1859679/blog/1839169 同步阻塞 IO 同步非阻塞 IO 异步非阻塞 IO 针对某种 IO 模型,我们如何分类,可以基于 POSIX 对同步/异步的定义来判别: A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes; (同步 I/O 操作会导致发起请求的进程被阻塞,直到该 I/O 操作完成。) An asynchronous I/O operation does not cause the requesting process to be blocked; (异步 I/O 操作不会导致发起请求的进程被阻塞。) 那么从上我们可以看出: 同步: 是否同步体现在消息通信机制上。 阻塞: 是否阻塞主要体现在调用的线程是否可以干别的,关注的是程序的等待状态 也就是说同步和异步说的是消息的通知机制,阻塞非阻塞说的是线程的状态 。 Unix 5种I/O模型 在《UNIX网络编程: 卷一》的第六章书中列出了五种IO模型: 阻塞式I/O; 非阻塞式I/O; I/O复用 (select,poll,epoll…) ; 信号驱动式I/O (SIGIO) ; 异步I/O (POSIX的 aio 系列函数)

2026-03-31 · 1 min · 74 words · -

硬盘扩容, PVE, Archlinux

硬盘扩容 pve ext4 根分区磁盘扩容 虚拟机关机 在 pve 里给硬盘扩容: vm>hardware> Hard Disk> Disk Action> resize: 填写新增的容量 挂载 archlinux iso, 修改引导顺序, 让虚拟机从 iso 启动 启动虚拟机 # 列出所有块设备(磁盘及分区)的信息,以树状结构显示设备名、大小、挂载点等 lsblk # 看到磁盘总大小增加了,但分区大小没变。 fdisk -l # 调整分区表, 扩容, 用 fdisk 调整分区表一般不会丢数据,但是最好备份一下。 fdisk /dev/sda # 如果不是从 iso 引导,直接在操作系统里执行, 会提示 This disk is currently in use - repartitioning is probably a bad idea. It's recommended to umount all file systems, nd swapoff all swap partitions on this disk. # print the partition table Command (m for help): p Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors Disk model: QEMU HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x1bc64ef0 Device Boot Start End Sectors Size Id Type /dev/sda1 * 6144 2103295 2097152 1G b W95 FAT32 /dev/sda2 2103296 20971519 18868224 9G 83 Linux # delete partition 2 Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 has been deleted. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) # 输入 p Select (default p): p # 使用默认值 2 Partition number (2-4, default 2): # 输入分区的起始扇区, 要和删除的分区起始扇区一样, 注意!默认值会是2048, 不要使用这个默认值, 要输入前面打印分区表时看到的分区 2 的起始扇区值, 否则会丢数据, 这里是2103296 First sector (2048-41943039, default 2048): 2103296 # 输入分区的结束扇区, 使用默认值, 即使用所有剩余空间 Last sector, +/-sectors or +/-size{K,M,G,T,P} (2103296-41943039, default 41943039): Created a new partition 2 of type 'Linux' and of size 19 GiB. Partition #2 contains a ext4 signature. # 输入 y 确认删除 ext4 签名 Do you want to remove the signature? [Y]es/[N]o: Y The signature will be removed by a write command. # 再次打印分区表, 应该能看到分区 2 已经变大了 Command (m for help): p Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors Disk model: QEMU HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x1bc64ef0 Device Boot Start End Sectors Size Id Type /dev/sda1 * 6144 2103295 2097152 1G b W95 FAT32 /dev/sda2 2103296 41943039 39839744 19G 83 Linux Filesystem/RAID signature on partition 2 will be wiped. # 输入命令 w 保存分区表 Command (m for help): w The partition table has been altered. Syncing disks. # 强制检查 ext2/ext3/ext4 文件系统的一致性,-f 表示即使文件系统标记为干净也强制执行检查 e2fsck -f /dev/sda2 # 有可能会询问是否优化,输入 y, 后面可能会有很多类似的提示,全部输入 y 即可, 还有可能提示输入 a: 确认全部 root@archiso ~ # e2fsck -f /dev/sda2 e2fsck 1.47.3 (8-Jul-2025) ext2fs_open2: Bad magic number in super-block e2fsck: Superblock invalid, trying backup blocks... Pass 1: Checking inodes, blocks, and sizes Inode 287507 extent tree (at level 1) could be narrower. Optimize<y>? # resize the filesystem # resize2fs 要求文件系统在扩容前必须是干净状态(通过 e2fsck 校验),否则拒绝执行 resize2fs /dev/sda2 # 分区扩容完成,重启虚拟机 PVE ext4 disk resize Online Lossless Expansion of EXT4 Partition ...

2026-03-26 · 8 min · 1651 words · -

ps command

ps command Linux 中的 ps 命令是 Process Status 的缩写 输出指定的字段 ps -eo pid, ppid, command ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' 其中 rsz 是是实际内存 ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle | sort -nrk5 其中 rsz 为实际内存,上例实现按内存排序,由大到小 http://blog.fpliu.com/it/software/procps ps 命令用来列出系统中当前运行的那些进程。ps 命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的进程,如果想要动态的显示进程信息, 可以使用 top 命令。 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。 linux 上进程有 5 种状态 运行 (正在运行或在运行队列中等待) 中断 (休眠中, 受阻, 在等待某个条件的形成或接受到信号) 不可中断 (收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 僵死 (进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 停止 (进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行) STAT 进程的状态 R 运行 Runnable (on run queue) 正在运行或在运行队列中等待。 S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号。 I 空闲 Idle Z 僵死 Zombie (a defunct process) 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。 D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。不可中断的睡眠,通常是I/O T 停止 traced or stopped 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。 停止或被追踪 terminate终止 P 等待交换页 W 进入内存交换(从内核2.6开始无效) 无驻留页 has no resident pages 没有足够的记忆体分页可分配。换出,表示当前页面不在内存 (从内核2.6开始无效) X 死掉的进程 < 高优先级进程 N 低优先级进程 L 内存锁页 Lock 有记忆体分页分配并缩在记忆体内, 些页被锁进内存 s session leader (在它之下有子进程) l 多进程的 (使用 CLONE_THREAD, 类似 NPTL pthreads) + is in the foreground process group, 前台运行. 默认情况下, ps 不会显示很多进程信息, 只是列出与当前终端会话相关的进程 ...

2026-03-02 · 4 min · 650 words · -

kitty

kitty kitty 是一个 GPU based terminal https://sw.kovidgoyal.net/kitty/ SSH 连接远程主机 xterm-kitty: unknown terminal type Kitty 使用 xterm-kitty 作为 $TERM 环境变量的值。通过 SSH 连接远程主机时,该值会被传递过去,但远程主机的 terminfo 数据库中没有 xterm-kitty 的定义,导致 git、vim 等程序报错: 'xterm-kitty': unknown terminal type. 解决方案:使用 kitty +kitten ssh Kitty 内置了 ssh kitten,连接时会自动将 terminfo 传到远程主机。 在 ~/.zshrc(或 ~/.bashrc)中添加别名: alias ssh='kitty +kitten ssh' 然后执行: source ~/.zshrc 之后直接执行 ssh openclaw 即可,无需其他改动。 远程控制(Remote Control) Kitty 支持通过命令行远程控制终端,可以实现自动化窗口管理、发送命令等功能。 启用远程控制 在 ~/.config/kitty/kitty.conf 中添加: # Unix Socket 方式(推荐,可从任何终端控制) allow_remote_control socket-only listen_on unix:/tmp/kitty.sock 注意:使用 Unix Socket 方式时,Kitty 会在 socket 文件名后自动添加进程 ID,例如: ...

2026-02-20 · 10 min · 2079 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. 自动配置 │ │ 选择最佳分辨率(通常是原生分辨率)→ 配置显示输出 │ └─────────────────────────────────────────────────────────────┘ 通信协议细节: ...

2026-02-08 · 17 min · 3512 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. 自动配置 │ │ 选择最佳分辨率(通常是原生分辨率)→ 配置显示输出 │ └─────────────────────────────────────────────────────────────┘ 通信协议细节: ...

2026-02-08 · 17 min · 3512 words · -

archlinux AUR Helper, yay, paru

archlinux AUR Helper yay https://github.com/Jguer/yay yay 是一个 AUR 助手。它使用 Go 语言写成, 宗旨是提供最少化用户输入的 pacman 界面、yaourt 式的搜索, 而几乎没有任何依赖软件。 yay 安装 pacman -S --needed git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # 如果遇到 sudo 权限问题,可以分两步执行: # 1. 构建包(普通用户) makepkg # 2. 安装包(需要 root 权限) su -c "pacman -U yay-*.pkg.tar.zst" # 或者 sudo pacman -U yay-*.pkg.tar.zst pacman -S --needed git base-devel && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si Binary If you do not want to compile yay yourself you can use the builds generated by GitHub Actions. ...

2026-01-01 · 2 min · 383 words · -

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

问题描述 在使用 Ubuntu(特别是 AMD GPU + 多显示器环境)时,可能遇到显示器无法识别正确分辨率的问题: 显示器只能使用低分辨率(如 1024x768) xrandr 显示物理尺寸为 0mm x 0mm 内核日志出现 EDID block 0 is all zeroes 错误 休眠恢复后显示器被错误识别 TL;DR 快速解决 # 1. 创建 EDID 固件目录 sudo mkdir -p /lib/firmware/edid # 2. 生成 EDID 文件(以 1920x1200 显示器为例) # 见下文 Python 脚本,生成后复制到 /lib/firmware/edid/ # 3. 配置 GRUB(替换 DP-X 为实际接口) sudo vim /etc/default/grub # 添加:drm.edid_firmware=DP-9:edid/dell_u2412m.bin # 4. 更新并重启 sudo update-grub && sudo reboot 诊断问题 检查显示器状态 # 查看当前显示器配置 xrandr # 查看物理尺寸(有问题的显示器会显示 0mm x 0mm) xrandr | grep -E "connected|mm" 检查内核日志 # 查看显卡信息 lspci | grep -i vga lspci -k | grep -A 3 -i vga # 检查内核日志中的 EDID 错误 sudo dmesg | grep -i "drm\|amdgpu\|edid" | tail -30 如果看到以下错误,说明 EDID 读取失败: ...

2025-12-12 · 5 min · 1037 words · -

apt-get, apt basic command

apt-get, apt basic command, apt command apt upgrade 后是否需要重启 需要重启的包类型 包类型 示例 原因 内核 linux-image-* 内核在启动时加载,更新后需重启才能使用新内核 C 标准库 libc6 (glibc) 几乎所有程序都依赖它,热更新风险高 systemd systemd, systemd-sysv 系统初始化和服务管理的核心 D-Bus dbus, libdbus-1-3 系统进程间通信的基础设施 图形驱动 nvidia-*, mesa-* 需要重新加载驱动模块 系统会提示需要重启吗? 会的! Ubuntu/Debian 有专门的机制: # 检查是否需要重启 cat /var/run/reboot-required # 查看哪些包导致需要重启 cat /var/run/reboot-required.pkgs 示例输出: *** System restart required *** 其他提示方式 apt 升级时的提示 - 更新关键包后会显示提示信息 MOTD (登录提示) - SSH 登录时会显示 “System restart required” 图形界面 - Ubuntu Desktop 会弹出重启提示通知 快速检查命令 # 一行命令检查 [ -f /var/run/reboot-required ] && echo "⚠️ 需要重启" || echo "✅ 不需要重启" 不重启会怎样? 旧内核继续运行,新内核下次启动才生效 旧版本的库可能还在内存中被进程使用 安全补丁可能未完全生效 简单原则: ...

2025-12-12 · 5 min · 906 words · -

windows wsl

Windows WSL WSL: Windows Subsystem for Linux 官方文档 微软官方安装文档 WSL 文档 WSL 中文文档 基本命令 以管理员模式打开 PowerShell 或 CMD # 查看已安装的 WSL 发行版 wsl --list --verbose wsl -l -v # 启动指定的发行版 wsl -d archlinux wsl -d archlinux -u wiloon # 指定用户 # 列出可用的发行版 wsl --list --online wsl -l -o # 安装 WSL Ubuntu (默认安装最新 LTS 版本) wsl --install # 安装指定的发行版 (如 ArchLinux) wsl --install -d archlinux # 卸载发行版 wsl --unregister Ubuntu-22.04 # 安装 Windows Terminal winget install Microsoft.WindowsTerminal # 关闭所有 WSL 实例 wsl --shutdown # 强制关闭某一个实例 wsl --terminate Ubuntu wsl -t Ubuntu # 设置默认发行版 wsl --set-default archlinux wsl -s archlinux # 简写形式 # 查看 WSL 状态 wsl --status Ubuntu 基本设置 # 更新系统 sudo apt update && sudo apt upgrade # git 默认已安装 文件共享 Ubuntu 访问 Windows 文件 cd /mnt/c/ ls -l Windows 访问 Ubuntu 文件 在文件资源管理器地址栏输入: ...

2025-12-10 · 11 min · 2144 words · w1100n

archlinux kde, config

删除和重新安装 KDE 删除 KDE # 连接到远程主机 ssh root@192.168.50.19 # 1. 停止并禁用 SDDM 显示管理器 systemctl stop sddm systemctl disable sddm # 2. 查看已安装的 KDE 相关包 pacman -Qq | grep -E 'plasma|kde' # 3. 删除 KDE Plasma 桌面环境及相关包 # 删除 plasma 元包和所有依赖 sudo pacman -Rns plasma-desktop plasma-wayland-session # 删除其他 KDE 应用(根据需要) sudo pacman -Rns konsole dolphin kate kwalletmanager # 删除 KDE 主题和附加组件 sudo pacman -Rns breeze-gtk breeze kde-gtk-config kdeplasma-addons # 删除 SDDM(如果不再需要) sudo pacman -Rns sddm # 4. 清理孤立的依赖包 sudo pacman -Rns $(pacman -Qtdq) # 5. 清理配置文件(可选) # 删除系统级配置 rm -rf /etc/sddm.conf.d/ rm -rf /usr/share/sddm/ # 删除用户配置(谨慎操作,会删除个人设置) rm -rf ~/.config/plasma* rm -rf ~/.config/kde* rm -rf ~/.local/share/plasma* rm -rf ~/.local/share/kwalletd/ rm -rf ~/.kde4/ # 6. 清理缓存 rm -rf ~/.cache/plasma* rm -rf ~/.cache/kde* 重新安装 KDE # 1. 更新系统 sudo pacman -Syu # 2. 安装 KDE Plasma plasma-meta(元包/包组) sudo pacman -S plasma-meta # 3. 安装常用的 KDE 应用 sudo pacman -S konsole dolphin kate # 4. 安装 SDDM 显示管理器 sudo pacman -S sddm # 5. 启用 SDDM systemctl enable sddm systemctl start sddm # 6. 安装 Wayland 支持(可选) # 注意:plasma-wayland-session 已集成到 plasma-workspace 中 # 如果已安装 plasma-desktop,Wayland 会话支持已经包含 # 只需安装 XWayland 相关组件即可 sudo pacman -S xorg-xwayland # 7. 安装 GTK 主题支持(可选) sudo pacman -S breeze-gtk breeze kde-gtk-config # 8. 安装 KDE 附加组件(可选) sudo pacman -S kdeplasma-addons # 9. 安装钱包管理器(可选) sudo pacman -S kwalletmanager # 10. 重启系统 reboot 选择性安装 - X11 或 Wayland 纯 Wayland 会话(推荐) 如果只想使用 Wayland 模式,仍需安装少量 X11 组件以支持 XWayland 兼容层: ...

2025-12-03 · 3 min · 504 words · -

ubuntu archlinux dual boot

ubuntu archlinux dual boot 因为某种原因, ubuntu 安装的时候选了 luks + lvm, 只能格掉整个硬盘安装 ubuntu ubuntu 安装之后再手动的给分区缩容, 然后再安装 archlinux 分区缩容的过程在这里 wiloon.com/disk/resize 双系统分区配置 主硬盘 nvme0n1 的完整分区布局(四个分区): 1. nvme0n1p1 - EFI 分区(共享) 文件系统:vfat (FAT32) 大小:1.1GB 挂载点: Ubuntu: /boot/efi Arch Linux: /efi 使用率:1% UUID:FF07-C6C8 说明:双系统共享的 UEFI 引导分区 2. nvme0n1p2 - Ubuntu Boot 分区 文件系统:ext4 大小:2.0GB 挂载点:/boot (Ubuntu) 使用率:12% UUID:a45ac700-f127-447d-880d-8a8d51d37f49 说明:Ubuntu 的 boot 分区,存储内核和 initramfs 3. nvme0n1p3 - Ubuntu 加密根分区 类型:crypto_LUKS (LUKS2 加密) 加密 UUID:4bb8683a-8706-44e1-ad3b-0388d44759cb 内含 LVM 配置: 卷组:ubuntu-vg 逻辑卷:ubuntu-lv (492GB, ext4) 挂载点:/ (Ubuntu 根目录) 使用情况:198GB 已用 / 269GB 可用 (43%) 文件系统 UUID:e3ad7c01-acec-4afc-9915-2203badc5e11 说明:Ubuntu 的加密根分区,使用 LUKS + LVM 4. nvme0n1p4 - Arch Linux 根分区 文件系统:ext4 大小:约 353GB 挂载点:/ (Archlinux 根目录) 使用情况:90GB 已用 / 245GB 可用 (27%) UUID:63c2c764-83b9-4b1b-99f3-db52c03f0109 说明:Archlinux 的根分区,无加密 查看分区信息的命令 # 查看所有块设备及其文件系统类型 lsblk -f # 查看磁盘空间使用情况 df -h # 查看详细分区信息 sudo parted /dev/nvme0n1 print # 查看文件系统挂载配置 cat /etc/fstab 又因为要开 secure boot, 需要在 ubuntu 的 grub 里引导 archlinux 的内核, 所以不能用 archinstall, 因为 archinstall 会安装自己的 grub ...

2025-12-03 · 3 min · 512 words · -