OutRun:使用另一台Linux机器的处理电源执行本地命令

2021-03-19 01:01:48

OutRUN允许您使用另一个Linux机器的处理能力执行本地命令。

它必须安装在您自己的机器上和您' ll使用的任何机器都使用它来运行命令。在那些其他机器上,您必须确保全局安装它,这样可以使用SSH用户@ Host OutRun等命令启动。

除了outrun本身之外,还必须安装保险丝3.x库。大多数Linux发行版包括在仅为Fuse3的包中包含它。

您必须通过能够将其直接SSH直接SSH或SUDO访问权限而无法root访问权限。这是必要的,因为outrun使用chroot。

由于远程计算机将充分访问当前用户的本地文件系统,因此只需使用您信任的计算机即可。

然后,您可以使用像这样的用户@ host的处理能力让Outrun执行相同的命令:

FFMPEG不需要安装在另一台机器上,并根据需要读取此内容.MP4 / output.mp4并将其写入您的本地硬盘。

第一次运行新命令时,可能需要一些时间才能启动,因为它必须首先将其依赖项复制到另一台计算机。即使另一台机器已经在其上运行FFMPEG,可能会发生这种情况,因为它可能具有略微不同的版本。这需要的时间高度依赖于您的带宽和延迟。

请参阅OutRun --Help的输出以概述自定义行为的可用选项。可以通过创建像这样的〜/ .ourun / config文件来配置每个远程计算机上的持久缓存:

让我们从榜样中考虑ffmpeg命令,并评估它在另一台计算机上运行所需的内容,好像它在本地运行。

首先,我们需要某种方式运行命令并首先在另一台机器上观察其输出,因此它一切都以普通的SSH会话开始。尝试运行ssh -tt用户@ host htop和您' ll看到它' s易于使用ssh运行交互式远程程序,为本地运行的程序提供非常相似的经验。

当然,我们与在另一台机器上安装的运行软件不感兴趣,而是我们自己机器上的FFMPEG程序。开始的直接途径将是SCP / USR / BIN / FFMPEG可执行到另一台机器,并尝试在那里运行它。不幸的是你'如果你尝试执行它时,我会发现以下内容会发生以下情况:

这是因为可执行文件是动态链接的,并且它试图从文件系统加载其库依赖项,这些文件系统不存在于另一台计算机上。您可以使用LDD来查看哪个共享库,如图所取得的精灵可执行文件取决于:

$ ldd`哪个ffmpeg` linux-vdso.so.1(0x00007fffb7796000)libavdevice.so.58 => /usr/lib/libavdevice.so.58(0x00007f2407f2a000)libavfilter.so.7 => /usr/lib/libavfilter.so.7(0x00007f2407be0000)libavformat.so.58 => /usr/lib/libavformat.so.58(0x00007f2407977000)libavcodec.so.58 => /usr/lib/libavcodec.so.58(0x00007f2406434000)libpostproc.so.55 => /usr/lib/libpostproc.so.55(0x00007f2406414000)libswresample.so.3 => /usr/lib/libswresample.so.3(0x00007f24063f4000)...

我们也可以煞费苦心地复制所有这些库,但这不一定是它的结束。例如,像搅拌器一样的软件,另外,它在开始运行之后又加载了大量的其他依赖项。即使我们要将远程文件系统与所有这些依赖关系混淆,我们仍然无法运行原始命令,因为Input.mp4并在另一台机器上存在。

为了处理程序可能需要访问本地文件系统中的任何文件的不可避免的现实,OutRun通过将本地计算机的整个文件系统覆盖通过网络来镜像。这是通过在远程计算机上安装保险丝文件系统来完成的,该文件将所有操作转发到目录中的列表文件,在本地计算机上的RPC服务中。此RPC服务只需公开readdir()和stat()等函数以与本地文件系统交互。

您可能想知道为什么我们不使用现有的网络文件系统解决方案,如NFS或SSHFS。这些问题的问题是,很难为ad-hoc会话自动化。需要使用配置文件设置NFS,并且SSHFS要求远程计算机能够将SSH返回到本地计算机。相比之下,所包含的RPC文件系统是一个具有每次会话令牌的轻量级TCP服务器,可以在我们&#39的SSH会话上安全地隧道隧道连接。拥有自定义解决方案也为我们&#39的大量优化开辟了机会。

让' s说我们在/ tmp / local_fs上安装本地机器和#39; s文件系统。我们现在可以轻松访问/ tmp / local_fs / usr / bin / ffmpeg以及其所有库依赖项,以及在/ tmp / local_fs / usr / lib的所有库依赖项。不幸的是,它看起来不像我们' ve做得很大进展:

问题是我们'仍然在远程计算机上寻找其依赖项/ usr / lib。我们可以通过使用$ ld_library_path使用环境变量来解决这个问题,以使ffmpeg查找库/ tmp / local_fs / usr / lib中的图书馆,但是我们又重新回到了一次又一次解决一个小问题。如果我们可以假装/ tmp / local_fs是根文件系统,那么我们就会担心它,所以/ usr / lib自动重定向到/ tmp / local_fs / usr / lib。我们可以使用Chroot完成。

$ chroot / tmp / local_fs / bin / bash#ffmpeg -i input.mp4 -vcodec libx265 -crf 28 outcum.mp4ffmpeg版本n4.2.3版权所有(c)2000-2020 ffmpeg开发人员... input.mp4:没有这样的文件或目录

有用!好吧,几乎。我们仍然缺少要执行原始命令的一些上下文。为了能够找到Input.mp4并在正确的位置存储Output.mp4,我们还需要切换到相同的原始工作目录。

虽然FFMPEG已经按预期工作,但我们还应该引入正确的环境变量。例如,$ HOME可能会影响配置文件的何处,$ LAGH可能会影响某些程序的显示语言。

如果你现在又回到自己的机器并查看原始/主页/用户/视频,你' ll看到outduct.mp4就在那里,好像我们在完全不同的情况下运行ffmpeg机器!

虽然这种方法有效,但性能留下了很多需要的措施。如果您'重新连接到服务器通过Internet连接,甚至一个在附近的区域中,您的延迟可能是至少20毫秒。这也是每个文件系统操作所需的时间,并且快速加起来。例如,在我的机器上,FFMPEG有110个需要加载的共享库,这意味着只需查找其属性即将到达2.2秒!如果我们不得不自然地通过这样的网络进行每一个文件系统操作,那么Outrun Mourn' t真的是可行的。那个'为什么Outrun'网络文件系统附带两种类型的优化:缓存和预取。

OutRun持久地缓存了从系统目录读取的所有文件,如/ usr / bin和/ lib,已知包含应用程序及其依赖项。这些目录被认为在外出会议期间保持不变。每个新会话都将检查是否有任何缓存的文件已更改并根据需要更新它们。这种简单的策略足以使相同的程序在第二次开始时更快地开始,并且通常也有助于其他程序,因为Glibc等许多依赖项都是共享的。 LRU缓存策略用于抛出尚未使用的文件。

对于其他目录,OutRun让内核执行基本优化,如在大块中的读取文件和缓冲小写进入一个大写,就像NFS一样。

其中Outrun' S文件系统真正偏离通用网络文件系统是它的预取方法。例如,当读取可执行文件/ usr / bin / ffmpeg时,很可能会执行它,并且它将接下来将加载其共享库。因此,当Open()呼叫/ usr / bin / ffmpeg进来时,它不会仅仅在完整的时间内转移,还可以在单​​个操作中传输所有110个共享库和关联的文件系统元数据。如果这个假设是正确的,它一般将是,我们' ve只是减少了数百个stat()/ readlink()/ open()/ reck()/ close()调用一个与单个RPC调用时间20 ms开销。

这样的预取的另一个例子是假设如果访问了.py文件,则可能会被解释,并且Python很快就会查找其编译的.pyc伴侣。因此,该文件立即与它一起发送。如果__pycache__目录不存在,那么我们只是预取出了尝试访问它的enoent错误。

由于已编译的文件倾向于压缩,因此它们整体读取的所有文件内容也会使用LZ4压缩传输以节省带宽。

如果您想阅读有关OutRun及其设计决策的更多详细信息,那么请查看源代码。每个模块(文件系统,RPC,Operation Orchestration)在其DocStrings中包含更具体的文档。

文件系统性能仍然是一个瓶颈,因此最合适的工作负载是计算限制的任务,如Ray跟踪和视频编码。使用OutRun for Git Status工作的东西,但不建议使用。

由于要执行的软件被从自己的计算机复制到远程计算机,因此它必须是二进制兼容的。例如,不可能将从x86机器的会话设置为臂机。

该命令将使用远程计算机的网络和日期/时间。如果要访问本地端点,则必须使用SSH标志参数设置远程转发来显式转发它们。

Outrun同时支持多个会话吗?是的,您可以同时在许多不同的机器上运行软件。每个远程机器还可以使用异常不同的文件系统,同时支持连接到它的许多不同机器。

为什么在Python中outrun是什么? Outrun的原始原型是用C ++编写的,但它结果为Python及其标准库使得胶水协调流程和操作系统交互更容易。关于文件系统性能,由于网络延迟是迄今为止最大的瓶颈,因此它不会产生大大差异。

OutRun被编写为严重依赖于文档目的的类型提示,并允许使用MyPy进行静态分析。 除此之外,Flake8用于强制执行代码风格,Pylint用于捕获额外问题。 由于OutRun中的许多功能取决于OS交互,因此其测试套件还包括完整的集成测试,该测试模拟了与另一个VM连接的VM的使用。 这些是使用Vagrant建立的,可以通过包括 - vagrant标志来运行: