|
|
发表于 2018-2-14 06:24:59
|中国|
显示全部楼层
制作Linux下程序安装包——使用脚本打包bin、run等安装包2 [. P) X+ T' ?) e
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:/ T2 N: C6 p9 m, N
——————————华丽的分割线——————————4 u* Y9 [, w: m# |8 Z9 p: \7 Y
run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:+ K. ]5 J, y. |
|—————–|
1 ~# z7 Z; U1 S, J4 M3 W1 @| |
5 H+ z, i( ~0 f! i| 安装脚本 |
1 \& c% s; S5 V4 O, Q0 k, B* r' y| |6 z1 m; H* \& q: P6 f2 P
|—————–|0 _ V" ]; d8 z3 W! @8 C1 Q6 j
| |
0 J3 n+ G q" |% d8 K| 程序 |
8 p, r, O/ g/ Z. {, t4 ]| |) o; P. t$ b: c/ i/ w. b9 \
|—————–| P6 v( b. v1 n4 p( H+ w
图: run安装包的结构/ s! a4 |; q4 x: C' R8 z
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。3 J1 E8 ]3 X% [6 m
制作run安装包以下举个实际的例子:
1 m" E' u, u0 p# R为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
7 Q, K; L2 ?, j1 x) b$ ls ~ k, ~8 D8 P* Y- b
install.sh helloworld
+ H$ M9 _$ k- M4 b+ \$ cat install.sh1 I6 _0 s2 U. H2 }
#!/bin/bash3 K( ?1 I/ p! ]( b2 t0 r2 G7 P6 g
cp helloworld /bin
2 G% u0 f$ r4 S& \5 a* Z& T$
' D8 E. }/ b' @8 r) O3 h现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:
3 D# p' V1 l# L5 ~6 `$ tar jcvf helloworld.tar.bz2 helloworld
/ ~# k( R4 a! x1 r1 W现在修改一个安装脚本install.sh. }. ^" e+ Q- p9 R
改为:7 R4 N" ~; O' c
#!/bin/bash
4 u6 o& }' x$ }8 W7 B; k+ Alines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行
# x- a5 c3 d, ?1 f2 \tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
! H. l( m4 u; L) k, `tar jxvf /tmp/hellowrold.tar.gz# A" C4 L" @+ P$ _$ Z( ~
cp helloworld /bin
& s" U' A1 d( r" u9 M! n0 ?+ w4 Sexit 0
9 r7 R3 C% I6 i6 k& L( b! t5 {然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
) G" ] z: r' ]/ H$ cat install.sh helloworld.tar.bz2 > myinstall.run
* x% |+ [, \) }这样就得到了myinstall.run文件,它的结构如下:
' x( _8 [8 |" g6 j& V: V|——————| 第1行
; u9 o0 C) p' F| |) j. J8 D' h: u7 y: P0 i/ i" o3 h
| install.sh |1 v6 R$ x/ r* O# I
| | 第6行
5 e3 Q* L k# ]7 R|——————|! l$ q4 B# r; A9 D1 T
| | 第7行
% ^3 a" X8 r7 H0 ?: F1 T1 U- k|helloworld.tar.bz2 |
% [3 `8 o9 z- k5 H| |5 G; u& U3 x5 W4 B) R% }7 }
|——————| 结尾- V' t5 D+ ]4 [' T
图: myinstall.run安装包的结构
" f+ t) C3 r; t* m$ a运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。( L- g1 j% o6 o7 _( t; {8 h: m6 C' ]
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。2 m; i! o) U( z7 a# z1 q% T
——————————华丽的分割线——————————3 F, g7 `& f: O' f
linux 下制作二进制 .bin 的文件; z$ }) A! t9 X; l4 @. p4 D
制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
1 v- d* w; Q0 ^9 a7 f这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。8 Q$ m. d2 P$ R$ o# S3 s1 g/ Z6 w
例:制作安装apache、mysql的安装脚本包. ]; J5 L& [$ I- X* n7 U/ B
1.将源码包先打包
( [+ t, y) r8 g* J- g6 I#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz8 x! V( r' c7 Y- ~
2.编写脚本如下:( S; B3 y8 s% w6 F: k2 O" |$ c, q: [
# cat install.sh
% z6 E0 I7 p. o#!/bin/bash0 M) r! V& y( D8 e& K5 `- n
dir_tmp=/root/installapache
( b* \. S8 i+ u$ D0 Q6 Gmkdir $dir_tmp3 i: F" w5 J! w9 q5 }9 t
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
3 g$ e0 s# X/ }- s# tcd $dir_tmp/ p5 ~7 B; {: }) t4 B+ M
tar zxf packages.tar.gz7 T+ s' r4 E2 N) f4 d8 B6 L
tar jxf httpd-2.0.63.tar.bz2- u* H& a5 Z' a* @
cd httpd-2.0.63
# E2 V; [( @7 v2 v# a( N4 S./configure –prefix=/tmp/apache2: x/ f" P5 [. y" K' w u" r
make
' |! l. v. x5 T8 X6 \) Q1 Mmake install
9 A& G; s* R8 g; j; Zcd $dir_tmp3 i. L. d. M8 t+ O- A2 O8 u
tar zxf mysql-5.0.33.tar.gz
, h0 y& i3 Y+ C+ D- Fcd mysql-5.0.33$ j. X- a$ ~ g( n& P% T
./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
* r% X& \ i; H8 s/ j" t; ?make
. `& j, d& F9 n+ F9 Nmake install+ i2 k1 Z2 b, M0 W
exit 0
5 K5 U, G" d5 r#cat install.sh packages.tar.gz >install.bin
$ V- R, }8 }, O; i5 B( V这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到9 N! T2 v6 |% ]* ?) Y
最主要的是下面这句,是将二进制文件从.bin文件里分离出来$ c }% `3 t8 l1 g. o) K5 x) ~
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null8 X$ e1 I7 ^ g/ q) j
安装的时候直接执行
4 }1 g- j$ E2 Ush install.bin/ V; O2 Z7 y' D2 {! v
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。
; _! e a1 D! C* q5 U——————————华丽的分割线——————————0 ~' Z9 {( [ n% w% d
上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。! d/ Y! N1 E: C/ S4 n: d4 E3 Y
另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:* O9 }; a, |9 a' |! [' F8 L
http://megastep.org/makeself/
A0 X: f* `# S$ i* w9 C3 s?0 ?0 |
|