|
|
发表于 2018-2-14 06:24:59
|中国|
显示全部楼层
制作Linux下程序安装包——使用脚本打包bin、run等安装包' R0 G, C n5 B1 p
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:
( v E, w& w; [* l8 X b——————————华丽的分割线——————————3 i* L" Z9 l0 u3 L
run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:
$ V5 S% |) ?4 j1 `, E|—————–|2 E, q3 I. B! S/ o; u7 F7 |
| |
1 a' P% ^5 h7 _8 g& ^/ g& F2 q' G| 安装脚本 |6 I6 Q0 d1 u; ]) p, r5 O
| |
$ |9 A! Q- k) x+ C1 t+ B|—————–|
N, k( g$ F5 u0 G `2 V+ W| |4 e6 J# q$ D0 v* B$ U7 w
| 程序 |) g5 ^4 e; s z
| |
9 ^: b4 {& o: g6 M8 m, D5 k|—————–|
2 [" O6 Z1 {) w& P. }/ L图: run安装包的结构
8 B M7 d4 q& X) |- {3 Q这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。$ t. P4 }3 n( _+ O, w( s
制作run安装包以下举个实际的例子:. u# C6 v2 t7 k9 A) ]. j
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。8 m, R8 ?* Y' T& ~; V4 U, z/ m
$ ls
7 E* a, d1 d" _5 U; Sinstall.sh helloworld
; }) r% m4 u( A8 g. v$ cat install.sh) ]* [7 t) U, y H! d
#!/bin/bash( u# z0 |5 \3 L1 Z, X1 |
cp helloworld /bin2 I" [$ y" F* z7 i! Q7 R3 m" ]+ A
$; E5 t: c& B/ ?
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下: [- M8 G2 B8 N$ X' T
$ tar jcvf helloworld.tar.bz2 helloworld9 i7 I2 ^; ]* m f* {8 n& |
现在修改一个安装脚本install.sh5 ~; t1 p/ Z" H8 W
改为:* U. Y2 h2 y. I
#!/bin/bash
3 W) t5 w. G, V1 ^# q9 klines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行 R+ R. I9 Z2 m7 G1 m- ?2 c4 Z
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。) a) }( ~3 K8 X( o- M+ _( V
tar jxvf /tmp/hellowrold.tar.gz
/ o3 S0 A# Q6 N2 f C" h# Ncp helloworld /bin
4 F5 {' A9 B8 V3 texit 0
5 @" d- p7 J; A9 x然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。( ]) m0 k$ k& ~. X/ G
$ cat install.sh helloworld.tar.bz2 > myinstall.run; Y0 ~+ M3 I; S3 {, g5 |5 U
这样就得到了myinstall.run文件,它的结构如下:
/ w/ {+ J/ d! W|——————| 第1行
# {' I y1 e. e/ X1 |! A7 \1 G| |0 s' x* i% b z+ V9 D. |
| install.sh |
+ i0 c" v9 K, x" m| | 第6行
+ p$ @+ r) A9 G N9 Z P! [|——————|
# e' B# i- }, q. e1 `| | 第7行
$ R9 b+ y1 I5 C% K7 l/ R* w6 C|helloworld.tar.bz2 |
" b: F: ^( \2 j( t# H: p9 j| |6 V" D. @8 `: N& a- h2 h
|——————| 结尾
9 t, r- U% x3 ~0 \$ t0 L, ]( W图: myinstall.run安装包的结构
0 y& I: {: _$ z# h! {运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。/ Z2 @1 f5 k) p, I% ]6 z
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。
: d$ j8 A. Z6 O2 J4 o& N——————————华丽的分割线——————————
; H7 F4 W3 A5 c/ b0 j' Wlinux 下制作二进制 .bin 的文件
& _8 [8 U9 u; `3 K3 a: X制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
: r0 O2 b7 D7 W3 I3 [8 s5 {7 ^这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。
$ i( _8 Z8 x' q. F' w5 P2 w2 O% M$ L9 s例:制作安装apache、mysql的安装脚本包! h. u& b# L9 U- B" l
1.将源码包先打包
. t# {6 K# M. z( ~. N' K( D#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz1 b3 v! g. z! i
2.编写脚本如下:. W: f/ m7 i! m. D* u! j- [% U6 q( M1 f
# cat install.sh& \. w! u+ Z% }- V5 L( T w
#!/bin/bash
: l$ O5 i, M- T$ Q! C3 o3 sdir_tmp=/root/installapache
' M* n9 j: A5 v+ I' p' i7 O& h% Amkdir $dir_tmp
- d7 E: _2 A7 K) `7 _& r* y# \sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
" v! X$ l' H0 K, g7 j5 H: Xcd $dir_tmp
* i5 F' Q1 n L* xtar zxf packages.tar.gz
- a8 t( G$ U$ `$ Q6 J `+ S7 ztar jxf httpd-2.0.63.tar.bz2
: V. p U/ D& Q- s' O9 m1 v" D( [1 ucd httpd-2.0.630 |9 Y) w. |; {
./configure –prefix=/tmp/apache2
& B0 N& X0 | q# f+ Ymake
8 m1 U" o# Z' j4 {+ P' R/ Imake install# ~. ^7 E/ L+ `
cd $dir_tmp, L9 }( Z) ~) g0 F
tar zxf mysql-5.0.33.tar.gz& @' J% @5 X9 W% i4 |
cd mysql-5.0.33
* ]* E' J, ~: E./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: R7 x/ ~) [( `0 S1 k% o1 ~/ Z
make7 u! ]6 F/ H, ^! _. H L! f* C
make install
- h9 C1 h6 h/ N0 `& B, d, G: Iexit 0. M8 ]. {7 v5 o, A
#cat install.sh packages.tar.gz >install.bin2 D9 Y0 X8 W& j/ [9 N
这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到
0 T. n7 u" z, h1 C最主要的是下面这句,是将二进制文件从.bin文件里分离出来) J0 l# y' o$ M+ U7 }
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null* V6 w- A/ }; u0 z( A& u/ S
安装的时候直接执行
" `. M) j- d& {- n/ bsh install.bin5 O; _' F- K. R- y/ Z
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。" U+ U7 H$ j* R
——————————华丽的分割线——————————
! q+ Y% C a$ q上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。9 R( _( H+ y# s, ]5 d2 [$ f
另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:4 v8 r0 w8 {, [; w& R6 X) S
http://megastep.org/makeself/) b1 u. b- S, R
?0 ?0 |
|