1. byobu 到底是个啥
一句话:byobu 不是又一个终端复用器,它是 tmux / GNU screen 之上的“增强套件”。
终端复用器(tmux、screen)解决的是:SSH 断了会话不丢、一个终端开多窗格、后台进程不被 logout 杀掉。但 tmux 上手有门槛——Ctrl-b 前缀、手写 .tmux.conf、状态栏默认空白。byobu 把这层全部藏起来,给你一套开箱即用的体验:
- 会说话的状态栏:负载、内存、磁盘、CPU 频率、时间…… 每秒刷新,直接显示系统状况
- F 键快捷键:
F2开新窗口、F3/F4切换、F9打开配置菜单,鼠标点点就能改配置 - 双后端:同一套配置风格,底层 tmux 和 screen 随你切换
它由 Canonical 的 Dustin Kirkland 开发,曾是 Ubuntu 服务器的默认标配。
2. 安装
Debian 系一行装完:
$ sudo apt install byobu
看版本和依赖:
$ byobu --version
byobu version 7.15
$ dpkg -l | awk '$1=="ii" && ($2~/(^byobu$|^tmux$|^screen$)/) {print $2, $3}'
byobu 7.15-1
screen 4.9.1-3.1
tmux 3.6a-2
注意一个关键事实:byobu 自己不做终端复用,它只是 tmux/screen 的“管家”。后端选谁,看 /etc/byobu/backend:
$ cat /etc/byobu/backend
# BYOBU_BACKEND can currently be "screen" or "tmux"
# Override this on a per-user basis by editing "$BYOBU_CONFIG_DIR/backend"
# or by launching either "byobu-screen" or "byobu-tmux" instead of "byobu".
BYOBU_BACKEND="tmux"
BYOBU_BACKEND="tmux" —— 本机默认 tmux 后端。想切 screen,跑 byobu-select-backend 或直接 byobu-screen。
3. 命令族全景:30 多个脚本
/usr/bin/byobu* 是一整个家族:
$ ls /usr/bin/byobu*
byobu byobu-janitor byobu-quiet
byobu-config byobu-keybindings byobu-reconnect-sockets
byobu-ctrl-a byobu-launch byobu-screen -> byobu
byobu-disable byobu-launcher byobu-select-backend
byobu-disable-prompt byobu-launcher-install byobu-select-profile
byobu-enable byobu-launcher-uninstall byobu-select-session
byobu-enable-prompt byobu-layout byobu-shell
byobu-export byobu-prompt byobu-silent
byobu-status byobu-status-detail byobu-tmux -> byobu
byobu-ugraph byobu-ulevel
主程序 /usr/bin/byobu 只有 10KB,是个 sh -e 包装脚本;byobu-tmux、byobu-screen 只是指向它的符号链接,靠 $0 的名字区分派发。每个子命令各管一摊:
| 命令 | 作用 |
|---|---|
byobu-tmux / byobu-screen |
指定后端启动 |
byobu-status |
拼装状态栏(核心!) |
byobu-janitor |
每次启动前“管家式”重建用户配置 |
byobu-config |
F9 交互配置菜单(Python + snack) |
byobu-select-backend |
切换 tmux / screen |
byobu-enable / -disable |
开关登录自动拉起 |
byobu-select-session |
已有会话多时选择要附加哪个 |
4. 第一次真正跑起来
有 TTY 时直接 byobu 进入;无 TTY 环境也能起一个分离会话(tmux 派生的好处):
$ byobu-tmux new-session -d -s fresh
$ tmux ls
fresh: 1 windows (created Mon Aug 31 00:31:14 2026)
这时已经能看到状态栏配置长什么样了——直接问 tmux 要:
$ tmux show-options -g -v status-left # 左侧
#(byobu-status tmux_left)
$ tmux show-options -g -v status-right # 右侧
#(byobu-status tmux_right)%Y-%m-%d %H:%M:%S
$ tmux show-options -g -v prefix # 前缀键
F12
两个关键点:
- 前缀键是
F12,不是 tmux 的Ctrl-b,也不是 screen 的Ctrl-a(byobu 也兼容Ctrl-a)。 - 状态栏根本不是写死的文本,是
#(byobu-status ...)这个 shell 命令替换——tmux 每秒执行一次,把输出当状态栏。
5. 核心:状态栏是怎么拼出来的
byobu-status 是本片的主角。手动跑一下,能看到它输出的“原材料”(tmux 格式串 + ANSI 颜色):
$ byobu-status tmux_left
#[default]#[fg=brightwhite,bold,bg=black][B]#[default]#[fg=#EEEEEE,bg=#333333] #[default]#[fg=bold]2026.1#[default]#[fg=#EEEEEE]#[bg=#333333]
$ byobu-status tmux_right
#[default]#[fg=blue,bg=white]8h5m#[default]#[fg=#EEEEEE]#[bg=#333333] #[default]#[fg=black,bg=brightyellow]0.64#[default]...3.2...GHz...7.7...GB...32...%...79...GB...44...%
把 tmux 格式串翻译成人话,实际看到的状态栏是:
[B] 2026.1 │ 8h5m 0.64 8x 3.2GHz 7.7GB/32% 79GB/44% │ 2026-08-31 00:31:09
└logo └版本 └开机时长└负载└核心数└CPU频率 └── 内存 ── └─── 磁盘 ── └─ 日期时间
每个小段都是一个独立的状态脚本。/usr/lib/byobu/ 里躺着 40 多个:
$ ls /usr/lib/byobu/
apport cpu_count entropy ip_address packages services time_utc
arch cpu_freq fan_speed load_average processes session trash
battery cpu_temp hostname logo raid swap updates_available
color custom mail memory reboot_required time uptime
cpu_... disk ... menu ...
byobu-status 读两份“点菜单”决定渲染哪些(/usr/share/byobu/status/status),以 # 开头的是禁用:
$ cat /usr/share/byobu/status/status | awk '/(^tmux_left|^tmux_right)/'
tmux_left="logo #distro release #arch session"
tmux_right="#network #disk_io #custom #entropy raid reboot_required updates_available #apport #services #mail #users uptime #fan_speed #cpu_temp #battery #wifi_quality #processes #packages load_average cpu_count cpu_freq memory #swap disk #whoami #hostname #ip_address #time_utc date time"
所以左侧渲染 logo release,右侧渲染 uptime load_average cpu_count cpu_freq memory disk date time。这就是为什么没看到 raid、reboot_required——它们要么被 # 禁用,要么当前系统没有对应数据。
6. 状态脚本怎么工作(底层 · 一)
拿 load_average 开刀。它不调任何外部命令,直接读 /proc:
$ cat /usr/lib/byobu/load_average
__load_average() {
if [ -r "/proc/loadavg" ]; then
read one five fifteen other < /proc/loadavg # ← 内核文件
elif [ "$BYOBU_OSTYPE" = "OpenBSD" ]; then
read -r one five fifteen <<EOF
$(sysctl -n vm.loadavg 2>/dev/null | awk '{print $2, $3, $4}')
EOF
else
one=$(uptime | sed -e "s/.*://" | awk '{print $1}')
fi
[ -n "$one" ] || return
if [ "${LOAD_AVERAGES:-1}" = "3" ] && [ -n "$five" ] && [ -n "$fifteen" ]; then
color Y k; printf "%s %s %s" "$one" "$five" "$fifteen"; color -- # ← 上色
else
color Y k; printf "%s" "$one"; color --
fi
}
套路是统一的:读 /proc → color 函数包一层 ANSI → printf。color 是 /usr/lib/byobu/include/colors 提供的配色助手(color Y k = 黄字黑底)。
7. 配置体系:双层目录 + 自动生成(底层 · 二)
byobu 的配置分两层:
- 系统默认:
/usr/share/byobu/{profiles,keybindings,status}/ - 用户配置:
~/.byobu/,如果不存在就落到$XDG_CONFIG_HOME/byobu(本机是~/.config/byobu)
用户目录不是手写的,是 byobu-janitor 自动生成的。每次跑 byobu 都先执行 byobu-janitor --force,它把系统模板 + 用户在 F9 菜单里的选择合写成用户配置。实测首跑后生成的全套文件:
$ ls ~/.config/byobu/
backend datetime.tmux profile shellinit.tmux statusrc
color keybindings profile.tmux status windows
color.tmux keybindings.tmux prompt .tmux.conf
运行时缓存走 tmpfs(性能优先),在 /dev/shm/byobu-$USER-*,定义在 include/dirs:
# dirs: 配置目录 → ~/.byobu 或 ~/.config/byobu
# 运行目录 → /dev/shm/byobu-$USER-* (找不到就退回 ~/.cache/byobu)
8. tmux 后端的加载链(底层 · 三)
byobu-tmux 实际执行的命令是(主脚本尾部):
exec tmux -u $SCREEN_TERM -f $BYOBU_PREFIX/share/byobu/profiles/tmuxrc "$@"
即 tmux -f tmuxrc,用一个专门的文件取代默认的 ~/.tmux.conf。tmuxrc 是一个串联器:
$ cat /usr/share/byobu/profiles/tmuxrc | awk '/source-file/'
source-file $BYOBU_CONFIG_DIR/color.tmux
source-file $BYOBU_CONFIG_DIR/datetime.tmux
source-file $BYOBU_CONFIG_DIR/profile.tmux
source-file $BYOBU_CONFIG_DIR/keybindings.tmux
source-file $BYOBU_CONFIG_DIR/.tmux.conf
source-file $BYOBU_CONFIG_DIR/shellinit.tmux
profile.tmux 只干一件事——把锅甩给真正的公共配置:
$ cat ~/.config/byobu/profile.tmux
source $BYOBU_PREFIX/share/byobu/profiles/tmux
真正的 profiles/tmux(79 行)里才有干货:set -g prefix F12、mode-keys vi、history-limit 100000、状态栏那两行 set -g status-left/right,以及把你的 .tmux.conf 位置留给 $BYOBU_CONFIG_DIR/.tmux.conf。
这里有个容易踩的坑:byobu 默认完全不读你手写的 ~/.tmux.conf! 你以前在 ~/.tmux.conf 里配的主题、插件(比如 catppuccin)进 byobu 后全部不生效。自定义要写进 ~/.config/byobu/.tmux.conf。
9. 按键绑定:F 键速查
byobu 的按键定义在 /usr/share/byobu/keybindings/f-keys.tmux,一条 bind-key -n 对应一个 F 键。-n 表示“免前缀”,直接按就行。核心几条(实测文件内容):
$ cat /usr/share/byobu/keybindings/f-keys.tmux | awk '$1=="bind-key" && $2=="-n" {print $3}' | head -30
F1 # 帮助(help 窗口)
F2 # 新窗口
C-F2 # 垂直分屏
S-F2 # 水平分屏
F3/F4 # 上一个/下一个窗口
F5 # 重新加载配置
F6 # 分离并登出
F7 # 进入滚动历史(copy-mode)
F8 # 重命名窗口
F9 # 打开 byobu-config 配置菜单
F12 # 前缀键(转义)
S-F12 # 开关全部 F 键绑定
M-F12 # 开关鼠标支持
C-S-F12 # Mondrian 换色(艺术家附体)
官方帮助文件(按 Shift-F1)是完整的速查表,摘录一部分:
$ cat /usr/share/doc/byobu/help.tmux.txt | sed -n '/^ F[0-9]/p'
F1 * Used by X11 *
Shift-F1 Display this help
F2 Create a new window
Shift-F2 Create a horizontal split
Ctrl-F2 Create a vertical split
Ctrl-Shift-F2 Create a new session
F3/F4 Move focus among windows
...
F5 Reload profile, refresh status
Shift-F5 Toggle through status lines
Ctrl-Shift-F5 Change status bar's color randomly
F6 Detach session and then logout
Shift-F6 Detach session and do not logout
F7 Enter scrollback history
F8 Rename the current window
F9 Launch byobu-config window
F12 Escape sequence
Shift-F12 Toggle on/off Byobu's keybindings
10. 自定义状态项:~/.byobu/bin/ 机制
不想改 Python、不想碰 tmux 配置,也能加自己的状态项——扔一个可执行脚本进 $BYOBU_CONFIG_DIR/bin/,命名 NNN_name。NNN 是刷新频率(秒)。/usr/lib/byobu/custom 里的循环逻辑:
for i in "$BYOBU_CONFIG_DIR/bin/"[0-9]*_*; do
[ -x "$i" ] || continue # 可执行?
script=${i##*/}
freq=${script%%_*} # "300_name" → 300 秒
lastrun=$(cat "$cache.$script.last" 2>/dev/null || echo 0)
[ $(date +%s) -ge $((lastrun+freq)) ] && "$i" > "$cache.$script" # 到点才重跑
readfile < "$cache.$script"
output="$output$str "
done
例:加一个显示当前 git 分支的状态项:
$ cat > ~/.config/byobu/bin/60_branch <<'EOF'
#!/bin/sh
# 只在 git 仓库里显示分支
git rev-parse --abbrev-ref HEAD 2>/dev/null && echo " on $(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
EOF
$ chmod +x ~/.config/byobu/bin/60_branch
$ byobu-status tmux_right # 60 秒内最多重跑一次,结果被缓存
11. SSH 登录自动拉起
byobu 能让你一 SSH 进来就自动进入 byobu。钩子在 /etc/profile.d/Z97-byobu.sh:
if [ "$LC_BYOBU" = "0" ]; then
true
elif [ "$LC_BYOBU" = "1" ]; then
. /usr/bin/byobu-launch # 显式要求
elif [ -e "/etc/byobu/autolaunch" ]; then
. /usr/bin/byobu-launch # 系统级开关
elif [ "$LC_TERMTYPE" = "byobu" ]; then
. /usr/bin/byobu-launch # SSH 客户端声明
fi
它借用了 SSH 会透传的 LC_* 环境变量:要么你本地 export LC_BYOBU=1,要么服务器上放 /etc/byobu/autolaunch,要么 SSH 客户端设 LC_TERMTYPE=byobu。跑一次 byobu-enable 就会调用 byobu-launcher-install 把这些写进你的 ~/.bashrc;byobu-disable 撤销。
12. F9 配置菜单(底层 · 四)
byobu-config 是个 1KB 的 shell 包装,真正的菜单是 Python 写的:
$ cat /usr/bin/byobu-config | tail -3
...
PKG="byobu"
[ -z "${BYOBU_PREFIX}" ] && export BYOBU_PREFIX="/usr" || export BYOBU_PREFIX
. "${BYOBU_PREFIX}/lib/${PKG}/include/common"
${BYOBU_PYTHON} "${BYOBU_PREFIX}/lib/${PKG}/include/config.py"
config.py 基于 snack(newt 的 Python 绑定)做全屏菜单。它做的都是“改配置文件”的活:勾选状态项 → 写 status;选主题颜色 → 写 color;调状态栏方案 → 写 statusrc。改完按 F5(或让 janitor 重跑)生效——所以你所有 ~/.config/byobu/ 下的文件都能删了重建,byobu 会按菜单选择重新生成。
13. 实测踩过的坑
坑一:同 server 全局选项会“串台”。 我在一个已有 tmux server 上建 byobu 会话时,状态栏一度变成 catppuccin 的 status-right 而不是 #(byobu-status ...)——因为 tmux 的 set -g 全局选项是 server 级的,先起的 probe 会话(普通 tmux + 你的 ~/.tmux.conf)污染了后建的 byobu 会话。换一个干净的 server(tmux kill-server)后,byobu 状态栏才正常出现。
坑二:主题不生效。 本机 ~/.tmux.conf 配了 catppuccin 主题,但 byobu 用 -f tmuxrc 接管后完全不读它,状态栏回到 byobu 默认的 #333333 黑灰配色。要恢复个性化,去 ~/.config/byobu/.tmux.conf(byobu 自己的)里补。
坑三:screen 后端也要同一套。 状态脚本和键绑定分 tmux/screen 两份(f-keys.tmux 与 f-keys.screen),切后端后 F5 重新加载即可,不必手改配置。
14. 一张图看懂全链路
SSH 登录
│ /etc/profile.d/Z97-byobu.sh 命中 LC_BYOBU / autolaunch
▼
byobu(sh 包装器)
│ byobu-janitor --force 重建 ~/.config/byobu/*
▼
exec tmux -u -f /usr/share/byobu/profiles/tmuxrc new-session ...
│ tmuxrc 串联: color.tmux → profile.tmux → keybindings.tmux → .tmux.conf
▼
profile.tmux 设好: prefix=F12, mode-keys=vi, status-left='#(byobu-status tmux_left)'
│ tmux 每秒执行一次 #(...) 命令替换
▼
byobu-status 读 status 点菜单 → 逐个跑 /usr/lib/byobu/<item>
│ 每个脚本读 /proc → color 上色 → printf 片段
▼
渲染: [B] 2026.1 │ 8h5m 0.64 8x 3.2GHz 7.7GB/32% 79GB/44% │ 2026-08-31 00:31:09
结语
byobu 的价值不在它自己,而在“包装”:tmux 是引擎,byobu 是座舱。状态栏由 40 多个读 /proc 的小脚本 + 一条 #() 命令替换撑起来;配置由 janitor 按模板自动生成、F9 菜单点选即改;按键用一套 F 键覆盖了 tmux 的九成高频操作。理解了“壳脚本 → tmux 配置 → 状态脚本”这条加载链,你就既会用 byobu,也能随时掀开盖子回到原生 tmux。
要是哪天它跟你较劲,记住三把钥匙:tmux kill-server 清场、F5 重载配置、Shift-F12 临时交还按键。
原文 https://blog.csdn.net/2301_79518550/article/details/164194946