Ubuntu 从入门到精通,Ubuntu 快速上手
- 运维笔记
- 2026-05-10
- 174热度
- 0评论
Ubuntu 是免费、开源、基于 Linux 内核的电脑操作系统 。
快速上手
Ubuntu 来自非洲语言,意思是:我因我们而存在,理念是免费、共享、人人可用。
1.常见版本
- LTS 版本(重点):后缀带 LTS(长期支持版)每 2 年出一个,5 年官方安全更新普通人、服务器、开发只装 LTS
- 普通版本:半年一更,只支持 9 个月,适合尝鲜,不推荐新手用。
不同版本分支
- Ubuntu Desktop:桌面版,带图形界面,像 Windows 一样点鼠标用
- Ubuntu Server:服务器版,无桌面,纯终端命令
直接复制下载的国内镜像直链:
- 中山大学:https://mirror.sysu.edu.cn/ubuntu-releases/resolute/ubuntu-26.04-desktop-amd64.iso
- 清华大学:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/resolute/ubuntu-26.04-desktop-amd64.iso
- 中科大:http://mirrors.ustc.edu.cn/ubuntu-releases/resolute/ubuntu-26.04-desktop-amd64.iso
- 南京大学:https://mirror.nju.edu.cn/ubuntu-releases/resolute/ubuntu-26.04-desktop-amd64.iso
2.常用快捷键
通用快捷键:
- Ctrl+Alt+T 打开终端(最最最重要,必记)
- Ctrl+L 终端清屏 / 文件管理器定位地址栏
- Ctrl+C 终止正在运行的命令、取消操作
- Ctrl+V 粘贴Ctrl+X 剪切
- Ctrl+Z 终端暂停程序
- Ctrl+A 全选Ctrl+S 保存
- Ctrl+W 关闭当前窗口 / 标签页
窗口 & 桌面快捷键
- Win 键(Super 键) 打开应用菜单、搜索所有软件
- Win + D 显示桌面、最小化所有窗口
- Win + E 打开文件管理器
- Win + 左右方向键 窗口分屏靠左 / 靠右
- Win + 上方向键 窗口最大化
- Win + 下方向键 窗口还原 / 最小化
- Alt + Tab 切换已打开的程序窗口
- Alt + F4 关闭当前窗口
输入法 & 语言切换
- Super + 空格 切换输入法(英文 / 拼音互换)
- Ctrl + 空格 部分版本可用,自定义后最顺手
终端专用快捷键
- Tab 自动补全命令 / 文件名(Linux 神器,一定要多用)
- ↑ / ↓ 切换历史输入过的命令
- Ctrl+R 搜索历史命令
- Ctrl+Shift+C 终端复制
- Ctrl+Shift+V 终端粘贴
截图快捷键
- PrtSc 全屏截图,自动保存到 图片
- Alt + PrtSc 只截当前活动窗口
- Shift + PrtSc 手动框选截图
锁屏 & 关机
- Win + L 快速锁屏
- Alt + F2 弹出运行命令窗口
核心快捷键
- Ctrl+Alt+T 开终端
- Win 打开菜单搜软件
- Alt+Tab 切换窗口
- Shift+PrtSc 框选截图
- Super+空格 切输入法
- Tab 命令自动补全
其他
- Ctrl+Alt+F1 切回图形桌面登录界面
- Ctrl+Alt+F2 图形桌面会话
- Ctrl+Alt+F3 进入第 3 号纯字符 TTY 控制台
- Ctrl+Alt+F4 进入第 4 号纯字符 TTY 控制台
- Ctrl+Alt+F5 进入第 5 号纯字符 TTY 控制台
- Ctrl+Alt+F6 进入第 6 号纯字符 TTY 控制台
常用命令
记录一些常用的命令
1.系统信息类(查看版本、用户)
whoami # 查看当前登录用户名
who # 查看所有在线登录用户
w # 查看在线用户+占用资源详情
uname -r # 查看 Linux 内核版本
uname -a # 查看完整内核详细信息
lsb_release -a # 查看 Ubuntu 官方版本
cat /etc/os-release # 查看系统完整发行版信息
cat /etc/issue # 极简显示 Ubuntu 版本
2.目录文件基础命令
pwd # 显示当前所在文件夹路径
ls # 列出当前文件夹文件
ls -l # 详细列表(权限、大小、时间)
ls -a # 显示隐藏文件
cd / # 进入根目录
cd ~ # 进入自己家目录
cd .. # 返回上一级文件夹
cd 桌面 # 进入桌面
mkdir 文件夹名 # 创建新文件夹
mkdir -p a/b/c # 一次性创建多级文件夹
touch 文件名.txt # 创建空文件
cp 文件1 文件2 # 复制文件
cp -r 文件夹1 文件夹2 # 复制整个文件夹
mv 旧名 新名 # 重命名
mv 文件 文件夹 # 移动文件到文件夹
rm 文件名 # 删除文件
rm -r 文件夹 # 删除文件夹
rm -rf 文件夹 # 强制彻底删除(慎用)
cat 文件名 # 查看文件内容
3.用户管理命令
ls /home # 查看系统所有普通用户
sudo adduser 用户名 # 创建新用户
sudo passwd 用户名 # 修改用户密码
sudo usermod -aG sudo 用户名 # 给用户添加管理员权限
sudo deluser 用户名 # 删除用户
sudo deluser --remove-home 用户名 # 删除用户并清空家目录
su - 用户名 # 切换到其他用户登录
4.软件安装与更新
sudo apt update # 更新软件源缓存
sudo apt upgrade # 升级系统所有已装软件
sudo apt install 软件名 # 安装软件
sudo apt remove 软件名 # 卸载软件
apt search 关键词 # 搜索可用软件
sudo dpkg -i 文件名.deb # 安装本地 deb 安装包
5.网络相关命令
ip a # 查看本机局域网IP地址
ping baidu.com # 测试网络是否通
hostname # 查看电脑主机名
hostnamectl # 查看主机+系统+内核全套信息
6.SSH 远程连接
sudo apt install openssh-server # 安装SSH服务
systemctl status ssh # 查看SSH是否运行
sudo systemctl enable ssh # SSH开机自启
sudo systemctl restart ssh # 重启SSH服务
sudo ufw allow 22 # 防火墙放行SSH端口
7.磁盘进程查看
df -h # 查看硬盘占用空间
du -sh 文件夹 # 查看单个文件夹大小
top # 查看系统进程、CPU内存占用
htop # 更美观的进程查看(需手动安装)
8.权限与系统基础
sudo 命令 # 以管理员身份执行命令
sudo su # 切换到 root 超级管理员
exit # 退出当前终端/退出root
clear # 清空终端屏幕
开启SSH
开启 SSH,局域网其他电脑连接 Ubuntu
1.安装 OpenSSH
# Ubuntu 默认没装 SSH,先安装
sudo apt update
sudo apt install openssh-server -y
# 查看 SSH 服务状态
systemctl status ssh
# 设置 SSH 开机自启
sudo systemctl enable ssh
# 查看本机局域网 IP
ip a
# 防火墙放行 SSH(Ubuntu 默认有 ufw 防火墙)
sudo ufw allow 22
sudo ufw reload
2.SSH配置
# 重启 / 停止 SSH 服务
sudo systemctl restart ssh
sudo systemctl stop ssh
# 修改 SSH 端口
# 找到 Port 22,改成别的端口比如 Port 2222
# 保存退出:Ctrl+O 回车,Ctrl+X
sudo nano /etc/ssh/sshd_config
# 禁止 root 远程登录
# PermitRootLogin no
sudo nano /etc/ssh/sshd_config
防火墙
GUFW,是 Ubuntu 官方推荐的 UFW 防火墙图形管理工具
1.GUFW
# 安装
sudo apt update
sudo apt install gufw -y
2.UFW命令
# 基础状态
sudo ufw status # 查看状态(inactive/off)
sudo ufw enable # 启用(默认拒绝入站)
sudo ufw disable # 关闭防火墙
sudo ufw reset # 重置所有规则(慎用)
# 默认策略
sudo ufw default deny incoming # 拒绝所有入站(必设)
sudo ufw default allow outgoing # 允许所有出站(不影响上网)
常用放行规则
# 放行 SSH(22 端口,局域网连接必开)
sudo ufw allow 22/tcp
# 或按服务名放行(更直观)
sudo ufw allow OpenSSH
# 放行 HTTP/HTTPS(网站服务)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 放行局域网 IP 段(如 192.168.1.x 全网段)
sudo ufw allow from 192.168.1.0/24
# 放行单个 IP 访问所有端口
sudo ufw allow from 192.168.1.100
删除 / 拒绝规则
# 删除某条规则(如放行 22 端口)
sudo ufw delete allow 22/tcp
# 拒绝某个 IP 访问
sudo ufw deny from 192.168.1.200
# 查看规则编号(精准删除)
sudo ufw status numbered
sudo ufw delete 3 # 删除第 3 条规则
DNS设置
Ubuntu 默认不用你手动写 DNS,是自动获取:插网线 / 连 WiFi → 自动从路由器获取 DNS,系统底层由 systemd-resolved 接管
1.永久改 DNS
编辑 resolved.conf
sudo nano /etc/systemd/resolved.conf
改成下面这样(把注释去掉,填 DNS):
[Resolve]
DNS=114.114.114.114 8.8.8.8
FallbackDNS=1.1.1.1
#DNSSEC=no
#DNSOverTLS=no
#MulticastDNS=yes
#LLMNR=yes
#Cache=yes
#CacheTTL=3600
- 保存:Ctrl+O → 回车
- 退出:Ctrl+X
# 重启服务生效
sudo systemctl restart systemd-resolved
sudo systemctl enable systemd-resolved
# 查看是否生效
蓝牙
介绍蓝牙相关的一些功能
1. 蓝牙技术
蓝牙技术从 <strong>4.0 版本</strong>开始分裂为<strong>两个完全不同的技术体系</strong>:
1.1 经典蓝牙 (BR/EDR) 协议栈
┌─────────────────────────────────────────────────────────────┐
│ 第7层: 应用层 (Application Layer) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │
│ │ HFP │ │ A2DP │ │ SPP │ │ PBAP │ │ OPP │ │
│ │ (免提) │ │ (音频) │ │ (串口) │ │ (通讯录) │ │(文件传)│ │
│ │ ... │ │ ... │ │ ... │ │ ... │ │ ... │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │
│ │ │ │ │ │ │
│ └───────────┴───────────┴───────────┴──────────┘ │
│ 这些都是: Profile │
│ (应用规范/场景定义) │
├─────────────────────────────────────────────────────────────┤
│ 第6层: 协议适配层 (Protocol Adaptation) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ RFCOMM │ AVDTP │ AVCTP │ OBEX │ BNEP │ HIDP ││
│ │ (串口仿真)│ (音视频分布)│ (音视频控制)│ (对象交换)│(网络封装)│(人机接口)│
│ │ │ │ │ │ │ ││
│ │ 为 SPP/ │ 为 A2DP │ 为 AVRCP│ 为 OPP/│ 为 PAN │ 为 HID ││
│ │ HFP/PBAP│ 提供媒体│ 提供控制│ FTP/MAP│ │ ││
│ │ 提供数据│ 流传输 │ 命令传输│ 提供对象│ │ ││
│ │ 通道 │ │ │ 交换 │ │ ││
│ └────┬────┴────┬────┴────┬────┴────┬───┴────┬───┴────┬───┘│
│ │ │ │ │ │ │ │
│ └─────────┴─────────┴─────────┴────────┴────────┘ │
│ 这些都是: 协议 (Protocol) │
│ (定义数据格式和传输规则) │
├─────────────────────────────────────────────────────────────┤
│ 第5层: 逻辑链路控制 (Logical Link Control) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ L2CAP (Logic Link Control & Adaptation)││
│ │ ││
│ │ • 多路复用: 一个 ACL 连接上承载多个逻辑通道 (CID) ││
│ │ • 为 RFCOMM 分配 PSM=0x0001, 为 SDP 分配 PSM=0x0001 ││
│ │ • 为 BNEP 分配 PSM=0x000F, 为 HIDP 分配 PSM=0x0011 ││
│ │ • 分段/重组: 大包拆分成基带能传输的小包 ││
│ │ • QoS 管理 ││
│ └─────────────────────────┬───────────────────────────────┘│
│ │ │
├────────────────────────────┼────────────────────────────────┤
│ 第4层: 主机控制接口 (HCI) │ │
│ ┌─────────────────────────┴───────────────────────────────┐ │
│ │ HCI (Host Controller Interface) │ │
│ │ │ │
│ │ • 命令通道: Host → Controller (如"开始查询") │ │
│ │ • 事件通道: Controller → Host (如"发现设备") │ │
│ │ • ACL 数据通道: 异步数据 (L2CAP 上层所有数据) │ │
│ │ • SCO 数据通道: 同步语音数据 (HFP/HSP 通话语音) │ │
│ │ │ │
│ │ 物理接口: USB / UART / SDIO / SPI │ │
│ └────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 第3层: 链路管理层 (Link Manager) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ LM (Link Manager Protocol) ││
│ │ • 建立/断开 ACL/SCO 连接 ││
│ │ • 认证与加密协商 ││
│ │ • 时钟偏移协商 ││
│ │ • 功率控制、QoS 协商 ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 第2层: 基带层 (Baseband) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ • 跳频 (FHSS): 1600 hops/s, 79 个信道 (1MHz 间隔) ││
│ │ • 时分双工 (TDD): 主设备奇数时隙发送, 偶数时隙接收 ││
│ │ • 包类型: ID/DM1/DH1/DM3/DH3/DM5/DH5/AUX1 等 ││
│ │ • BR: 1 Mbps │ EDR: 2-3 Mbps │ HS: 24 Mbps (802.11) ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 第1层: 物理层 (Radio) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ • 频段: 2.4 GHz ISM (2402-2480 MHz) ││
│ │ • 调制: GFSK (BR) / π/4-DQPSK, 8DPSK (EDR) ││
│ │ • 发射功率: Class 1 (100mW) / Class 2 (2.5mW) / Class 3 (1mW)││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
1.2 低功耗蓝牙( BLE,Bluetooth Low Energy)
┌─────────────────────────────────────────────────────────────┐
│ 第7层: 应用层 (Application Layer) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │
│ │ HRP │ │ HTP │ │ GLP │ │ HOGP │ │ IPSP │ │
│ │ (心率) │ │ (体温) │ │ (血糖) │ │(HID) │ │(IPv6) │ │
│ │ ... │ │ ... │ │ ... │ │ ... │ │ ... │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │
│ │ │ │ │ │ │
│ └───────────┴───────────┴───────────┴──────────┘ │
│ 这些都是: Profile (GATT-based) │
│ 基于 GATT 服务定义 │
├─────────────────────────────────────────────────────────────┤
│ 第6层: 属性协议层 (Attribute Protocol) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ GATT (Generic Attribute Profile) ││
│ │ ┌─────────────────────────────────────────────────┐ ││
│ │ │ 建立在 ATT (Attribute Protocol) 之上: │ ││
│ │ │ │ ││
│ │ │ • Service (服务): 相关特征的集合 │ ││
│ │ │ • Characteristic (特征): 数据+元数据 │ ││
│ │ │ • Descriptor (描述符): 特征的配置信息 │ ││
│ │ │ • UUID: 128位标识符 (16位缩短形式) │ ││
│ │ │ │ ││
│ │ │ 操作: Read / Write / Notify / Indicate / Write CMD│ ││
│ │ └─────────────────────────────────────────────────┘ ││
│ │ ││
│ │ ATT (Attribute Protocol) ││
│ │ • 客户端-服务器架构 ││
│ │ • Handle: 16位属性句柄, 唯一标识属性 ││
│ │ • UUID: 定义属性类型 ││
│ │ • Permissions: 读/写/加密/认证权限 ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 第5层: 安全管理 (Security Manager) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ SMP (Security Manager Protocol) ││
│ │ • 配对 (Pairing): 交换密钥, 建立信任 ││
│ │ • 加密 (Encryption): AES-128-CCM ││
│ │ • 密钥分发: LTK/IRK/CSRK/EDIV/Rand ││
│ │ • 配对方法: Just Works / Passkey / Numeric Comparison ││
│ │ / OOB ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 第4层: 逻辑链路控制 (LE L2CAP) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ LE L2CAP ││
│ │ • 固定通道: ATT(0x0004), SM(0x0006), LE Sig(0x0005) ││
│ │ • LE Credit-Based Connection: 可靠数据传输 (IPSP) ││
│ │ • 动态通道分配 ││
│ │ • MTU 默认 23, 最大可协商 517 (ATT_MTU) ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 第3层: 主机控制接口 (HCI) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ HCI (同经典蓝牙, 但命令/事件不同) ││
│ │ • LE 专用命令: LE Set Scan Parameters, LE Create Conn ││
│ │ • LE 事件: LE Advertising Report, LE Connection Complete││
│ │ • ACL 数据通道 (无 SCO, BLE 无同步语音) ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 第2层: 链路层 (Link Layer) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ LL (Link Layer) ││
│ │ • 状态机: Standby → Advertising → Scanning → Initiating ││
│ │ → Connected (Master/Slave → Central/Peripheral)││
│ │ • 40 个信道 (2MHz 间隔): 37/38/39 广播, 0-36 数据 ││
│ │ • 跳频: 数据信道自适应跳频 (AFH) ││
│ │ • 包类型: ADV_IND/ADV_DIRECT/ADV_SCAN/ADV_NONCONN ││
│ │ / CONNECT_REQ / LL_DATA_PDU / LL_CONTROL_PDU ││
│ │ • 连接参数: Interval(7.5ms-4s), Latency, Timeout ││
│ └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│ 第1层: 物理层 (PHY) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ • 频段: 2.4 GHz ISM (2402-2480 MHz) ││
│ │ • 40 个信道 (2MHz 间隔, 与经典蓝牙不同!) ││
│ │ • 调制: GFSK (1Msym/s → 1Mbps) ││
│ │ • 蓝牙 5.0+: LE 2M PHY (2Mbps), LE Coded PHY (500kbps/ ││
│ │ 125kbps, S=2/S=8) ││
│ │ • 发射功率: ≤100mW (20dBm), 通常 0-10dBm ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
1.3 Profile 的本质
┌─────────────────────────────────────────────────────────────┐
│ Profile │
│ (应用配置文件/场景规范) │
│ │
│ Profile 不是代码, 不是协议, 而是一份"规范文档" │
│ │
│ 它定义: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 1. 应用场景: 这个 Profile 解决什么问题? ││
│ │ 例: HFP = 免提通话, A2DP = 立体声音频传输 ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 2. 角色定义: 有哪些参与方? 各自做什么? ││
│ │ 例: HFP 有 AG (网关) 和 HF (免提设备) ││
│ │ 例: A2DP 有 Source (音源) 和 Sink (播放设备) ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 3. 协议依赖: 需要哪些下层协议支持? ││
│ │ 例: HFP 需要 RFCOMM + SCO + SDP ││
│ │ 例: HRP 需要 GATT + ATT + L2CAP ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 4. 数据格式: 传输什么数据? 怎么编码? ││
│ │ 例: HFP 用 AT 命令, A2DP 用 RTP 包 ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 5. 状态机/流程: 设备如何交互? 什么顺序? ││
│ │ 例: HFP 开机→查询 SDP→建立 RFCOMM→交换 BRSF→等待来电 ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 6. 安全要求: 是否需要配对? 加密级别? ││
│ │ 例: PBAP 通常要求认证, 某些传感器可能不要求 ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ 实现者(如 BlueZ)根据 Profile 规范写出代码, │
│ 让用户能通过 API 使用这些功能 │
│ │
└─────────────────────────────────────────────────────────────┘
1.4 Profile 与协议的关系
┌─────────────────────────────────────────────────────────────┐
│ 应用层 (你的 App) │
│ "我要实现免提通话功能" / "我要读取心率数据" │
├─────────────────────────────────────────────────────────────┤
│ Profile 层 │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ HFP Profile 规范 ││
│ │ ├─ 定义角色: AG, HF ││
│ │ ├─ 定义流程: 开机→发现→连接→通话→挂断 ││
│ │ ├─ 定义命令: AT+BRSF, ATA, AT+CHUP... ││
│ │ └─ 定义依赖: 需要 RFCOMM 传 AT, 需要 SCO 传语音 ││
│ └─────────────────────────────────────────────────────────┘│
│ ↓ │
│ "Profile 说我需要 RFCOMM 和 SCO, 下面谁来提供?" │
├─────────────────────────────────────────────────────────────┤
│ 协议层 │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ RFCOMM 协议 ││
│ │ ├─ 提供可靠字节流传输 ││
│ │ ├─ 模拟 RS-232 (波特率、流控、帧结构) ││
│ │ └─ 基于 L2CAP PSM=0x0003 ││
│ │ ││
│ │ SCO 协议 ││
│ │ ├─ 提供同步语音通道 ││
│ │ ├─ 固定带宽 64kbps, CVSD 编码 ││
│ │ └─ 直接由基带层管理, 不经过 L2CAP ││
│ └─────────────────────────────────────────────────────────┘│
│ ↓ │
│ "RFCOMM 说我需要 L2CAP 提供逻辑通道" │
├─────────────────────────────────────────────────────────────┤
│ L2CAP 层 │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ L2CAP 协议 ││
│ │ ├─ 为 RFCOMM 分配 CID, 建立逻辑连接 ││
│ │ ├─ 分段/重组 ││
│ │ └─ 基于 ACL 连接 ││
│ └─────────────────────────────────────────────────────────┘│
│ ↓ │
├─────────────────────────────────────────────────────────────┤
│ HCI / 基带 / 射频 │
│ (最终变成 2.4GHz 无线电波发送出去) │
└─────────────────────────────────────────────────────────────┘
1.5 概念总结
| 层级 | 作用 | 类比 |
|---|---|---|
| Profile | 定义"做什么业务" | 餐厅菜单 (宫保鸡丁、鱼香肉丝) |
| 协议 (RFCOMM/AVDTP/GATT/ATT) | 定义"怎么传数据" | 厨房工艺 (炒、蒸、炖) |
| L2CAP | 定义"哪条路走" | 餐厅内部通道 |
| HCI | 定义"前台后厨怎么沟通" | 服务员传菜 |
| 基带/链路层 | 定义"怎么排队、怎么上菜" | 厨房调度 |
| 物理层 | 定义"用什么锅、什么火" | 灶台和锅具 |
2.BlueZ
BlueZ 是 Linux 官方蓝牙协议栈,由 Intel 主导开发,是 Linux 内核中蓝牙功能的标准实现。它实现了完整的蓝牙协议规范,从 HCI(Host Controller Interface)到各种 Profile。
- 协议栈 (Protocol Stack):分层实现蓝牙协议的软件架构,BlueZ 实现了从物理层到应用层的完整协议
- Host:运行 BlueZ 的主机
- Controller:蓝牙硬件芯片(如 USB 蓝牙适配器、集成蓝牙模块)
- D-Bus (Desktop Bus):Linux 进程间通信机制,BlueZ 5 大量依赖 D-Bus 暴露接口
- BR/EDR (Basic Rate/Enhanced Data Rate):经典蓝牙,用于音频、文件传输等,功耗较高
- BLE (Bluetooth Low Energy):低功耗蓝牙,用于物联网、传感器,功耗极低
- LE Audio:蓝牙 5.2 引入的新一代音频标准,支持广播音频、助听设备
- Dual Mode:同时支持 BR/EDR 和 BLE 的芯片
1.1 BlueZ 架构分层
┌─────────────────────────────────────────┐
│ 用户空间应用层 │
│ (bluetoothctl, btmgmt, 自定义程序) │
├─────────────────────────────────────────┤
│ D-Bus 接口层 │
│ (org.bluez 服务,暴露 Adapter/Device 等 │
├─────────────────────────────────────────┤
│ BlueZ 守护进程 (bluetoothd) │
│ (核心协议栈实现:GAP, ATT, GATT, L2CAP等) │
├─────────────────────────────────────────┤
│ 内核子系统 │
│ (HCI, L2CAP, SCO, RFCOMM, BNEP, HIDP) │
├─────────────────────────────────────────┤
│ 蓝牙硬件 (HCI 接口) │
│ (USB, UART, SDIO, SPI 接口的蓝牙芯片) │
└─────────────────────────────────────────┘
用户空间应用层:
| 名词 | 释义 |
|---|---|
| 用户空间应用层 | Linux 用户态程序运行区域,不直接操作内核硬件,通过系统调用 / D-Bus 和底层蓝牙服务交互,是开发者 / 用户操作蓝牙的入口层 |
| bluetoothctl | BlueZ 官方命令行蓝牙管理工具,交互式 CLI,用于蓝牙开关、扫描设备、配对、连接、读写 BLE 特征值、管理适配器,日常调试 BLE / 经典蓝牙首选工具 |
| btmgmt | BlueZ 配套 HCI 管理命令行工具,偏向底层 HCI 控制器参数配置,可修改蓝牙适配器本地名称、开启 / 关闭 BR/EDR、BLE、配置广播参数,管控 Controller 硬件属性 |
| 自定义程序 | 开发者基于 BlueZ D-Bus API 开发的自研应用(C/C++/Python/Go 等),实现定制蓝牙业务:BLE 从机、扫描器、串口透传、HID 键鼠等 |
D-Bus 接口层:
| 名词 | 释义 |
|---|---|
| D-Bus | Linux 系统进程间通信 (IPC) 标准总线,BlueZ 通过 D-Bus 向外暴露标准化对象接口,应用无需直接调用内核、不用对接原生 C 库,跨语言便捷调用蓝牙能力 |
| org.bluez | BlueZ 在 D-Bus 上注册的服务名,系统 D-Bus 总线唯一标识蓝牙服务,所有蓝牙对象、方法、属性都挂载在该服务下 |
| Adapter | D-Bus 对象:蓝牙适配器(本机蓝牙硬件),对应/org/bluez/hci0,提供开关蓝牙、启动扫描、设置可见性、创建 BLE 广播等接口 |
| Device | D-Bus 对象:远端蓝牙设备,扫描到设备后自动生成/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX对象,提供配对、连接、断开、获取 RSSI 等接口 |
BlueZ 守护进程 (bluetoothd):
| 名词 | 释义 |
|---|---|
| bluetoothd | BlueZ 核心后台守护进程,Linux 蓝牙服务本体,开机自启,加载蓝牙协议栈逻辑、管理 D-Bus 服务、转发用户指令到内核 HCI、处理设备连接状态管理 |
| GAP | 通用访问配置文件,蓝牙应用层基础规范,管控设备广播、扫描、配对、绑定、安全鉴权、设备可见性,BLE / 经典蓝牙共用基础框架 |
| ATT | 属性协议,BLE 底层传输协议,基于 L2CAP 封装,实现属性读写,是 GATT 的底层承载 |
| GATT | 通用属性配置文件,BLE 核心业务协议,定义服务 (Service)、特征值 (Characteristic)、描述符 (Descriptor) 结构,BLE 读写数据、通知、indication 全部基于 GATT |
| L2CAP | 逻辑链路控制与适配协议,蓝牙数据链路层协议,向上承载 RFCOMM、ATT、SCO 等上层协议,向下对接 HCI,负责数据包分段、重组、信道复用 |
内核子系统(Linux Kernel Bluetooth Subsystem):
| 名词 | 释义 |
|---|---|
| HCI | 主机控制器接口,内核与蓝牙硬件的标准通信协议,定义指令包、事件包、ACL/SCO 数据包格式,是上层协议和蓝牙芯片的桥梁 |
| L2CAP (内核态) | 内核实现的 L2CAP 协议驱动,在内核完成数据包调度、缓存、链路管理,区别于用户态 bluetoothd 的协议逻辑 |
| SCO | 同步面向连接链路,经典蓝牙语音通话协议,用于蓝牙耳麦语音传输,实时音频数据流 |
| RFCOMM | 串口仿真协议,基于 L2CAP,经典蓝牙模拟 RS232 串口,传统蓝牙串口透传、蓝牙 Modem 使用该协议 |
| BNEP | 蓝牙网络封装协议,依托 L2CAP,实现蓝牙 PAN(个人局域网),蓝牙共享上网、蓝牙网卡使用 |
| HIDP | 蓝牙 HID 协议,人机接口设备协议,蓝牙键盘、鼠标、手柄等外设的传输协议 |
1.2 配置文件与目录
| 路径 | 说明 |
|---|---|
/etc/bluetooth/main.conf |
守护进程主配置 |
/var/lib/bluetooth/ |
配对设备数据库(每个 HCI 一个子目录) |
/sys/class/bluetooth/ |
sysfs 蓝牙设备接口 |
main.conf 关键配置段:
[General]
# 控制器名称
Name = %h-%d
# 默认设备类别 (Service Class + Major + Minor)
Class = 0x000100
# 可发现性超时(秒)
DiscoverableTimeout = 180
# 配对超时(秒)
PairableTimeout = 0
# 默认隐私设置
# off = 使用公共地址
# device = 使用可解析私有地址
Privacy = device
# LE 广告数据缓存时间
Cache = yes
[GATT]
# 启用 GATT 属性缓存
Cache = yes
[Policy]
# 自动连接策略
AutoEnable=true
1.3 D-Bus 对象模型
org.bluez,核心对象路径:-
/org/bluez:根对象 -
/org/bluez/hci0:第一个蓝牙适配器 -
/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX:发现的设备 -
/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX/serviceXXXX:设备的 GATT 服务 -
/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX/serviceXXXX/charYYYY:特征值
| 接口 | 作用 |
|---|---|
org.bluez.Adapter1 |
适配器管理(开关、扫描、可发现性) |
org.bluez.Device1 |
远程设备管理(连接、配对、信任) |
org.bluez.GattService1 |
GATT 服务 |
org.bluez.GattCharacteristic1 |
GATT 特征值 |
org.bluez.GattDescriptor1 |
GATT 描述符 |
org.bluez.Agent1 |
配对代理(处理 PIN 码、确认) |
org.bluez.Profile1 |
自定义 Profile 注册 |
org.bluez.Media1 |
A2DP/AVRCP 音频控制 |
org.bluez.Network1 |
PAN/BNEP 网络 |
org.bluez.Input1 |
HID 设备 |
1.4 bluetoothctl — 交互式管理工具
BlueZ 5 推荐的交互式工具,基于 D-Bus。
# 进入交互式 shell
bluetoothctl
适配器管理:
# 列出适配器
list
# 选择适配器(多适配器时)
select XX:XX:XX:XX:XX:XX
# 开关蓝牙
power on
power off
# 可发现性
discoverable on
discoverable off
# 可连接性
pairable on
pairable off
# 查看适配器信息
show
设备扫描与连接:
# 开始扫描(经典蓝牙 + BLE)
scan on
# 停止扫描
scan off
# 查看发现的设备
devices
# 查看 LE 设备(仅 BLE)
ble.scan on
# 连接设备
connect XX:XX:XX:XX:XX:XX
# 断开连接
disconnect XX:XX:XX:XX:XX:XX
# 信任设备(自动连接)
trust XX:XX:XX:XX:XX:XX
# 取消信任
untrust XX:XX:XX:XX:XX:XX
# 配对
pair XX:XX:XX:XX:XX:XX
# 移除配对信息
remove XX:XX:XX:XX:XX:XX
# 查看设备信息
info XX:XX:XX:XX:XX:XX
1.5 btmgmt — 底层 HCI 管理
直接操作 HCI 接口,不经过 D-Bus。
# 查看 HCI 信息
btmgmt info
# 开关控制器
btmgmt power on
btmgmt power off
# 设置可发现
btmgmt discov on
btmgmt discov off
# LE 扫描
btmgmt find
btmgmt find -l # 仅 LE
# 添加广告
btmgmt add-adv -u 180d # 添加心率服务 UUID 到广告
# 查看连接
btmgmt con
# 断开连接
btmgmt disconnect XX:XX:XX:XX:XX:XX
1.6 btmon — 蓝牙协议分析器
这是调试蓝牙问题的最强工具,可抓取 HCI 层所有流量。
# 需要 root 权限
sudo btmon
# 同时显示 HCI 和 ACL 数据
sudo btmon -w /tmp/btsnoop.log
# 仅显示 HCI 命令/事件
sudo btmon -i hci0
# 实时解析 ATT/GATT 数据
sudo btmon -a
3.oFono
oFono 是 Linux 上的开源移动电电话协议栈(Open Source Telephony Stack),由 Intel 发起,现由 Linux Foundation 维护 。它的核心目标只有一个:为上层应用提供一个与硬件无关的标准化 D-Bus 接口,屏蔽底层不同 Modem/协议的差异。
Modem特指任何能够提供蜂窝通信功能(语音通话、短信、移动数据)的通信端点。
# ========== 服务管理 ==========
sudo systemctl start ofono # 启动 oFono 守护进程
sudo systemctl stop ofono # 停止
sudo systemctl restart ofono # 重启
sudo systemctl enable ofono # 设置开机自启
# ========== 查看 Modem(核心命令) ==========
/usr/share/ofono/scripts/list-modems
# 输出关键字段说明:
# Type = hfp → 蓝牙免提设备
# Online = 1 → 已注册到网络/可用
# Powered = 1 → 已通电
# Interfaces → 支持的功能列表(VoiceCallManager 等)
# ========== Modem 电源与网络控制 ==========
/usr/share/ofono/scripts/enable-modem /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX # 启用 Modem
/usr/share/ofono/scripts/disable-modem /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX # 禁用 Modem
/usr/share/ofono/scripts/online-modem /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX # 注册网络(上线)
/usr/share/ofono/scripts/offline-modem /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX # 注销网络(离线)
# ========== 通话控制(HFP 核心) ==========
/usr/share/ofono/scripts/dial-number /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX 13800138000 # 拨打电话
/usr/share/ofono/scripts/answer-calls # 接听来电
/usr/share/ofono/scripts/hangup-all # 挂断所有通话
/usr/share/ofono/scripts/hangup /hfp/.../voicecall01 # 挂断指定通话
/usr/share/ofono/scripts/list-calls # 查看当前通话状态
# ========== 其他信息查询 ==========
/usr/share/ofono/scripts/get-sim-info /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX # SIM 卡信息
/usr/share/ofono/scripts/get-network-status /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX # 网络注册状态(运营商/信号)
/usr/share/ofono/scripts/get-call-volume /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX # 通话音量
/usr/share/ofono/scripts/send-sms /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX 13800138000 "消息" # 发短信(若支持)
# ========== 直接 D-Bus 调用(无需脚本) ==========
dbus-send --system --print-reply --dest=org.ofono / org.ofono.Manager.GetModems
busctl call org.ofono /hfp/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX org.ofono.VoiceCallManager Dial "s" "13800138000"
4.PipeWire
PipeWire 是 现代 Linux 的音频和视频服务器:用一个统一的框架,同时替代 ALSA、PulseAudio 和 JACK,并且原生支持视频处理。
3.1 核心概念
PipeWire 所有复杂的概念,都能用 "自来水系统" 完美解释:
| PipeWire 术语 | 自来水系统类比 | 大白话解释 |
|---|---|---|
| 节点(Node) | 任何和水有关的东西 | 比如:你的手机(放歌的)、净水器(调音质的)、水龙头(扬声器)、水桶(录音软件) |
| 端口(Port) | 水管的接口 | 每个节点都有进水口和出水口。比如手机只有出水口,水龙头只有进水口 |
| 链路(Link) | 连接两个接口的水管 | 把手机的出水口和水龙头的进水口连起来,你就能听到声音了 |
| 图(Graph) | 整个城市的水管网络 | 所有节点和水管连在一起,就是 PipeWire 的 "图" |
| 守护进程(pipewire) | 水厂的总控制室 | 24 小时运行,负责控制水的流动、调节水压 |
| 会话管理器(WirePlumber) | 小区物业 | 负责分配水管。比如你插了耳机,它就自动把水从扬声器引到耳机里 |
所有 PipeWire 的操作,本质上都是在做这几件事:
- 看看有哪些节点(设备和应用)
- 把这个节点的出水口连到那个节点的进水口
- 调整一下水管的粗细(缓冲区大小)
当你用网易云音乐播放一首歌时,PipeWire 内部发生了这 5 件事:
- 网易云音乐创建了一个节点(相当于一个水桶,里面装着音乐),这个节点只有一个出水口
- 你的扬声器也被表示为一个节点(相当于一个水龙头),这个节点只有一个进水口
- 物业(WirePlumber)看到新的水桶出现了,自动拿了一根水管(链路),把水桶的出水口和水龙头的进水口连起来
- 总控制室(pipewire)开始控制水从水桶流到水龙头,你就听到声音了
- 如果你插上耳机,物业会立刻把水管从扬声器拔下来,插到耳机上
3.2 名词解释
- Profile:声卡 / 蓝牙设备的工作模式
- Sink:声音出口(往外播放:耳机、喇叭、蓝牙音箱)
- Source:声音入口(往里收录:各种麦克风)
- Sink-Input:正在发声的软件(浏览器、视频、音乐)
- Cards ,代表物理音频设备
- Source-Output:正在录音的软件(微信语音、录屏、K 歌)
- Loopback(回环):就是一根"虚拟音频线":把电脑播放的声音,同时变成麦克风能录到的声音。
3.3 pactl
pactl (PulseAudio Controller,通用音频控制) PulseAudio 音频服务器的核心控制工具,用于在运行时动态管理音频设备和流,PipeWire 自带 pipewire-pulse 兼容层,所以 pactl 可以直接用来控制 PipeWire :
# ==================== 信息查询类 ====================
pactl info # 显示 PulseAudio 服务器信息(版本、默认设备、采样率等)
pactl list # 列出所有对象(模块、设备、端口、流等)的详细信息
pactl list short # 以简短格式列出所有对象,便于脚本处理
pactl list modules # 列出已加载的模块
pactl list sinks # 列出所有输出设备(扬声器/耳机)
pactl list sources # 列出所有输入设备(麦克风)
pactl list sink-inputs # 列出当前正在播放的音频流(应用输出)
pactl list source-outputs # 列出当前正在录音的音频流(应用输入)
pactl list cards # 列出所有声卡及其配置文件
pactl list clients # 列出连接到服务器的客户端
pactl list samples # 列出预加载的样本(音效)
pactl stat # 显示服务器统计信息(内存使用、缓存等)
pactl subscribe # 实时监控 PulseAudio 事件(阻塞模式,按 Ctrl+C 退出)
# ==================== 默认设备设置 ====================
pactl set-default-sink <sink名称> # 设置默认输出设备(如:alsa_output.pci-0000_00_1f.3.analog-stereo)
pactl set-default-source <source名称> # 设置默认输入设备(如:alsa_input.pci-0000_00_1f.3.analog-stereo)
# ==================== 音量控制 ====================
pactl set-sink-volume # 设置输出设备音量,如:pactl set-sink-volume 0 50%
pactl set-sink-volume +5% # 增加输出设备音量 5%
pactl set-sink-volume -5% # 降低输出设备音量 5%
pactl set-source-volume # 设置输入设备音量
pactl set-sink-input-volume # 设置特定应用(sink-input)的音量
pactl set-source-output-volume # 设置特定录音流的音量
pactl set-sink-mute 1 # 静音输出设备(1=静音,0=取消静音)
pactl set-sink-mute 0 # 取消静音输出设备
pactl set-source-mute 1 # 静音输入设备
pactl set-source-mute 0 # 取消静音输入设备
pactl set-sink-input-mute 1 # 静音特定应用
pactl set-source-output-mute 1 # 静音特定录音流
# ==================== 端口/配置文件管理 ====================
pactl set-sink-port # 切换输出端口(如:耳机/扬声器切换)
pactl set-source-port # 切换输入端口(如:内置麦克风/外接麦克风)
pactl set-card-profile # 切换声卡配置文件(如:analog-stereo、hdmi-stereo)
# ==================== 模块管理 ====================
pactl load-module [参数...] # 加载模块,如:pactl load-module module-null-sink sink_name=my_sink
pactl unload-module <模块ID> # 卸载指定 ID 的模块
pactl list modules short # 查看已加载模块的 ID
# ==================== 移动音频流 ====================
pactl move-sink-input # 将指定应用的声音移到另一个输出设备
pactl move-source-output # 将指定录音流移到另一个输入设备
# ==================== 采样/音效管理 ====================
pactl upload-sample <文件名> <样本名> # 上传音频文件作为样本
pactl play-sample <样本名> # 在指定设备播放样本
pactl remove-sample <样本名> # 删除已加载的样本
# ==================== 其他命令 ====================
pactl suspend-sink 1 # 挂起(暂停)输出设备
pactl suspend-sink 0 # 恢复输出设备
pactl suspend-source 1 # 挂起输入设备
pactl suspend-source 0 # 恢复输入设备
3.4 wpctl
wpctl 是PipeWire 原生专属命令,比 pactl 更底层、更精准:
# ========== 核心信息查询 ==========
wpctl status # 显示 PipeWire 完整状态:客户端、音频、视频、设置
wpctl inspect ID # 详细检查指定对象的所有属性
wpctl get-volume ID # 获取指定节点的当前音量
# ========== 默认设备管理 ==========
wpctl set-default ID # 将指定 ID 设为默认设备
wpctl clear-default [ID] # 清除默认设置(可选指定 ID)
# ========== 音量控制 ==========
wpctl set-volume ID VOL[%][-/+] # 设置音量
# VOL 格式:
# 0.5 → 50%
# 75% → 75%
# 5%+ → 增加 5%
# 10%- → 减小 10%
# 选项:
# -l, --limit NUM # 设置音量上限(如 -l 1.5 限制最大 150%)
wpctl set-mute ID 1|0|toggle # 静音控制(1=静音,0=取消,toggle=切换)
# ========== 设备配置 ==========
wpctl set-profile ID INDEX # 为设备设置配置方案(Profile)
3.5 pw-*
pw-* PipeWire 原生底层工具集,主打【监控、播放、录音、高级排错】 :
| 功能 | 命令 |
|---|---|
| 底层交互 | pw-cli, pw-dump, pw-mon |
| 播放录制 | pw-cat, pw-play, pw-record, pw-midiplay, pw-midirecord, pw-dsdplay, pw-encplay |
| 端口链路 | pw-link |
| 虚拟设备 | pw-loopback |
| 元数据 | pw-metadata |
| 性能监控 | pw-top, pw-profiler, pw-dot |
| 配置调试 | pw-config, pw-mididump |
| 设备预留 | pw-reserve, pw-container |
| 协议兼容 | pw-jack, pw-v4l2 |
| SPA 调试 | spa-inspect, spa-monitor, spa-json-dump, spa-acp-tool, spa-resample |
核心交互与状态查询工具:
# pw-cli — PipeWire 命令行接口(最底层的万能工具)
pw-cli ls # 列出所有对象(节点、端口、设备、模块等)
pw-cli ls Node # 只列出节点
pw-cli ls Port # 只列出端口
pw-cli ls Device # 只列出设备
pw-cli ls Module # 只列出模块
pw-cli ls Factory # 只列出工厂
pw-cli ls Client # 只列出客户端
pw-cli ls Link # 只列出链路
pw-cli info ID # 查看指定 ID 对象的详细信息
pw-cli create-node FACTORY PROPS # 创建虚拟节点
pw-cli create-link NODE1 PORT1 NODE2 PORT2 # 手动创建端口链路
pw-cli destroy ID # 销毁指定对象
pw-cli load-module NAME ARGS # 动态加载模块
pw-cli unload-module ID # 卸载模块
pw-cli enum-params ID PARAM # 枚举对象参数
pw-cli set-param ID PARAM VALUE # 设置对象参数
pw-cli permissions # 查看/设置权限
# pw-dump — PipeWire 状态导出器
pw-dump # 导出整个 PipeWire 图的 JSON 状态
pw-dump --color # 彩色输出
pw-dump --monitor # 持续监控变化
pw-dump NODE_ID # 只导出指定节点
# pw-mon — PipeWire 事件监控器
pw-mon # 实时监控所有对象变化事件
pw-mon --color # 彩色输出
pw-mon -r # 只显示新增对象
pw-mon -d # 只显示删除对象
pw-mon -p # 只显示参数变化
音频播放与录制工具:
# pw-cat — 通用媒体播放/录制工具(底层实现)
pw-cat --playback file.wav # 播放音频文件
pw-cat --record -o out.wav # 录制音频到文件
pw-cat --midi -d file.mid # 播放 MIDI 文件
pw-cat --dsd file.dsf # 播放 DSD 音频
pw-cat --list-targets # 列出可用目标节点
# pw-play — pw-cat 的播放别名(symlink)
pw-play file.wav # 播放音频文件
pw-play --target=NODE_ID file.wav # 指定输出节点播放
# pw-record — pw-cat 的录制别名(symlink)
pw-record -o out.wav # 录制音频
pw-record --target=NODE_ID -o out.wav # 指定输入节点录制
# pw-midiplay — MIDI 播放别名(symlink)
pw-midiplay file.mid # 播放 MIDI 文件
# pw-midirecord — MIDI 录制别名(symlink)
pw-midirecord -o out.mid # 录制 MIDI
# pw-dsdplay — DSD 播放别名(symlink)
pw-dsdplay file.dsf # 播放 DSD 音频
# pw-encplay — 编码播放工具
pw-encplay file.mp3 # 播放编码音频文件
端口链路管理工具:
# pw-link — 端口与链路管理器
pw-link # 列出所有端口和链路
pw-link -l # 只列出端口(-l = list)
pw-link -o PORT # 列出指定输出端口的连接
pw-link -i PORT # 列出指定输入端口的连接
pw-link --link OUTPUT INPUT # 手动连接两个端口
pw-link --unlink OUTPUT INPUT # 断开两个端口的连接
pw-link --disconnect ID # 断开指定链路 ID
pw-link -m # 监控模式(持续显示变化)
pw-link --linger # 创建持久链路(重启后保留)
回环与虚拟设备工具:
# pw-loopback — 创建音频回环节点
pw-loopback # 创建默认回环节点(输入直连输出)
pw-loopback --capture-props="media.class=Audio/Source" \
--playback-props="media.class=Audio/Sink" # 自定义属性
pw-loopback -n my-loopback # 指定节点名称
pw-loopback --latency-msec=20 # 设置延迟(毫秒)
pw-loopback --rate=48000 # 设置采样率
pw-loopback --channels=2 # 设置通道数
pw-loopback --position=FL,FR # 设置通道位置
性能监控与调试工具:
# pw-top — 实时性能监控(类似 top)
pw-top # 显示所有节点的实时性能数据
pw-top -p # 只显示进程信息
pw-top -n # 只显示节点信息
pw-top -r # 原始数据输出(无格式化)
# pw-profiler — 性能分析器
pw-profiler # 启动性能分析
pw-profiler -o profile.log # 输出到文件
# pw-dot — 图结构导出(Graphviz 格式)
pw-dot # 导出当前 PipeWire 图到标准输出
pw-dot -o graph.dot # 输出到文件
pw-dot -s | dot -Tpng > graph.png # 直接生成 PNG 图片
# pw-config — 配置调试工具
pw-config # 显示当前有效配置
pw-config -n pipewire # 查看 pipewire 配置
pw-config -n client # 查看客户端配置
pw-config --check # 检查配置语法
# pw-mididump — MIDI 消息转储
pw-mididump file.mid # 显示 MIDI 文件内容
pw-mididump --port=PORT # 从指定端口实时转储 MIDI
5.HFP 打电话
4.1 相关名词
| 术语 | 全称 | 角色说明 |
|---|---|---|
| AG | Audio Gateway | 音频网关,通常是手机/智能手机,负责接入蜂窝网络、处理通话信令和音频 |
| HF | Hands-Free | 免提设备,通常是车载系统、耳机、音箱等,通过蓝牙连接到 AG 进行通话 |
手机 (AG/Audio Gateway) ←──蓝牙HFP──→ 车载蓝牙/耳机 (HF/Hands-Free)
↑ ↑
连接移动网络 只负责音频输入输出
处理拨号/接听/挂断 不直接连网络
管理通话状态
4.2 概念介绍
BlueZ 负责"连上"蓝牙设备,oFono 负责"打电话"的业务逻辑,PipeWire 负责"声音往哪走"。
三者通过 D-Bus(Linux 的进程间通信机制)协调,BlueZ 是桥梁,oFono 和 PipeWire 分别走"控制信号"和"数据流"两条路。
-
发现蓝牙耳机 → 配对 → 建立 A2DP(音乐)或 HFP/HSP(通话)蓝牙配置文件连接
-
相当于:蓝牙芯片和耳机"握手成功"
-
当需要打电话时,oFono 通过 D-Bus 告诉 BlueZ:"激活这个耳机的 HFP 配置文件,我要用"
-
oFono 处理:拨号、来电显示、接听、挂断、信号强度等
-
相当于:电话 APP 开始工作
-
通话建立后,PipeWire 创建音频通道:
-
麦克风声音 → 编码 → 经 BlueZ → 传给耳机
-
耳机传来的对方声音 → 解码 → 播放
-
-
PipeWire 会根据场景自动切换:
-
听歌时用 A2DP(高音质,单向)
-
打电话时切换到 HFP(双向通话,音质较低)
-
4.3 实现方案
安装必要软件:
# 安装 oFono(HFP AT 指令处理)和 PipeWire 蓝牙支持
sudo apt update
sudo apt install ofono ofono-scripts pipewire pipewire-pulse wireplumber libspa-0.2-bluetooth
# 确保没有 PulseAudio 蓝牙模块冲突
sudo apt remove pulseaudio-module-bluetooth
oFono 会将自己注册为系统的 HFP AG 处理器,替代 BlueZ 默认的 HFP HF(耳机端)角色 :
# 启动并启用服务
sudo systemctl enable --now ofono
sudo systemctl enable --now bluetooth
# 查看 oFono 识别的蓝牙调制解调器
dbus-send --system --print-reply --dest=org.ofono / org.ofono.Manager.GetModems
Ubuntu 24.04 的 PipeWire 已经内置 HFP 支持,但需要确保 WirePlumber 正确配置自动连接和配置文件切换 。
查看日志:
journalctl --user -u wireplumber -n 50 --no-pager | grep -i "config\|loading\|loaded\|lua"
创建 WirePlumber 配置,强制蓝牙设备使用 HFP AG 模式:
sudo mkdir -p /etc/wireplumber/main.lua.d/
sudo tee /etc/wireplumber/main.lua.d/51-bluez-hfp-ag.lua << 'EOF'
bluez_monitor.properties = {
-- 启用 HFP AG 角色(Audio Gateway,类似车载蓝牙)
["bluez5.roles"] = "[ a2dp_sink a2dp_source hsp_hs hsp_ag hfp_hf hfp_ag ]",
-- 使用 oFono 作为 HFP 后端(支持完整通话控制)
["bluez5.hfphsp-backend"] = "ofono",
-- 自动连接 HFP AG 配置文件
["bluez5.auto-connect"] = "[ hfp_ag hfp_hf a2dp_sink ]",
}
EOF
# 3. 重启服务
systemctl --user restart pipewire pipewire-pulse wireplumber
sudo systemctl restart bluetooth
配置 BlueZ 允许 HFP AG 注册,编辑 BlueZ 主配置,确保支持双模式(BR/EDR + LE)和正确的配置文件加载:
sudo nano /etc/bluetooth/main.conf
修改/添加以下关键配置:
[General]
# 允许 oFono 注册 HFP AG
Name = Ubuntu-HFP-Gateway
ControllerMode = dual
[Policy]
AutoEnable=true
如果使用的是较新版本的 BlueZ(>= 5.72),可能需要启用实验性功能以支持完整的 HFP AG 功能 (参考):
sudo systemctl edit bluetooth
# 或者
# (可选)删除旧的 drop-in,重新创建
sudo rm -rf /etc/systemd/system/bluetooth.service.d/sudo mkdir -p /etc/systemd/system/bluetooth.service.d
sudo tee /etc/systemd/system/bluetooth.service.d/override.conf << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/libexec/bluetooth/bluetoothd --experimental --noplugin=sap
EOF
# 修复报错
# 将 /etc/bluetooth 权限改为 systemd 期望的 555
sudo chmod 555 /etc/bluetooth
# 重启蓝牙服务
sudo systemctl restart bluetooth
在覆盖文件中添加:
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --experimental
重启蓝牙服务:
sudo systemctl daemon-reload
sudo systemctl restart bluetooth
验证:
# 方法1:查看进程参数
ps aux | grep bluetoothd
# 方法2:查看 systemd 配置
systemctl show bluetooth -p ExecStart
# 方法3:查看日志中是否还有 "experimental not enabled"
sudo journalctl -u bluetooth -n 20 --no-pager
使用 bluetoothctl 将手机配对为 Hands-Free 设备:
bluetoothctl
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
# 从手机端搜索并配对,或手动配对手机
[bluetooth]# scan on
[bluetooth]# pair <手机MAC地址>
[bluetooth]# trust <手机MAC地址>
[bluetooth]# connect <手机MAC地址>
连接成功后,检查 PipeWire 是否正确识别 HFP 配置文件:
# 查看蓝牙音频卡状态
pactl list cards | grep -A 30 "bluez_card"
# 应该能看到类似:
# Profiles:
# headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
# a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, available: yes)
# Active Profile: headset_head_unit
强制切换到 HFP 模式(如果需要):
# 获取蓝牙卡名称
CARD=$(pactl list cards short | grep bluez_card | awk '{print $2}')
# 设置为 HFP 双向通话模式
pactl set-card-profile $CARD headset_head_unit
检查音频路由:
# 查看输入源(麦克风)
pactl list sources | grep -A 10 "bluez"
# 查看输出 sink(扬声器)
pactl list sinks | grep -A 10 "bluez"
验证 oFono 识别手机:
# 列出 oFono 管理的所有 Modem
/usr/share/ofono/scripts/list-modems
拨打电话:
# 使用 oFono 脚本拨号
# 参数1: Modem 的 D-Bus 路径(list-modems 中 [ ] 里的内容)
# 参数2: 要拨打的电话号码
/usr/share/ofono/scripts/dial-number /hfp/org/bluez/hci0/dev_CC_42_10_50_BA_FD 13800138000
| 操作 | 命令 |
|---|---|
| 拨号 | /usr/share/ofono/scripts/dial-number <modem路径> <号码> |
| 接听来电 | /usr/share/ofono/scripts/answer-calls |
| 挂断所有通话 | /usr/share/ofono/scripts/hangup-all |
| 挂断指定通话 | /usr/share/ofono/scripts/hangup <voicecall路径> |
| 查看通话状态 | /usr/share/ofono/scripts/list-calls |
6.journald
oFono 作为 systemd 服务运行,日志统一由 journald 管理。
# 查看 oFono 全部历史日志
sudo journalctl -u ofono
# 实时跟踪最新日志(拨号时开另一个终端观察)
sudo journalctl -u ofono -f
# 查看最近 100 行
sudo journalctl -u ofono -n 100
# 按时间范围查看(今天)
sudo journalctl -u ofono --since today
# 反向查看(最新的在前面)
sudo journalctl -u ofono -r
6. DEBUG
# 蓝牙信息
dbus-send --system --print-reply --dest=org.ofono / org.ofono.Manager.GetModems
# 查询节点信息
# pw-cli ls Node 2>/dev/null | grep -B 10 "bluez_input.CC_42_10_50_BA_FD.2"
应用管理
介绍一些常见的管理本机应用的功能
1.dpkg
dpkg = Ubuntu / Debian 系统里的 “软件包管理器核心命令”,可以把理解成:Ubuntu 里管所有软件安装、删除、查找的底层工具(比 apt 更底层,apt 是在 dpkg 之上包装的)
- 安装 .deb 软件
- 卸载软件
- 查看系统里装了哪些软件
- 查看某个软件装到了哪个文件夹
# ==============================
# dpkg 本地 .deb 包管理常用命令
# ==============================
# 1. 安装本地 .deb 软件包(例:安装当前目录下的 clash-verge.deb)
sudo dpkg -i clash-verge_1.7.0_amd64.deb
# 2. 修复安装时出现的依赖缺失问题
sudo apt -f install
# 3. 卸载已安装的软件包(保留配置文件)
sudo dpkg -r clash-verge
# 4. 彻底卸载软件包(同时删除配置文件)
sudo dpkg -P clash-verge
# 5. 查看系统中所有已安装的软件包列表
dpkg --list
# 6. 按关键词搜索已安装的软件包(例:搜索 clash 相关)
dpkg --list | grep clash
# 7. 查看某个软件包的所有安装文件路径(例:查看 clash-verge 装到了哪里)
dpkg -L clash-verge
# 8. 查看某个文件属于哪个已安装的软件包
dpkg -S /usr/bin/clash-verge
# 9. 查看本地 .deb 安装包的详细信息(未安装的包也能看)
dpkg -I clash-verge_1.7.0_amd64.deb
# 10. 提取 .deb 包中的文件到当前目录(不解压安装,只看内容)
dpkg -x clash-verge_1.7.0_amd64.deb ./deb_extracted
2.apt
APT 是 Ubuntu/Debian 官方软件源包管理器专门用来:联网安装、升级、卸载、搜索、修复软件
底层依赖 dpkg,但 自动帮你解决依赖关系,软件都从官方源 / 国内镜像源下载,不用自己找安装包,可以理解为:Ubuntu 自带的应用商店(命令行版)
# ==============================
# apt 基础用法:安装 / 更新 / 卸载 / 清理
# ==============================
# 1. 更新软件源索引(每次安装前建议先执行)
sudo apt update
# 2. 安装指定软件(例:安装 openssh-server、firefox)
sudo apt install openssh-server -y
sudo apt install firefox -y
# 3. 卸载软件(保留配置文件)
sudo apt remove firefox
# 4. 彻底卸载软件(同时删除配置文件)
sudo apt remove --purge firefox
# 5. 更新系统中所有已安装的软件
sudo apt upgrade -y
# 6. 安装指定版本的软件
sudo apt install firefox=115.0.1-1
# 7. 搜索软件包(例:搜索 clash 相关软件)
apt search clash
# 8. 查看软件包的详细信息(例:查看 firefox)
apt show firefox
# 9. 查看系统中已安装的软件包列表
dpkg --list | grep firefox
# 10. 卸载软件后,清理无用的依赖包
sudo apt autoremove -y
# 11. 清理下载的软件包缓存(释放磁盘空间)
sudo apt clean
# 12. 修复依赖损坏/安装失败的软件
sudo apt -f install
# 13. 列出应用版本信息
sudo apt list -a golang-go
3.GNOME
GNOME是 Linux 上最主流、最标准的「图形桌面环境」(Desktop Environment)。
Ubuntu 左下角 “显示应用程序” 里的每个图标,都对应一个 .desktop 启动器文件。
# 用户级
~/.local/share/applications/
# 系统级
/usr/share/applications/
# snap应用
/var/lib/snapd/desktop/applications/
# flatpak应用
/var/lib/flatpak/exports/share/applications/
# 全局搜索(推荐)
find ~/.local/share/applications /usr/share/applications /var/lib/snapd/desktop/applications -name "*.desktop" | grep -i 关键词
.desktop 文件内容,标准结构:
[Desktop Entry]
Type=Application # 固定:Application
Name=PhpStorm # 应用列表显示名(关键)
Comment=PHP IDE # 鼠标悬停提示
Exec=/opt/PhpStorm/bin/phpstorm.sh %f # 启动命令(绝对路径)
Icon=/opt/PhpStorm/bin/webide.png # 图标(绝对路径或主题名)
Terminal=false # 是否终端启动
Categories=Development;IDE; # 分类(决定分组)
Keywords=php;ide;jetbrains; # 搜索关键词
StartupWMClass=jetbrains-phpstorm # 窗口绑定(Dock 图标不丢关键)
NoDisplay=false # 是否隐藏(false=显示)
图形和编辑工具:
sudo apt install menulibre
menulibre
4.查找本机应用
# ==================== 1. 先查看命令类型(判断是否系统内置/别名/函数) ====================
type 命令名 # 作用:判断命令类型(内置命令/外部程序/别名/shell函数)
# ==================== 2. 获取命令绝对路径(最标准、最稳定) ====================
command -v 命令名 # 作用:输出命令的绝对路径(比 which 更标准,脚本专用)
which 命令名 # 作用:简易查找命令可执行文件路径
# ==================== 3. 优先判断:APT 安装(系统官方软件) ====================
dpkg -S $(command -v 命令名) # 作用:查询【文件路径】属于哪个 APT 安装包
# → 查到结果 = APT 安装
sudo apt purge 包名 # 作用:卸载软件 + 删除所有配置(彻底清理)
sudo apt autoremove # 作用:自动删除无用依赖
sudo apt autoclean # 作用:清理旧安装包缓存
# ==================== 4. 判断:Snap 安装(Ubuntu 官方应用商店) ====================
snap list | grep 命令名 # 作用:列出所有Snap软件,过滤查找目标命令
# → 查到结果 = Snap 安装
sudo snap remove --purge 软件名 # 作用:彻底卸载Snap软件 + 删除所有数据
# ==================== 5. 判断:Flatpak 安装(跨平台通用) ====================
flatpak list | grep 命令名 # 作用:列出所有Flatpak软件,过滤查找目标命令
# → 查到结果 = Flatpak 安装
flatpak uninstall 应用ID # 作用:卸载Flatpak应用
flatpak uninstall --unused # 作用:删除无用运行库
# ==================== 6. 都查不到 = 手动解压安装(PhpStorm/VSCode/绿色软件) ====================
# 先查安装路径
command -v 命令名 # 作用:获取手动安装软件的启动路径
# 卸载清理
rm -rf 安装目录 # 作用:删除手动安装的主程序文件夹
rm -rf ~/.config/软件名 # 作用:删除用户配置
rm -rf ~/.local/share/软件名 # 作用:删除用户数据
rm -f ~/.local/share/applications/*.desktop # 作用:删除桌面图标
update-desktop-database ~/.local/share/applications # 作用:刷新应用列表
# ==================== 7. 特殊:Shell 函数(nvm 这类非程序命令) ====================
type nvm # 作用:判断是否为 shell 函数(which 查不到)
rm -rf ~/.nvm # 作用:卸载 nvm + 所有它安装的 node
sed -i '/nvm/d' ~/.bashrc # 作用:删除环境变量配置
UEFI
UEFI是写在主板芯片里、永久固化的一套小型系统程序,代替老式 BIOS,是电脑硬件和操作系统之间的第一层桥梁。
开机上电 → UEFI自检
↓
读取NVRAM启动顺序(efibootmgr管这里)
↓
按顺序找ESP分区里的.efi文件
↓
选中Windows → 直接进Windows
选中Ubuntu → 加载shimx64.efi
↓
弹出GRUB菜单
↓
再选Ubuntu 或 Windows
1.BIOS
- BIOS(Basic Input Output System,基本输入输出系统本质):老式主板自带的底层固件程序,固化在主板闪存芯片里,是电脑通电后第一个运行的程序,负责硬件自检、硬件初始化、引导操作系统,是连接电脑硬件与操作系统的底层桥梁。
- UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口本质)新一代主板自带的底层固件程序,同样写在主板 SPI 闪存芯片里、永久固化、出厂预置,是老式 BIOS 的全面升级替代版;作为电脑硬件和操作系统之间的第一层核心桥梁,接管开机自检、硬件初始化、启动项管理、系统引导全部工作。
电脑按下开机键,CPU 第一个执行的就是它俩,比任何操作系统都先运行。
- 开机硬件自检(POST),检测 CPU / 内存 / 硬盘 / 显卡是否正常
- 初始化所有硬件,让硬件具备基础工作能力
- 按照启动顺序,寻找并加载硬盘上的操作系统
| 对比维度 | 老式 BIOS(Legacy) | 现代 UEFI |
|---|---|---|
| 界面体验 | 纯黑白文字、无鼠标、操作繁琐 | 图形化界面、支持鼠标、可中文、可联网 |
| 硬盘分区 | 只支持 MBR 分区,最大识别 2TB 硬盘 | 支持 GPT 分区,支持超大容量硬盘 |
| 启动项存储 | 无专用独立存储,不永久保存完整启动项 | 自带主板 NVRAM 独立存储空间,永久保存启动项、启动顺序、隐藏属性 |
| 启动方式 | 读取硬盘最开头引导扇区,无独立 EFI 分区 | 读取硬盘 ESP 独立 EFI 分区 里的 .efi 引导文件 |
| 安全机制 | 无安全防护 | 支持 Secure Boot 安全启动,防止恶意程序篡改引导 |
| 扩展性 | 功能固定,无法扩展 | 可加载驱动、可装模块、支持扩展功能 |
| 开机速度 | 流程老旧,启动慢 | 流程精简,开机更快 |
2.NVRAM
主板上一块极小的非易失性存储区域,断电不丢数据;容量极小,只有几 KB~几十 KB专门只存:
- 各个 UEFI 启动项
- BootOrder 启动顺序
- 硬件设置(开机顺序、安全启动、XMP 等)
3.ESP 分区(EFI 系统分区)
硬盘上独立的 FAT32 小分区(100~500MB),是 UEFI 专用分区;所有系统的引导文件都放这里共用,比如:
- Windows:\EFI\Microsoft\Boot\bootmgfw.efi
- Ubuntu:\EFI\ubuntu\shimx64.efi
UEFI 就是按 NVRAM 里的顺序,去 ESP 分区找对应的 .efi 文件启动。
4.Boot Loader
\EFI\Microsoft\Boot\bootmgfw.efi是什么Windows 官方自带的 UEFI 启动管理器,是 Windows 专属启动器。
UEFI 主板固件
↓
bootmgfw.efi (Windows启动器)
↓
加载 Windows 内核 ntoskrnl.exe
↓
进入 Windows 桌面
GRUB(Rand Unified Bootloader,统一多系统引导加载器 ),Linux 生态通用的万能多系统启动器,Ubuntu、CentOS、Debian 全都用它。自动扫描全盘所有系统能识别:Windows、Ubuntu、其他 Linux、Mac。
UEFI 主板固件
↓
shimx64.efi → grubx64.efi (GRUB启动器)
↓
弹出选择菜单:Ubuntu / Windows / 恢复模式
↓
选Ubuntu:加载 Linux 内核 → 进系统
选Windows:转交控制权给 bootmgfw.efi → 进Windows
DHCP 协议
动态主机配置协议(Dynamic Host Configuration Protocol),自动给局域网内所有设备分配 IP 地址、网关、子网掩码、DNS,不用手动设置。
1.工作原理
- DISCOVER 发现:设备开机大喊:谁是 DHCP 服务器?我要 IP!
- OFFER 提供:路由器(DHCP 服务器)回复:我给你一个空闲 IP
- REQUEST 请求:设备确认:我就要这个 IP
- ACK 确认:路由器正式下发:IP、网关、DNS 全部配齐
2.关键概念
- IP 地址池:路由器预留一段 IP 专门用来分配,例:192.168.1.100 ~ 192.168.1.200
- 租约:IP不是永久的,有使用时长,到期前设备自动续租 → IP 不变,长时间关机 / 离线 → IP 回收分给别人
问题记录
记录使用过程中遇到的一些问题
1.安装golang
# 清理旧版本
sudo apt remove -y golang-go golang-1.*
sudo apt autoremove -y
sudo rm -rf /usr/local/go
# 下载安装指定版本
wget https://dl.google.com/go/go1.23.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.2.linux-amd64.tar.gz
# 配置环境变量
echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.bashrc
source ~/.bashrc
# 验证输出
go version
2.常用软件
记录一些常用的软件
2.1 远程桌面
sudo apt update
sudo apt install remmina remmina-plugin-rdp -y
3.sudo运行很慢
如果 /etc/hostname 或 /etc/hosts 配置不当,sudo 会尝试反向解析主机名导致超时。
# 编辑 hosts 文件,确保有这一行(将 your-hostname 替换为实际主机名)
sudo nano /etc/hosts
# 添加:
127.0.0.1 localhost your-hostname
127.0.1.1 your-hostname
# 或者如果主机名未解析,直接禁用 sudo 的 DNS 解析
sudo nano /etc/sudoers
# 添加:
Defaults !fqdn
4.phpstorm查看md文件闪退
Markdown 预览器依赖 Chromium 渲染,而 chrome-sandbox 二进制文件权限不正确导致致命错误。
# 1. 切换到 PhpStorm 的 jbr 目录(根据你的实际路径)
cd /home/tim/软件/PhpStorm-233.15619.9/jbr/lib/
# 2. 修复 chrome-sandbox 的所有者和权限
sudo chown root:root chrome-sandbox
sudo chmod 4755 chrome-sandbox
# 3. 验证权限
ls -la chrome-sandbox
# 应该显示:-rwsr-xr-x 1 root root ...
