暗无天日

=============>DarkSun的个人博客

使用Exodus在不同linux之间迁移程序

Exodus能将Linux ELF二进制文件及其依赖打包在一起,从而保证程序在不同Linux之前迁移后依然能正常使用。

注意:由于Exodus并不会改变ELF文件的内容,因此请不要尝试在不同的硬件平台之间做迁移,比如将X86上的应用迁移到ARM中,那是不可能的

安装Exodus

我们需要使用 pip 来安装 exodus

sudo pip install exodus-bundler

根据 exodus 主页上的说明,还最好安装好 gcc 以及 musldietlibc

sudo pacman -S gcc musl dietlibc

使用Exodus把程序迁移到其他Linux中

使用Exodus迁移程序的方法很简单,只需要执行

exodus 程序|ssh user@remote

Exodus就会将程序打包好,然后放到remote下user用户的 $HOME/.exodus/bin

例如:

[lujun9972@T520 lctt-scripts]$ exodus vi |ssh lujun9972@orangepipc2
Pseudo-terminal will not be allocated because stdin is not a terminal.
WARNING: Installing either the musl or diet C libraries will result in more efficient launchers (currently using bash fallbacks instead).
  ___                               ____  _   ____   ____ ____  
 / _ \ _ __ __ _ _ __   __ _  ___  |  _ \(_) |  _ \ / ___|___ \ 
| | | | '__/ _` | '_ \ / _` |/ _ \ | |_) | | | |_) | |     __) |
| |_| | | | (_| | | | | (_| |  __/ |  __/| | |  __/| |___ / __/ 
 \___/|_|  \__,_|_| |_|\__, |\___| |_|   |_| |_|    \____|_____|
                       |___/                                    

Welcome to ARMBIAN 5.40 stable Ubuntu 16.04.4 LTS 4.14.18-sunxi64   
System load:   0.39 0.21 0.19  	Up time:       9 days		Local users:   2            	
Memory usage:  17 % of 994MB  	Swap usage:    13 % of 497Mb  	IP:            192.168.1.9
CPU temp:      35°C           	
Usage of /:    17% of 29G    	storage/:      86% of 466G   	

Installing executable bundle in "/home/lujun9972/.exodus"...
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr/bin/vi: time stamp 2018-03-10 22:07:15 is 158.261128965 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr/bin/linker-dfd5de2638cea087685b67786050dcdc33aac7b67f5f8c2753b7da538517880a: time stamp 2018-03-10 22:07:15 is 158.256992469 s in the future
tar: data/83d187def3d3ed02de70ec8b3059e3665b2d0c31b25431486262878be245c469: time stamp 2018-03-10 22:07:15 is 158.246799933 s in the future
tar: data/39027ea769af1413aaac9ef7fafb8865b6bd83148539532523931d96bfd48f04: time stamp 2018-03-10 22:07:15 is 158.230871884 s in the future
tar: data/6d0e1d459072c805cf1cee1a9d394998f477dbc5d947894cb04962d0e06288b1: time stamp 2018-03-10 22:07:15 is 158.162682666 s in the future
tar: data/dfd5de2638cea087685b67786050dcdc33aac7b67f5f8c2753b7da538517880a: time stamp 2018-03-10 22:07:15 is 158.157154228 s in the future
tar: data: time stamp 2018-03-10 22:07:15 is 158.156088023 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/lib64/ld-linux-x86-64.so.2: time stamp 2018-03-10 22:07:15 is 158.155651207 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr/lib/libc.so.6: time stamp 2018-03-10 22:07:15 is 158.155441508 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr/lib/libncursesw.so.6: time stamp 2018-03-10 22:07:15 is 158.155205809 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr/bin/vi-x: time stamp 2018-03-10 22:07:15 is 158.155030941 s in the future
tar: bin/vi: time stamp 2018-03-10 22:07:15 is 158.154871823 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/lib64: time stamp 2018-03-10 22:07:15 is 158.154811617 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr/lib: time stamp 2018-03-10 22:07:15 is 158.154743787 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr/bin: time stamp 2018-03-10 22:07:15 is 158.154681539 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5/usr: time stamp 2018-03-10 22:07:15 is 158.154619792 s in the future
tar: bundles/1d0a475efc744b690bfc00c4841507e2263c50efab8b6d6e0483c08a3b6851d5: time stamp 2018-03-10 22:07:15 is 158.154560128 s in the future
tar: bundles: time stamp 2018-03-10 22:07:15 is 158.154503297 s in the future
tar: bin: time stamp 2018-03-10 22:07:15 is 158.154448757 s in the future
Successfully installed, be sure to add /home/lujun9972/.exodus/bin to your $PATH.

然后登陆user@remote,将 ~/.exodus/bin 加入 PATH 中,就可以运行程序了。

export PATH="~/.exodus/bin:${PATH}"

Exodus还提供了很多选项,比如可以通过 -r 来为程序改名等等,要查看更多选项的说明可以运行

(env) [lujun9972@T520 lctt-scripts]$ exodus -h
usage: exodus [-h] [-c CHROOT_PATH] [-a DEPENDENCY] [-d] [--no-symlink FILE]
              [-o OUTPUT_FILE] [-q] [-r [NEW_NAME]] [--shell-launchers] [-t]
              [-v]
              EXECUTABLE [EXECUTABLE ...]

Bundle ELF binary executables with all of their runtime dependencies so that
they can be relocated to other systems with incompatible system libraries.

positional arguments:
  EXECUTABLE            One or more ELF executables to include in the exodus
                        bundle.

optional arguments:
  -h, --help            show this help message and exit
  -c CHROOT_PATH, --chroot CHROOT_PATH
                        A directory that will be treated as the root during
                        linking. Useful for testing and bundling extracted
                        packages that won run without a chroot. (default:
                        None)
  -a DEPENDENCY, --add DEPENDENCY, --additional-file DEPENDENCY
                        Specifies an additional file to include in the bundle,
                        useful for adding programatically loaded libraries and
                        other non-library dependencies. The argument can be
                        used more than once to include multiple files, and
                        directories will be included recursively. (default:
                        [])
  -d, --detect          Attempt to autodetect direct dependencies using the
                        system package manager. Operating system support is
                        limited. (default: False)
  --no-symlink FILE     Signifies that a file must not be symlinked to the
                        deduplicated data directory. This is useful if a file
                        looks for other resources based on paths relative its
                        own location. This is enabled by default for
                        executables. (default: [])
  -o OUTPUT_FILE, --output OUTPUT_FILE
                        The file where the bundle will be written out to. The
                        extension depends on the output type. The
                        "{{executables}}" and "{{extension}}" template strings
                        can be used in the provided filename. If omitted, the
                        output will go to stdout when it is being piped, or to
                        "./exodus-{{executables}}-bundle.{{extension}}"
                        otherwise. (default: None)
  -q, --quiet           Suppress warning messages. (default: False)
  -r [NEW_NAME], --rename [NEW_NAME]
                        Renames the binary executable(s) before packaging. The
                        order of rename tags must match the order of
                        positional executable arguments. (default: [])
  --shell-launchers     Force the use of shell launchers instead of attempting
                        to compile statically linked ones. (default: False)
  -t, --tarball         Creates a tarball for manual extraction instead of an
                        installation script. Note that this will change the
                        output extension from ".sh" to ".tgz". (default:
                        False)
  -v, --verbose         Output additional informational messages. (default:
                        False)