使用Exodus在不同linux之间迁移程序
Exodus能将Linux ELF二进制文件及其依赖打包在一起,从而保证程序在不同Linux之前迁移后依然能正常使用。
注意:由于Exodus并不会改变ELF文件的内容,因此请不要尝试在不同的硬件平台之间做迁移,比如将X86上的应用迁移到ARM中,那是不可能的
安装Exodus
我们需要使用 pip 来安装 exodus 。
sudo pip install exodus-bundler
根据 exodus 主页上的说明,还最好安装好 gcc 以及 musl 或 dietlibc 库
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)
