|
|
发表于 2018-2-14 06:26:23
|
显示全部楼层
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:
7 U1 N" m, Z! U* l7 e——————————华丽的分割线——————————
7 R4 s& S$ c+ f; m& g9 c run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:) X& e; ?2 @4 ]7 |0 ?4 }9 F$ H( f' {$ h
|—————–|
, j) E0 X, R0 i8 ] ]2 N1 q' S| |
* G5 A% v: z: Y; S1 P| 安装脚本 | U; h0 L% \. D# Y( G
| |
, J; F, Y+ U) ?8 I& P5 v|—————–|# C/ r5 R4 Q- a0 l( k" h h# \$ c0 ]5 T
| |
3 s7 b7 N! m0 z| 程序 |& d2 m$ e. g$ \7 }0 ~+ ?
| |
5 @' ?6 Z* O2 c$ h# d|—————–|
* T! Y( e- s. E$ }/ h图: run安装包的结构9 N" Y# j+ H: E3 g7 z* _. R
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。. R5 O$ Y% X# w3 ` I
制作run安装包以下举个实际的例子:5 Z& F& @8 q1 U0 N3 _. |& w
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
2 S1 p0 C$ s% d& j1 |$ e C$ ?; b$ ls
$ u' J0 g! j6 Q$ x; e+ _2 J, ninstall.sh helloworld
4 X% ^8 y' d0 B' V9 s9 n$ cat install.sh" s6 c5 m0 u; Q4 q
#!/bin/bash
, c* K1 `$ e6 }' p X4 ]cp helloworld /bin. [6 }% f3 t: ?. }$ }( h
$# K* \' I7 i1 Y2 k" \, `
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:
6 x& ]/ j. {' D% d C$ R$ tar jcvf helloworld.tar.bz2 helloworld U# o; x2 P# q j6 H
现在修改一个安装脚本install.sh
q& d0 i" }" p. n改为:
% ?- u( `4 n6 P) F; I#!/bin/bash
. ?# n! j( W/ j' U" C, d h. Olines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行' s# y% Z" {) u& x8 j1 u2 C2 _
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
3 T% B7 S( J- @0 ?6 ?tar jxvf /tmp/hellowrold.tar.gz
) t3 j" `% B( |9 ]- J( W+ G( zcp helloworld /bin1 C) W. ^0 r& H z. S
exit 0
$ f' g: w2 b( q4 b4 Z" n* r然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
1 v4 m3 p, u" u& `7 m- i/ I$ cat install.sh helloworld.tar.bz2 > myinstall.run1 D0 i& }) ]7 \' f* T" U5 o' Z
这样就得到了myinstall.run文件,它的结构如下:* h9 V7 O2 h% T9 v
|——————| 第1行
6 |2 |9 ?2 Q$ ~3 b. r) t| |
# o C7 j) z; ^) S6 N a| install.sh |
" @. ^) c; S9 z$ I. c7 |3 \| | 第6行1 [9 b, B! d7 E# d! O; {+ g/ L9 D0 J
|——————|5 n1 i4 F& H( S
| | 第7行/ n/ F9 G: ]% F; u: ^3 M l- \+ ^
|helloworld.tar.bz2 |' u$ T! |+ l$ e4 ~
| |
" W/ O7 Q: U$ h* Z: K9 T|——————| 结尾( f. h3 w- l3 u! E$ Q+ N
图: myinstall.run安装包的结构 H% R4 |$ Y# y
运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。' _& o; H6 o% a. ~
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。
4 Y3 t2 F. y; Q- ^: O——————————华丽的分割线——————————- J: y9 Y: @% e8 T1 n
linux 下制作二进制 .bin 的文件
_! E* m4 I4 t5 F) _制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里
/ A* ^8 m |" b8 L这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。
% {& v8 N) }, g例:制作安装apache、mysql的安装脚本包
" s) B1 e; [% A! s( ~ z+ S1.将源码包先打包$ c. u: P1 r# G3 W+ c B, A
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
. M9 |- |. G- q: |' |1 s2.编写脚本如下:* x; r2 O+ w) B- |9 K, s
# cat install.sh# t6 v# A& w, k
#!/bin/bash
/ j) ?, l; J( w1 R5 E6 Wdir_tmp=/root/installapache3 x' U; N& j7 Q ]
mkdir $dir_tmp
4 m" M9 Y1 E X; Used -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
& l+ Y g5 t, d" icd $dir_tmp7 [- |. K- {5 U- P
tar zxf packages.tar.gz
' p! A5 B" p) gtar jxf httpd-2.0.63.tar.bz2 o G+ U7 H2 s5 z/ X
cd httpd-2.0.63/ e# d& I( w; u! H: H
./configure –prefix=/tmp/apache2
1 I6 O& ?0 Z; Fmake
, D; E3 L3 V8 x* {$ [make install
- m' j& F% v9 ~. d8 Q) Bcd $dir_tmp
* n& _( c3 H) j9 ptar zxf mysql-5.0.33.tar.gz9 V7 W4 [" {- o; \9 g: G0 ]
cd mysql-5.0.339 I: h9 ^% L. E1 M9 I, L
./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
; O2 c8 E5 v: M* Y% Umake
# n# {9 z2 O2 Q9 U9 Dmake install3 [: F# W/ j4 _ ]# v" S7 ?& E
exit 0
' z6 a" L# r1 ~, P6 \) e8 v3 W#cat install.sh packages.tar.gz >install.bin
3 T4 q* R1 R. R这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到4 S* l5 a0 s# w. R' l4 g
最主要的是下面这句,是将二进制文件从.bin文件里分离出来
1 h, {& L, w* b5 }" d, R5 Wsed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null) u4 b% \; q* c" h9 h% {" q
安装的时候直接执行
/ V. f8 R, d- E4 Psh install.bin( h3 [1 _) K: V4 M! e, A
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。
9 V. {* x$ n; |: k——————————华丽的分割线——————————
- Y( x& [0 _1 A: W上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。# M% U, t% N. \0 ~; [1 S
另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:
8 D" I, G- D! ?http://megastep.org/makeself/ e8 I3 Y* v) _3 {& s- n1 N& K5 }
?0 ?0 |
|