// Linux · 2026-08-30

byobu: tmux 的豪华壳

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

两个关键点:

  1. 前缀键是 F12,不是 tmux 的 Ctrl-b,也不是 screen 的 Ctrl-a(byobu 也兼容 Ctrl-a)。
  2. 状态栏根本不是写死的文本,是 #(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