Orange Pi Zero 3w开发文档

简约无双

开发板系统:linux
用户名:orangepi
sudo密码:orangepi

连接

SSH无线连接

  1. 和开发板连接同一WI-FI

  2. 给板子插电,等待红灯闪烁

  3. 在电脑上用ssh进行连接

    1
    ssh orangepi@192.168.3.163

    ssh密码:orangepi

adb有线连接

  1. 用USB线连接板子和电脑
  2. 红灯闪烁后等待大约1分钟
  3. 执行adb devices查看是否连接成功
  4. 执行adb shell进行板端开发

已在板端配置开机自动运行adb启动脚本的systemctl服务:

1
sudo nano /etc/systemd/system/adb-conf.service

写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=ADB config startup script
After=sys-devices-platform-soc\x403000000-10.usbc0.device
Wants=sys-devices-platform-soc\x403000000-10.usbc0.device

[Service]
Type=forking
ExecStart=/etc/adb_conf.sh start
ExecStop=/etc/adb_conf.sh stop
TimeoutStartSec=15

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
# 重新加载配置
sudo systemctl daemon-reload
# 设置开机自启
sudo systemctl enable adb-conf.service
# 立即测试运行一次,看脚本有没有报错
sudo systemctl start adb-conf.service
# 查看运行状态
systemctl status adb-conf.service
# 查看完整日志
journalctl -u adb-conf.service

文件传输

scp协议

PC端执行:

下载文件:

1
2
3
4
5
# 单个文件
# 把开发板 /home/orangepi/log.txt 下载到PC当前目录(22为默认端口,可省略)
scp -P 22 orangepi@192.168.3.163:/home/orangepi/log.txt ./
# 文件夹
scp -r orangepi@192.168.3.163:/home/orangepi/my_code ./

上传文件:

1
2
3
4
# 单个文件
scp ./local_file.txt orangepi@192.168.3.163:/home/orangepi/
# 文件夹
scp -r pure-uav orangepi@192.168.3.163:/home/orangepi

rsync

增量传输,支持重复执行断点续传。

PC端执行:

1
2
3
4
5
6
7
8
# 下载开发板目录到PC本地
rsync -avz orangepi@192.168.3.163:/home/orangepi/my_code ./my_code
# 上传PC文件夹到开发板
rsync -avz ./my_code orangepi@192.168.3.163:/home/orangepi/
# 限制带宽1000kb/s
rsync -avz --bwlimit=1000 orangepi@192.168.3.163:/home/orangepi/logs ./logs
# 换端口
rsync -avz -e "ssh -p 2222" orangepi@192.168.3.163:/home/test ./
  • -a:归档模式,保留权限、目录结构、软链接
  • -v:verbose,打印详情
  • -z:传输时压缩

sftp协议

用文件管理器图形化查看和传输文件。

在文件管理器地址栏输入:sftp://orangepi@192.168.3.163连接。

日志记录

启用 journald 持久化日志

1
sudo nano /etc/systemd/journald.conf

添加Storage=persistent

查看:

1
2
3
4
5
6
7
8
# 实时持续看日志
journalctl -f
# 查看上一次开机的全部日志
journalctl -b -1
# 只看内核日志(等价dmesg)
journalctl -k
# 导出上一次开机全部日志保存到文件
journalctl -b -1 > ~/logs/crash_lastboot.log

抓取dmesg内核日志

读取内核日志需要root权限,用systemd服务读取并记录。

1
sudo nano /etc/systemd/system/dmesg-logger.service

写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Collect dmesg kernel log to file
After=local-fs.target

[Service]
Type=simple
User=root
ExecStart=/bin/bash -c 'mkdir -p /home/orangepi/logs; dmesg -w | while read line; do echo "[$(date +%%Y-%%m-%%d %%H:%%M:%%S)] $line"; done >> /home/orangepi/logs/dmesg.log'
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target

启动服务:

1
2
3
4
5
6
7
sudo systemctl daemon-reload
sudo systemctl enable dmesg-logger.service
sudo systemctl start dmesg-logger.service
# 查看服务状态
systemctl status dmesg-logger
# 实时查看日志输出
tail -f /home/orangepi/board_log/dmesg.log

[!WARNING]
这个方式记录的日志没有自动删除功能,需要定期手动清理。

把日志从内存移动到SD

1
2
3
sudo systemctl disable --now orangepi-ramlog
sudo sed -i 's/^ENABLED=.*/ENABLED=false/' /etc/default/orangepi-ramlog 2>/dev/null
sudo reboot

禁用休眠

不禁用休眠的话会因GDM登录界面或桌面空闲20分钟后被自动挂起,而全志的BSP的挂起唤醒是坏的,就会导致死机。

1
2
3
4
5
6
7
8
9
# 查看休眠发起来源
journalctl -b -1 | grep -iE "suspend|sleep|logind|gsd-power"
# 看是 reboot 还是 crash
last -x | head -20

journalctl -b -1 -o short-monotonic | grep -iE "suspend|sleep|logind|NetworkManager|gsd-power"
journalctl -b -1 -u systemd-logind -u NetworkManager -o short-monotonic | tail -40
# 看真实有几轮启动
journalctl --list-boots

禁用休眠:

1
2
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
sudo nano /etc/systemd/sleep.conf

写入:

1
2
3
4
5
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no
1
sudo nano /etc/systemd/sleep.conf.d/nosuspend.conf
1
2
3
4
[Sleep]AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no
1
sudo nano /etc/systemd/logind.conf.d/noidle.conf
1
2
3
4
[Login]
HandleSuspendKey=ignore
HandleHibernateKey=ignore
IdleAction=ignore
1
sudo systemctl restart systemd-logind

关掉桌面端的自动挂起:

1
2
sudo -u gdm dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'
sudo -u gdm dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'nothing'

完整脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1) 桌面端:市电/电池两条路都关掉,gdm 和你自己各一遍
for u in gdm orangepi; do
for t in ac battery; do
sudo -u $u dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-${t}-type 'nothing'
done
done

# 2) systemd 层面彻底堵死
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

printf '[Sleep]\nAllowSuspend=no\nAllowHibernation=no\nAllowSuspendThenHibernate=no\nAllowHybridSleep=no\n' | sudo tee /etc/systemd/sleep.conf.d/nosuspend.conf

printf '[Login]\nHandleSuspendKey=ignore\nHandleHibernateKey=ignore\nHandleLidSwitch=ignore\nIdleAction=ignore\n' | sudo tee /etc/systemd/logind.conf.d/noidle.conf

# 3) 日志从 zram 挪回 SD 卡
sudo systemctl disable --now orangepi-ramlog
sudo sed -i 's/^ENABLED=.*/ENABLED=false/' /etc/default/orangepi-ramlog 2>/dev/null
1
2
3
chmod +x sleep-disable.sh
./sleep-disable.sh
reboot

网络转发

原理:sshuttle 在板子上用 iptables 把流量拦下来,通过 SSH 隧道送到电脑,由电脑的 SSH 进程代为发出。电脑上只要求能 SSH 登录。

电脑上执行:

1
systemctl is-active ssh

若输出inactive,就执行:

1
2
sudo apt install openssh-server
sudo systemctl enable --now ssh
1
2
3
4
5
6
# 查看电脑IP
ip -br addr show
# 或
hostname -I
# 查看电脑端口(默认22)
sudo ss -tlnp | grep sshd

如果端口不是22,在PC的IP后加冒号和端口,如:192.168.1.100:2222。

板子上执行:

1
2
3
4
# 查找板子IP
ip route show scope link
# 或(需会看)
ip -br addr show wlan0
1
2
3
4
sudo apt install sshuttle
sudo sshuttle -r <PC_user>@<PC_IP> 0.0.0.0/0 --exclude <板子IP>
# 例:
sudo sshuttle -r jianyuelinux@192.168.3.181 0.0.0.0/0 --exclude 192.168.3.0/24
  • --exclude 很重要:把你的局域网段排除掉,否则你 SSH 登录板子的这条连接本身也会被塞进隧道,容易造成递归死锁或 SSH 断连。
  • 前台运行,Ctrl-C 结束,规则会自动清理。加 -D 可后台运行,日志默认写 syslog。

新开一个开发板窗口验证:

1
curl -s ifconfig.me

应返回电脑的公网出口IP,在电脑上执行这条命令会输出相同的结果。

停止:

1
sudo pkill -f sshuttle

正常退出会清规则,如果之前被 kill -9 强杀过导致板子上不了网,用 sudo iptables -t nat -S 检查残留的 REDIRECT 规则,手动 -D 删掉。

局限:只转发 TCP。所以 ping(ICMP)不走隧道,仍然是板子直连路由器的结果,不能用 ping 验证;DNS 默认也走隧道(sshuttle 会劫持 DNS 查询),apt、pip、curl、浏览器都正常。

内核锁定

防止内核更新后NPU驱动崩溃。

1
2
3
sudo apt-mark hold linux-image-legacy-sun60iw2 linux-dtb-legacy-sun60iw2 linux-u-boot-orangepizero3w-legacy orangepi-bsp-cli-orangepizero3w orangepi-bsp-desktop-orangepizero3w orangepi-firmware
# 校验锁定结果
sudo apt-mark showhold

解锁:sudo apt-mark unhold linux-image-legacy-sun60iw2 linux-dtb-legacy-sun60iw2 linux-u-boot-orangepizero3w-legacy orangepi-bsp-cli-orangepizero3w orangepi-bsp-desktop-orangepizero3w orangepi-firmware

其他

systemd

查看systemctl服务:

1
2
3
4
5
6
7
8
9
10
# 列出所有加载的服务(包括激活/未激活)
systemctl list-units --type=service
# 只看正在运行的服务
systemctl list-units --type=service --state=running
# 查看所有已安装服务(含没加载的)
systemctl list-unit-files --type=service
# 查看单个服务状态
systemctl status <服务名>.service
# 或
systemctl status <服务名>
  • enabled:开机自启

  • disabled:开机不启动

  • static:静态服务,不能直接 enable,一般被别的服务依赖启动

  • active (running):正在运行

  • active (exited):一次性任务执行完成

  • inactive (dead):未运行

  • enabled:开机自启

  • 标题: Orange Pi Zero 3w开发文档
  • 作者: 简约无双
  • 创建于 : 2026-10-18 00:00:00
  • 更新于 : 2026-10-20 09:15:21
  • 链接: https://blog.jianyuewushuang.top/2026/10/18/香橙派开发文档/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论