Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1217752
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: 嵌入式

2013-12-06 11:20:32

原文地址:
做bin文件说白了就是写脚本,安装源码包的脚本,脚本写好了,可以先调试一下能不能直接运行脚本,来完成源码包的安装,如果可以,就成功一半了。剩下的就是增加一些东西,然后用cat把安装脚本和包连接起来即可。

一、一个小例子说明怎么制作bin文件

先来一个简单的例子,打印hello world!

首先来写一个python脚本,来打印hello world.

  1. #!/usr/bin/env python
  2. print 'Hello,world!'
复制代码

写完最好测试一下,保证脚本能够正常的运行。

然后把刚才写的文件打包成tar.gz或者tar.bz的格式,反正是压缩包就行。

  1. # tar cjf hello.tar.bz2 hello
复制代码

打好包之后,我们就把它当成源码包来处理,写它的安装脚本。我们想做的操作就是可以直接运行hello命令,来让这个脚本执行。那么就需要先解包,然后给执行权限,然后放到/bin下或者其它的PATH定义的路径中去就可以了。很简单的一个小例子,来实现一下吧。

  1. # cat install.sh 
  2. #!/bin/bash
  3. install_dir=/tmp/hello
  4. if [[ -e $install_dir ]];then
  5.     rm -rf $install_dir && make $install_dir
  6. else
  7.     mkdir $install_dir
  8. fi
  9. sed -n '1,/^exit 0$/!p' $0 >$install_dir/hello.tar.bz2
  10. cd $install_dir && tar xf hello.tar.bz2 && cp hello /bin && chmod +x /bin/hello
  11. exit 0
复制代码

脚本很简单,关键在于sed那一行,大概意思是匹配exit 0,如果匹配到了,把它后面的打印出来,下面就可以拼接了

  1. cat install.sh hello.tar.bz2 >myinstall.bin
复制代码

拼接完之后,我们可以运行一下刚才生成的bin文件,先给执行权限。

  1. # chmod +x myinstall.bin
  2. # ./myinstall.bin 
  3. # hello 
  4. Hello,world!
  5. # which hello
  6. /bin/hello
复制代码

以上,一个简单的bin文件就生成了!

说下生成bin文件几点要注意的地方:

首先我们网上看到,有使用tail来分割文件的,这个有时候可能会失败。因为有时候文件比较小,拼接后的文件没有那么多行,当我们用tail来取排除脚本里的行的时候,可能会遇到把排除不了的情况。比如刚才的hello这个例子,文件非常小,但是脚本有10行,这时候如果用tail来分割生成的bin文件,肯定会遇到问题,一般报错如下:

  1. # tar xf hello.tar.bz2 
  2. tar: This does not look like a tar archive
  3. bzip2: (stdin) is not a bzip2 file.
  4. tar: Child returned status 2
  5. tar: Error is not recoverable: exiting now
复制代码

以上报错就说明被分割出来的文件,不是我们一开始创建的那个压缩文件,内容发生了改变。

其实bin文件也算得上普通文件,因为我们生成的时候,有脚本内容,我们cat连接的时候,把脚本放到了前面,所以bin文件就是一个两层文件,第一层是我们的脚本内容,第二层是我们的压缩文件。我们可以直接查看刚才生成的bin文件,就明白了。

  1. # cat myinstall.bin 
  2. #!/bin/bash
  3. install_dir=/tmp/hello
  4. if [[ -e $install_dir ]];then
  5.     rm -rf $install_dir && make $install_dir
  6. else
  7.     mkdir $install_dir
  8. fi
  9. sed -n '1,/^exit 0$/!p' $0 >$install_dir/hello.tar.bz2
  10. cd $install_dir && tar xf hello.tar.bz2 && cp hello /bin && chmod +x /bin/hello
  11. exit 0
  12. 7ю?-!??§?z??@h :h?n¤u?=jWT?w??TI?3????Kq     
复制代码

看到了吧,exit 0后面,就是我们刚才打印的tar文件了。整个bin文件才11行,如果用tail来排除脚本行,肯定是排除不掉的,tail是查看最后几行,指定10行的话,把脚本也显示出来了,生成的压缩文件肯定解压不开了。

其实,exit 0是必须要有的,如果没有的话,脚本执行完,会接着执行二进制的包文件,整个屏幕就刷刷的乱掉了!

二、使用bin文件来实战,安装node.jsOK,有以上的小例子之后,我们就可以拿一个生产中用到的包来做了,我这里安装node,脚本写好了,如下。
  1. # cat install.sh 
  2. #!/bin/bash
  3. dir_tmp=/tmp/node
  4. mkdir $dir_tmp
  5. lines=12
  6. tail -n +$lines $0 >/tmp/node/node-v0.10.18.tar.gz
  7. if [[ -e /usr/local/node ]];then
  8.     echo '/usr/local/node is exists,or node is installed? '
  9.     exit 1
  10. fi
  11. cd $dir_tmp
  12. tar xf node-v0.10.18.tar.gz && cd node-v0.10.18 && ./configure --prefix=/usr/local/node && make && make install && echo ok
复制代码

我这里用的是tail,因为包比较大,所以肯定能排除的掉。不太建立使用tail,请一定要使用上面的sed的方法,这个是最推荐的。

然后拼接就很简单了,跟上面一样。

  1. # cat install.sh node-v0.10.18.tar.gz > node.bin
复制代码

拼接完加执行,然后运行就可以安装了。

验证一下,安装成功
# /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
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。

阅读(1234) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~