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

快速上手

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

# 查看是否生效
resolvectl status 

展开代码

蓝牙

介绍蓝牙相关的一些功能

1.BlueZ

BlueZ 是 Linux 内核官方蓝牙协议栈,由 Linux Foundation 维护。它是 Linux 系统上所有蓝牙功能的底层根基。BlueZ 只管蓝牙通信本身,不管上层业务逻辑

层级BlueZ 负责不负责
硬件层驱动蓝牙芯片(USB、PCIe、UART)
协议层L2CAP、RFCOMM、SDP、AVDTP、ATT、GATT
Profile 管理注册和分发 Profile(HFP、A2DP、DUN 等)Profile 的具体业务实现
连接管理发现、配对、认证、建立 ACL/SCO 链路音频编解码、电话 AT 命令解析

BlueZ 本身不处理 HFP 的 AT 命令,它只提供机制:

  • 发现配对:bluetoothctl scan/pair/connect — BlueZ 负责
  • Profile 注册:oFono 通过 D-Bus 向 BlueZ 注册自己为 HFP Handsfree (HF) 角色的实现者
  • RFCOMM 通道:BlueZ 建立好后,把 socket fd 交给 oFono
  • SCO 音频链路:BlueZ 建立好后,交给 PipeWire 做音频传输
# ========== 服务控制 ==========
sudo systemctl start bluetooth      # 启动蓝牙服务
sudo systemctl stop bluetooth       # 停止蓝牙服务
sudo systemctl restart bluetooth    # 重启蓝牙服务

# ========== 交互式控制台 ==========
bluetoothctl                        # 进入交互式命令行,以下命令可在其中执行

power on                            # 打开蓝牙控制器电源
power off                           # 关闭蓝牙
agent on                            # 启用默认配对代理(自动处理配对码)
default-agent                       # 将当前代理设为默认
scan on                             # 开始扫描附近设备
scan off                            # 停止扫描
devices                             # 列出已配对设备
pair XX:XX:XX:XX:XX:XX            # 与指定 MAC 地址的设备配对
trust XX:XX:XX:XX:XX:XX           # 标记为信任设备(开机自动连接)
connect XX:XX:XX:XX:XX:XX         # 连接已配对设备
disconnect XX:XX:XX:XX:XX:XX      # 断开当前连接
remove XX:XX:XX:XX:XX:XX          # 删除配对记录
quit                                # 退出 bluetoothctl

# ========== 非交互式快捷用法 ==========
bluetoothctl power on
bluetoothctl scan on
bluetoothctl pair CC:42:10:50:BA:FD
bluetoothctl connect CC:42:10:50:BA:FD

# 查看蓝牙信息
bluetoothctl info CC:42:10:50:BA:FD

# ========== SDP 服务发现与 RFCOMM ==========
sdptool browse XX:XX:XX:XX:XX:XX           # 浏览设备支持的蓝牙服务
sdptool search --bdaddr XX:XX:XX:XX:XX:XX DUN   # 搜索 DUN(拨号上网)服务通道号
sudo rfcomm bind 0 XX:XX:XX:XX:XX:XX 4    # 绑定 RFCOMM 虚拟串口到 /dev/rfcomm0(通道号 4)
sudo rfcomm release 0                       # 释放 /dev/rfcomm0

展开代码

2.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"

展开代码

3.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

展开代码

4.HFP 打电话

4.1 相关名词

术语全称角色说明
AGAudio Gateway音频网关,通常是手机/智能手机,负责接入蜂窝网络、处理通话信令和音频
HFHands-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 模式:

udo 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

5.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

展开代码

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

展开代码

问题记录

记录使用过程中遇到的一些问题

1.安装golang

# 清理旧版本

sudo apt remove -y golang-go golang-1.*
sudo apt autoremove -y