Ubuntu 从入门到精通,Ubuntu 快速上手

Ubuntu 是免费、开源、基于 Linux 内核的电脑操作系统 。

快速上手

Ubuntu 来自非洲语言,意思是:我因我们而存在,理念是免费、共享、人人可用。

1.常见版本

  • LTS 版本(重点):后缀带 LTS(长期支持版)每 2 年出一个,5 年官方安全更新普通人、服务器、开发只装 LTS
  • 普通版本:半年一更,只支持 9 个月,适合尝鲜,不推荐新手用。

不同版本分支

  • Ubuntu Desktop:桌面版,带图形界面,像 Windows 一样点鼠标用
  • Ubuntu Server:服务器版,无桌面,纯终端命令

直接复制下载的国内镜像直链:

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

BlueZLinux 官方蓝牙协议栈,由 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 对象模型

BlueZ 5 通过 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 分别走"控制信号"和"数据流"两条路。

① BlueZ 建立物理连接
  • 发现蓝牙耳机 → 配对 → 建立 A2DP(音乐)或 HFP/HSP(通话)蓝牙配置文件连接
  • 相当于:蓝牙芯片和耳机"握手成功"
② oFono 接管电话逻辑
  • 当需要打电话时,oFono 通过 D-Bus 告诉 BlueZ:"激活这个耳机的 HFP 配置文件,我要用"
  • oFono 处理:拨号、来电显示、接听、挂断、信号强度等
  • 相当于:电话 APP 开始工作
③ PipeWire 搬运声音
  • 通话建立后,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 ...