|
发表于 2018-2-14 06:24:59
|
显示全部楼层
制作Linux下程序安装包——使用脚本打包bin、run等安装包% y9 ~; K+ f, d: d
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:
+ }% V; F8 @9 E) g2 G——————————华丽的分割线——————————
; v9 K, O; L7 z* Q3 ?8 X! ~/ M. c run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示: S- M. y# F# t9 t1 d- h
|—————–|
3 {0 ^2 l; ~! @1 P. U- {7 k" ]8 k" f| |# U$ R6 }3 Q7 W. w% X
| 安装脚本 |3 I) c* M5 R C
| |2 l* x- y$ U# p3 q
|—————–|
9 {2 z+ {2 s7 U! M2 E| |2 N! [+ e; K7 m# P8 N) d
| 程序 |
8 W8 V8 I" S' U; D& i/ u0 t| |
# \" L6 A( u# i+ d$ N: G7 ~2 S, B1 C|—————–|0 g# K- M- \) L
图: run安装包的结构+ y( c3 w& B8 D2 j: k( I% A% E
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。, l8 O" ?( @) f c e# F
制作run安装包以下举个实际的例子:. a4 ^. X3 S6 Z% z
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
4 }; Q* \6 D( g- y) ^! B2 B$ ls
$ `* U9 _: U( S2 x+ |install.sh helloworld- j/ `2 {, g( v4 M% p
$ cat install.sh* i, w- _2 L# u1 P& x" k# J
#!/bin/bash
, l0 x) P ~, j: n/ j5 |cp helloworld /bin& o' P# f- v. i# D/ G1 @3 ^
$' \$ @$ p$ g* L$ @
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:
# u+ j" h" z2 B6 ^6 b8 y4 [$ tar jcvf helloworld.tar.bz2 helloworld; W8 C9 _$ L( Q# C) f( g
现在修改一个安装脚本install.sh
" [ D; A* ^/ l( k改为:, O' D6 v$ u* n$ Q: o, m
#!/bin/bash& @( W& {4 g. z* z, Z
lines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行
6 @. m+ p$ F5 J$ R- V7 U& `6 Ttail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。4 V, X6 E0 n$ ]3 O' P+ y
tar jxvf /tmp/hellowrold.tar.gz" A# L- `& S0 H, f
cp helloworld /bin
& ]5 I. B0 O: dexit 0
: Z! N5 x, L& q8 a然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。$ _! p+ s0 f3 G S0 X% ~1 @8 e
$ cat install.sh helloworld.tar.bz2 > myinstall.run' [. z; P' S* P/ `( m' `9 t
这样就得到了myinstall.run文件,它的结构如下:1 F8 [7 R& D# Z% {
|——————| 第1行
' a4 p- `+ p' ~% E5 D/ K: m| |6 d# l- Q/ U4 j* H7 ]0 I
| install.sh |6 I- n$ g6 k) m8 |" f6 ^ j
| | 第6行
) O T: F7 O' i$ ]|——————|7 V7 M6 @: ]- M( @3 i x! D
| | 第7行
5 t2 ^. Z0 i: t3 N|helloworld.tar.bz2 |
/ p* V* `% E0 f, R| |
; K7 y; L$ L! V" K" ?: d6 E|——————| 结尾
\: t# q( x, E4 i. y. M图: myinstall.run安装包的结构
& q+ l' i$ L, v$ v运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。 m8 r: Z: W5 H1 H0 ^" e
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。
6 u. ~' W. h- o9 b* A1 g——————————华丽的分割线——————————
( L" P! h0 S! U% tlinux 下制作二进制 .bin 的文件" b/ r v0 C& ]
制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里" m% ~2 q! T! i
这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。
- E' L5 m* v' ~* n4 t+ R5 y例:制作安装apache、mysql的安装脚本包
, T: ]9 v6 F7 K0 k1.将源码包先打包
1 Y& k9 X% q$ P% U* N6 {; G#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
2 X: b, S L: P2 l9 U0 \2.编写脚本如下:
+ x* ~8 @5 ?2 }# cat install.sh ^& O* ^( q& I! ?. e
#!/bin/bash
( X1 Z' o0 f- S9 w; K# N+ wdir_tmp=/root/installapache% i) i4 F; @' y2 a: T; i/ O& ^
mkdir $dir_tmp# H; B& C* `1 L
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null1 D7 }; X: i8 m" [- F; z% c
cd $dir_tmp2 {" ]+ r: g9 P; z
tar zxf packages.tar.gz
+ n5 O& }8 z: |/ Z0 \- Ntar jxf httpd-2.0.63.tar.bz28 b1 Y$ p3 [5 N8 x, j- G
cd httpd-2.0.63
9 R* { J% ~' a2 q5 y( Y/ E3 A./configure –prefix=/tmp/apache2
- W, P0 j/ g/ Qmake
, M& @8 s7 T8 D7 i1 ?( u' qmake install
. X6 I4 \. Y6 K( Rcd $dir_tmp
; G" N$ y# r$ t Q0 ztar zxf mysql-5.0.33.tar.gz
0 u& a# v7 k2 l, |2 o1 u$ \cd mysql-5.0.33
* C$ e* Z+ R# [; v./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
: k' n; d+ q" L, }5 ?; imake% h3 E: y8 `' r, [, B
make install
3 B* F, g9 o* }) @, K' Pexit 0
3 p, Z7 m+ n" K# x/ N#cat install.sh packages.tar.gz >install.bin
3 V% r; a. A& P+ l- g, P% g1 m这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到3 o5 k+ @* j a
最主要的是下面这句,是将二进制文件从.bin文件里分离出来) u; p+ x: p+ F x5 \! K9 [
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null1 A6 M! c1 z# {$ n4 E5 x" n
安装的时候直接执行
/ y+ r1 g) W# L7 T5 v7 e* ]sh install.bin* H' ^( a) N) m+ O$ w
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。
` v. J* g& ~4 R——————————华丽的分割线——————————
( h2 p" |( r+ H% z/ z. l上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。" H' a; @& P% X
另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:
$ `" r% F4 a( U8 N7 ohttp://megastep.org/makeself/! u8 x2 `: ~" g. k4 @# l9 T
?0 ?0 |
|