|
|
发表于 2018-2-14 06:26:23
|
显示全部楼层
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:2 M: `3 Y7 \9 H) u& ~
——————————华丽的分割线——————————' ^9 Z# y& t' \: R! u- a2 c
run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:; E. h! V! ?: S- j4 U- r- s
|—————–|
6 ^5 |: E! Q9 c/ I. x, \- u| |- v5 ^3 \ x% P- W. _# N
| 安装脚本 |7 A. V& B3 Z& A8 s2 Y+ t \
| |# b" w, u2 [+ U- s) R$ d
|—————–|+ r( l; o5 r0 ]8 r6 w& f+ _' F4 l
| |! R5 a2 M& `$ e( U
| 程序 |
P0 Z2 Z6 ?" U| |4 T/ q4 b) B; F% k! q& |
|—————–|
* @9 l) t( z0 ]. U% K图: run安装包的结构2 e" }$ O9 V; g- w, W+ L: A; c
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。5 O5 e( U, M+ z
制作run安装包以下举个实际的例子:
1 n7 V4 U( d7 [为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
6 c* |0 U" e6 F& A) J$ ls& u6 \: [$ L& [+ A- Q
install.sh helloworld
: Z3 j8 k+ O9 A- M! n. x" S$ cat install.sh# S* k, Z3 M. @/ j
#!/bin/bash, t E2 }7 g1 r. C6 N3 k' J
cp helloworld /bin( r7 n" [& {% ?( F" \$ ?
$
$ j+ i) A3 P, O6 ?" o, l& }; C. h& r; }现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:9 G- x, z, ^" A7 x9 q- h
$ tar jcvf helloworld.tar.bz2 helloworld
- z6 H. G1 C2 u+ P) z2 ~: X现在修改一个安装脚本install.sh
: e+ t5 S( ~9 |5 q改为:
. b* F$ s m% X5 n2 |, S- |- x#!/bin/bash c- r( c6 i( s5 `) {$ G! M
lines=7 #这个值是指这个脚本的行数加1,这个脚本共有6行
5 b0 u5 x F4 C# G: Stail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
1 m B3 K' B! K9 ]$ p2 D3 w7 ytar jxvf /tmp/hellowrold.tar.gz
+ y* j4 K/ L0 j! W8 Mcp helloworld /bin* m# F# Q) f7 \- g# q. y4 Q
exit 0
$ r7 B1 _* ~6 U然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。% _) e N( k& w$ W% N
$ cat install.sh helloworld.tar.bz2 > myinstall.run
: P" F) S7 v0 }& |+ {, _( z# g这样就得到了myinstall.run文件,它的结构如下:
+ E4 w/ o5 I U. Y$ A4 H|——————| 第1行3 d8 ^& d: |3 M4 D, J7 c2 v/ i' a- D, l
| |0 A* s" }) s4 d5 f0 X
| install.sh |
; p; m- b9 a5 Q, p7 B0 i( ]| | 第6行
" ~) c: S; _! \|——————|! ^5 f" q0 C! l
| | 第7行" w$ A3 y, h( [5 J" ^5 o3 I6 Z" B
|helloworld.tar.bz2 |5 `- R) a! M# L/ ^4 h/ q* j" M
| |; q' Z/ A3 L9 R* Q+ E; C
|——————| 结尾
/ I' h2 A4 x# N4 d" _5 V9 D图: myinstall.run安装包的结构3 O }# w$ i" c4 S
运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。1 _6 B! l0 `8 z5 M7 M. v4 c
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。
, g8 B+ E( Q2 ~5 W, [——————————华丽的分割线——————————' A: j. M! @; \ i+ M" ?
linux 下制作二进制 .bin 的文件4 J x; F( K7 X S# q$ m0 z }
制做方法是使用cat 命令将执行脚本和打包文件同事放到一个.bin的文件里* k) ^( Q; ^5 w: @5 N8 f+ B2 }+ j
这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。' I2 Z3 K1 K3 |5 l/ _# {, C
例:制作安装apache、mysql的安装脚本包
: |( b% L% g% y3 v* p( l- z+ K1.将源码包先打包, f9 E7 B& N$ G! X6 I O) r
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz
/ n3 {1 B; O, H1 f, T L" \# M2.编写脚本如下:
3 u H9 h2 w/ B# cat install.sh
$ {5 v% |' l! K& n! U#!/bin/bash/ n! Y- i. i4 p7 v
dir_tmp=/root/installapache0 t0 v6 {. F8 y7 i% e
mkdir $dir_tmp& z; C2 s! i) S
sed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
/ b9 r1 @4 R. `+ ~% C3 `cd $dir_tmp/ e# @( n0 _% |8 H
tar zxf packages.tar.gz$ F* Z$ L. I9 E; z- B, M$ T) m
tar jxf httpd-2.0.63.tar.bz2. C4 I! k8 p- K: M
cd httpd-2.0.63
% J+ w' @" c6 y% i7 I. S. I( ?1 A./configure –prefix=/tmp/apache2
0 k% T( B. E! r# O5 emake
& r, \# F4 d: j- dmake install
8 H2 C, N2 g c5 b2 }4 S) rcd $dir_tmp
: ]0 ^; Y+ Y4 U5 Gtar zxf mysql-5.0.33.tar.gz2 J' @$ e( J5 o4 |7 b7 N; D8 y$ H
cd mysql-5.0.33
! c& q X; v: J, a./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 [$ l+ E& W+ [
make; o. m. k9 ^; z* P3 r8 H0 m# {
make install
! g& C6 r0 ^% Eexit 0
/ J1 ^: Q0 k# x! ?" w#cat install.sh packages.tar.gz >install.bin/ W; D5 o$ W; w- @
这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到/ L( s1 I' j8 c @) r7 Y
最主要的是下面这句,是将二进制文件从.bin文件里分离出来
2 P$ O# o" N# a9 g7 }8 @* csed -n -e ‘1,/^exit 0$/!p’ $0 > “${dir_tmp}/packages.tar.gz” 2>/dev/null
. D" G. I. O) Z) [ U* ?安装的时候直接执行( X& x: |) @1 l& f7 l, a3 O7 [ Y
sh install.bin' q6 j9 V' ^# H9 ^, J
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。
' d% B# _+ X* Q——————————华丽的分割线——————————
) `( P& m& V# a: v上面两个例子,其实不管是bin也好run也好,其实Linux下一切皆文件,而且是不管什么文件,都是一样的看法。所以这些后缀没有什么意义。上面两个 不同的地方是分离,一个是用了tail命令,一个是用了sed来实现。总之,这只是一种思路,不管用什么办法,只要能合起来然后又分开就行。% a2 B0 }3 X# F, q- V P: R
另外,有人写出了一个脚本来实现这样的功能,感兴趣的可以自己看一下:
6 U+ _7 m" V. k% T6 Z# rhttp://megastep.org/makeself/6 p% I- B# ]& }6 E* Y0 L
?0 ?0 |
|