|
|
发表于 2018-2-14 06:24:59
|中国|
显示全部楼层
制作Linux下程序安装包——使用脚本打包bin、run等安装包
; _/ M8 o( [) h+ d5 S! ]' a0 X1 C, k0 p制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:& I0 B; b' S2 i# [" z, x! P0 e
——————————华丽的分割线——————————8 y- Q& c4 I# b0 M
run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:2 B; R, s8 z7 O% k! D
|—————–|1 j- n; q9 i" ?. V
| |
$ V8 V. X2 K+ j7 n; F- e| 安装脚本 |; \0 `8 c! q, T
| |
6 c9 t0 ^0 [3 v; \! h, i# b|—————–|
) I" M4 L- b/ g9 l4 y| |
) T! W6 [ \; i$ y| 程序 |
7 {3 p! L* O, ]' R- I0 ]! P. x| |
( z6 n$ P+ ?( S; a|—————–|# }8 k/ f# k& ~/ g
图: run安装包的结构
, x" |* f) d$ C' u这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。
7 w/ E9 Z1 N* @* F9 W; k" H, H" b制作run安装包以下举个实际的例子:
1 N6 f! P7 J9 Q' y9 t$ |$ S) C为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
7 {9 K. y1 ?% m( {3 K0 P z. A8 w$ ls
. ~* m1 \# h% `' D% V& E) @* ^install.sh helloworld
" F2 k9 y$ e+ b$ cat install.sh% R6 B8 f. n1 }3 B7 ]( J
#!/bin/bash+ m0 _8 V" H5 S' g8 o! s
cp helloworld /bin0 R; x. t' n* x! d- b+ ]
$3 t4 h+ ~: }/ Y0 Z: x6 L( y) v
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:0 C5 X* W3 c5 H" @. I* R7 ?- G
$ tar jcvf helloworld.tar.bz2 helloworld
5 E3 K( w2 l& n& H3 t1 e: s1 _现在修改一个安装脚本install.sh* j& Z- r' C& G. ?1 J
改为:
9 R- a; W7 b: J# ^' ?3 n2 @0 ^' ^#!/bin/bash* \4 j6 M( z/ U: U
lines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行
" q9 i( ^6 e2 I; u/ [" X: \ ztail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。 p! E* y& Y/ U
tar jxvf /tmp/hellowrold.tar.gz
( k- S) `- i, pcp helloworld /bin- l7 K8 ^, T/ i0 Y% s& s$ k! V
exit 0! x9 c. F0 @& }& x+ J7 M
然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
- c$ ^8 g9 b& X8 q, z& @$ cat install.sh helloworld.tar.bz2 > myinstall.run _8 i: a" f+ I2 r7 v: c+ N7 `
这样就得到了myinstall.run文件,它的结构如下:+ A& R) D2 ~; Q. C
|——————| 第1行& O5 I* v5 y$ u5 g
| |
4 n# q. T' Y; h$ J5 I- C| install.sh |- o$ t, d5 J9 Z9 A$ [
| | 第6行
1 E7 y+ y& |) J. f' p3 w' R, J. K|——————|
2 o& u! r: O# [/ ~5 k' M( y| | 第7行: q" y9 R' f0 U3 U0 ], W3 ~
|helloworld.tar.bz2 |
4 Z" M7 G* d1 d| |
% O8 ~8 Z! Z& i7 J4 {7 D0 T: ?% [. E|——————| 结尾
+ ~. W0 ^8 @. f图: myinstall.run安装包的结构
" f# |% R ?5 ]% ^6 p# G运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。 d' R8 r z; P. r a
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。! v. Y) q7 F( }: }1 c* f- a
——————————华丽的分割线——————————
% _! n7 h8 h6 K( H6 Elinux 下制作二进制 .bin 的文件
. G6 A$ t8 u" ?# e9 f2 E4 L9 H制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
6 f. I9 W3 B5 x& l k- {这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。
9 N, u, p; I* x6 H! K例:制作安装apache、mysql的安装脚本包
0 w F) h" I: r6 Y1.将源码包先打包; a& t7 ?( m: s1 W+ s4 A3 T
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
1 u) R7 \8 f+ C: \8 s* Q$ m5 u m2.编写脚本如下:) u6 j; q7 K8 N" y9 `& {) N
# cat install.sh
7 s# i% z0 t. |2 q#!/bin/bash- ?# I& ^6 g% T M7 L' b) k' U& }
dir_tmp=/root/installapache
$ q7 m( [* F" \( [8 {) tmkdir $dir_tmp
, Q. k+ P# g2 }# Xsed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
# ^. L1 \$ x/ [9 [cd $dir_tmp6 _5 H# y, i% d
tar zxf packages.tar.gz* R9 F" Q5 g2 [! c: `
tar jxf httpd-2.0.63.tar.bz2
" {/ E7 [ g* m* |1 ncd httpd-2.0.63- S! t1 E* Z- o) G4 i w9 C7 x% m
./configure –prefix=/tmp/apache2' O) J/ x6 W n/ o. r3 }& g7 u
make
3 y6 u+ i8 H8 b- o r5 V' i \& Tmake install0 F, D6 v1 z" l$ b+ U+ v
cd $dir_tmp
+ E% j9 k# c, O5 t" c& ]# b, ~tar zxf mysql-5.0.33.tar.gz9 B4 z$ b2 q! q' E
cd mysql-5.0.33
9 B' A) c' T+ c2 \2 ~./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, G& s& e b% h7 W4 a
make
+ }1 y3 d, M/ i8 w* P4 [make install
! _: M, R" A; Pexit 0
" `; a5 O; d9 o4 a o( ?#cat install.sh packages.tar.gz >install.bin* w6 f) Z, f# R0 Z
这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到
9 U* l$ y; v; l* [最主要的是下面这句,是将二进制文件从.bin文件里分离出来
' U$ a, S) f, u4 f1 O% R6 psed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null/ U! t0 r2 u! s* c# M* V$ I4 [- |
安装的时候直接执行
1 X9 S; A: X$ p2 P5 osh install.bin
9 L, f5 Q3 {, I: C安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。
0 x+ C: y1 m# a3 N——————————华丽的分割线——————————
: K' @; a) W, d上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。2 O$ w o* s( R8 L* [8 Q5 @
另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:5 q4 t3 \( H" _$ u
http://megastep.org/makeself/
+ ~# q. _+ I; J- }% @: P?0 ?0 |
|