求助: Rclone 挂载 onedrive 后在 1drive 中 git 问题

2020-03-29 12:33:18 +08:00
 xuerui911
编程小白求助, 求大佬们指导

我想编译定制 openwrt 固件, 需要 git clone -b dev-19.07 https://github.com/Lienol/openwrt && cd openwrt && ./scripts/feeds clean && ./scripts/feeds update -a && ./scripts/feeds install -a && make menuconfig.
自己选择需要的配置后, make -j1 V=s

上面那个 github 项目写着不要用 root 用户 git 和编译, 在本地电脑虚拟机, 用普通用户执行命令会报错无法 git clone 提示没权限创建文件夹, 用 root 用户可以完成 make menuconfig, 在 make V=s 这步会报错提示你不应该用 root 用户, 最终用普通用户 sudo su 执行完 make menuconfig 再 exit 回到普通用户执行 make V=s 能成功编译.

北京联通, 访问 github 奇慢无比, 通过梯子可以成功, 但编译也太占本地硬盘空间.

我买了 onedrive for business.
有个墙外 vps, 多数端口被墙, 但给留了 22 和 80 端口, 所以考虑 ssh 此 vps 挂载 onedrive 后 git clone 到 1drive 中并编译, 编译完后再把固件下载回来.

在 Windows 下用的是 RaiDrive, 上网一番查, Linux 下大家用的比较多的是 RClone.

本地电脑虚拟机和 VPS 系统都是 Ubuntu.

rclone config, 我的配置中, 我给挂载盘在 rclone 中起名为 my1drive, VPS 中目录为 /VPSMount/hk1, 本地挂载目录为 /home/mnt1drive/1drive

执行 rclone mount my1drive:VPSMount/hk1 /home/mnt1drive/1drive --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 --vfs-cache-mode minimal

这时程序运行, 没有返回结果. 先不注册为服务, 先能进入 make menuconfig 目录再说, 新建 ssh 会话, sudo su, git clone -b dev-19.07 https://github.com/Lienol/openwrt && cd openwrt && ./scripts/feeds clean && ./scripts/feeds update -a && ./scripts/feeds install -a && make menuconfig
这时会提示
Cloning into 'openwrt'...
remote: Enumerating objects: 518949, done.
remote: Total 518949 (delta 0), reused 0 (delta 0), pack-reused 518949
Receiving objects: 100% (518949/518949), 378.20 MiB | 9.18 MiB/s, done.
Resolving deltas: 100% (349100/349100), done.
error: unable to append to '/home/mnt1drive/1drive/openwrt/.git/logs/refs/remotes/origin/HEAD': Input/output error
fatal: update_ref failed for ref 'HEAD': cannot update the ref 'HEAD': unable to append to '/home/mnt1drive/1drive/openwrt/.git/logs/HEAD': Input/output error

此时之前执行 rclone 挂载命令那个 ssh session 中, 会提示
2020/03/29 11:43:49 ERROR : openwrt/.git/tsjG3i7(0xc0004c4f40): failed to find cache file: object not found
2020/03/29 11:43:49 ERROR : openwrt/.git/tsjG3i7(0xc0004c4f40): RWFileHandle.Release error: failed to find cache file: object not found

求大佬们指导
838 次点击
所在节点    Linux
25 条回复
xuerui911
2020-03-29 12:58:41 +08:00
111
xiri
2020-03-29 13:07:45 +08:00
看了个开头就知道这帖不用看了
首先,git clone 没有权限创建文件夹那你就在当前用户有权限的文件夹内操作啊(当前用户的家目录肯定是可以的)
其次,rclone 这种网络挂载硬盘性能极低(本质上还是你每进行一次操作调用一次 onedrive 的 api ),编译这种高 io 操作有时候机械硬盘都嫌太慢了,你这却试图用 rclone 挂载的硬盘,,,,,,
xuerui911
2020-03-29 13:18:10 +08:00
@xiri 在 Windows 下用 raidrive 感觉速度还可以啊, rclone 跟 raidrive 原理不一样吗...
learningman
2020-03-29 14:33:15 +08:00
@xuerui911 速度是一回事,io 是一回事
你下载一个文件,可能可以把带宽跑满,200M1000M 好像也不是不能用
问题是编译时,可能一秒要创建上百个 4k 的小文件,每个文件对应的也是一次请求,你居然没被微软服务器拉黑也是挺奇怪的
jim9606
2020-03-29 14:42:26 +08:00
我不知道你是有什么特殊目的用这种非官方仓库,openwrt 官方仓库地址是 https://github.com/openwrt/openwrt.git ,嫌慢的可以用码云的官方镜像 https://gitee.com/mirrors/openwrt.git

大部分外部源码会在 make 的时候下载,建议自行准备梯子,建议使用 proxychains 工具,menuconfig 之后用 make download -j4 只执行源码下载,这样在 make 时候就不会等下载了

不要使用任何网盘和网络文件系统,最好用 SSD

还有为啥你会默认用 root 登录?你真的是用正常渠道装的 ubuntu 吗?除了 apt 之外所有操作都不应该用 root
hxz0803
2020-03-29 14:51:47 +08:00
这里的特殊目的可能是这个仓库里带了修改版(可能更好用)的科学软件,还有其他的官方源里没有的软件。毕竟一站式 make menuconfig 还是比学习如何编译安装非官方源软件要简单不少的
Coioidea
2020-03-29 16:55:51 +08:00
rclone 没有配置本地缓存的话是直接依赖你的网速的,你想想访问硬盘才几 ms,你这网络延迟就多少了。
高密集 IO 还是硬盘来的踏实。
@hxz0803 其实网上有好多已经编译的 ipk 包可以用的。
seers
2020-03-29 17:11:44 +08:00
编程小白就别想着编译了,先拉个 op 官方 img 然后自己装 ipk 用,能解决 99%需求
xuerui911
2020-03-29 21:25:38 +08:00
@learningman
我刚开始学 JAVA,我就把 Eclipse 的 Workspace 目录和 Idea 的 Projects 目录直接放在 Raidrive 挂载的 Onedrive 里了…用了一个月了,没感觉过卡啊…
我本机配置是 9600K 锁 4.8G+32G DDR4 3000+PM981 512G,网络是联通 200M,不觉着卡是因为内存容量大速度快缓冲的多?而 VPS 配置太低就不行?
ysc3839
2020-03-29 21:30:15 +08:00
这个问题是个 X-Y 问题 https://coolshell.cn/articles/10804.html
你编译的时候遇到了文件系统权限的问题,觉得可以改用 VPS 编译解决。但可能是 VPS 硬盘空间太小之类的问题,你选择使用 rclone “挂载” OneDrive 来解决空间不足的问题。
然而你没想到你正面临着更麻烦的问题。OneDrive 不是“网络文件系统”,它不支持随机写入,只能顺序写入,这大概是 git unable to append 的原因。它还不支持 Unix 文件权限,很可能不支持大小写敏感,这都是构建 Linux 发行版的必要条件。
所以你应该想办法解决文件系统权限的问题。你说出了问题的全貌,这一点做的很好,大部分提出 X-Y 问题的人不会说出问题的全貌,这使得别人更难帮他们分析、提供建议。
xuerui911
2020-03-29 21:31:43 +08:00
@jim9606 非 root 用户经常得输 sudo 很麻烦…我把 VMWare 开启后台运行网络设为桥接,点了启动就点叉然后就 ssh 了,ssh session 分别保存了 root 用户和普通用户,习惯性是用 root 用户。我现在还不是程序员没有生产环境,root 下玩瘫了就直接重装了…,
xuerui911
2020-03-29 21:35:00 +08:00
@jim9606 另外用那个非官方 OpenWrt 就是想用那里的 Passwall 插件,多节点自动切换…我用这个插件集成 Haproxy 负载均衡+V2R+Trojan
xuerui911
2020-03-29 21:35:40 +08:00
@hxz0803 是的我就是想用那里的 Passwall 插件,多节点自动切换…我用这个插件集成 Haproxy 负载均衡+V2R+Trojan
xuerui911
2020-03-29 21:37:11 +08:00
@Coioidea 呃这个 ipk 包分不分 x86 arm mips 啊,还是通用?
xuerui911
2020-03-29 21:46:33 +08:00
@ysc3839
大神解释满分.
我本地只有个 512 固态, 没有机械硬盘, 我想能省点空间就省点, 另外编译时间太长, 电脑风扇吵短时间还行,时间长了我很烦, 这也是我想在 VPS 编译上的一个主因.
我的几个 VPS 硬盘基本都是 15G 到 30G 之间, 硬盘大点的肯定现阶段挂的网站也大点, 剩余空间都差不多, 我之前有过本地虚拟机一共 20G 编译多一半提示 no space left 的经历, 所以我才想用 rclone 挂载网盘.
看来我的唯一出路就是再去买个大 SSD 的 VPS 去...
mmtromsb456
2020-03-29 22:12:30 +08:00
只是治标的话..可以在考虑好后果之后使用环境变量 FORCE_UNSAFE_CONFIGURE=1 来允许 root 用户进行编译
ysc3839
2020-03-29 22:15:38 +08:00
@xuerui911 关于你说的 Raidrive 不卡的情况,我不知道 Raidrive 的工作原理,不过 OneDrive 的 Windows 客户端是先把文件存在硬盘上,再同步到服务器的,卡不卡取决于本地硬盘的速度。而 rclone 我猜测不依赖本地硬盘做缓存很可能使用内存做缓存,而且有限制最大缓存容量,一旦缓存满了就得等待上传完才能继续写入。

另外,既然你的内存比较大,想节省硬盘空间的话完全可以考虑在内存盘中编译,给虚拟机分配大一点的内存,然后上网找一下 Linux 手动挂载 tmpfs 的方法。如果不想每次编译都重新下载过所有文件的话,可以使用 source mirror,配合 nginx 搭建一个带缓存功能的反向代理。

关于 source mirror,OpenWrt 的软件包一般不包含源代码,源代码是从软件最初发布的地方下载的,不仅仅支持 tar 包,还能从 git svn 等版本管理系统中下载源代码。tar 包是一个单独的文件,能直接缓存,git 等版本管理系统却无法缓存,OpenWrt 的编译系统会在下载源代码之后重新打包成 tar 缓存。
OpenWrt 官方编译时缓存的包会放到 https://sources.openwrt.org ,编译前设置环境变量 export DOWNLOAD_MIRROR=https://sources.openwrt.org 让它优先选择缓存的包。
不过你使用的是修改过的 OpenWrt,里面包含官方没有的包,你可以在第一次编译成功后把生成的 tar 包拷出来 (我忘了在哪个文件夹了)。
xuerui911
2020-03-29 22:28:58 +08:00
@ysc3839 我本地硬盘是 PM981 512G,NVME 协议的应该是算比较快的,可能编译简单程序不卡就是这原因吧…
后边看着看着就有点看不懂了呢😂容我消化消化…
我本科环境工程,毕业就进了某市政类国企,感觉工作环境有点差吧但回想回想又好像大多是行政类的活用不上什么专业技能…混日子混了两年了刚裸辞,年根底下报了个全程线下的大数据的培训机构,赶上新冠肺炎没法开课…我现在还是真的小白…
xuerui911
2020-03-29 22:32:11 +08:00
@mmtromsb456 这个可以试试! Rclone 需要用 root,编译不让用 root,两个冲突又得两个同时用,哪个好改改哪个!
learningman
2020-03-29 22:36:23 +08:00
@xuerui911 这里的限制是微软定的,你的代码目录能有几个文件。。。IO 级别就是普通读写

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/657246

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX