Android - 在代码中挂载 Samba 共享

Posted

技术标签:

【中文标题】Android - 在代码中挂载 Samba 共享【英文标题】:Android - Mount a Samba share in code 【发布时间】:2013-06-05 07:39:54 【问题描述】:

我正在寻找一种以编程方式挂载 Samaba 共享的方法。

我知道this question,如果它有效,将允许在我的应用程序浏览 Samba 共享,但我希望这些共享在安装后可供其他应用程序使用。

我知道 ES 文件资源管理器可以做到这一点,所以它必须可以在代码中实现,但我正在尝试弄清楚它是如何完成的。我能想到的唯一方法是使用 Runtime.getRuntime().exec(...) 打开一个进程,但接下来是发送什么命令的问题。我一直在玩终端仿真器应用程序,标准安装命令似乎不起作用。我尝试了以下方法:

mount -t smbfs //[ipaddress] /mnt/sdcard/net/Share1

mount -t cifs //[ipaddress] /mnt/sdcard/net/Share1

但在这两种情况下,我都会收到信息量不大的错误消息“mount: no such device”

我哪里出错了?

【问题讨论】:

我会使用 JCIF(我以前用过,它有效)并运行 Service 真正的问题是,要使用mount 挂载文件系统,您需要通过适当的模块在内核中支持 CIFS。 Ken,运行服务不是一种选择。我需要这些文件对其他不知道我的应用程序透明可用。本质上,一旦挂载完成,任何 android 应用程序中的任何文件浏览器都应该能够访问远程文件 CifsManager 管理它,虽然它需要 root 访问权限。 mount 要求 a) 向内核注册的文件系统(或使用 FUSE)和 b) root 访问权限(并非严格如此,可以以普通用户可以使用的方式限制挂载它,但 Android 不这样做)。使用cat /proc/filesystems 查找内核识别的文件系统。如果走那条路,你仍然需要root。我怀疑其他应用程序的工作方式是通过复制到外部存储并将其他应用程序指向它,或者通过使用流式 ContentProvider(非常非常难以实现,尤其是使用 samba)。 【参考方案1】:

您的内核目前可能不支持 smbfs/cifs。正如Delyan 所说,确保您的内核可以挂载这些文件系统:

$ cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   tmpfs
nodev   debugfs
nodev   sockfs
nodev   usbfs
....

如果它们没有列出,你应该尝试做一个 modprobing(有时你想要的模块必须被激活),然后获得 root 访问权限:

# modprobe <modulename(without.ko)>

例如:

# modprobe cifs

如果它不起作用,您将不得不更改或重新编译您的内核(包括适当的模块)。

【讨论】:

我已在问题中解释并在 cmets 中重申,CifsManager 无需任何额外配置即可在需要此功能的设备上运行,但无法通过命令行安装。 CifsManager 设置中是否选中了“通过 insmod 加载”选项?在这种情况下,请在运行 mount 命令之前尝试运行“busybox insmod cifs”。【参考方案2】:

我遇到了完全相同的问题。 Cifs 管理器正在工作,但来自终端的命令却没有。无论如何,对我来说,事实证明我只需要稍微修改命令就可以了。试试下面的命令:

mount -o username=guest,password=guest -t cifs //[ipaddress]/[share] /sdcard/cifs/nas

在运行命令之前确保本地文件夹 /sdcard/cifs/nas(或您想要的等效文件夹)存在,否则您可能会收到“文件或目录不存在”错误。

【讨论】:

以上是关于Android - 在代码中挂载 Samba 共享的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统Centos7系统下挂载samba共享

多用户Samba挂载

linux如何挂载samba目录

samba共享

linux搭建smb挂载smbWindows共享

samba文件共享服务配置(multiuser机制)二 (共两节)