单命令安装源代码的二进制文件的实用工具
项目描述
Whack允许使用单个命令安装Linux程序,如nginx和Apache HTTP服务器。例如,要将nginx安装到~/apps/nginx
whack install git+https://github.com/mwilliamson/whack-package-nginx.git ~/apps/nginx
大多数Linux二进制文件不可重定位,这意味着它们是为您的文件系统上的特定路径编译的。这意味着如果您想在不同的路径上安装完全相同的程序,您需要重新编译整个程序。Whack允许您创建这些程序的重定位版本。在第一次安装时,程序将被编译并复制到目标目录。在后续安装中,将复制应用程序的缓存版本到目标目录。
安装
在您可以使用Whack之前,您需要安装一个名为whack-run的工具。您可以从GitHub下载whack-run
$ curl -L https://github.com/mwilliamson/whack-run/archive/1.0.0.tar.gz > whack-run-1.0.0.tar.gz $ tar xzf whack-run-1.0.0.tar.gz $ cd whack-run-1.0.0 $ make
并且作为root
# make install
这将把二进制文件whack-run安装到/usr/local/bin。一旦whack-run被安装,您就可以像普通Python包一样安装Whack
pip install whack
用法
whack install PACKAGE_SOURCE DESTINATION
例如,要将nginx安装到~/apps/nginx
whack install git+https://github.com/mwilliamson/whack-package-nginx.git ~/apps/nginx
然后可以使用以下命令运行nginx
~/apps/sbin/nginx
包源可以是git或hg仓库(分别用git+和hg+前缀表示),通过HTTP获取的tar包(由http://前缀检测),或本地路径(由前缀/、./或../之一检测)。
您可以使用参数 --add-parameter KEY=VALUE 或其简写别名 -p KEY=VALUE 来传递构建参数。可设置的构建参数取决于包。例如,要安装特定版本的 nginx
whack install git+https://github.com/mwilliamson/whack-package-nginx.git ~/apps/nginx \ -p nginx_version=1.2.7
如果未设置构建参数,则通常包会有一个合理的默认值。
创建包源
包源描述了如何从无到有,安装特定程序的实例。包含已安装程序输出目录的输出目录被称为包。
以下是对如何构建包的相当详细的描述,但当你查看具体示例时可能更有意义。例如 nginx 源包 是一个好例子,因为它相对简单。
每个包源通常至少包含三个文件
whack/whack.json:一个描述包源的 JSON 文件
whack/downloads:一个可执行文件,将所需的下载输出到 stdout
whack/build:一个可执行文件,用于构建包
whack/whack.json
whack/whack.json 应该是一个包含以下属性的 JSON 对象
name:包的名称,例如 nginx。它应仅包含小写字母、数字和连字符。
sourcePaths(可选):源包中用于构建包的路径。默认为 ["whack"]。
defaultParameters(可选):包含包默认构建参数的对象。
构建参数
执行 whack/downloads 和 whack/build 时,任何构建参数都作为环境变量传递。构建参数根据 whack/whack.json 中的默认值设置。然后添加用户明确传递的构建参数,覆盖任何默认参数。每个构建参数的名称在环境中转换为大写。例如,构建参数“version”作为环境变量“VERSION”可用。
whack/downloads
在构建包之前,执行 whack/downloads,并将输出捕获到 stdout。输出应该是构建包所需的 URL 列表,由换行符分隔。下载被缓存,因此如果您有一个内容可能会改变(例如,程序的最新 tarball)的 URL,您可以选择以下任一操作:
尝试找到该特定版本的 URL
在构建步骤中手动下载文件
构建包
执行以下步骤以构建包
读取 whack/whack.json 以获取包描述。
根据 whack/whack.json 中设置的默认值和用户提供的参数设置构建参数的值。
创建一个临时目录,称为构建目录。
将源包中指定的 sourcePaths 目录和文件复制到构建目录中。
使用作为环境变量的构建参数执行 whack/downloads,并将文件下载到构建目录中。
执行 whack/build
将构建参数设置为环境变量
将当前工作目录设置为构建目录
将包的目标目录作为命令行参数传递
当构建软件包时,所有可执行文件应放置在 .bin 或 .sbin 目录中,而不是 bin 和 sbin 目录。当使用 Whack 安装软件包时,bin 和 sbin 将包含轻量级包装器,这些包装器设置文件系统正确,然后委托给 .bin 和 .sbin 中的等效可执行文件。有关更多详细信息,请参阅“Whack 的工作原理”部分。
软件包源示例
Whack 的工作原理是什么?
许多 Linux 应用程序可以通过运行以下命令或类似命令进行编译和安装:
$ ./configure $ make $ make install
这通常会在 /usr/local 下安装应用程序。然而,有时我们想在非 root 用户权限下安装应用程序的独立实例。例如,如果我们正在开发一个使用 Apache 的 Web 应用程序,拥有 Apache 的独立安装将很有帮助。我们可以在运行 ./configure 时更改安装前缀。
$ ./configure --prefix=/home/user/projects/web-app/apache $ make $ make install
虽然这样做是可行的,但每次我们想在不同的位置安装应用程序时,都需要重新编译应用程序。根据应用程序的不同,编译可能需要很长时间。
Whack 通过使用 unshare 和 mount 来更改单个进程的文件系统,从而解决了这个问题。每个应用程序都编译为前缀设置为 /usr/local/whack。在运行应用程序的二进制文件之前,Whack 使用 unshare 系统调用创建一个私有的挂载命名空间。这意味着任何 mount 调用只对进程内部可见。然后我们将应用程序安装的目录挂载到 /usr/local/whack,并执行二进制文件。
例如,假设我们通过以下命令安装了 nginx 到 ~/web-app/nginx:
whack install git+https://github.com/mwilliamson/whack-package-nginx.git \ ~/web-app/nginx
实际的 nginx 二进制文件位于 ~/web-app/nginx/.sbin 中(注意二进制文件位于名为 .sbin 的目录中,而不是 sbin 目录)。如果我们直接尝试运行 ~/web-app/nginx/.sbin/nginx,我们会得到一个错误:
$ ~/web-app/nginx/.sbin/nginx nginx: [alert] could not open error log file: open() "/usr/local/whack/logs/error.log" failed (2: No such file or directory) 2013/02/18 11:25:17 [emerg] 11586#0: open() "/usr/local/whack/conf/nginx.conf" failed (2: No such file or directory)
nginx 预期安装于 /usr/local/whack,但实际上安装在 ~/web-app/nginx。为了成功运行 nginx,我们需要使用 whack-run。
$ whack-run ~/web-app/nginx ~/web-app/nginx/.sbin/nginx
使用 whack-run 时,以下操作会发生:
whack-run 调用 unshare(CLONE_NEWNS),创建一个私有的挂载命名空间。
whack-run 将 ~/web-app/nginx 挂载到 /usr/local/whack。由于我们之前调用了 unshare,此挂载只对当前进程可见。
whack-run 放弃其用户和组权限。由于 whack-run 安装时设置了 setuid 位,因此它可以调用 unshare 和 mount。
whack-run 使用传递给它的参数调用 exec,即 exec ~/web-app/nginx/.sbin/nginx。
使用 whack-run 来运行 nginx 稍显繁琐。然而,我们可以直接调用 ~/web-app/nginx/sbin/nginx(而不是 ~/web-app/nginx/.sbin/nginx),这样就会以适当的参数调用 whack-run。
虽然 whack-run 设置了 setuid 位,但它只使用 root 权限调用 unshare 和 mount。之后,将丢弃用户和组权限。
项目详情
whack-0.7.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ac1ef9c6aecfc8e1611a7a8d367da9303aedb848c22b977dad8437bd93505ecc |
|
MD5 | 851144be76b1f9902e69fc72c145cdfd |
|
BLAKE2b-256 | 109bcf69fa8725dbaa73f04f2a4fe1152de2e7c3f885aebb759f439a89ce5968 |