Skip to main content

Raspberry Pi 挂载 U盘 用 SAMBA 实现局域网共享

Raspberry Pi 的性能不是很好,但是做一些小服务已经足够,特别是对于家用… Raspberry Pi 3B 有4个USB口,身边也有不用的旧的TF卡,Class4的,还能用,拿来做共享硬盘吧。

准备

移动硬盘 或 TF卡及适配器,exFAT格式。

原理

挂载移动硬盘 然后让SMB访问它就可以了。

步骤

1. 挂载移动硬盘

把硬盘插到USB口里面,打开终端。用 root身份 查看硬碟列表。

$ sudo fdisk --list

# 执行后输出的尾部会看到新的硬盘,从容量可以识别到。
Disk /dev/sda: 14.6 GiB, 15707668480 bytes, 30679040 sectors
Disk model: Mass-Storage    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1        2048 30679039 30676992 14.6G  7 HPFS/NTFS/exFAT

记住设备号 /dev/sda1,下次插上硬盘时,设备号可能变化,可以用 修改fstab 的方法实现开机自动挂载。 注意!fstab编辑不当会导致无法开机!表现出挂载出问题导致系统初始化失败,最后找了一台Ubuntu系统挂载系统盘改了回来解决。

假设我想把U盘挂到 /mnt/portable 上。

# 创建目录,-p 表示如果目录已存在则跳过,也可以用来创建多层子目录
sudo mkdir -p /mnt/portable
# 用 root 身份挂载
sudo mount /dev/sda1 /mnt/portable

2. 准备 docker 镜像

这里用到 Trnape 构建好的脚本镜像: Samba file server for Raspberry Pi

$ docker pull trnape/rpi-samba

3. 启动临时容器

先启动临时容器查看是否工作正常 按照 Trnape 的 README.md,脚本的选项如下。

参数 示例值 说明
-u X:Y 添加用户X,密码Y
-s A : B : C : D A共享名,B目录,C为读写权限,D为所有者

启动临时容器:

$ docker run \
  -p 445:445 \
  -v /mnt/portable:/share/data \
  trnape/rpi-samba \
  -u "guest:guest" \
  -s "Public:/share/data:rw:guest"

启动后新开一个 文件管理器 访问,输入用户名guest密码guest即可访问共享目录。

由于移动硬盘是exFAT格式,不支持Linux的文件权限,尝试chmod时会报错,程序中断。 解决办法是弹出脚本修改指令,在后面加上 || true即可忽略错误。

# 程序中断
chown root:root /share/data

# 程序跳过中断,继续运行
chown root:root /share/data || true

4. 配置纯访客用户访问(无密码)

镜像内置的脚本只实现了用户鉴权配置,用访客身份会被拒绝。所以要把脚本文件弹出来手动修改。

获取运行脚本 run.sh

  • 方法1: 直接到仓库下载 run.sh

  • 方法2: 运行镜像打印脚本

$ docker run \
  --rm \
  --entrypoint /bin/bash \
  trnape/rpi-samba \
  -c 'cat /run.sh'

修改脚本

打开 run.sh

找到这行chown,在后面加上 || true 可以跳过exFAT格式 Operation not permitted 错误。

# 找到这里
chown smbuser "$sharepath"
# 改成
chown smbuser "$sharepath" || true

继续查找,修改 samba 配置。

[global]
workgroup = WORKGROUP

# 在后面添加
# guest 账户不需要密码
map to guest = Bad Password
# 允许 guest 账户
guest ok = yes
# guest 账户以 smbuser 用户登录
guest account = smbuser

smbuser 是镜像内建的用户,用 smbuser 就不用添加其他用户了。

编辑完了在当前目录再次试运行

$ docker run \
  -p 445:445 \
  -v /mnt/portable:/share/data \
  trnape/rpi-samba \
  -s "Public:/share/data:rw:smbuser"

再次访问 samba 服务器,不用再输入密码了。

参考文章

Samba configuration for public shares