|
|
发表于 2018-2-14 06:24:59
|
显示全部楼层
制作Linux下程序安装包——使用脚本打包bin、run等安装包
p8 v7 a$ e0 e8 y7 D: U$ \+ X制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:
p1 D0 E! `0 b& n8 C——————————华丽的分割线——————————
9 b+ q0 C8 N O3 A) N run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:
8 } S/ A Z1 f4 ~! B8 X, H6 B8 G' _|—————–|( ?9 C% r- h( Z1 X0 @, G7 |
| |
4 h8 s1 n( ~5 }' E6 `. ?, X| 安装脚本 |1 H/ S: h2 e7 a9 F) Z( T8 ?
| |, J0 y9 g' c- G4 w
|—————–| H0 d' {* J, e/ A+ @
| |
6 L7 D2 T9 F( z4 n% u" M5 V| 程序 |) D2 ]& w' k x
| |7 B5 ^: R0 t* J
|—————–|# g! w: e7 D5 N
图: run安装包的结构! R: R0 M8 ~: f5 a3 T
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。6 [1 h$ N& G( ~6 ~/ R! D1 A( V
制作run安装包以下举个实际的例子:/ a/ m+ K% F, U. W( j
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
2 ~6 w) [5 V" j- m9 X# d: R$ ls9 f* V! w' x( [- k$ h& _
install.sh helloworld
2 g9 u3 R7 M0 T" F' e$ cat install.sh: L" B# V7 V* W3 C
#!/bin/bash
! t$ ` Q% K3 k! _- F2 d* Z1 X8 scp helloworld /bin
: x, K4 x: i4 L* @' g3 }. l" q$9 T& F ], Y6 f* ~- r: R+ I& |
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:
8 M" Z& E Q# k9 p* t$ tar jcvf helloworld.tar.bz2 helloworld
+ G5 ^2 R) y3 b; L现在修改一个安装脚本install.sh- M3 t* P7 w5 l- B: _# B# p v p
改为:
% X* b1 G5 C/ j* ?#!/bin/bash
) ]5 C: z3 M6 K' D+ M u3 J: u) E8 glines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行8 l N3 ~' B" f7 e V# J' O
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。4 V9 H3 h- x( X$ U% z5 }
tar jxvf /tmp/hellowrold.tar.gz' `# `; S6 a3 W# T9 i+ t7 m
cp helloworld /bin
- J- W! V( {: Y# @exit 0
, U, J+ [) O% r( P然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
4 {* h0 Y% r4 W' `1 ~/ U' n$ i$ cat install.sh helloworld.tar.bz2 > myinstall.run
0 c5 F7 C0 h% y$ S& M$ m% A这样就得到了myinstall.run文件,它的结构如下:
+ }2 S; p$ o( l, G|——————| 第1行8 o; Y" E+ X: P" K0 s$ [
| |
, S& p" o k' F2 d) b| install.sh |
& \* R8 t5 w4 |, o7 b \% N1 m| | 第6行$ r- P& r S7 W
|——————|6 r- n0 r" g( ]$ {" z4 x
| | 第7行+ H7 L, N! R2 Z
|helloworld.tar.bz2 |# A7 V+ B7 c) G$ }- c
| |; a Z9 l* {1 H2 P& G9 V& S$ H8 I
|——————| 结尾
7 W# I# w3 T. S: {: _6 h! O- K图: myinstall.run安装包的结构3 u3 G$ o0 A: U; C y' E
运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。
# V, y- K% {# h$ _/ ?7 j/ f1 zrun安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。# i' a E: ]4 V' O% p. s
——————————华丽的分割线——————————7 q+ m$ ]' x" g {( Q
linux 下制作二进制 .bin 的文件; ~3 e: Z9 `% b8 D \ l
制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
! O" `7 \1 z7 d$ {$ x5 ]这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。; Q, Y& a0 n0 w7 _
例:制作安装apache、mysql的安装脚本包
/ H$ Q/ N1 w" z4 \- H1 ^1.将源码包先打包) x( }. v6 T% a# ]$ F6 u
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
3 }: B( C5 R" q4 K# W2.编写脚本如下:2 m3 c" [9 c" C- P9 `
# cat install.sh
; L! E; Z% n1 |7 ?1 ~#!/bin/bash( s2 n! u5 i: L" a+ x
dir_tmp=/root/installapache0 D2 O8 D# d/ o4 R# ~: f2 r
mkdir $dir_tmp
^9 l3 ^! E. T7 R- {sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
) }4 t& P9 u) D* X( Gcd $dir_tmp m1 Z( T2 U2 B0 |
tar zxf packages.tar.gz
( z5 l. o$ P1 O# Q; ]5 V: atar jxf httpd-2.0.63.tar.bz2
}1 R) z! f7 l6 z! M5 H& J) V1 {cd httpd-2.0.632 Z( K$ j" Z# d$ {/ i- E3 v- }
./configure –prefix=/tmp/apache2& j+ @: t/ v9 q% C) O7 R. \
make
u. g5 @" m( w1 ^. a& M' N Imake install
. `4 y0 ^- N C* M( j8 k# O+ A ucd $dir_tmp/ |/ e8 M& g) x9 U" @$ Y
tar zxf mysql-5.0.33.tar.gz2 b9 k y# x+ ^) D* Q
cd mysql-5.0.33* p$ `& {5 r- M3 i
./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
: a3 R& a% M0 c+ G$ b) j. H( E5 b' Fmake
& f- S- E9 P7 I& J+ Wmake install
! A8 @1 Q# a" kexit 0
7 u, m0 e0 l0 ]7 }1 ?% K#cat install.sh packages.tar.gz >install.bin
- S5 B6 p( J$ Z: [" }这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到
3 |1 E# U! i2 [: J最主要的是下面这句,是将二进制文件从.bin文件里分离出来4 U# a. d0 f$ Q. _* h
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
+ V% [" j/ D, m& {' M# a% }; U安装的时候直接执行1 i* J% M6 b5 L! r3 S) L
sh install.bin
" w- H/ P# K0 I: z5 O- B安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。( G( {' ^3 b' Y% q# ]: Z, Z z8 U
——————————华丽的分割线——————————
3 r- J# ?7 j5 V. V1 E- s上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。
* Z: \& T5 t; @$ A- L9 `$ b/ ]另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:7 K5 M# r0 p" [& y7 F( A
http://megastep.org/makeself/* G5 E& v$ Y# |1 {) o
?0 ?0 |
|