|
发表于 2018-2-14 06:24:59
|
显示全部楼层
制作Linux下程序安装包——使用脚本打包bin、run等安装包
4 \/ w% @& N9 }' F) [' e- D4 m8 E制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:7 d/ h0 X" J5 r/ E& k K
——————————华丽的分割线——————————) @1 A0 E- {+ p# |. V
run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:9 T3 z' Q3 ^+ q. _
|—————–|# s4 _" c) ~) G! h5 ~ Y
| |5 C3 I% ^5 r- c& z- G
| 安装脚本 |
& N0 o, }5 s( c w! [| |: C0 p$ r; ?+ y% U( n1 T
|—————–|
: v6 I( k5 x9 }3 u# [7 {" ]| |
. X5 n9 g0 d" Y| 程序 |) m* ?) }4 y; B
| |
: } r X+ F& ?! W& I) c4 w" c|—————–|: u7 u+ F; A) b' o* R
图: run安装包的结构% h6 g6 e( Y# D X
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。- z7 {/ {7 {; _$ S, @
制作run安装包以下举个实际的例子:( N/ n ~9 R+ j* Z4 i' ]
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。) ^. [# V8 D L2 u% d% E
$ ls
; D* n* e, k6 j6 Y l6 D3 w5 finstall.sh helloworld& s- u/ E6 l! ~5 G
$ cat install.sh
; H, X1 @8 X$ r2 t7 f$ F7 `#!/bin/bash
& V5 r& c }; {- O" p+ ~cp helloworld /bin
0 J; ~1 _ f/ Q- I4 l8 V$ K$* I+ g0 _9 H* N! [7 Z
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:9 H3 N: z; Z: l3 e. @0 J6 Y
$ tar jcvf helloworld.tar.bz2 helloworld
+ t% j2 Y5 A' K现在修改一个安装脚本install.sh
0 g, V8 ]9 K# D# n% [1 n改为:0 J; `) R+ m% B5 Y( U! w' ?
#!/bin/bash+ C1 t; ` V) o1 e
lines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行; Y r+ y6 ^) W& b4 S5 `: c
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
# \; B) ^- U; r1 otar jxvf /tmp/hellowrold.tar.gz( |1 L7 k3 r) L; [
cp helloworld /bin
8 P. @- l. g* G) J' `1 F! a. c7 {exit 08 u; T7 @2 N: ~' U9 Z
然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。$ r7 k- F: b% _5 q1 R5 L$ G
$ cat install.sh helloworld.tar.bz2 > myinstall.run( c) f' i; x4 T0 ~7 Y) X
这样就得到了myinstall.run文件,它的结构如下:* X; c- S$ F' W
|——————| 第1行$ ~4 P! f- d& N2 K" t
| |
* Z" t; Z" \- a) x& ]| install.sh |9 P& v( v6 t+ D9 X
| | 第6行
, M/ @- ]) ^( D' m8 X7 |" O, v|——————|
' A" n# m" T9 G+ m. Z" B }% k| | 第7行
9 x* J, |' c& @6 j( i; Z3 F|helloworld.tar.bz2 |0 D% T; n2 q' |* g8 n! R% p- d" O
| |: z" [6 T+ B/ S6 E5 G; C6 a
|——————| 结尾
% ~5 q9 v" Q' }" a图: myinstall.run安装包的结构
2 \: u2 d6 {+ C4 {. O T5 N* B运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。
' R: \) ~! l" g+ D# [8 t6 P9 Q5 ^run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。; `7 _; m* w& e- ? R _
——————————华丽的分割线——————————: Q f7 T6 k& E* V# k
linux 下制作二进制 .bin 的文件
! |' }. Y7 _6 Z* t9 L7 h& o制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
" \' m5 _6 n u8 Z$ W' s这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。( N8 B& J, u* A2 | W
例:制作安装apache、mysql的安装脚本包
, v; [7 b) a2 p+ G/ ^) ?, E+ v& C. {1.将源码包先打包4 W& z1 A; ^5 q6 L
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
P4 k" K/ W3 ?9 m- F$ C2.编写脚本如下:, ^ h* b* m& Z
# cat install.sh' M6 J5 T2 @$ B2 n- u
#!/bin/bash3 U5 T: j- ?5 u
dir_tmp=/root/installapache, f' y* Z; h" h2 i+ ?
mkdir $dir_tmp4 f, x; q7 W* I2 s& [0 |
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
1 b- |3 C- K* ^, scd $dir_tmp
& C% ^( t) ~9 a2 T5 H7 Wtar zxf packages.tar.gz; q) {9 O, `0 E0 g- b w* x$ N
tar jxf httpd-2.0.63.tar.bz2
: I# o! C) X2 \( ?cd httpd-2.0.630 Q: K& N( o# C+ F4 n& C! y
./configure –prefix=/tmp/apache2
' L' B! z$ K$ _1 S$ m3 Vmake
! ]5 o) _. S. I2 n0 A+ ymake install
0 v' j" R. R( W$ ?" Rcd $dir_tmp
* I7 T7 t1 ^& j ]tar zxf mysql-5.0.33.tar.gz
( {- I/ Y# Y" I. W: R, g1 Wcd mysql-5.0.333 w& D+ o# z0 U. Z, h/ M
./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
( L' ^! W3 I& E) x+ mmake
! c; m3 Q1 m( v5 Smake install4 j+ o9 ]' v2 b9 @; X
exit 01 l' q' z4 t0 {. f. Y! }
#cat install.sh packages.tar.gz >install.bin
# U O+ {, n# s! v这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到$ Z# o( J1 a- q, U9 T: l' P
最主要的是下面这句,是将二进制文件从.bin文件里分离出来. ~( E( n: Y1 \+ m$ C' U$ ~& f; t5 F
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
2 d& J' o' C' Y/ n8 @安装的时候直接执行7 ?9 r& i% m" V
sh install.bin' g Q2 i( r+ N+ q6 |: A" ]1 ^
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。
+ {, v N$ x1 g' b( C. Z' a, }8 @——————————华丽的分割线——————————
- P& p. V7 @: @+ }$ `5 \上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。
% y( }( ~% R) K( N" M另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:
" s) F' l& ]3 B0 E# B9 ihttp://megastep.org/makeself/! j9 A% g$ P5 ?1 x( D) L' T
?0 ?0 |
|