分类: 嵌入式
2013-12-06 11:20:32
原文地址:
做bin文件说白了就是写脚本,安装源码包的脚本,脚本写好了,可以先调试一下能不能直接运行脚本,来完成源码包的安装,如果可以,就成功一半了。剩下的就是增加一些东西,然后用cat把安装脚本和包连接起来即可。
先来一个简单的例子,打印hello world!
首先来写一个python脚本,来打印hello world.
写完最好测试一下,保证脚本能够正常的运行。
然后把刚才写的文件打包成tar.gz或者tar.bz的格式,反正是压缩包就行。
打好包之后,我们就把它当成源码包来处理,写它的安装脚本。我们想做的操作就是可以直接运行hello命令,来让这个脚本执行。那么就需要先解包,然后给执行权限,然后放到/bin下或者其它的PATH定义的路径中去就可以了。很简单的一个小例子,来实现一下吧。
脚本很简单,关键在于sed那一行,大概意思是匹配exit 0,如果匹配到了,把它后面的打印出来,下面就可以拼接了
拼接完之后,我们可以运行一下刚才生成的bin文件,先给执行权限。
以上,一个简单的bin文件就生成了!
说下生成bin文件几点要注意的地方:
首先我们网上看到,有使用tail来分割文件的,这个有时候可能会失败。因为有时候文件比较小,拼接后的文件没有那么多行,当我们用tail来取排除脚本里的行的时候,可能会遇到把排除不了的情况。比如刚才的hello这个例子,文件非常小,但是脚本有10行,这时候如果用tail来分割生成的bin文件,肯定会遇到问题,一般报错如下:
以上报错就说明被分割出来的文件,不是我们一开始创建的那个压缩文件,内容发生了改变。
其实bin文件也算得上普通文件,因为我们生成的时候,有脚本内容,我们cat连接的时候,把脚本放到了前面,所以bin文件就是一个两层文件,第一层是我们的脚本内容,第二层是我们的压缩文件。我们可以直接查看刚才生成的bin文件,就明白了。
看到了吧,exit 0后面,就是我们刚才打印的tar文件了。整个bin文件才11行,如果用tail来排除脚本行,肯定是排除不掉的,tail是查看最后几行,指定10行的话,把脚本也显示出来了,生成的压缩文件肯定解压不开了。
其实,exit 0是必须要有的,如果没有的话,脚本执行完,会接着执行二进制的包文件,整个屏幕就刷刷的乱掉了!
二、使用bin文件来实战,安装node.jsOK,有以上的小例子之后,我们就可以拿一个生产中用到的包来做了,我这里安装node,脚本写好了,如下。我这里用的是tail,因为包比较大,所以肯定能排除的掉。不太建立使用tail,请一定要使用上面的sed的方法,这个是最推荐的。
然后拼接就很简单了,跟上面一样。
拼接完加执行,然后运行就可以安装了。
验证一下,安装成功
# /usr/local/node/bin/node -v
v0.10.18
例2:制作安装apache、mysql的安装脚本包
1.将源码包先打包
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
2.编写脚本如下:
# cat install.sh
#!/bin/bash
dir_tmp=/root/installapache
mkdir $dir_tmp
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/packages.tar.gz" 2>/dev/null
cd $dir_tmp
tar zxf packages.tar.gz
tar jxf httpd-2.0.63.tar.bz2
cd httpd-2.0.63
./configure --prefix=/tmp/apache2
make
make install
cd $dir_tmp
tar zxf mysql-5.0.33.tar.gz
cd mysql-5.0.33
./configure --with-charset=gbk --with-extra-charsets=binary,latin1,gb2312 --localstatedir=/home/db --with-mysqld-ldflags=-all-static -enable-assembler --with-innodb --prefix=/tmp/mysql5
make
make install
exit 0
#cat install.sh packages.tar.gz >install.bin
这样就生成install.bin的安装文件,改文件是由和二进制合成的。前半部分是脚本后半部分是,用strings等二进制查看命令可以看到
最主要的是下面这句,是将二进制文件从.里分离出来
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/packages.tar.gz" 2>/dev/null
安装的时候直接执行
sh install.bin
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。