Openwrt下适配Samba

关于Samba

samba是Linux和Unix平台的一款实现了SMB协议的软件,可以使得windows平台的主机也可以访问Linux和Unix平台主机共享出来的资源。

SMB协议(Server Message Block)是由微软开发的一种软件程序级的网络传输协议,基于NetBIOS,主要功用是使得一个网络上的机器共享计算机文件、打印机、串行端口和通讯等资源,使用C/S架构运行,主要作用在Windows平台。

samba服务监听的协议端口:

  • UDP协议 端口号:137 NetBIOS名字服务 服务名称:nmbd
  • UDP协议 端口号:138 NetBIOS数据包服务
  • TCP协议 端口号:139 文件共享和打印机共享 服务名称:smbd
  • TCP协议 端口号:445 NetBIOS在Windows2000及以后版本使用此端口

Openwrt下直接安装samba服务

终端输入
opkg update
opkg install samba
安装完成后,重启 OpenWrt 路由器以使配置生效。

Openwrt下USB TypeA编译适配Samba

可以到Openwrt官网搜索samba相关内容进行学习

以下以samba3.6为例表述我自己在openwrt下的操作步骤:

  • 首先需要下载对应的tar包到openwrt源码根目录的dl文件夹下
  • makefile等文件放在package/network/services/samba36目录下
    samba36
    ├─ files
    ├─ patches
    └─ Makefile
  • 随后根据个人需求对配置文件做修改,其中samba.config是uci配置文件,samba.conf.template是配置模板,samba.init是samba初始化脚本

Makefile:默认配置即可

# Copyright (C) 2007-2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#include $(TOPDIR)/rules.mkPKG_NAME:=samba
PKG_VERSION:=3.6.25
PKG_RELEASE:=1.1PKG_SOURCE_URL:=http://ftp.samba.org/pub/samba \http://ftp.samba.org/pub/samba/stable
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_MD5SUM:=76da2fa64edd94a0188531e7ecb27c4ePKG_LICENSE:=GPLv3
PKG_LICENSE_FILES:=COPYINGPKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>PKG_BUILD_PARALLEL:=1include $(INCLUDE_DIR)/package.mkMAKE_PATH:=source3
CONFIGURE_PATH:=source3PKG_BUILD_BIN:=$(PKG_BUILD_DIR)/$(MAKE_PATH)/bindefine Package/samba36-serverSECTION:=netCATEGORY:=NetworkTITLE:=Samba 3.6 SMB/CIFS serverURL:=http://www.samba.org/DEPENDS:=+USE_EGLIBC:librt
endefdefine Package/samba36-clientSECTION:=netCATEGORY:=NetworkTITLE:=Samba 3.6 SMB/CIFS clientURL:=http://www.samba.org/DEPENDS:=+libreadline +libncurses
endefdefine Package/samba36-server/configconfig PACKAGE_SAMBA_MAX_DEBUG_LEVELint "Maximum level of compiled-in debug messages"depends on PACKAGE_samba36-server || PACKAGE_samba36-clientdefault -1endefdefine Package/samba36-server/descriptionThe Samba software suite is a collection of programs that implements theSMB protocol for UNIX systems, allowing you to serve files and printers toWindows, NT, OS/2 and DOS clients. This protocol is sometimes also referredto as the LanManager or Netbios protocol.
endefTARGET_CFLAGS += -DMAX_DEBUG_LEVEL=$(CONFIG_PACKAGE_SAMBA_MAX_DEBUG_LEVEL) -D__location__=\\\"\\\" -ffunction-sections -fdata-sections
TARGET_LDFLAGS += -Wl,--gc-sectionsCONFIGURE_VARS += \ac_cv_lib_attr_getxattr=no \ac_cv_search_getxattr=no \ac_cv_file__proc_sys_kernel_core_pattern=yes \libreplace_cv_HAVE_C99_VSNPRINTF=yes \libreplace_cv_HAVE_GETADDRINFO=yes \libreplace_cv_HAVE_IFACE_IFCONF=yes \LINUX_LFS_SUPPORT=yes \samba_cv_CC_NEGATIVE_ENUM_VALUES=yes \samba_cv_HAVE_GETTIMEOFDAY_TZ=yes \samba_cv_HAVE_IFACE_IFCONF=yes \samba_cv_HAVE_KERNEL_OPLOCKS_LINUX=yes \samba_cv_HAVE_SECURE_MKSTEMP=yes \samba_cv_HAVE_WRFILE_KEYTAB=no \samba_cv_USE_SETREUID=yes \samba_cv_USE_SETRESUID=yes \samba_cv_have_setreuid=yes \samba_cv_have_setresuid=yes \ac_cv_header_zlib_h=no \samba_cv_zlib_1_2_3=noCONFIGURE_ARGS += \--exec-prefix=/usr \--prefix=/ \--disable-avahi \--disable-cups \--disable-pie \--disable-relro \--disable-static \--disable-swat \--disable-shared-libs \--with-codepagedir=/etc/samba \--with-configdir=/etc/samba \--with-included-iniparser \--with-included-popt \--with-lockdir=/var/lock \--with-logfilebase=/var/log \--with-nmbdsocketdir=/var/nmbd \--with-piddir=/var/run \--with-privatedir=/etc/samba \--with-sendfile-support \--without-acl-support \--without-cluster-support \--without-ads \--without-krb5 \--without-ldap \--without-pam \--without-winbind \--without-libtdb \--without-libtalloc \--without-libnetapi \--without-libsmbclient \--without-libsmbsharemodes \--without-libtevent \--without-libaddns \--with-shared-modules=pdb_tdbsam,pdb_wbc_sam,idmap_nss,nss_info_template,auth_winbind,auth_wbc,auth_domainMAKE_FLAGS += DYNEXP= PICFLAG= MODULES=define Package/samba36-server/install$(INSTALL_DIR) $(1)/etc/config$(INSTALL_DATA) ./files/samba.config $(1)/etc/config/samba$(INSTALL_DIR) $(1)/etc/samba$(INSTALL_DATA) ./files/smb.conf.template $(1)/etc/samba$(INSTALL_DATA) $(PKG_BUILD_DIR)/codepages/lowcase.dat $(1)/etc/samba$(INSTALL_DATA) $(PKG_BUILD_DIR)/codepages/upcase.dat $(1)/etc/samba$(INSTALL_DATA) $(PKG_BUILD_DIR)/codepages/valid.dat $(1)/etc/samba$(INSTALL_DIR) $(1)/etc/init.d$(INSTALL_BIN) ./files/samba.init $(1)/etc/init.d/samba$(INSTALL_DIR) $(1)/usr/sbin$(INSTALL_BIN) $(PKG_BUILD_BIN)/samba_multicall $(1)/usr/sbinln -sf samba_multicall $(1)/usr/sbin/smbdln -sf samba_multicall $(1)/usr/sbin/nmbdln -sf samba_multicall $(1)/usr/sbin/smbpasswd
endefdefine Package/samba36-client/install$(INSTALL_DIR) $(1)/usr/sbin$(INSTALL_BIN) $(PKG_BUILD_BIN)/smbclient $(1)/usr/sbin$(INSTALL_BIN) $(PKG_BUILD_BIN)/nmblookup $(1)/usr/sbin
endef$(eval $(call BuildPackage,samba36-client))
$(eval $(call BuildPackage,samba36-server))

samba.config:
uci配置文件,可以设置共享名,共享路径等信息

config sambaoption 'name'			'OpenWrt'option 'workgroup'		'WORKGROUP'option 'description'	'OpenWrt'option 'homes'			'1'config sambashare 'sdcard'option path '/tmp/samba'option guest_ok 'yes'option create_mask '777'option dir_mask '777'option name 'USB-Drive'option read_only 'no'option enabled '1'

samba.conf.template:
samba配置文件模板,具体可以参考这篇samba配置文件详解的文章

[global]netbios name = |NAME| display charset = |CHARSET|interfaces = |INTERFACES|server string = |DESCRIPTION|unix charset = |CHARSET|workgroup = |WORKGROUP|browseable = yesdeadtime = 30domain master = yesencrypt passwords = trueenable core files = noguest account = nobodyguest ok = yeslocal master = yesload printers = nomap to guest = Bad Usermax protocol = SMB2min receivefile size = 16384null passwords = yesobey pam restrictions = yesos level = 20passdb backend = smbpasswdpreferred master = yesprintable = nosecurity = usersmb encrypt = disabledsmb passwd file = /etc/samba/smbpasswdsocket options = TCP_NODELAY IPTOS_LOWDELAYsyslog = 2use sendfile = yeswriteable = yesserver signing = mandatoryclient signing = mandatory

samba.init:
samba初始化脚本,samba服务启动和关闭需要调用该脚本

#!/bin/sh /etc/rc.common
# Copyright (C) 2008-2012 OpenWrt.orgSTART=60smb_header() {local interfaceconfig_get interface $1 interface "loopback lan"# resolve interfaceslocal interfaces=$(. /lib/functions/network.shlocal netfor net in $interface; dolocal devicenetwork_get_device device "$net" && {local subnetnetwork_get_subnet  subnet "$net" && echo -n "$subnet "network_get_subnet6 subnet "$net" && echo -n "$subnet "}echo -n "${device:-$net} "done)local name workgroup description charsetlocal hostname="$(uci_get system.@system[0].hostname)"config_get name        $1 name        "${hostname:-OpenWrt}"config_get workgroup   $1 workgroup   "${hostname:-OpenWrt}"config_get description $1 description "Samba on ${hostname:-OpenWrt}"config_get charset     $1 charset     "UTF-8"mkdir -p /var/etcsed -e "s#|NAME|#$name#g" \-e "s#|WORKGROUP|#$workgroup#g" \-e "s#|DESCRIPTION|#$description#g" \-e "s#|INTERFACES|#$interfaces#g" \-e "s#|CHARSET|#$charset#g" \/etc/samba/smb.conf.template > /var/etc/smb.conflocal homesconfig_get_bool homes $1 homes 0[ $homes -gt 0 ] && {cat <<EOT >> /var/etc/smb.conf[homes]comment     = Home Directoriesbrowsable   = noread only   = nocreate mode = 0750
EOT}[ -L /etc/samba/smb.conf ] || ln -nsf /var/etc/smb.conf /etc/samba/smb.conf
}smb_add_share() {local namelocal pathlocal userslocal read_onlylocal guest_oklocal create_masklocal dir_masklocal browseablelocal enabledconfig_get name $1 nameconfig_get path $1 pathconfig_get users $1 usersconfig_get read_only $1 read_onlyconfig_get guest_ok $1 guest_okconfig_get create_mask $1 create_maskconfig_get dir_mask $1 dir_maskconfig_get browseable $1 browseableconfig_get enabled $1 enabled[ -z "$name" -o -z "$path" ] && returnif [ "$enabled" = "0" ]; thenexit 0fiecho -e "\n[$name]\n\tpath = $path" >> /var/etc/smb.conf[ -n "$users" ] && echo -e "\tvalid users = $users" >> /var/etc/smb.conf[ -n "$read_only" ] && echo -e "\tread only = $read_only" >> /var/etc/smb.conf[ -n "$guest_ok" ] && echo -e "\tguest ok = $guest_ok" >> /var/etc/smb.conf[ -n "$create_mask" ] && echo -e "\tcreate mask = $create_mask" >> /var/etc/smb.conf[ -n "$dir_mask" ] && echo -e "\tdirectory mask = $dir_mask" >> /var/etc/smb.conf[ -n "$browseable" ] && echo -e "\tbrowseable = $browseable" >> /var/etc/smb.conf
}start() {config_load sambaconfig_foreach smb_header sambaconfig_foreach smb_add_share sambashareservice_stop /usr/sbin/smbdservice_stop /usr/sbin/nmbdsleep 1service_start /usr/sbin/smbd -Dservice_start /usr/sbin/nmbd -D
}stop() {service_stop /usr/sbin/smbdservice_stop /usr/sbin/nmbd
}

驱动适配好Type A后,在/etc/hotplug.d/block下可以修改热插拔挂载脚本:
将设备名为sda开头的USB设备挂载到你预设的目录下(注意与uci中配置的一致),在 Linux 中 通常会将文件写入缓存中,而不是立即写入磁盘。使用sync参数实现数据的立即刷新到磁盘,确保数据的安全性和一致性。如果是samba4.0以后的版本可以尝试使用strict sync = yes配置项。

/sbin/block hotplugudisk_folder=/tmp/samba
echo "action:$ACTION,device:$DEVICENAME,devname:$DEVNAME" > /dev/kmsgcase "$ACTION" inadd)for i in $(ls /dev/ | grep '^sd[a-z][1-9]*$')domkdir  $udisk_folderchmod 777 $udisk_foldermount -o sync -o fmask=0000 -o dmask=0000  -o iocharset=utf8  /dev/$i $udisk_folderdone[ "$DEVTYPE" = "partition" -o "$DEVTYPE" = "disk" ] && {[ "${DEVNAME:0:2}" = "sd" ] && {touch /tmp/smb.flag/etc/init.d/samba restartecho "add dev $DEVNAME" > /dev/kmsg}};;remove)[ "$DEVTYPE" = "partition" -o "$DEVTYPE" = "disk" ] && {[ "${DEVNAME:0:2}" = "sd" ] && {rm -rf /tmp/smb.flag/etc/init.d/samba stopecho "remove dev $DEVNAME" > /dev/kmsg}}sleep 1umount -l $udisk_folderrm -rf $udisk_folder;;
esac

Ref:
https://www.kancloud.cn/limata/threepandas/756923

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Canvas与艺术】模拟八一电影制片厂电影片头效果

【缘起】 八一厂每部电影前都有其专有开头&#xff0c;如&#xff1a;https://www.ixigua.com/6799821997258834440?logTag2eacce76401e13f9efe7 这个片头可以用canvas模拟下来。 【关键点】 线型放射状粒子系统的运作。 立体感五角星的绘制。 【图例】 【代码】 <!D…

开放大学2024年春《幼儿园环境创设 050546》过程性考核作业二:撰写一所幼儿园活动环境创设现状分析评价报告参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 选择一所幼儿园&#xff0c;最好是你所在或者比较熟悉的园所&am…

单页面应用部署到iis上可以正常打开,刷新就404

当您遇到Dumi打包的网站部署到IIS上可以正常打开首页,但刷新页面时出现404错误的情况,这通常与以下几个方面有关: 路由处理: Dumi生成的项目通常基于SPA(Single Page Application)架构,使用前端路由来实现无刷新导航。这意味着大部分页面切换是在浏览器层面完成的,而不…

vc_red.msi 错误

建议将安装的软件解压&#xff0c;再安装&#xff0c;这样可以自动下载vc_red.msi. 不解压就会出现这个错误。

unity学习(73)——服务器异常--无法处理 123类型的数据包

服务器发送回的数据包&#xff0c;客户端根本读不出来&#xff0c;type都读不出来&#xff0c;拖了三天&#xff0c;把客户端翻了个底朝天&#xff0c;发现客户端一点问题都没有&#xff01; 所有的问题不是unity的模型问题&#xff0c;就是socket网络通信中断&#xff01; 1…

C++ 控制语句(一)

一 顺序结构 程序的基本结构有三种&#xff1a; 顺序结构、分支结构、循环结构 大量的实际问题需要通过各种控制流程来解决。 1.1 顺序结构 1.2 简单语句和复合语句 二 循环 2.1 for循环 语句流程图 注意&#xff1a;使用for语句的灵活性 三 while语句 四 do while语句

java springboot mybatisplus vue elementui python django vue 30套源代码 可用于接私活或毕设

java springboot vue elementui python django vue 30套源代码 Springboot vue3 elementplus 后台通用权限系统 代码生成器 (源码教程开发环境) Springboot vue2 elementui 后台通用权限系统 代码生成器(源码教程开发环境) Springboot vue2 elementui 物品出入库管理系统 (源…

【项目技术介绍篇】如何在本地运行若依项目

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

程序员也写歌啦

我的第一首AI原创歌曲《旅途的歌声》 身为 AI 重度患者的我&#xff0c;时刻关注着每天发布的各种 AI 产品。面对这些雨后春笋般的 AI 产品&#xff0c;我也早就没那么敏感了。 但是今天尝试着用 AI 生成了一个音乐&#xff0c;真的震惊到了我&#xff01; 不到一分钟&#…

Java中的序列化

Java中的序列化&#xff08;Serialization&#xff09;是一个将对象转换为字节序列的过程&#xff0c;以便可以在网络上传输或将其写入持久存储&#xff0c;如文件。这样&#xff0c;可以稍后在需要时重新构造这个对象&#xff0c;即反序列化&#xff08;Deserialization&#…

网络瞎复习

七层 应用进程 粘包问题以及如何理解是 TCP 面向字节流协议&#xff1f; 之所以会说 TCP 是面向字节流的协议&#xff0c;UDP 是面向报文的协议&#xff0c;是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同&#xff0c;也就是问题原因在发送方。 先来说说为什么 UDP 是面…

【LaTeX】7实现章节跳转

使用 LaTeX 实现章节跳转 写在最前面1. 引入 hyperref 包2. 标记章节3. 引用章节示例代码注意 小技巧总结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;…

前端理论总结(js)——闭包和内存泄漏

闭包 什么是闭包&#xff1f; 函数内部和函数外部连接起来的桥梁&#xff0c;可以在一个内层函数中访问到其外层函数的作用域 为什么要用 封装变量 收敛权限 临时变量持久化 优点 1.保护函数内的变量安全      2.在内存中维持一个变量(用的太多就变成了缺点&#xff0c…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

使用LangChain LCEL生成RAG应用、使用LangChain TruLens对抗RAG幻觉

# 导入LangChain的库 from langchain import *# 加载数据源 loader WebBaseLoader() doc loader.load("https://xxx.html")# 分割文档对象 splitter RecursiveCharacterTextSplitter(max_length512) docs splitter.split(doc)# 转换文档对象为嵌入&#xff0c;并…

程序员35岁的职业困惑及应对之道

35岁,对许多程序员来说,是一个职业生涯的重要分水岭。在这个年龄,一些人开始感到迷茫和焦虑,担心自己的技能已经落后,难以跟上日新月异的技术变革。而另一些人则充满信心,认为多年来积累的丰富经验和扎实的技术功底,将助力他们在未来的职业道路上取得新的飞跃。 无疑,在AI、自…

一款比 K8S 更好用的编排工具——Nomod 单机部署

上下文 最近公司需要调研类似 EMCHub 这样支持算力共享的服务。第一直觉是使用 K8S 或 K3S&#xff0c;作为 CNCF 孵化的顶级项目&#xff0c;同时也是当前云原生生态使用最广的编排系统。但是在学习 EMC Hub 源码过程中&#xff0c;偶然发现它是基于 Nomad 做的集群管理。 相…

鸿蒙HarmonyOS应用开发之使用NAPI接口在主线程中进行模块加载

场景介绍 Node-API中的napi_load_module接口的功能是在主线程中进行模块的加载&#xff0c;当模块加载出来之后&#xff0c;可以使用函数napi_get_property获取模块导出的变量&#xff0c;也可以使用napi_get_named_property获取模块导出的函数&#xff0c;目前支持以下场景&a…

vue3从精通到入门2:虚拟DOM的生成与真实DOM的转化

虚拟 DOM 实现是 Vue 框架的核心部分之一&#xff0c;它负责在真实 DOM 之上抽象出一个轻量级的、可复用的 JavaScript 对象树&#xff0c;用于高效地更新视图。 什么是虚拟DOM? 虚拟 DOM 是一个编程概念&#xff0c;它将真实的 DOM 树抽象为一个轻量级的 JavaScript 对象树…

2024年学鸿蒙开发有“钱”途吗?

随着科技的不断发展和智能设备的普及&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐渐受到市场的关注。2024年&#xff0c;学鸿蒙开发是否有前途&#xff0c;成为了很多开发者关心的问题。本文将从多个角度分析鸿蒙系统的发展前景&#xff0c;以及学习鸿蒙开…