LEDE 文件共享

在 LEDE 上开启文件共享。当然也能在 Docker 里搭建,会稍微简单一点。这里简要地说明从 0 开始,格式化磁盘,挂载磁盘,配置文件共享,解决容易遇上的一些问题,以及在其他系统上挂载共享的方法。总体而言比较简单。

章节 内容
准备磁盘 准备好外挂/内置磁盘
SAMBA SAMBA 服务器的简单配置
SMB 挂载 SMB 挂载到本地磁盘下

环境准备

  1. Windows 11

    Windows 操作系统

  2. OpenWrt LEDE

    Ubuntu、Debian 系都行

  3. NVMe 硬盘盒 256GB

    USB 硬盘盒,3.5、2.5、mSATA 和 NVMe 都行

  4. 比较熟悉 Shell

    不熟也行,备份好数据,多试试就好

准备磁盘

确认 usb 连接好,并挂载上了,这里涉及到格式化的命令,绝对不要直接复制黏贴,否则容易格式化删掉分区

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
# 更新
opkg update
# sudo apt update

# 安装 usb tools
opkg install usbutils

# 查看 usb 接口的设备
lsusb
#Bus 008 Device 002: ID 0bda:9210 Realtek RTL9210B-CG

# 查看挂载的设备,和设备挂载点
lsblk
#NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
#sda 8:0 0 238.5G 0 disk
#└─sda1 8:1 0 238.5G 0 part /mnt/sda1

#一般的自动挂载的,不需要手动控制,实在是需要可以:
#查看分区表
fdisk -l
#Disk /dev/sda: 238.47 GiB, 256060514304 bytes, 500118192 sectors
#Disk model: RTL9210B-CG
#Units: sectors of 1 * 512 = 512 bytes
#Sector size (logical/physical): 512 bytes / 512 bytes
#I/O size (minimum/optimal): 512 bytes / 33553920 bytes
#Disklabel type: gpt
#Disk identifier: xxxx-xxxx-xxxx-xxxx-xxx
#
#Device Start End Sectors Size Type
#/dev/sda1 2048 500117503 500115456 238.5G Microsoft basic data

# 分区表,变更为 gpt,注意是 /dev/sda1 目标不要搞错
parted /dev/sda1 mklabel gpt

# 格式化分区,变更为 ext4
parted /dev/sda1 mkpart sub ext4 0% 100%

# 刷新设备
partprobe /dev/sda1

# 查看分区情况,格式化后应该会变
lsblk

SAMBA

Samba 是在 Linux 上实现 SMB(Server Messages Block)协议的软件,SMB 协议是 Windows 的局域网通信协议,虽然说历年上出现很多 POC(比方说永恒之蓝),只要注意更新,一般不会有什么问题。

smb 协议的优点:

  1. 全平台兼容
  2. 可以作为网络驱动器映射,可以直接安装软件(不建议)

配置

具体使用方法也不太复杂,但不要复制黏贴,容易出错,建议读完脚本里面的注释再运行。

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
# 更新
opkg update
# sudo apt update

#安装 samba4
opkg install luci-app-samba4
# apt install samba

# LEDE 下可能找不到 useradd 命令,需要安装:
#opkg install shadow-useradd
#opkg install shadow-usermod
#opkg install shadow-userdel
#opkg install shadow-groupadd
#opkg install shadow-groupdel

# 如果喜欢用户组的话,可以用这个
#groupadd samba_group
# 删除组
#groupdel samba_group
#useradd -g samba_group -M -s /sbin/nologin samba

# 创建无法登录的 shell 的用户 samba
useradd -s /usr/sbin/nologin samba
# useradd -s /usr/sbin/nologin <user_name>
# 删除用户
# userdel samba
# useradd -s /usr/sbin/nologin <user_name>
# 后面的命令需要自行修改,不做详细注释


# 为用户创建密码(可选)
#passwd samba
# passwd <user_name>

# 为 samba 添加密码
smbpasswd -a samba
#smbpasswd -a <user_name>

# 可选,如果不喜欢 /dev/sda1 形式的路径,可以挂载到其他目录下
#mkdir /home/samba/shares
#mount /dev/sda1 /home/samba/shares
#umount /home/samba/shares

# Samba 网络速度优化,size 越大占用内存越多
#cat >> /etc/samba/smb.conf <<<-EOF
# Buffer size
# use sendfile = yes
# read size = 65536
# read prediction = yes
# socket options = TCP_NODELAY SO_KEEPALIVE IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536
# write raw = yes
# read raw = yes
# aio read size = 1
# aio write size = 1
#EOF
# 部分情况可能去掉异步驱动会更快
#aio read size = 0
#aio write size = 0
# 因为硬件线路只有 1000M,达不到任何一级的极限速度,因此不需要开启。
# 对于 1000M 网口,由于 TCP 协议和 smb 协议的限制,最大网速不会超过 910Mbps (100MB/s)

# 在 LEDE 中建议用网页配置,避免意外发生
# 追加 samba 配置
cat >> /etc/samba/smb.conf <<<-EOF
[samba]
path = /mnt/sda1
valid users = samba
hosts allow = 10.22.33.0/24
create mask = 0774
directory mask = 0774
read only = no
vfs objects = io_uring
EOF
# 权限建议 774
# | Owner | Group | Other
# Read (4) | x | x | x
# Write (2) | x | x |
# Execute (1) | x | x |
# None (0) | | |
# | 7 | 7 | 4
# 若改了用户名,这里的 `valid users = <user_name>` 也需要改
# 这里的 `[samba]` ,也就是 `<share_name>`,
# 实际上指定了 `\\<host_name>\<share_name>`

# 检查配置文件
testparm

# 重启服务
service samba4 restart
#service smbd restart
#service samba restart

# 改变目录权限
chown samba -R /mnt/sda1
# 这里的 /mnt/sda1 是供给 samba 分享的目录

# 检查目录权限
ls -ld /mnt/sda1
#drwxr-xr-x 8 samba root 4096 Jun 21 17:10 /mnt/sda1

# 如果遇到文件无法打开,请检查该目录下文件权限
ls -l /mnt/sda1
# 比方说 samba 只能读写 samba 自己的文件,其他用户的只能读,不能写
#-rw-r--r-- 1 samba root xx
#---------- 1 samba ftp xx
#drwxr-xr-x 8 samba root xx
#-rwxrw-r-- 1 samba samba xx
#drwxr-xr-x 18 samba root xx
#-rwxrw-r-- 1 samba samba xx

以上脚本可以直接执行,但是要注意修改几个地方:

  1. samba 服务需要设置密码
  2. 挂载的目录 /mnt/sda1 需用 lsblk 查看
  3. 配置中的 [samba] 可以自定义,是共享名,也就是指定了 \\10.22.33.1\samba 共享位置的
  4. 参数 hosts allow 建议设置为局域网,不会设置可以去掉(不建议)。
  5. 不喜欢 samba 为用户名在 useradd -s /usr/sbin/nologin <username> 可以自己修改

问题

几个容易遇上的问题:

  1. 在 Windows 下可以正常挂载,但是其他地方无法挂载

考虑降低 smb 版本

1
2
3
server min protocol = NT1
# 实在不行用
#server max protocol = NT1
  1. 始终无法访问文件,看不到文件

检查分区格式,确保不是 NTFS 文件系统,有 BUG,详见 准备磁盘 篇

检查目录是否配置正确

1
path = /mnt/sda1
  1. 报错无权限

检查权限,详见 SAMBA 篇:

1
ll /mnt/sda1
  1. 文件夹权限是对的,但总是访问不了文件

检查给对用户了吗?

1
valid users = samba
  1. 还是访问不了,怎么办

ping 一下,还在吗?

1
2
3
4
5
6
ping 10.22.33.1
``

配置中路径写对了吗?
```text
\\10.22.33.1\samba

用户名和密码填对了吗?

防火墙打开了吗?

  1. 过一会,挂载的驱动器会掉,无法访问

部分 NVMe 硬盘盒设置了自动休眠,供电不足也会导致自动休眠,
请确保硬盘盒没有问题,或者修改硬盘盒固件

  1. 上电不读盘,或者是 samba 映射空间突然变小。lsblk 找得到 /dev/sda,但是 fdisk -l 读不到分区

在系统启动完毕后,重置下 USB 端口

一般是系统启动期间供电不足导致的,初步推断:

  1. 电源供电不足
  2. 电路设计,不允许接收更大的电流做电源输入
  3. 挂载外设逻辑有误,应当在系统启动,并稳定运行后,开始给外设上电
1
2
3
4
5
6
7
8
9
# 找到 USB 设备

lsusb | grep 9210
#Bus 004 Device 002: ID 0bda:9210 Realtek RTL9210B-CG

# 重置设备

usbreset 004/002
#Resetting RTL9210B-CG ... ok
  1. 上电不读盘,lsblk 找得到 /dev/sda,但是 fdisk -l 读不到分区
1
2
# 重启就行
reboot -f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 表现为设备连上
lsusb | grep 9210
# 9210 是我这个硬盘盒芯片型号,不同的盒子不一定一样
#Bus 008 Device 002: ID 0bda:9210 Realtek RTL9210B-CG

# 找不到分区信息
fdisk -l | grep sda
#(空)

# 根本没有映射分区表
cat /proc/partitions | grep sda
#(空)

# 并且,同时表现为,读不出分区,
lsblk | grep sda
#sda 8:0 0 0B 0 disk

# 这是正常的情况
lsblk | grep sda
#sda 8:0 0 238.5G 0 disk
#└─sda1 8:1 0 238.5G 0 part

# 一般重启后可以解决(可以看 dmesg 内核日志)
dmesg | grep sda
  1. 上电不读盘,lsblk 找得到 /dev/sda,但是 fdisk -l 读不到分区,重启后还是不行
1
# 拔插 USB 接口,开关硬盘盒电源

这是磁盘读不到,只需要拔插 USB 接口就行,一般是硬盘供电不足,导致上电初始化卡住,发生在断电后和路由一起重启上电

异常输出,带 failed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> dmesg | grep sda
[ 8.809930] sd 0:0:0:0: [sda] Read Capacity(16) failed: Result: hostbyte=0x00 driverbyte=DRIVER_OK
[ 8.810768] sd 0:0:0:0: [sda] Sense Key : 0xb [current]
[ 8.811240] sd 0:0:0:0: [sda] ASC=0x0 ASCQ=0x0
[ 14.809704] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=DRIVER_OK
[ 14.810611] sd 0:0:0:0: [sda] Sense Key : 0xb [current]
[ 14.811105] sd 0:0:0:0: [sda] ASC=0x0 ASCQ=0x0
[ 14.811542] sd 0:0:0:0: [sda] 0 512-byte logical blocks: (0 B/0 B)
[ 14.812105] sd 0:0:0:0: [sda] 0-byte physical blocks
[ 18.809426] sd 0:0:0:0: [sda] Test WP failed, assume Write Enabled
[ 20.809298] sd 0:0:0:0: [sda] Asking for cache data failed
[ 20.809839] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 20.811499] sd 0:0:0:0: [sda] Preferred minimum I/O size 512 bytes not a multiple of physical block size (0 bytes)
[ 20.812438] sd 0:0:0:0: [sda] Optimal transfer size 33553920 bytes not a multiple of physical block size (0 bytes)
[ 20.814540] sd 0:0:0:0: [sda] Attached SCSI disk

这是连接正常后的输出

1
2
3
4
5
6
7
8
9
> dmesg | grep sda
[ 1357.401057] sd 0:0:0:0: [sda] 500118192 512-byte logical blocks: (256 GB/238 GiB)
[ 1357.402926] sd 0:0:0:0: [sda] Write Protect is off
[ 1357.403410] sd 0:0:0:0: [sda] Mode Sense: 37 00 00 08
[ 1357.406496] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 1357.408302] sd 0:0:0:0: [sda] Preferred minimum I/O size 512 bytes
[ 1357.408868] sd 0:0:0:0: [sda] Optimal transfer size 33553920 bytes
[ 1357.420625] sda: sda1
[ 1357.421187] sd 0:0:0:0: [sda] Attached SCSI disk

SMB 挂载

Windows 下挂载

Windows 下使用 PowerShell 直接映射网络驱动器:

1
2
3
4
5
6
7
8
# 获取所有驱动器
Get-PSDrive -PSProvider "FileSystem"
# 需要命令行输入凭据
$cred = Get-Credential -Credential samba
# 添加网络驱动器
New-PSDrive -Name "Z" -Root "\\10.22.33.1\samba" -Persist -PSProvider "FileSystem" -Credential $cred
# 删除网络驱动器
#Remove-PSDrive -Name "Z"

Linux 下挂载

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
# 安装 cifs
sudo apt install cifs-utils
# 安装中文支持,避免目录乱码
sudo apt language-pack-zh-hans-base
# 应用中文支持
sudo locale-gen
# 如果还是有问题,需要重启下计算机

# 创建目录
sudo mkdir ~/local_share

# 查看当前用户的 id 和 gid
id

# 挂载 到当前用户下
sudo mount -t cifs //10.22.33.1/samba/ /home/aero/smb/ -o rw,uid=1000,gid=1000,vers=3.0,username=samba
# 带有密码,不推荐。
#sudo mount -t cifs //10.22.33.1/samba/ /home/aero/smb/ -o rw,uid=1000,gid=1000,vers=3.0,username=samba,password=<your_pass>

# 因为 samba 没有密码保护的措施,因此建议每次挂载都输入密码
# 当然,对于不重要,对安全性没有追求的来说,可以直接带着密码写进去
# 写在鉴权文件中是明文,因此写哪儿都一样,不过是浪费别个半分钟罢了。

# 卸载
#sudo umount /home/aero/smb