新入手一个nanopi,用于做家用网盘,设置为旁路由,启用了网络共享,外接了2个USB硬盘。没有使用raid,对实时性要求没那么高,计划用一块硬盘共享出来做局域网共享盘,另一个做备份即可。

备份方式直接使用 rsync

设置计划任务

rsync --update -av /mnt/sda1/ mnt/sdb1

隔几天早上执行即可。

重点来了,nanopi的固件基于openwrt,系统启动的时候,自动挂载了外接的两个u盘,并自动共享了两个盘的目录,还不止如此,还共享了sd卡的文件系统

/mnt/sda1

/mnt/sdb1

/mnt/mmcblk1p1

需求是,只需要共享/mnt/sda1,不需要其他的。

可是,在openwrt的web界面设置,或者直接在/etc/config/samba4文件中修改,只要系统重启,就会恢复成上述3个共享目录。

折腾了半天,最后发现固件中对于u盘的处理逻辑是 只要u盘有效,就自动mount,同时自动设置samba共享,代码在

/etc/hotplug.d/block

目录下,有个

20-smb

文件,注释中是 D-team ...Shenzhen...,猜测是nanopi固件的开发团队。

处理办法

在系统启动后,把已经共享的多余的目录去掉

首先,新建一个脚本

#!/bin/sh

INPF=/etc/config/samba4
TMPF=/tmp/samba4fix
cp -f $INPF ${TMPF}0
line=$(grep -nm1 "option name 'sdb1'" $INPF | cut -d: -f1) && [[ $line =~ '^[0-9]+$' ]] && sed "$((line-2)),$((line+6))d" $INPF > $TMPF || cp -f $INPF $TMPF
line=$(grep -nm1 "option name 'mmcblk1p1'" $TMPF | cut -d: -f1) && [[ $line =~ '^[0-9]+$' ]]&& sed "$((line-2)),$((line+6))d" $TMPF > ${TMPF}1 || cp -f $TMPF ${TMPF}1 
cp -f ${TMPF}1 $INPF
/etc/init.d/samba4 reload

解释一下,

原始配置文件 /etc/config/samba4是由hotplug中的脚本自动更新的,系统启动完成以后,文件内容为:

config 'samba'
	option 'name' 'OpenWrt'
	option 'workgroup' 'OpenWrt'
	option 'description' 'Samba on OpenWrt'
	option 'charset' 'UTF-8'
	option 'homes' '0'
	option 'interface' 'loopback lan'
 
 
config 'sambashare'
	option 'name' 'sda1'
	option 'path' '/mnt/sda1'
 
 
                 ..... 有几个共享,就有几段 config 'sambashare'

新建脚本的目的是,将多余的 sambashare段落删除,并重新装入smb服务即可

删除匹配字符串前后几行

 这一句比较实用,

line=$(grep -nm1 "option name 'sdb1'" $INPF | cut -d: -f1) && [[ $line =~ '^[0-9]+$' ]] && sed "$((line-2)),$((line+6))d" $INPF > $TMPF || cp -f $INPF $TMPF

 分为2段,

第一段定义变量 line,查找第一个匹配的行数,如果找到 line为行数数字,否则为空,grep的参数:n是行数,m1是第一个匹配 ;cut的目的是把冒号前的数字取出来

第二段是个逻辑分支

 如果  [[ $line =~ '^[0-9]+$' ]] 为真,意思是line变量是数字

则执行 && 后面的

sed "$((line-2)),$((line+6))d" $INPF > $TMPF 

将行数之前2行到之后6行删除,即删除 sambashare整段

否则执行 || 后面的

cp -f ... 直接复制

这样处理之后,最后执行

/etc/init.d/samba4 reload

就达到了去掉不需要的共享目录的目的。

最后在rc.local中加上自动执行

在rc.local中加一句 sleep 60 && xxxx.sh 

至于延后60秒,是等系统自动挂载和自动共享完成之后,多少秒合理视具体配置情况。确实有点简单粗暴,但是对付简单粗暴的无脑强制共享,也算是可用  😊。