Ubuntu 从入门到精通,Ubuntu 快速上手
- 未分类
- 21天前
- 66热度
- 0评论
快速上手
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
# 查看是否生效
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 相关名词
| 术语 | 全称 | 角色说明 |
|---|---|---|
| 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 模式:
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