文章目录
系列文章推荐
前言
本文主要来自正点原子、野火Linux教程及本人理解,若有侵权请及时联系本人删除。如果本篇对您有帮助的话希望能一键三连,万分感谢。
正文
Linux软件包
软件包管理工具
了解Linux软件包的组成
Linux软件包分类
源码包
优点:开源免费;自由裁剪功能;修改源代码
缺点:安装步骤繁琐;编译时间长;新手无法解决编译问题
二进制包
优点:简单易用;安装速度快
缺点:无法阅读修改源码;无法裁剪功能;依赖性强
二进制包分类
deb包:Debian、Ubuntu、Deepin等Linux发行版的软件安装包。
rpm包:RedHat,Fedora,Centos等Linux发行版的软件安装包。
dpkg工具
底层的包管理工具,主要用于对已下载到本地和已经安装的deb包进行管理。dpkg用于所有源自Debian的linux发行版,如Ubuntu、Knoppix等,用于离线安装软件。
常用命令
安装软件:dpkg -i xxxx.deb
查看安装目录:dpkg -L xxxx
显示版本:dpkg -l xxxx
详细信息:dpkg -s xxxx
罗列内容:dpkg -c xxxx.deb
卸载软件:dpkg -r xxxx
deb包文件结构分析
- DEBIAN目录:
- control文件:(必须需要)
- Package:软件名称
- Version:版本
- Section:软件类别
- Priority:对系统的重要性
- Architecture:支持的硬件平台
- Maintainer:软件包的维护者
- Description:对软件的描述
- preinst文件 : 安装之前执行的shell脚本(可选)
- postinst文件 : 安装之后执行的shell脚本(可选)
- prerm文件:卸载之前执行的shell脚本(可选)
- postrm文件: 卸载之后执行的shell脚本(可选)
- copyright文件:版权声明(可选)
- changlog文件: 修改记录(可选)
- control文件:(必须需要)
- 软件具体安装目录:
- 视实际需求
构建一个helloworld的deb包
演示:dpkg -b
其他:
dpkg-buildpackage
checkinstall
build_deb.sh构建脚本
通过该脚本帮我们自动创建deb包的文件结构
野火build_deb.sh构建脚本
#!/bin/bash
version="0.1.2"
author="Emdebfire"
package_name="$2"
package_dir="$1"
mkdir -p ./$package_dir/DEBIAN/
cat <<EOF > ./$package_dir/DEBIAN/changelog
AUTHOR:$author
VERSION:$version
DATE:$(date -R)
EOF
cat <<EOF > ./$package_dir/DEBIAN/copyright
******************************************************************
* @attention
*
* 实验平台:野火 i.MX6ULL开发板
* 公司 :http://www.embedfire.com
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
* * ******************************************************************
EOF
cat <<EOF > ./$package_dir/DEBIAN/control
Source:embedfire
Package:${package_name%.*}
Version:$version
Section: debug
Priority: optional
Architecture: amd64
Maintainer:$author
Description: Embedfire Tools
EOF
cat <<EOF > ./$package_dir/DEBIAN/control
Source:embedfire
Package:${package_name%.*}
Version:$version
Section: debug
Priority: optional
Architecture: amd64
Maintainer:$author
Description: Embedfire Tools
EOF
cat <<EOF > ./$package_dir/DEBIAN/postinst
#!/bin/sh
echo "******************************************************************"
echo "welcome to use $package_name!"
echo "******************************************************************"
EOF
sudo chmod 775 ./$package_dir/DEBIAN/postinst
dpkg -b $package_dir $package_name
试验过程
首先在build_deb.sh脚本同级目录下创建helloworld文件夹并进入
在helloworld文件夹下创建usr/bin文件夹,接着在usr/bin文件夹下面创建helloworld.sh脚本
修改helloworld.sh脚本执行权限,到这里软件包的安装目录构建好了,之所以在helloworld目录下构建usr/bin,是因为我希望helloworld安装包一旦被安装到系统中后,helloworld.sh脚本就能被放到系统的/usr/bin目录下面,也就是说deb包的路径在安装后相当于系统的根目录/usr/bin
回到build_deb.sh脚本同级目录test/下,修改build_deb.sh脚本执行权限
接着就可以使用build_deb.sh脚本来将helloworld文件夹打包成一个deb包,但是运行后报错,如下,试了一下别的脚本可以运行
出现问题场景
执行xxx.sh脚本时,报错 "xxx.sh /bin/bash^M: 坏的解释器:没有那个文件或目录”
问题产生原因
因为xxx.sh脚本文件是从windows拷贝过来的,所以多了\r,如果脚本文件是在Windows 下编辑过,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以才会有多出来的\r。所以执行命令将\r换成空白去掉即可。从Windows复制代码过来要相当注意
解决办法
执行如下所示命令即可:
sed -i 's/\r$//' xxx.sh
最后使用dpkg命令安装这个deb包就可以了
关于dpkg的常用命令。可以参考Linux必备基础
sudo dpkg -i helloworld1.deb
这样helloworld.sh就成为了一个外部命令