Armbian USB 自动挂载并共享教程
XMit Lv3

本教程介绍如何在 Armbian 系统上实现 USB 设备的自动挂载和 Samba 共享功能。通过这个脚本,你可以实现插入 USB 设备后自动挂载并创建网络共享,支持 Windows 网络发现功能。

功能特点

  • 自动检测并挂载 USB 存储设备
  • 支持多种文件系统:NTFS、FAT32、exFAT、ext4
  • 自动配置 Samba 共享
  • 支持 Windows 网络发现(通过 wsdd2)
  • 即插即用,无需手动操作
  • 支持匿名访问和完全读写权限
  • 自动日志记录
  • 智能依赖检查和安装

前期准备

1. 更换镜像源(可选,但推荐)

编辑 sources.list 文件:

1
nano /etc/apt/sources.list

选择适合你系统的镜像源:

📦 Ubuntu 系统(点击展开)
1
2
3
4
# 清华大学 Ubuntu 镜像源
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble-backports main restricted universe multiverse
📦 Debian 系统(点击展开)
1
2
3
4
# 清华大学 Debian 镜像源
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware

💡 提示:选择对应你系统的镜像源复制即可,不确定是哪个系统可以通过 lsb_release -a 命令查看

2. 安装必要软件包

脚本会自动安装以下必要组件:

  • samba:网络共享服务
  • samba-common-bin:Samba 通用组件
  • ntfs-3g:NTFS 文件系统支持
  • exfat-fuse 和 exfatprogs:exFAT 文件系统支持
  • jq:JSON 处理工具
  • wsdd2:Windows 网络发现支持

安装步骤

1. 创建脚本文件

创建并编辑脚本文件:

1
nano usb-automount-share.sh
📦 脚本内容(点击展开)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/bin/bash

# 配置

MOUNT_BASE="/mnt/usb"
SMB_CONF="/etc/samba/smb.conf"
LOG_FILE="/var/log/usb_share.log"

# 确保基础挂载目录存在

mkdir -p "$MOUNT_BASE"

# 获取所有 USB 存储设备

get_usb_devices() {
lsblk -Jplno NAME,TYPE,RM,UUID | jq -r '.blockdevices[]
| select(.type == "part" and .rm == true and .uuid != null)
| .name + " " + .uuid'
}

# 配置 Samba 共享

setup_samba_share() {
local mount_point="$1"
local share_name=$(basename "$mount_point")

# 如果配置文件不存在或为空,先创建基本配置
if [ ! -f "$SMB_CONF" ] || [ ! -s "$SMB_CONF" ]; then
# 创建配置文件目录
mkdir -p "$(dirname "$SMB_CONF")"

# 创建基本配置
cat > "$SMB_CONF" << EOF

[global]
workgroup = WORKGROUP
netbios name = USB-SHARE
wins support = yes
local master = yes
preferred master = yes
server string = USB Share Server
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
server role = standalone server
map to guest = Bad User
usershare allow guests = yes
EOF

# 确保日志目录存在
mkdir -p /var/log/samba

# 设置适当的权限
chmod 644 "$SMB_CONF"
fi

# 检查并添加全局配置
if ! grep -q "wins support = yes" "$SMB_CONF"; then
# 备份原配置
cp "$SMB_CONF" "${SMB_CONF}.bak"

# 添加全局配置到文件开头
cat > "$SMB_CONF" << EOF

[global]
workgroup = WORKGROUP
netbios name = USB-SHARE
wins support = yes
local master = yes
preferred master = yes
server string = USB Share Server
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
server role = standalone server
map to guest = Bad User
usershare allow guests = yes

EOF # 追加原配置文件的其余部分(排除原有的 [global] 部分)
sed '/\[global\]/,/\[/!d;/\[global\]/d;/\[/!d' "${SMB_CONF}.bak" >> "$SMB_CONF"
fi

# 检查共享是否已存在
if ! grep -q "^\[$share_name\]" "$SMB_CONF"; then
# 添加共享配置
cat >> "$SMB_CONF" << EOF

[$share_name]
path = $mount_point
browseable = yes
read only = no
guest ok = yes
create mask = 0777
directory mask = 0777
force user = nobody
force group = nogroup
comment = USB Share - $share_name
EOF # 重启 Samba 服务
systemctl restart smbd nmbd
fi
}

# 挂载设备

mount_device() {
local device="$1"
local uuid="$2"
local mount_point="$MOUNT_BASE/$(basename "$device")"

# 创建挂载点
mkdir -p "$mount_point"

# 检查是否已经挂载
if ! mountpoint -q "$mount_point"; then
# 尝试挂载
mount -U "$uuid" "$mount_point" -o rw,users,umask=000

if [ $? -eq 0 ]; then
echo "成功挂载设备 $device$mount_point" | tee -a "$LOG_FILE"
# 设置Samba共享
setup_samba_share "$mount_point"
else
echo "挂载设备 $device 失败" | tee -a "$LOG_FILE"
rmdir "$mount_point"
fi
fi

}

# 检查并安装依赖

install_dependencies() {
local dependencies=("samba" "samba-common-bin" "ntfs-3g" "exfat-fuse" "exfatprogs" "jq" "wsdd2")
local packages_to_install=()

for package in "${dependencies[@]}"; do
# 使用 dpkg-query 检查包是否已安装
if ! dpkg-query -W -f='${Status}' "$package" 2>/dev/null | grep -q "ok installed"; then
echo "需要安装: $package" | tee -a "$LOG_FILE"
packages_to_install+=("$package")
fi
done

# 只有当有包需要安装时才执行安装
if [ ${#packages_to_install[@]} -gt 0 ]; then
echo "开始安装缺失的包..." | tee -a "$LOG_FILE"
# 先尝试直接安装
if ! apt-get install -y "${packages_to_install[@]}"; then
# 如果安装失败,则更新源后重试
echo "直接安装失败,更新软件源后重试..." | tee -a "$LOG_FILE"
apt-get update && apt-get install -y "${packages_to_install[@]}"
fi
else
echo "所有依赖包已安装" | tee -a "$LOG_FILE"
fi

}

# 确保 nmbd 服务已安装并启动

ensure_nmbd_service() {
systemctl enable nmbd
systemctl start nmbd
}

# 添加新函数来确保 wsdd2 服务正常运行

ensure_wsdd2_service() {
systemctl enable wsdd2
systemctl start wsdd2
}

# 主函数

main() { # 检查并安装依赖
install_dependencies

# 确保 nmbd 服务已安装并启动
ensure_nmbd_service

# 确保 wsdd2 服务已启动
ensure_wsdd2_service

# 处理所有USB存储设备
while read -r device uuid; do
if [ -n "$uuid" ]; then
mount_device "$device" "$uuid"
fi
done < <(get_usb_devices)

}

# 运行主函数

main

2. 设置脚本权限并安装

1
2
chmod +x usb-automount-share.sh
cp usb-automount-share.sh /usr/local/bin/

3. 配置开机自启

有两种方式可以选择:

方式一:使用 rc.local(推荐)

  1. 编辑 rc.local 文件:
1
sudo nano /etc/rc.local
  1. exit 0 前添加:
1
/usr/local/bin/usb-automount-share.sh
  1. 确保 rc.local 可执行:
1
sudo chmod +x /etc/rc.local

方式二:使用 systemd service

  1. 创建服务文件:
1
sudo nano /etc/systemd/system/usb-automount.service
  1. 添加以下内容:
1
2
3
4
5
6
7
8
9
10
[Unit]
Description=USB Automount Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/usb-automount-share.sh

[Install]
WantedBy=multi-user.target
  1. 启用服务:
1
2
sudo systemctl enable usb-automount
sudo systemctl start usb-automount

使用说明

1. 插入 USB 设备

设备插入后会自动:

  • 检测 USB 设备
  • 创建挂载点
  • 挂载设备
  • 配置网络共享

2. 访问共享

  • Windows:
    • 方式 1:网络邻居中找到 “USB-SHARE”
    • 方式 2:\\USB-SHARE\\IP地址
  • Mac:smb://USB-SHAREsmb://IP地址
  • Linux:smb://USB-SHAREsmb://IP地址

3. 查看状态

  • 检查挂载:df -hlsblk
  • 查看日志:tail -f /var/log/usb_share.log
  • 检查服务:
    1
    2
    3
    systemctl status smbd
    systemctl status nmbd
    systemctl status wsdd2

故障排除

1. 网络发现问题

检查 wsdd2 服务:

1
systemctl status wsdd2

2. 共享访问问题

检查 Samba 配置:

1
testparm

3. 挂载问题

查看设备信息:

1
lsblk -f

4. 权限问题

检查挂载权限:

1
ls -l /mnt/usb/

日志说明

脚本会记录以下信息到 /var/log/usb_share.log

  • 设备挂载状态
  • 依赖安装情况
  • 错误信息
  • 服务启动状态

安全建议

  1. 默认配置

    • 允许匿名访问
    • 完全读写权限
    • 适合家庭网络使用
  2. 增强安全性

    • 修改 Samba 配置添加用户认证
    • 限制共享权限
    • 配置防火墙规则

技术支持

如遇问题,请检查:

  1. 系统日志:journalctl -xe
  2. Samba 日志:tail -f /var/log/samba/log.smbd
  3. USB 日志:tail -f /var/log/usb_share.log
  4. 确保所需服务正常运行

参考资料

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务