前言
这几天陆陆续续给Termux添加了好多功能进去,然后问题就来了,手机64G存储空间的小身板是真的不够用,于是给手机OTG了一块硬盘,然后,Termux竟然需要root权限才能读取/mnt外设挂载,然而在Termux上使用root权限运行服务可能出现一些奇奇怪怪的问题,比如,nginx使用root运行后可以读取挂载的硬盘,却不能读取/sdcard了,,,奇奇怪怪的问题层出不穷,而mount总是找不到设备,无奈只好走迂回路线:使用root权限将/mnt挂载到webdav服务,再使用rclone将webdav挂回Termux,其他服务就可以免root读取硬盘内容了。
准备工作
- Termux环境,不用多说。
-
root环境,手机无法root的这篇文章可以跳过了。
pkg install tsu #安装依赖 tsu #使Termux获取root,权限,授权弹窗选择永久授权 exit #授权后退出root模式,后续使用sudo即可
- 一块移动硬盘(没有的内存卡U盘也凑合),提前刷好格式,看看自己的的手机支持的文件系统,在支持的情况下优先选择NTFS,其次exFAT,都不支持最后选择FAT32。
- 一个拓展坞或者OTG转换头,能将硬盘连至手机即可。
一、将硬盘挂载至本地webdav服务
Linux上搭建wedav服务的软件有很多,nginx,apache,webdav_server,caddy等,这里以caddy为例,问就是web界面好看,其他方式自己探索。
1. 确认自己硬盘路径
将硬盘接入手机,确保出现挂载提醒,然后在Termux中输入:
sudo ls /mnt/media_rw
则/mnt/media_rw/635D-7F75即为硬盘路径,root用户查看硬盘文件试试:
sudo ls /mnt/media_rw/635D-7F75
可以查看。
非root再查看试试:
ls /mnt/media_rw/635D-7F75
没有权限。
2. webdav 服务搭建
1)caddy下载
官方下载地址:https://caddyserver.com/download
系统架构选择Linux arn64, 插件选择mholt/caddy-webdav,其他插件不用问,以后有需要其他插件的话可以使用caddy的内置命令来添加。
2)部署
在Termux的home目录下创建caddy工作目录,并将刚刚下载的文件拷贝进去:
mkdir ~/caddy &&mv /scard/download/caddy_linux_arm64_custom ~/caddy
更改执行文件名为caddy:
cd ~/caddy &&mv caddy_linux_arm64_custom caddy
并赋予其执行权限:
chmod +x caddy
配置管理密码:
./caddy hash-password --plaintext 123456
拷贝生成的密文密码。
编写配置文件:
vim ~/caddy/Caddyfile
添加以下内容:
{ order webdav before file_server } # 使用一个WebDav服务测试,以开放5050端口为例,可以自行修改 :5050 { # 设置可访问目录,写刚刚拿到的硬盘路径 root * /mnt/media_rw/635D-7F75 # 信息流编码,默认就好 encode gzip # 生成123456(此处明文密码自己设置)的密码 caddy hash-password --plaintext 123456 # 下面的username为用户名(可自行更改),后面的长字符串为使用上面命令生成的加密密码 # 留空则无需登录信息 basicauth { yibingyihan xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } # WebDAV访问相关,建议保持默认 route { rewrite /webdav /webdav/ webdav /webdav/* { # 访问后缀,建议默认,web浏览不能加,客户端挂载必须加 prefix /webdav } # 设置HTTP文件服务,可以在浏览器中查看下载文件(浏览器中只能查看下载,无法上传删除,配合无密码设置,可以搭建下载站) file_server browse } }
保存配置文件。
3)运行测试
cd ~/caddy &&sudo ~/caddy/caddy run #前台运行,测试时使用 cd ~/caddy &&sudo ~/caddy/caddy start #后台运行,实际运行环境使用
本机浏览器访问:http://localhost:5050
二、将wedav挂载至rclone
Rclone是一个命令行程序,用于管理云存储上的文件。他打包了各大供应商云存储的接口提供统一的访问界面。rclone支持40多种云存储产品,包括对象存储、企业和消费者文件存储、服务以及标准传输协议。所以除了本文所说的挂载本地webdav服务,你还可以挂载其他云服务,例如OneNote,Google Drive,SMB等,具体支持列表见官方文档。
安装命令:
pkg install rclone
开始配置:
rclone config
Storage: 选择rclone要挂载的网络磁盘类型,类型很多,输入对应序号即可,这里我们以webdav举例,所以是46;
url:服务器地址,记得加上访问后缀:http://localhost:5050/webdav/;
vendor:服务商,因为是我们自己搭建的,所以选择other;
设置完会弹出配置确认,确认无误q退出就行了。
rclone连接读取一下webdav内容试试:
rclone lsd test: #lsd 列出指定目录下的所有一级子目录名称,test为刚刚设置的配置名,/file为webdav内部存储路径 rclone ls test:/file #ls 列出指定目录下所有文件,包括一级子目录以及子目录的子目录,文件多及其不建议使用 rclone lsl test:/flie #lsl 作用范围同ls,列出指定目录下的所有子目录内文件的名称及其大小修改时间等信息,同样不建议使用
挂载成功。
三、将rclone挂载到Termux
此操作需要依赖fusermount, 但Termux官方库里并没有,所以需要自己手动编译构建arm64 版本的,所幸,前人栽树后人乘凉,尝试了一上午编译失败后,总算是让我在网上找到了别人编译后的版啦~啦~啦! 两个下载方式提供给大家:
有积分的施舍点积分:csdn下载地址
没积分的赏赐个关注:XDA下载地址
下载好的文件解压,移动到$PREFIX/bin并重命名为fusermount,之后赋予其执行权限:
unzip -d /sdcard/download/ /sdcard/download/fusermount_Termux_arm64.zip mv /sdcard/download/fusemount $PREFIX/bin/fusemount chmod +x $PREFIX/bin/fusemount
因为要使用系统root权限,将fusermount链接到系统bin路径:
sudo ln -s /data/data/com.termux/files/usr/bin/fusermount /bin/fusermount
接下来使用sudo执行rclone mount挂载命令,先将配置文件链接到root用户目录下,不然无法加载配置的网络磁盘目录:
sudo mkdir -p /data/data/com.termux//files/home/.suroot/.config/rclone sudo ln -s /data/data/com.termux/files/home/.config/rclone/rclone.conf /data/data/com.termux/files/home/.suroot/.config/rclone/rclone.conf
完整的挂载命令:
sudo clone mount test:/file /localfile/xxx --allow-other --attr-timeout 5m --vfs-cache-mode full --vfs-cache-max-age 24h --vfs-cache-max-size 10G --vfs-read-chunk-size-limit 100M --buffer-size 100M --daemo
命令参数 | 命令解析 |
---|---|
rclone mount | rclone 挂载命令 |
test:/file | test为配置好的webdav配置名,:/file 是 webdav 路径 |
/data/wwwroot/xxx | 为termux本地文件夹路径(建议为新建空目录) |
–allow-other | 允许非当前 rclone 用户外其它用户进行访问,必须项,不然非rooot用户无法访问 |
–attr-timeout 5m | 文件属性缓存,(大小,修改时间等)的时间。如果手机配置比较低,建议适当提高这个值,避免过多内核交互,降低资源占用。 |
-vfs-cache-mode full | 开启Termux文件缓存,可减少 rclone 与 API 交互,同时可提高文件读写效率 |
–vfs-cache-max-age 24h | Termux文件缓存时间,这里设置 24 小时,如果文件很少更改,建议设置更长时间 |
–vfs-cache-max-size 5G | VFS文件缓存上限大小,根据自己使用情况设置 |
vfs-read-chunk-size-limit 100M | 分块读取大小,这里设置的是100M,可提高文件读的效率,比如1G的文件,大致分为10个块进行读取,但与此同时API请求次数也会增多 |
–buffer-size 100M | 内存缓存,如果您内存比较小,可降低此值,如果内存比较大,可适当提高 |
–daemon | 指后台方式运行 |
挂载时最好新建挂载目录,示例:
rm -rf /sdcard/cloud &&mkdir /sdcard/cloud sudo rclone mount test:/ /sdcard/cloud --allow-other --allow-non-empty --vfs-cache-mode writes
非root访问测试:
成功!
解除挂载:
通常情况,直接使用 umount 命令取消挂载即可:
sudo umount /sdcard/cloud #/sdcard/cloud为挂载目录
如果提示磁盘繁忙那就先kill掉rclone进程,再取消挂载:
#kill杀掉进程 sudo pgrep 'rclone'|xargs kill -9 #再次取消挂载 sudo umount /path/to/local/mount
有待解决的问题
这样配置完成后是有一个问题的,那就是只有termux自己及内部服务才能访问挂载的文件夹( /sdcard/cloud)内的内容,其他软件包括系统的文件管理器看到的都是空目录,本来打算放弃这个方案,但是随后想想,本来就是只拿它来做服务器,供在那儿不动,也不需要什么别的软件访问外部存储,于是就释怀了,才将这篇文章写出来。 另外,当我写这篇文章时发现了一个magisk模块,据说能解决上述空目录问题,但是我试了几次没有刷入成功,不知道是不是安卓12版本的问题,有兴趣的可以去试试: 使用教程, 项目地址。我会尝试将他剖解移植到termux中,完成后我会在这篇文章更新,当然我想这应该属于有生之年系列了。
到此这篇关于Termux外置硬盘挂载——rclone & WebDav 挂载网盘的文章就介绍到这了,更多相关内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文地址:https://blog.csdn.net/YiBYiH/article/details/127612970