|
|
发表于 2018-2-14 06:26:23
|中国|
显示全部楼层
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:
+ T% Z0 ?3 `4 E/ F——————————华丽的分割线——————————5 H* E1 E" Q: u, _5 r
run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:
1 o) F5 J/ H! H8 R|—————–|" ?0 z3 {. @* s- u a+ a2 x7 `7 ]
| |
r+ `: u7 J' c' r| 安装脚本 |
$ _+ W/ ]5 ~4 @6 z) L6 X' k% p| |
9 V$ f/ [/ ~1 }3 `0 y* |4 ^- K|—————–|7 F7 f$ t4 g9 d0 w- A; p7 }7 j
| |
" ]# k! B1 V3 s" A| 程序 |& |$ u3 L Q; Q. z3 C% }: p* p3 k
| |
9 S% |; }0 H! f1 A8 R|—————–|
: w$ s: }. y& m图: run安装包的结构: J- `; t9 e" r
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。: q5 F! b, Y; H1 T, G4 U
制作run安装包以下举个实际的例子:5 A9 l1 ?3 n( S
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
2 Z; P8 i" I3 a/ ]- D& A' a, V% l$ ls
3 ?% |/ |! ]/ P, q V1 s5 Winstall.sh helloworld
; u: ?$ @0 e" E; E& W7 C$ cat install.sh
/ T( i3 b- s) z; {7 T#!/bin/bash
* ^/ t7 n; w) f" G- k3 pcp helloworld /bin" E( Z% }" i( S5 H$ N/ x
$1 @9 |. ?# l; ^7 D
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:3 v+ ]9 m \0 `5 g* {
$ tar jcvf helloworld.tar.bz2 helloworld
, i) {9 R, }8 i8 k8 c( |& ]现在修改一个安装脚本install.sh
1 c# p0 s# J* M V( ^: j! A改为:# w# n% R/ _& T k
#!/bin/bash: g6 a; S! H$ K9 T7 T, o5 u" a
lines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行
$ _% s2 X* H1 X# a0 Ptail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
) D# r8 X; `$ N' E* v! ntar jxvf /tmp/hellowrold.tar.gz$ R0 \$ E. P2 B( r; T' t5 E
cp helloworld /bin) \* Q7 G9 p U7 ^
exit 0
7 C$ y1 H/ S1 `4 A: p; T2 @/ ~然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。5 R1 M* t& Q& ^
$ cat install.sh helloworld.tar.bz2 > myinstall.run
2 A+ w/ G7 \0 L i1 h这样就得到了myinstall.run文件,它的结构如下:
, e$ H$ r8 @; n3 l3 C|——————| 第1行( k6 k |. M5 w$ U2 i; a; H- F
| |
9 G7 F8 q7 K6 m3 X' e| install.sh |
8 S# L S: y% \| | 第6行2 k; K- `" L( {: j7 Q
|——————|; j: l" q& y7 Y& ]- Q" G! M: G1 ~
| | 第7行1 n% j- l0 p; e4 c5 L, b
|helloworld.tar.bz2 |
( h, }$ w' C% d| |" o2 v: x- r% f& b( }& T( d! L
|——————| 结尾
% q P% x, Q; _- y9 ~4 p图: myinstall.run安装包的结构
+ |% L J. h' @: x7 G7 m7 }+ I运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。# u: S! k5 u' d3 |, A
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。4 F N3 n4 _3 Y) Y0 S1 E4 H2 z; e/ s
——————————华丽的分割线——————————( x9 Z9 K5 c& s* B% ^% G. [! B
linux 下制作二进制 .bin 的文件! N6 r: P; z- |
制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里2 O5 x0 c X% V# ?! ^
这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。* J- ~+ @% L; @8 q1 n2 n) g6 R& y
例:制作安装apache、mysql的安装脚本包: f6 J8 V, I/ ^9 k8 A, z
1.将源码包先打包
8 b; Z* I" \% [# i# C#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
% W1 [ X/ t# H2 I( G. N6 C2.编写脚本如下:
2 [' F$ x( \! o/ M; a9 E# cat install.sh8 g: g8 x9 G% |, y' W' R1 i
#!/bin/bash7 `& ?' e' v- {- f" ~% z- {% V P
dir_tmp=/root/installapache
* s5 v' f' ? [mkdir $dir_tmp
2 T. L- g0 O5 T% Wsed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null6 T3 i0 L$ {) Z* X% T5 v
cd $dir_tmp% ^/ Z5 u$ m+ A( @+ c0 r' `3 H4 {
tar zxf packages.tar.gz
# ^! e, I2 a% Z- i- e6 u1 e* Ptar jxf httpd-2.0.63.tar.bz2
: X+ \- G' |* G" H* dcd httpd-2.0.63
. `& x9 @ v8 z H./configure –prefix=/tmp/apache2* S3 L2 _6 e4 I: Z! v
make7 }! H6 s$ k1 o- x2 O
make install
9 S* G7 p7 ]. k2 W0 u! ~cd $dir_tmp
9 S; J( n$ @: @8 ?tar zxf mysql-5.0.33.tar.gz f# K" [: i4 n z. W$ i0 M
cd mysql-5.0.33; S5 p+ A0 Y( t0 `5 S8 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
$ j2 K* h, T" }0 ]; o' ], ]make
4 c, _* e4 @) `) m2 a% Dmake install+ t+ U# T; m% P; Y& W6 T
exit 0
\1 ]$ `6 k2 ^+ t3 u#cat install.sh packages.tar.gz >install.bin# i# w- r7 z0 _2 C" C7 U
这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到
% g# h3 u) c* u P u3 ~最主要的是下面这句,是将二进制文件从.bin文件里分离出来
) t* m; X! d/ |$ c( v: a3 J% v" A0 `sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null4 K1 L: x& J, s$ u- l6 K9 e* E
安装的时候直接执行
. L8 }4 w$ v" F- n9 W |/ Ish install.bin
, P0 R# t% f c- d- q安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。
" ?% q9 ]8 U' u- | C——————————华丽的分割线——————————$ w8 O' Z1 u+ t
上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。
3 N" w5 @) h8 [$ K另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:" o2 t6 p1 i* ~' T* d" E
http://megastep.org/makeself/. B2 w- g3 s3 C3 @" O7 o7 `
?0 ?0 |
|