Skip to main content

linux自解压文件

经常从网络上下载.run格式的安装包,直接运行就能够执行程序安装了,很简单方便,一直也没有仔细研究过,前段时间学习开源交换机ONIE的NOS安装镜像,需要自己制作一个NOS的安装镜像,于是就学习了一下。

网上最常用的一种方式是通过tail命令+tar命令来实现:

  • 首先把想要安装的文件通过tar命令进行打包,当然也可用zip、gunzip等命令
$ls
target

$tar -cvf target.tar target/
target/
target/t.sh
target/System.map

$ls
target.tar
  • 新建自解压脚本,本例取名self_extract.sh,可以自己修改这个脚本,添加自己的安装过程。
$cat self_extract.sh                                                                      
#/bin/sh

lines=%%SELF_EXTRACT_LINES%%
target_file=$(readlink -f $0)

tail $lines $target_file | tar xf -

#添加你自己的安装过程

exit 0
  • 修改这个self_extract.sh文件中的%%SELF_EXTRACT_LINES%%变量。
$LINE=$(wc -l self_extract.sh | awk -F" " '{print $1+1}')| echo $LINE | sed -i -e "s/%%SELF_EXTRACT_LINES%%/$LINE/" self_extract.sh

修改后的脚本文件为:

#/bin/sh

lines=10

target_file=$(readlink -f $0)

tail -n +$lines $target_file | tar xf -

exit 0

  • 把第一步生成的target.tar文件追加到slef_extract.sh脚本。
$cat target.tar >> self_extract.sh
  • 执行最终生成的self_extract.sh后,目录下就会最终生成target目录了。
$./self_extract.sh 
$ls
self_extract.sh target

ONIE的做法

  • ONIE的做法更加简洁:
$cat self_extract.sh 
#/bin/sh

target_file=$(readlink -f $0)

sed -e '1,/^__exit_marker__$/d' $target_file | tar xf -

exit 0

__exit_marker__
  • 追加target.tar到self_extrac.sh文件。
$cat target.tar >> self_extract.sh
  • 执行self_extract.sh就可以了
$./self_extract.sh 
$ls
self_extract.sh target

ONIE格式的安装包加入校验

sha1=$(sed -e '1,/^__exit_marker__$/d' "$0" | sha1sum | awk '{ print $1 }')

payload_sha1=%%IMAGE_SHA1%%

if [ "$sha1" != "$payload_sha1" ] ; then
echo
echo "ERROR: Unable to verify archive checksum"
echo "Expected: $payload_sha1"
echo "Found : $sha1"
exit 1
fi

需要在把target.tar文件追加到self_extract.sh之前,先替换%%IMAGS_SHA1%%变量。

$SHASUM=$(sha1sum target.tar | awk '{print $1}') | sed -i -e 's/%%IMAGE_SHA1%%/$SHASUM' self_extrac.sh