|
|
发表于 2018-2-14 06:26:23
|
显示全部楼层
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:
' {! T3 [! q; g5 V( l; H# [——————————华丽的分割线——————————
6 ]* S$ h6 B8 U7 C run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:
: `- |( I8 M' _|—————–|7 t: @( H4 j- N. Q. H4 I
| |
" p1 @3 f7 i1 v9 E0 f" f| 安装脚本 |
2 u! z/ [3 h- U3 {, \| |' a) O5 G( N8 A$ b8 }4 K
|—————–|* ~0 a5 a% ] d+ H
| |, l' a* M, o6 L7 T
| 程序 |2 c( S+ [* |" K: q
| |# y: k$ A2 x& w- f
|—————–|
7 M8 D8 T" Z% j. U g7 ~, [图: run安装包的结构. T# C- G9 ` G" S
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。; x9 Y. ^6 F+ p
制作run安装包以下举个实际的例子:# O9 l5 A6 Q) x, j) W I! k$ \
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
, p6 F4 I4 q8 u0 G4 r7 k* ?* ~1 [+ Z$ ls% G# s- }; z2 N* D/ v$ O
install.sh helloworld
$ B$ I) u0 O' \$ cat install.sh. r4 K! Z. q' [
#!/bin/bash6 H$ W7 ~. o4 o6 c- i; D7 p( O2 ~
cp helloworld /bin
+ ]" d( Q, i7 P4 b8 I) ~/ {; E$8 G) V1 z" U4 z' _5 @ E0 ?
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:
5 ]& c P% X4 a: L: g7 C) }5 ]' z/ D$ tar jcvf helloworld.tar.bz2 helloworld/ P A) E+ e( ~& `, n
现在修改一个安装脚本install.sh
) S: i0 B; E( Z7 B0 H# o$ W& b改为: O0 o% s3 o: I% `7 h0 Z# z/ f
#!/bin/bash- i& ]" ~, b. F) `2 o6 y
lines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行+ O/ G( W, v) W1 ]9 K6 }/ Z
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
* @' o' h0 `7 B2 l% b* r! D. [tar jxvf /tmp/hellowrold.tar.gz
, O! q: w3 e0 _ [3 Vcp helloworld /bin
$ A7 ~& N, W" A' q; g, v* T+ C3 Jexit 0
l) F( @- o' F# T) \然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。2 P' I; ]6 r# `, }( t
$ cat install.sh helloworld.tar.bz2 > myinstall.run
7 v* O4 U+ g0 S9 @- m: ^5 S4 J+ c这样就得到了myinstall.run文件,它的结构如下:
6 Z: W/ T, H r$ v|——————| 第1行
0 \8 {+ K# `# D. H& o, T| |
& a& z# l8 z8 k& G( |( @! p| install.sh |$ \* f) f6 L1 q4 D
| | 第6行! O0 N* X2 a. z3 v7 W) s# t" E& o
|——————|
1 ~7 U5 c, H- m N# H| | 第7行6 I, W' l/ I* [5 S/ J0 u- k+ X/ q
|helloworld.tar.bz2 |+ W4 G; i- W R* c* M
| |5 O; A! R5 }6 E) W: W( K
|——————| 结尾( Q3 W4 d8 B8 J7 {. p( ^
图: myinstall.run安装包的结构
, m# q B a g运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。' e D8 i* ]% z3 X4 V
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。# ?' n7 s& N5 n7 b
——————————华丽的分割线——————————4 Y' H- x* K8 H' n. K. z
linux 下制作二进制 .bin 的文件( V( i( |, Q/ J- u
制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
+ }" A1 m* [6 n, ]1 u9 w这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。. k: J7 l, e0 O
例:制作安装apache、mysql的安装脚本包
* t/ D; C, i7 W, u- n3 r1.将源码包先打包! l: J2 t8 T0 C/ L' y% t/ G
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
# }( Y O# g6 K8 s' a2.编写脚本如下:
& k ?0 R3 \" W5 f4 N# cat install.sh/ d: ~* O" A% z4 Z6 f" E
#!/bin/bash5 d+ Z' V) ]2 _
dir_tmp=/root/installapache2 E# K$ L$ ?9 t2 H
mkdir $dir_tmp
. O: t! D3 g8 X/ z( ~1 W: Y/ psed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
8 O% H/ T9 A/ i6 ]' Q# [cd $dir_tmp
- P7 n4 S: U5 ~- ?4 P" b( Ltar zxf packages.tar.gz
6 K0 M; U1 K" b6 A1 j9 {) Mtar jxf httpd-2.0.63.tar.bz2- s3 ?; O, T+ I! a* f+ B# _( x
cd httpd-2.0.63: D( i, V6 k i# G" H
./configure –prefix=/tmp/apache20 O r8 X1 r6 u% G& F! g
make8 F+ j) P+ e. \7 @
make install/ p9 G! T+ n3 F$ N' a6 [+ o
cd $dir_tmp9 _" i: M& x6 Y: G. Y2 e' U
tar zxf mysql-5.0.33.tar.gz
$ s) j) ^* R- S" X, U* W% E }" C$ Jcd mysql-5.0.33* n A4 ?- V0 }1 H6 L3 R
./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
6 p) M0 t S( A; M0 Xmake$ X& ]5 _8 ]! p% x$ s$ p: \5 F
make install
. Y- z& h3 K1 x6 e0 a( gexit 0$ E4 k; l3 K% G( V& z( C$ j
#cat install.sh packages.tar.gz >install.bin2 I- [5 e' ~1 F% D3 f9 x" r. B
这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到
% `1 l3 l! K4 l" h/ u最主要的是下面这句,是将二进制文件从.bin文件里分离出来! u8 k. W) @# L k. M/ h) Z
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null1 N; `8 P1 f L& U: E: P& ]
安装的时候直接执行
- c+ V" T% ?5 Fsh install.bin
& n% Z( Y) |& l安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。! I M ]' ^6 t7 H- l! c
——————————华丽的分割线——————————
' S& a; V0 ? ?0 z上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。
/ I% p. v/ s7 i' Z+ S4 G$ {8 r" m另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:
: a H y; D% D) bhttp://megastep.org/makeself/
7 F' r" V1 D7 I: F0 ]7 e# h" G?0 ?0 |
|