制作 Linux 下 bin、run 等一键安装包

Bash Shell gongyj 3685℃ 已收录 0评论

以前安装一个环境的时候,都是使用“压缩包”或“压缩包+shell”的方法,这个需要每次手动移动安装包到目录然后解压再执行里面的 shell 安装,如果每一次都这么做的话是很浪费时间的,有没有什么方法可以一步到位呢?有什么方法可以简单地敲个命令然后就可以继续所有的操作呢?

当然有办法可以实现,而且我们见到过这种软件包,run 或 bin 文件,下面我们就来介绍一下这类文件的原理。

一 、Linux 安装文件

Linux 常见的安装为 tar,zip,gz,rpm,deb,bin 等。我们可以简单的分为三类:

第一:打包或压缩文件 tar,zip,gz 等,一般解压后即可,或者解压后运行 sh 文件;

第二:对应的有管理工具的 deb,rpm 等,通常的这类安装文件可以通过第三方的命令行或 UI 来简单的安装,例如 Ubuntu 中的 apt 来安装 deb,Redhat 中的 yum 来安装 rpm;

第三:像 .bin 类,其实就是把 sh 和 zip 打包为 bin,或把 sh 和 rpm 打包为 bin 等,当在命令行运行 bin 安装文件时,其实就是 bin 里面的 sh 来解压 bin 中的 zip 或安装 rpm 的过程,这类文件就是常说一键安装包。

二、一键安装包的结构与特点

run 程序安装包实质上是一个安装脚本加要安装的程序,如下所示:

|—————–——|
|                           |
|     安装脚本         |
|                           |
|—————–——|
|                           |
|      程序              |
|                           |
|—————–——|

这样整个 run 安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。

它的结构是 shell +压缩包(当然也可以是其它文件)的格式,制作的时候用 cat 命令命令连接两个文件,头部是 shell 脚本文件(shell 一定要在前面)和压缩包同时重定向到另一个文件(Linux 中统一给后缀 run、bin 或 sh 给它,就是本文中说的 run 文件),一般这个后部分的文件是个压缩 包,那样就能够打包很多文件了。运行的时候 shell 就可以用 Linux 里面的 tail 或 head 等命令很容易地把压缩包从 run 文件切分出来,后面的操作就跟 shell+压缩包 的操作类似了,但这其中用户只需执行它就行,剩下的都是 shell 自己的操作了。这就是 Linux 那些 bin 、run 等安装脚本的简单制作了,对用户来说自动省事了很多。

与普通脚本相比,此类脚本多了一步从合并的文件中,提取出程序文件的过程。

安装文件的优点:

(1)只有一个包文件;

(2)可以直接运行在 Linux上,因为它是 sh(它的前半部分是sh);

(3)在 sh 中可以包含需要用户接收的协议信息,而且提示用户接收,如果用户不接收,安装退出。

三、安装包的制作

1、run 的制作

制作 run 安装包举一个简单的实际的例子:

为了简单起见,要安装的程序就是 scan 程序,安装它的过程就是把它拷贝到 /usr/bin 目录下。

我们把 scan 程序压缩一下打个包,名字为 scan.tar.gz,普通安装脚本是这样写的:

vim install.sh
#!/bin/bash
tar zxvf /usr/local/src/scan.tar.gz
cp scan /usr/bin

如果把 2 个文件合并,肯定不行,无法正常执行,需要修改一下,如下:

#!/bin/bash
lines=8                                  #这个值是指这个脚本的行数加 1,这个脚本共有 7 行
tail -n +$lines $0 >/tmp/scan.tar.gz  # $0 表示脚本本身,这个命令用来把从 $lines 开始的内容写入一个 /tmp 目录的 scan.tar.gz 文件里。
tar zxvf /tmp/scan.tar.gz
cp scan /usr/bin
rm scan -f
exit 0

然后使用 cat 命令,合并脚本文件 install.sh 与程序包 scan.tar.gz。

cat install.sh scan.tar.gz > scaninstall.run

这样就得到了 scaninstall.run 文件,它的结构如下:
|—————–———| 第1行
|                                |
|         install.sh         |
|                              | 第7行
|—————–———|
|       scan.tar.gz       | 第8行
|                               |
|—————–———| 结尾
在运行 scaninstall.run 时,运行到第 6 行的 exit 0 ,脚本就会自动退出了,不会去运行第 7 行以下的二进制数据(即 scan.tar.gz 文件),这样 shell 就不会因为识别不了二进制数据而出错了。这里我们巧妙地使用了 tail 命令,把第 7 行以下的数据重新生成了一个 scan.tar.gz文件,然后再执行安装。运行超级简单,使用 sh scaninstall.run 或赋予可执行权限然后直接执行 ./scaninstall.run 就可以安装了。

run 安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦,因此此时还是用其他的安装包更好。

2、bin 的制作

下面做一个复杂点的安装包,大部分应用安装,我们都需要安装多个软件包,但如果直接合并的话,每个软件包的起始与结尾不太好定位,那么就把所有的软件包,先打成一个包,然后在提取出来解包,就还原成多个软件包了。

例如:制作 nginx 的一键安装包

首先将所有源码包打成一个包:

tar cfvz nginxpkgs.tar.gz nginx-1.6.3.tar.gz ngx_cache_purge-2.3.tar.gz pcre-8.36.tar.gz zlib-1.2.8.tar.gz

编写脚本如下:

#!/bin/bash
tmp_dir=/usr/local/src
sed -n -e '1,/^exit 0$/!p' $0 > "${tmp_dir}/packages.tar.gz" 2>/dev/null

cd ${tmp_dir}

tar xf packages.tar.gz

tar xf pcre-8.36.tar.gz
tar xf ngx_cache_purge-2.3.tar.gz
tar xf zlib-1.2.8.tar.gz

tar xf nginx-1.6.3.tar.gz
cd nginx-1.6.3
yum install -y gcc gcc-c++ openssl
./configure --prefix=/usr/local/nginx --error-log-path=/var/log/nginx/error.log --add-module=../ngx_cache_purge-2.3 --with-pcre=/usr/local/src/pcre-8.36 --with-zlib=/usr/local/src/zlib-1.2.8 --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_gunzip_module
make && make install
cd ..
rm -fr pcre-8.36.tar.gz ngx_cache_purge-2.3* zlib-1.2.8* nginx-1.6.3* packages.tar.gz
exit 0

这样就生成 nginxinstall.bin 的安装文件了,可以用 strings 等二进制查看命令看到,前半部分是脚本,后半部是二进制文件。最重要的是脚本中下面这行,是将二进制文件分离出来。

sed -n -e '1,/^exit 0$/!p' $0 > "${tmp_dir}/packages.tar.gz" 2>/dev/null

上面一行命令的意思是打印除了第一行到 exit 0 所在行之外的所有行,重定向到 ${dir_tmp}/packages.tar.gz,如果过程中有错误则输出到 /dev/null,安装的时候直接执行 sh nginxinstall.bin,或用 chmod 命令赋予执行权限,直接执行。将我们平时常使用的安装环境,做成这种一键安装包,以后使用就方便了。

四、总结

在 Linux 下一切皆文件,其实不管是 bin 也好 run 也好,总之不管什么文件,都是一样的看法,所以这些后缀没有什么意义。上面两个不同的地方是分离,一个是用了 tail 命令,一个是用了 sed 来实现,脚本中必须要有 exit 0。
总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://blog.chopmoon.com/favorites/233.html
喜欢 (4)
发表我的评论
取消评论

表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
正在加载中……