|
|
发表于 2018-2-14 06:26:23
|
显示全部楼层
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:5 f7 _9 |& ^5 Y0 N! {+ [4 v
——————————华丽的分割线——————————! P3 G' G, h# R4 `. O
run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:* `" r2 k- T: Q7 p( E. g
|—————–|
! k* r% M9 s E| |* Q% h7 O8 f) T) s
| 安装脚本 |6 O, `( O3 p8 n
| |( H6 n4 e- Y! j& c9 c/ Q$ Q
|—————–|
- \4 D: O* l& ~$ p6 }# A0 U6 O| |
7 u0 b* [: n7 M| 程序 |
+ D: ?' n1 A/ O( R) G G: z( B9 i' [- \/ Z| |
0 V, o9 G6 U: M- b, I8 A# a" w|—————–|6 c# w6 `8 m! K! L
图: run安装包的结构
8 } e: Z: g' j" N这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。8 o& L" W" B8 p( D7 F3 e5 ` w
制作run安装包以下举个实际的例子:0 C k/ k; D; S2 n
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
( C% u! X5 A- l {' ~$ ls+ ^: _' l5 v; S0 [6 s$ p% q% |4 P
install.sh helloworld
/ J1 L! p* V9 D$ cat install.sh/ u, b M2 W8 D& |2 E/ x
#!/bin/bash: _9 O1 E2 A7 T* r8 \1 U' I
cp helloworld /bin; A% _% e, H- H1 f. N, `5 u
$- O9 K% W2 A0 K
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:' {- R5 v$ ]# \1 }
$ tar jcvf helloworld.tar.bz2 helloworld6 _4 I! X2 S4 I$ L0 C$ J
现在修改一个安装脚本install.sh* V# r4 }" z8 _+ ^
改为:. ]( d7 z1 p, o1 q2 B" o
#!/bin/bash
' u6 r7 Q5 s; j: M4 r* c" xlines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行; r/ c! o6 n+ A
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。 Q/ i" e0 R. S6 l: f: m
tar jxvf /tmp/hellowrold.tar.gz
. \9 \) ^) z! I! U4 ]" z% \cp helloworld /bin
- u4 |$ J3 _: N9 U/ _) J9 l' {. u' ?exit 0
8 q( W& w( W* o) G. L+ g然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
8 y; S$ }6 Z, }' `3 T2 A& b$ cat install.sh helloworld.tar.bz2 > myinstall.run
5 h% M: h2 `" m' l7 T* m4 z这样就得到了myinstall.run文件,它的结构如下:
3 @% }* T: C3 g! r|——————| 第1行1 V8 d0 h( O+ T7 ?
| |7 I" I% u. A, B9 x" ~- s
| install.sh |
/ l: x- ^ I/ E, E| | 第6行/ X! q( h* _, W3 U. F
|——————|6 C( y" s- y0 g' V
| | 第7行) v+ o8 s5 k) I$ y3 L/ f3 I
|helloworld.tar.bz2 |
8 j6 A+ @( _( m3 q| |, T/ p, Q' G7 M6 ~" {
|——————| 结尾0 E4 a9 O" m* ?' _: i. O
图: myinstall.run安装包的结构
: y$ ]* n" t6 I; G+ p+ _运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。/ h; F+ J2 w3 b3 Q/ z& _
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。" o7 f' v3 G0 q# t S: _' P; }
——————————华丽的分割线——————————3 c, ^3 H. d) Y% U) a
linux 下制作二进制 .bin 的文件
, i- `5 O. E) N: J& M制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
9 N( T# p* s7 Z! f; P这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。 Y' d; t- P: Z8 S* Y0 i
例:制作安装apache、mysql的安装脚本包7 [& G l7 u0 a( A; {9 _% Q; s
1.将源码包先打包
% p" n8 J4 x! k( v1 |#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
9 {/ w) g: i. F2.编写脚本如下:
4 A/ F0 w' E3 y% f2 j; R8 R# cat install.sh
& O# q* f3 S" p* c2 B: p#!/bin/bash
0 Z7 P: I2 ] V; L7 Zdir_tmp=/root/installapache
* i- ~* h" {* a5 b$ gmkdir $dir_tmp3 J! z; X/ f" z K/ G" F+ d* D8 d
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
% Z3 N7 a4 U7 l$ vcd $dir_tmp* C9 v) Q& t! X% n
tar zxf packages.tar.gz' {! l7 A0 X) N3 i; D
tar jxf httpd-2.0.63.tar.bz2" s5 Q' {/ m5 p0 v7 U
cd httpd-2.0.63
, }, x6 s* c) N0 G2 e% b: c4 D./configure –prefix=/tmp/apache26 ~9 A1 F& f" {; P
make, A; Q: f. F3 k
make install2 N' \% n& P N4 F8 S$ B
cd $dir_tmp
& s- B, {" M1 Q( l+ ^8 M" W1 O/ Star zxf mysql-5.0.33.tar.gz' k4 G3 O8 r$ G
cd mysql-5.0.33- Q6 u& ^7 |1 B, D5 z
./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/ e% ~8 C( z9 G& ^
make+ `$ U* l5 m3 S% k- k" Q
make install. q; |! o( |: c- [# O
exit 0
& s p# ^9 Y. c' t2 Z) V. E#cat install.sh packages.tar.gz >install.bin
* z, j5 n, W8 m# [3 @这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到) g; q, X- r( u1 ~/ Y' b5 O4 X9 S& l
最主要的是下面这句,是将二进制文件从.bin文件里分离出来
! {8 a4 u- J0 v( j( Ysed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null1 j6 O" H1 L& D
安装的时候直接执行
7 ^) M/ q) F, S# P7 n7 ]sh install.bin
+ R9 R: S: y/ f/ Y安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。' l/ ?0 [! Y7 R g8 K* o
——————————华丽的分割线——————————
5 I$ @ U' X! Q4 U4 e: e上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。4 }1 O' O* p: x2 y) N4 T
另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:6 t( f6 d+ N+ ?8 [7 `3 F
http://megastep.org/makeself/
; k# p$ D( v; g# W4 r?0 ?0 |
|