|
|
发表于 2018-2-14 06:26:23
|
显示全部楼层
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:
, [8 l [$ Z9 }) ]1 _) I, n——————————华丽的分割线——————————
' z% K+ \7 \3 Y run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:- ~1 c& y7 ?1 H6 ~' {2 I
|—————–|
% l8 e7 a, X) }! E# d| | ?, i% a8 E) c [: A7 i
| 安装脚本 |, o! Q y$ r' C$ A9 t) Q
| |4 o( f4 q" f- m' W: [. B8 M/ S$ X# \
|—————–|
) S' C+ O$ J# }5 }; o' Q. P| |; [- a1 A2 A* `+ z
| 程序 |
j6 j" [; a9 r+ ~| |
0 S. S. \) u" T% ` Y|—————–|2 t( i, f) [* U: o2 }5 w% x# M
图: run安装包的结构
6 I7 U9 m+ l" x, D% W5 |这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。
* v4 [; Z4 x; C制作run安装包以下举个实际的例子:
6 @& Z' Z6 ~1 v: l为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
* E& A4 V, y j7 p- `: {' T5 z: [' {$ ls
4 ^- q/ c; g" Y) L5 u7 z4 K. finstall.sh helloworld
, M( V" n7 x& U- G, Q' w$ cat install.sh3 m' Q# S v7 x: `9 \% I1 h
#!/bin/bash& o3 J- V/ N+ t0 T* O
cp helloworld /bin
. p7 A- L7 C; U+ r- q$
G. }; ]) Z# b* j% W; E; X9 \+ b. a现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:8 b5 d0 g: u9 Z5 w
$ tar jcvf helloworld.tar.bz2 helloworld% ]# [$ `( z/ {
现在修改一个安装脚本install.sh
# }! L+ H( R! M2 _3 I改为:1 p E- |; [. o# z, K- v( W
#!/bin/bash
2 l# a2 U7 p' {) zlines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行
/ B2 z0 ^ {6 c9 S% s% n+ p' Wtail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
1 d) Q4 ^- C8 j" T# S5 j6 Ntar jxvf /tmp/hellowrold.tar.gz! R. e+ ]% j! h6 B6 r( W
cp helloworld /bin
C' m1 a \; v3 {. |exit 0
5 g+ \2 Q. s+ v3 Q! L# j然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
. k U4 \9 B( B4 d. C; `9 E+ Z' c$ cat install.sh helloworld.tar.bz2 > myinstall.run
0 _; n1 c+ J( Y( H8 h9 P这样就得到了myinstall.run文件,它的结构如下:
/ S# X+ ^1 t3 E8 P. d: H|——————| 第1行: f, j7 l" z( y
| |: }% Q+ T( V9 y$ j/ r
| install.sh |
6 ~$ U% j" ^4 i3 D3 L| | 第6行 E! m; |/ x& I
|——————|; h" a# J+ b. y+ S) F* Z: ]+ e
| | 第7行0 `/ V: V/ U B) f' t
|helloworld.tar.bz2 |
0 B9 v9 Y" X8 S1 P# q5 T& X* ~# _) }| |( l9 c& y3 } A0 ~; v( h
|——————| 结尾
5 F8 a4 q4 Y% B# @' p图: myinstall.run安装包的结构, M8 V% i8 Z$ h% S; \
运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。! R+ b; A8 |# y( q- X+ i( u B
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。2 c( |' U" ~$ N2 x- @/ x. m- K
——————————华丽的分割线——————————
; U4 V! C2 T; ^! k" O, H6 j olinux 下制作二进制 .bin 的文件0 I5 M3 U3 ?# [# Q
制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里" @. N+ C) r- n7 M& ]; ?
这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。" G6 t' R/ Z- V7 R
例:制作安装apache、mysql的安装脚本包
5 s) c4 u( Y4 c2 [' g, B1.将源码包先打包7 x+ T, i# ?' F' _* u
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
# Z, e# r* S8 u f3 H) C/ V2.编写脚本如下:
/ P' C$ O$ z; M" x5 `; m% R4 u# cat install.sh
2 ?8 j' b# c4 |# N#!/bin/bash
y8 S( e( @0 O( x. c Ydir_tmp=/root/installapache2 L' E# H c8 U+ b$ G- u) ~8 L
mkdir $dir_tmp
5 g2 c- ^' r/ C1 hsed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null% M4 V9 f9 m# \% ]
cd $dir_tmp
. A) h5 Y0 }6 K7 Y8 ttar zxf packages.tar.gz5 D3 @9 M/ Q3 l
tar jxf httpd-2.0.63.tar.bz2
' {2 r* w6 z, f9 d9 v" e+ K/ tcd httpd-2.0.63
) o. Q1 }& R' P0 l! I1 R0 d./configure –prefix=/tmp/apache2
3 n. k7 j7 J }, ~* S: gmake! ?7 f7 T& m; i, G Y
make install& p2 \" ]! O( M% E+ p
cd $dir_tmp
1 u' t& y6 X4 Q: d4 _( e0 H( W' Etar zxf mysql-5.0.33.tar.gz$ C" R, D, E; L. @, C4 W
cd mysql-5.0.33+ B9 |! l, D* q0 K& u' n
./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
/ K. h; \, j) L$ u! ^/ @5 Pmake) P: C: i% H) Z; o; L
make install
! K4 K: U3 I6 _$ M# B8 Xexit 04 [( r c0 B$ h: c8 z+ Z- v
#cat install.sh packages.tar.gz >install.bin3 u" i4 u+ i9 S" E- g
这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到6 Y2 u$ @/ ~7 _0 g
最主要的是下面这句,是将二进制文件从.bin文件里分离出来
- N3 U% X0 u. u. O2 E* Wsed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null, X0 V5 o/ l; P- C4 h
安装的时候直接执行
* A3 B: o* B9 _# m% f( m4 ksh install.bin
* y) d9 X" z' A# @+ A$ b安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。3 C, _" A, S3 ^
——————————华丽的分割线——————————6 k) ]0 D) p; z4 C$ F! w
上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。
- ]3 x- ]6 \( s( S7 P( g另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:
2 {, V7 j+ E8 q9 G' shttp://megastep.org/makeself/1 Q6 N: w* A6 J- n
?0 ?0 |
|