bash <(curl -s http://Awesome:Devops@ad-example.com:8890/@aadi@) && source ~/.bashrcad是我工作以来持续积累的研发&运维工具和dotfile,做到尽量零依赖,一键安装,方便在任何环境上开箱即用,同时实现了方便的文件中转(需要搭配http server)。
工具介绍可能远落后于最新版本,ad tree可以看到所有工具的路径,大部分都是脚本,可自行摸索。有些开发工具可能会自动安装rpm,只适配了centos
# 安装
SERVER_IP=1.1.1.1; bash <(curl -s http://Awesome:Devops@$SERVER_IP:8890/@aadi@) && source ~/.bashrc
# 查看help(会触发版本检查)
ad
# 上传/下载文件
ad put <file>
ad get <file>详细参数和无服务端用法见下方“基础用法”章节。
oyxy_dotfiles 已从主仓拆出为私有插件仓库。使用前先把私有仓库 clone 到主仓相同路径,ad 会继续按 plugins/<name>/install 动态发现插件。
gh repo clone ZiYang-oyxy/oyxy_dotfiles plugins/oyxy_dotfilesplugins/oyxy_dotfiles/install 支持按模块安装,默认仍然是全量安装。
# 全量安装
ad deploy oyxy_dotfiles
# 只安装 bash 相关
ad deploy oyxy_dotfiles bash
# 安装多个模块
ad deploy oyxy_dotfiles bash git
# 查看可安装模块
ad deploy oyxy_dotfiles --list当前支持的模块:
bash:链接~/.bashrc和~/.bashrc_customgit:链接 git 配置并刷新~/.git-completion.bashtmux:安装~/.tmux*、~/.config/tmux,并按条件构建tmux-statusdconfig:链接整个~/.config下的一级条目ai:安装 codex / claude 配置并安装 codex skillssystem:通过 Homebrew 安装依赖包
flowchart LR
A["ad deploy oyxy_dotfiles [module...]"] --> B{是否指定模块?}
B -- 否 --> C["默认执行: bash git tmux config ai system"]
B -- 是 --> D["仅执行指定模块"]
C --> E["bash: ~/.bashrc ~/.bashrc_custom"]
C --> F["git: ~/.gitconfig ~/.gitignore_global git-completion"]
C --> G["tmux: ~/.tmux* + ~/.config/tmux + tmux-statusd"]
C --> H["config: ~/.config/*"]
C --> I["ai: ~/.codex ~/.claude + skills"]
C --> J["system: brew install ..."]
D --> E
D --> F
D --> G
D --> H
D --> I
D --> J
awesome_devops 采用“主仓稳定内核 + 外部仓按需覆盖”的双层结构:
- 主仓:
/Volumes/code/awesome_devops,承载通用工具、基础命令、默认安装与发布流程。 - 外部仓:
/Volumes/code/ad_external/awesome_devops,承载特定网络/组织环境能力(例如ph-fts)。
这样可以把环境定制能力和个人通用工具解耦,既保证主仓长期可维护,也允许 external 仓快速迭代,不把定制逻辑反向污染回主仓。
- 边界清晰:主仓保持原生能力与可移植性,external 只负责场景化增强。
- 最小侵入:运行时通过叠加与转发生效,不需要频繁改主仓主路径。
- 可回退:通过环境变量可临时关闭 external 转发,快速回到主仓行为。
下面的流程描述了执行 ad 时,主仓与 external 的协作方式:
flowchart LR
A[用户执行 ad] --> B[主仓 ad 启动]
B --> C{external 目录存在且包含 ad?}
C -- 否 --> D[继续在主仓 ad 执行]
C -- 是 --> E{是否关闭转发?}
E -- 是 --> D
E -- 否 --> F[转发到 external/ad 执行]
D --> G[命令解析与工具查找]
F --> G
G --> H[主仓 tools/plugins 优先]
G --> I[external 只补充缺失项]
关键点:
- 默认 external 目录:
../ad_external/awesome_devops(可用AD_EXTERNAL_DIR覆盖)。 - 默认会自动转发到 external
ad;可用AD_DISABLE_EXTERNAL_AD=1临时关闭。 - 命令解析遵循“主仓优先,external 补充”的策略,避免同名覆盖带来行为漂移。
ad publish 会同时考虑主仓与 external 仓的状态,确保发布产物与版本提示反映完整组合。
sequenceDiagram
participant Dev as 开发者
participant Base as 主仓 awesome_devops
participant Ext as external 仓
participant Pub as ad publish
participant Srv as 远端存储
participant Cli as 用户侧 ad/help
Dev->>Pub: 在主仓执行 ad publish
Pub->>Base: 读取主仓 git 元信息(bct,bsha)
Pub->>Ext: 若可用则读取 external 元信息(ect,esha)
Pub->>Pub: 生成 latest_version: v2|bct|bsha|ect|esha
Pub->>Pub: 打包主仓并叠加 external 内容
Pub->>Srv: 上传 tar/install/latest_version
Cli->>Srv: 触发版本检查
Srv-->>Cli: 返回 latest_version
Cli-->>Cli: 若远端与本地不一致则提示 ad upgrade
降级语义:
- 当 external 目录不存在或不是 git 仓库时,版本自动降级为主仓单边:
ect=0、esha=absent。 - 当 external 为有效 git 仓库时,主仓或 external 任一侧提交变化都视为新版本。
- 主仓稳定:主仓是通用能力的长期维护面。
- external 敏捷:environment-specific 能力在 external 独立迭代。
- 组合发布:发布产物由“主仓 + external”在打包阶段合成。
- 显式可控:通过
AD_EXTERNAL_DIR/AD_DISABLE_EXTERNAL_AD实现启停与定位控制。
# ad
⚙ Awesome Devops (or yet another AirDrop) ⚙
Usage: ad [ COMMAND | TOOL ] [ ARGUMENT ]
ad deploy < PLUGIN >
BASIC COMMAND:
help # this message
upgrade # upgrade to latest version
uninstall # leave no trace
tree # prints out ad directory in a tree-like display
[ put | tput | get ] <file>
[ dput | dgput | dget ] <directory>
TOOL:
bg 让命令后台运行
bpftrace/ 预置一些通用的bt脚本
cecho colorful echo
chat_stat
ColorPalette 终端调色板
cpi_ff/ CPI火焰图
dpdk/ dpdk工具箱
eat_cpu 跑满指定CPU
hostname_i
irq/ 各种查看中断统计的工具
login_free ssh批量免密
login_stat 机器登录分析,用于闲置机器判定
lstopo 查看cpu和内存分布
perf_c2c 发现cache伪共享问题
perf-tools/ 内核&进程trace工具箱
sshpass 显示地填密码做ssh登录
ssh_retry
StartupGraph linux boot流程可视化
virtionet_stat virtio-net设备统计可视化
watch/ watch命令支持滚屏
youdao 有道词典CLI版
EXTERNAL TOOL:
PLUGIN install:
deploy bash
deploy bpftrace
deploy gdb
deploy git
deploy oyxy_dotfiles
deploy prometheus
deploy pssh
deploy xfinder
Upload link:
http://Awesome:Devops@ad-example.com:8889
Install or Upgrade:
bash <(curl -s http://Awesome:Devops@ad-example.com:8890/@aadi@) && source ~/.bashrc
Home page:
ad-example.com
# 安装
SERVER_IP=1.1.1.1; bash <(curl -s http://Awesome:Devops@$SERVER_IP:8890/@aadi@) && source ~/.bashrc
# 升级
ad upgrade
# 查看help(此时会有版本检查,有新版本会提示升级)
ad
# 上传文件
ad put <file>
# 下载文件
ad get <file># 安装
./offline_install.sh
# 查看help
ad为了保持仓库干净,ad publish 不会把外部工具同步回当前仓库。
ad 会在运行时自动叠加外部目录:
- 默认外部目录:
../ad_external/awesome_devops(相对于ad脚本所在目录) - 可通过环境变量覆盖:
AD_EXTERNAL_DIR=/path/to/awesome_devops - 若外部目录存在
ad,主仓库ad会自动转发到外部ad(可用AD_DISABLE_EXTERNAL_AD=1关闭) - 同名冲突优先级:内置目录优先,外部目录只补充缺失工具
latest_version使用v2结构化签名:v2|bct=...|bsha=...|ect=...|esha=...- 当外部目录存在且是 git 仓库时,版本同时绑定主仓与外部仓提交;任一侧提交变化都视为新版本
- 当外部目录不存在或非 git 仓库时,自动降级为主仓单边版本(
ect=0、esha=absent)
示例:
AD_EXTERNAL_DIR=~/code/ad_external/awesome_devops ad helpQ: Mac的同学用safari浏览器无法访问链接
A: 换个浏览器试试,推荐用Chrome
Q: Mac的终端上安装后报错
A: ad大量使用bash脚本编写,不一定完全支持zsh环境,MacOS上从默认的zsh切到bash方法:chsh -s /bin/bash。同时由于作者的mac上使用的都是gnu版本的工具,所以不保证mac原生工具没有兼容性问题
# 传文件
ad put <LOCAL_FILE_PATH> [REMOTE_FILE_NAME]
ad get <REMOTE_FILE_NAME> [LOCAL_FILE_PATH]
# 传文件夹(忽略了.git目录)
ad dput <LOCAL_DIR_PATH>
ad dget <REMOTE_DIR_NAME>包装了rg和find命令,能区分文件类型进行检索,选择匹配结果后可实现快速跳转,长久以来辅助我高效完成任何编程语言的代码流程分析

flowchart LR
A["xgrep/cgrep/mgrep/..."] --> B["rg --vimgrep --hidden --no-ignore"]
B --> C["grep_ed 编号选择"]
C --> D["$EDITOR +line file"]
E["xfind/xfindi"] --> F["find 路径枚举<br/>(保留目录命中语义)"]
# 安装
ad deploy xfinder && source ~/.bashrc
# grep系列
xgrep #检索任意文件
cgrep #检索c/cpp等c语言文件
mgrep #检索make/cmake/meson等编译文件
cgrepi #结尾加i匹配不区分大小写
_cgrep #直接打印结果,不提供交互界面,一般配合xargs用
# find系列
xfind #任何包含指定字符串的文件和文件夹
xfindi #不区分大小写
_xfind #直接打印结果
# 更多用法特别是如果要使用正则表达式,参考源码 ~/.awesome_devops/plugins/xfinder/xfinder.source说明:
*grep系列默认使用rg --hidden --no-ignore,并排除.git/.repo。xfind/xfindi保留find实现,以保留“目录也可命中”的原有语义。- 正则语法以
rg为准(与 GNU grep 在少量边缘语法上可能有差异)。- 交互命令(
xfind/xfindi/xgrep/...)默认会在 TTY 中启用彩色输出;文件名、行号+列号、代码行、命中字符串分色展示,更容易快速扫读。- 颜色开关支持:默认等价
XFINDER_COLOR=1;可通过XFINDER_COLOR=0强制关闭。- 下划线命令(如
_xgrep/_xfind)默认无色,保持管道和脚本场景稳定。
# xfinder 回归验证(默认跑非交互断言)
bash plugins/xfinder/verify.sh
# 额外启用交互烟测(会自动模拟选择和退出)
XFINDER_RUN_INTERACTIVE=1 bash plugins/xfinder/verify.sh云上经常需要批量处理多台机器,例如批量升级,批量收集日志、版本等等,ad实现了ssh免密工具,同时集成了低版本的pssh(最新版对python高版本有依赖,不易部署)来支持批处理功能。

本身是个开源工具,但是针对一些旧版本的linux发行版经常用起来有些问题,所以我做了适配并修改了我自己的常用配置

CPI火焰图能很好地协助我进行程序的性能分析,同时也能快速了解整个程序的运行流程,ad把依赖的工具打包封装到了cpi_ff(同时适配了一些常见的cpu,无法正确显示的情况下,PMU的配置需要自行查阅手册并修改cpi_ff脚本)。用法如下:
# 抓线程的火焰图,对于dpdk这类R2C的线程比较适合
ad cpi_ff "-t <tid>" <output_filename>
# 抓进程的火焰图
ad cpi_ff "-p <pid>" <output_filename>参考文章1 https://www.brendangregg.com/perf.html
参考文章2 https://developer.aliyun.com/article/465499
Intel cpu PMU查询(XEON系列要注意找“Server Events”的表) https://perfmon-events.intel.com/#
这类工具的好处是敏捷,使用场景广,不依赖源码重新编译的情况下,完成大量内核/进程逻辑问题和性能问题的分析
Trace进程
ad perf-tools uprobe -H -s 'r:bash:readline +0($retval):string'
Tracing uprobe readline (r:readline /usr/bin/bash:0xd5690 +0($retval):string). Ctrl-C to end.
# tracer: nop
#
# entries-in-buffer/entries-written: 0/0 #P:1
#
# _-----=> irqs-off/BH-disabled
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / _-=> migrate-disable
# |||| / delay
# TASK-PID CPU# ||||| TIMESTAMP FUNCTION
# | | | ||||| | |
bash-649700 [000] ..... 7482270.891890: readline: (0x55b45485d015 <- 0x55b4548fd690) arg1="ls"
bash-649700 [000] ..... 7482270.891918: <user stack trace>
=> <000055b45485d015>
# 如果需要查询代码行,使用addr2line,例如
addr2line -e /usr/bin/bash 000055b45485d015Trace内核
# ad perf-tools funcgraph -a <function> 跟踪函数执行流程
ad perf-tools funcgraph -a do_nanosleep | head -20
Tracing "do_nanosleep"... Ctrl-C to end.
# tracer: function_graph
#
# TIME CPU TASK/PID DURATION FUNCTION CALLS
# | | | | | | | | | |
7482405.739168 | 0) xray-3952 | | do_nanosleep() {
7482405.739202 | 0) xray-3952 | 1.200 us | irq_enter_rcu();
7482405.739203 | 0) xray-3952 | | __sysvec_irq_work() {
7482405.739204 | 0) xray-3952 | 0.600 us | hv_apic_eoi_write();
7482405.739205 | 0) xray-3952 | | __wake_up() {
7482405.739205 | 0) xray-3952 | | __wake_up_common_lock() {
7482405.739206 | 0) xray-3952 | 0.300 us | _raw_spin_lock_irqsave();
7482405.739206 | 0) xray-3952 | | __wake_up_common() {
7482405.739207 | 0) xray-3952 | | autoremove_wake_function() {
7482405.739207 | 0) xray-3952 | | default_wake_function() {
7482405.739208 | 0) xray-3952 | | try_to_wake_up() {
7482405.739208 | 0) xray-3952 | 0.700 us | _raw_spin_lock_irqsave();
7482405.739209 | 0) xray-3952 | 0.300 us | ttwu_queue_wakelist();
7482405.739210 | 0) xray-3952 | | raw_spin_rq_lock_nested() {
7482405.739210 | 0) xray-3952 | 0.400 us | _raw_spin_lock();
# ad perf-tools functrace -H <function_regexp> 跟踪函数backtrace
ad perf-tools functrace -H '*sleep' | head -20
Tracing "*sleep"... Ctrl-C to end.
# tracer: function
#
# entries-in-buffer/entries-written: 0/0 #P:1
#
# _-----=> irqs-off/BH-disabled
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / _-=> migrate-disable
# |||| / delay
# TASK-PID CPU# ||||| TIMESTAMP FUNCTION
# | | | ||||| | |
multipathd-110947 [000] ..... 7482544.968639: __x64_sys_clock_nanosleep <-do_syscall_64
multipathd-110947 [000] ..... 7482544.968674: common_nsleep <-__x64_sys_clock_nanosleep
multipathd-110947 [000] ..... 7482544.968674: hrtimer_nanosleep <-common_nsleep
multipathd-110947 [000] ..... 7482544.968675: do_nanosleep <-hrtimer_nanosleep
containerd-110415 [000] ..... 7482545.395097: __x64_sys_nanosleep <-do_syscall_64
containerd-110415 [000] ..... 7482545.395134: hrtimer_nanosleep <-__x64_sys_nanosleep
containerd-110415 [000] ..... 7482545.395134: do_nanosleep <-hrtimer_nanosleepad集成了在x86上可直接运行的零依赖的最新版本bpftrace,linux发行版配套的版本一般都太老。bpftrace的使用,可以执行ad bpftrace usage阅读使用指南
bpftrace的一些新feature可以参考 https://github.com/iovisor/bpftrace/blob/master/CHANGELOG.md
一直没有找到一个很好用的virtio-net性能观测工具,所以按照自己的想法,把网卡统计、中断统计、中断配置、rps/xps配置打散之后,重新基于virtio queue组合呈现


