Armbian + CasaOS + NAS 配置指南
目录
以下基于 Armbian + CasaOS 进行配置
外部存储挂载与卸载
挂载外部存储
# 查看当前的存储设备以及挂载的位置
# 使用 fdisk -l 命令列出所有存储设备及其挂载点
fdisk -l
运行上述命令后,会得到类似如下的输出,从中找到外部存储的路径,例如:/dev/mmcblk0
注意:多次插拔 U 盘后,存储路径可能会发生变化。
Disk /dev/mmcblk0: 28.97 GiB, 31104958464 bytes, 60751872 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
# 创建一个目录用于挂载外部存储设备
mkdir /mnt/udisk
# 使用 mount 命令将外部存储设备挂载到刚创建的目录
mount /dev/mmcblk0 /mnt/udisk
# 提示:一般情况下直接使用 mount 命令即可完成挂载
卸载外部存储
# 使用 umount 命令卸载挂载的存储设备
# 记得提前停止相关进程
umount /mnt/udisk
CasaOS Docker 迁移到外部存储
免密登录
# 1. 生成 SSH 密钥对 (使用默认路径和空密码)
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519 -N ""
# 2. 将公钥复制到远程服务器
ssh-copy-id username@remote_host
# 3. 验证 SSH 免密登录
ssh username@remote_host
U 盘挂载各类常见问题
Aria2 无法下载到外部存储: Task Status: Error Occurred
这里有多种情况:
- 盲猜是读写权限问题
- 进入外部存储文件夹后, 尝试运行
chmod 777 {PATH}更改权限 - 如果上述
chmod无效, 可能是外部存储的文件系统 (如 FAT32 或 NTFS) 导致的。
- 进入外部存储文件夹后, 尝试运行
- 外部存储文件系统不支持标准的 unix 权限模型
- 检查外部存储的文件类型:
df -T {PATH} - 示例输出:
Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda2 vfat 204560 74356 130204 37% /mnt/udisk2 - 如果文件系统类型为
vfat,基本可以确认是文件系统问题。 - 解决方法: 一劳永逸格式化
# 先卸载外部存储, 然后格式化为 `ext4` 文件系统 umount {PATH} sudo mkfs.ext4 {PATH}
- 检查外部存储的文件类型:
Bad magic number in super-block while trying to open
重新插拔优盘,可能和重复的挂载 UUID 有关。
mount: /media/devmon/SDCard4G: wrong fs type, bad option, bad superblock on /dev/mmcblk0p1, missing codepage or helper program, or other error.
这种情况通常出现在格式化后的 SD 卡上,建议重新到 CASAOS UI 中格式化后解决问题。
dev/mmcblk0 is apparently in use by the system; will not make a filesystem here!
docker volume 已经映射到外部存储, 依然下载到了内部存储?
比如 QBittorrent 或者 Aria2 之类的, 明明已经在 CASAOS 的 Docker Volume 中映射了外部存储, 但是下载的时候依然占用内部存储, 这可能是因为:
- Volumes 写错了呗, 可能自己傻傻地选择了一个并没有挂载 USB 的目录
- 外部存储根本没有 mount, 尝试执行
lsblk查看当前挂载情况:
这时候就重新挂载一下外部存储:lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 29G 0 disk # 如果你的 USB 这里没有路径, 那就说明没有挂载 mmcblk1 179:16 0 7.3G 0 disk ├─mmcblk1p1 179:17 0 256M 0 part /boot └─mmcblk1p2 179:18 0 6.9G 0 part / mmcblk1boot0 179:32 0 4M 1 disk mmcblk1boot1 179:48 0 4M 1 disk zram0 253:0 0 496.6M 0 disk [SWAP] zram1 253:1 0 50M 0 disk /var/log
然后更新一下 QB 和 Aria2 的 Volumnes 配置, 下载个文件试试, 应该就不会占用内部磁盘的空间了mount /dev/mmcblk0 /media/devmon/MyUSB01
开机自动挂载
fstab 配置格式
UUID=设备UUID 挂载点 文件系统类型 挂载选项 备份 检查
关键参数详解
挂载选项 (mount options)
| 参数 | 作用 | 说明 |
|---|---|---|
defaults | 默认选项 | 使用系统默认的挂载选项 |
user | 用户挂载 | 允许普通用户挂载/卸载设备 |
noauto | 不自动挂载 | 系统启动时不会自动挂载此设备 |
nofail | 容错处理 | 如果设备不存在,系统启动不会失败 |
ro | 只读 | 以只读模式挂载 |
rw | 读写 | 以读写模式挂载 |
实际配置示例
❌ 错误配置(不会自动挂载)
UUID=132a1111-b10b-411e-ae14-3dad111105d4 /media/devmon/usb_32G auto defaults,user,noauto 0 0
✅ 正确配置(会自动挂载)
UUID=132a1111-b10b-411e-ae14-3dad111105d4 /media/devmon/usb_32G auto defaults,user,nofail 0 0
配置步骤
-
获取设备 UUID
sudo blkid /dev/mmcblk0 -
创建挂载点
sudo mkdir -p /media/devmon/usb_32G -
编辑 fstab
sudo nano /etc/fstab -
添加配置行
UUID=你的设备UUID /media/devmon/usb_32G auto defaults,user,nofail 0 0 -
测试配置
sudo mount -a
常见问题
- Q: 为什么
sudo mount -a显示 “ignored”?- A: 因为配置中包含了
noauto参数,系统会忽略此配置。
- A: 因为配置中包含了
- Q: 如何确保设备不存在时系统不会启动失败?
- A: 使用
nofail参数替代noauto。
- A: 使用
- Q: 为什么要使用 UUID 而不是设备路径?
- A: UUID 是唯一的,不会因为设备插入顺序变化而改变。
总结
- 移除
noauto参数才能实现自动挂载 - 使用
nofail参数提高系统稳定性 - 使用 UUID 确保设备识别准确
- 测试配置使用
sudo mount -a命令
内网穿透
我常用的两种:
- Tailscale/Zerotier 等 Private VPN 方法
- 虚拟网络, 虚拟局域网
- 多设备支持
- 每个设备都要客户端
- 在服务商方面集中管理
- DDNS-GO/Lucky 等 Reverse Proxy 方法
- 通过动态域名解析 (DDNS) 将内网设备或者 Web 服务的地址绑定到一个固定的域名, 方便外网访问.
- 配合反向代理工具可以实现内网穿透
- 一般需要一个公网域名
- 适合需要长期稳定访问的场景, 例如搭建个人博客, NAS 文件共享等.
TL’DR: 想要虚拟局域网选
Tailscale, 想要通过网站访问家里内网的服务选Lucky
Tailscale
安装: Using Tailscale with Docker
只需要两个环境变量:

- 从 用户配置页面 生成一个
Auth Key - 需要广播的路由:
TS_ROUTES:192.168.1.0/24会将内网192.168.1开头所有 IP 广播到虚拟网络- 简而言之: 我在其他设备上输入
192.168.1.100就能访问到内网192.168.1.100的服务
启动服务, 然后在其他设备上下载 App, 安装并开启.
这时跑到后台管理页面应该就有一个新设备:

下方可以看到有个 subnets 感叹号, 需要到右边三个点里面 Edit route settings 激活一下.
Hints
- 偶尔有时候不同的 subnet 里面的服务 IP 是相同的会冲突, 这时候一样跑到上面三个点关闭一些 设备的 subnet 就可以了, 多简单
- 电信的网比移动的访问 Tailscale 明显更卡
Auth Key的有效期最多未 180 天, 因此需要定期更新
Lucky
你需要一个域名
略,懒得写了。
添加动态域名

- 获取域名商提供的
Token - 配置
TeamID:TeamID是 Vercel 的用户 ID. 一开始以为是某些数字, 后来发现可以直接在 URL 中找到. 例如, 在https://vercel.com/szhshps-projects/szhshp-blog中,TeamID是szhshps-projects
- 配置完成后, 动态域名解析即可生效

申请证书
需要填写的内容在上一步骤中已经获取:

SSL 证书信息填写的弹窗里,域名列表也一定要添加两行:
- 一个是
abc.top,这个可以保证主域名在访问时浏览器提示是可信任的 - 一个是
*.abc.top,这个可以保证二级域名在访问时浏览器提示是可信任的
配置后等待几分钟即可生效.
开启 Web 服务
启动所需的 Web 服务, 并确保其可以通过动态域名访问.

规则组会选择一个主要端口, 我用了 16666
规则组需要开启 TLS.

两种策略访问不同服务:
- 多个规则组, 每个设置一个端口:
https://filebrowser.szhshp.org:16666https://filebrowser.szhshp.org:16688
- 一个规则组多个子规则, 使用子域名区分:
https://filebrowser.szhshp.org:16666https://media.szhshp.org:16666https://backup.szhshp.org:16666
我记不住端口, 因此选择 #2 , 子域名更好记.
为每个本地端口的服务添加多个子规则:

配置完成后, 你应该可以通过 https://filebrowser.szhshp.org:16666 访问服务.
端口转发与内网穿透
我的网络状况非常简单, 没有多层 NAT 的情况, 所以我不需要进行额外的端口转发设置
Hints
- 证书发放成功后, 使用 HTTPS 协议访问可能仍显示
Not Secure, 通常是刷新延迟, 等待即可. - 外部访问时需永久带上端口, 例如:
https://filebrowser.szhshp.org:16666. - 配置完成后, 记得在外网使用流量测试:
- 一开始内网访问成功了我还以为就直接搞定了, 当天晚上遛弯儿的时候用手机试了试才注意到外网不行
浏览器->绑定的域名->DNS 解析->主机地址->建立 TCP 连接->发送 HTTP 请求->服务器响应->渲染网页- 你在内网的话主机就在你身边啊, 当然秒访问啊
- 就这一点可以直接体会到 Edge Function 和 分布式部署的优势, 离得近就是快啊
- 外网无法访问多数是路由器设置问题:
- 检查 DMZ 主机是否开启, 确保配置后已启用. (配置后忘记开启就很尴尬了)
- 检查路由器防火墙, 必要时关闭防火墙. (我的一台路由器就是这个问题, 关闭
Ipv4Spi和Ipv6Spi)
Aria2
核心点就是需要下载 2 个镜像:
p3terx/ariang: Clientp3terx/aria2-pro: Server
Hints
Server 配置
在配置 Server 时,需要关注以下几个关键点:
RPC_SECRET:用于前端连接后端的密码,确保安全性。- Volumes 的映射:将文件下载路径映射到外部存储目录。具体操作可参考外部存储挂载与卸载一节。
Client 配置
在配置 Client 时,需要使用对应 Server 的端口和 RPC_SECRET:
- 打开
AriaNg Setting,进入RPC设置页面。 - 配置以下内容:
- 地址:填写 Server 的 IP 和端口,例如:
192.168.1.105:8800。 - 密码:填写 Server 配置的
RPC_SECRET。
如果使用了 Lucky 进行端口映射,则需要填写映射到外部的地址和端口,例如:https://aria.server.szhshp.org:16666。
示例界面
以下为配置完成后的示例界面:

媒体服务
我不喜欢个人媒体中心, 我听的音乐非常偏门导致基本刮削不出什么信息, 电影也不是经常看. 我觉得折腾很久最后收益只是孤芳自赏, 因此 Jellyfin 之类的我搭建最后都删了
最有用的还是 xiaoya 库, 这里是最方便的安装方式
WebDAV - nPlayer
配置细节:
小雅默认 webdav 账号密码
用户: guest 密码: guest_Api789
端口根据小雅配置端口写

SMB - Nova Video Player
这个配置就简单得多了, 直接写 smb 协议地址即可
飞跃大气层的魔法 (旧 Clash + YACD)
这个方案配置起来比较麻烦, 现在有更好的方案, 见下文
开启穿越大气层魔法需要两个镜像:
dreamacro/clash: Clienthaishanh/yacd: Server
配置细节
准备配置文件
首先需要获取 Clash 的配置文件 (YAML 格式) . 最简单的方法是从 PC 或手机上的 Clash 客户端中导出配置文件.

导出后, 需要对配置文件进行一些修改, 主要是调整 External Controller 的设置.

修改内容包括:
- 将
External Controller的广播地址改为0.0.0.0, 以便允许外部设备访问. - 设置
mixed-port, 用于暴露 SOCKS5 代理端口. - 启用
allow-lan, 允许局域网设备连接.
将修改后的配置文件保存到路径 /clash/sub.yaml .
YACD 连接配置
在 YACD 中连接 Clash 时, 需要使用刚才修改的 External Controller 地址.
注意:
- 必须使用实际的设备 IP 地址,
localhost无法用于外部设备连接. - 端口号与配置文件中设置的
External Controller端口保持一致.

其他设备代理设置
在其他设备上进行代理设置时:
- 使用本地设备的实际 IP 地址.
- 代理端口为配置文件中设置的
mixed-port(默认值为7890) .
完成以上配置后, 其他设备即可通过代理访问网络.
飞跃大气层的魔法 (新 V2rayA)
TL’DR:
V2rayAin Docker, 不用像以前那样安装Clash + YACD俩服务了
Compose 文件:
name: cool_antonio
services:
v2raya:
cpu_shares: 90
command: []
container_name: v2raya
deploy:
resources:
limits:
memory: 993M
environment:
- IPTABLES_MODE=legacy
- TZ=Asia/Shanghai
- V2RAYA_LOG_FILE=/tmp/v2raya.log
- V2RAYA_V2RAY_BIN=/usr/local/bin/xray
hostname: v2raya
image: mzz2017/v2raya:v2.2.6.3
labels:
icon: v2raya
ports:
- target: 2017
published: "2017"
protocol: tcp
- target: 20170
published: 20170-20173
protocol: tcp
privileged: true
restart: always
volumes:
- type: bind
source: /lib/modules
target: /lib/modules
- type: bind
source: /volume1/docker/v2raya/data
target: /etc/v2raya
devices: []
cap_add: []
network_mode: host
x-casaos:
author: self
category: self
hostname: ""
icon: v2raya
index: /
is_uncontrolled: false
port_map: "2017"
scheme: http
store_app_id: cool_antonio
title:
custom: v2raya
配置完成后, 添加订阅, 启动服务, 然后使用预设的走 HTTP 协议的端口号 {ip}:20171 访问即可.
简单粗暴.