Linux bin文件的制作
在某些场景下,我们希望将一系列安装的动作打包在一个 .bin文件里面,在新的环境安装部署时,直接使用 .bin 文件来无脑部署。这时候就可以将安装所需要的步骤和文件打包成一个 .bin 文件,在新服务器上执行 ./xxx.bin 来进行无脑安装。
要做到将一些列的文件合并到一个文件中,第一想到的就是 tar 命令,要使得 ./bin 能运行,那么就要用到脚本文件了。将脚本内容放到文件的顶部。后面的文件放工程文件,bin 的时候,头部脚本将工程文件脱落,脱落之后,运行工程文件中的第一个程序,让这个程序来控制工程文件的部署。
文件结构如下图:

要制作这样的 bin 文件,我们先要有个 package.sh 脚本,来将这样的头部文件和工程文件合并。假如工程文件目录为 project.
header.sh
project
package.sh 文件内容如下:
#!/bin/bash
tar zcvf project.tar.gz project
cat header.sh project.tar.gz >> result.bin
chmod a+x result.bin
./package.sh 之后,得到 result.bin 文件
header.sh 被放在了 result.bin 文件的头部
现在就是要实现 header.sh 的逻辑了。
header.sh 的逻辑,第一要将 project.tar.gz 从 result.bin 中进行分离出来。
第二,解压 project.tar.gz
第三,运行 project 中的第一个脚本
后面两简单。
关键第一步,怎么知道要从 result.bin 中取多少字节出来呢,很简单就是在 tar project 完计算大小,写入到 header.sh 中。
所以,我们再改下 package.sh 脚本。
#!/bin/bash
tar zcvf project.tar.gz project
filesize=$(wc -c < project.tar.gz)
cp header.sh header-bak.sh
sed -i "s/TAR_SIZE/${filesize}/g" header-bak.sh
cat header-bak.sh project.tar.gz > result.bin
chmod a+x result.bin
filesize=$(wc -c < project.tar.gz)
sed -i “s/TAR_SIZE/${filesize}/g” header-bak.sh
这两行,第一行是获取工程目录打包后的文件大小,第二行就是将这个文件的大小写入到 bin 包的头部,我们固定的一个变量名中。
我们来看下 header.sh 脚本的内容。
#!/bin/bash
tarsize=TAR_SIZE
workdir="www.jesson32.cn"
tail -c ${tarsize} $0 > ${workdir}.tar.gz
mkdir "${workdir}"
tar zxvf tmp.tar.gz -C "${workdir}"
cd "${workdir}"/project
chmod u+x first.sh
./first.sh
exit
这里的 TAR_SIZE 就是在 package.sh 的时候就进行了替换,后续就是从当前 bin 包中获取到 $TAR_SIZE 大小的内容生成一个 tar.gz , 后面就是解开这个 tar.gz 然后运行里面预设好的 first.sh 脚本了。
he@ubuntu:~/jesson/TestPackage$ ll project
总用量 12
drwxrwxr-x 2 he he 4096 3月 3 09:14 ./
drwxrwxr-x 3 he he 4096 3月 3 09:19 ../
-rw-rw-r-- 1 he he 30 3月 3 09:14 first.sh
-rw-rw-r-- 1 he he 0 3月 3 09:14 test.txt
这里为了测试 first.sh 的逻辑很简单,就是将 test.txt 拷贝到 ~ 目录,这里 first.sh 就是用户的逻辑脚本了,后面要做的内容,就可以很随意了。
#!/bin/bash
cp ./test.txt ~/
后续:
后面各种的自定义行为,都可以在 first.sh 中做,比如增加各种安装选项。