linux软件包管理
1.软件包分类
源码包
二进制包
2.源码包
优点
可修改
可自由选择需要的功能
软件是编译安装,更加适合系统,更加稳定和高效
卸载方便
缺点
编译时间长
错误新手不容易解决
3.二进制包
DPKG:是由Debian Linux开发出来的包管理机制,通过DPKG包,Debian Linux就可以进行软件的包管理,主要用于Debain和ubuntu中。dpkg 是Debian Packager 的简写。俗称deb包。
root@ubuntu:/home/yanyanzhang/shell_study# dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==================================-======================-======================-=========================================================================
ii a11y-profile-manager-indicator 0.1.10-0ubuntu3 amd64 Accessibility Profile Manager - Unity desktop indicator
ii account-plugin-facebook 0.12+16.04.20160126-0u all GNOME Control Center account plugin for single signon - facebook
ii account-plugin-flickr 0.12+16.04.20160126-0u all GNOME Control Center account plugin for single signon - flickr
ii account-plugin-google 0.12+16.04.20160126-0u all GNOME Control Center account plugin for single signon
ii accountsservice 0.6.40-2ubuntu11.6 amd64 query and manipulate user account information
ii acl 2.2.52-3 amd64 Access control list utilities
ii acpi-support 0.142 amd64 scripts for handling many ACPI events
ii acpid 1:2.0.26-1ubuntu2 amd64 Advanced Configuration and Power Interface event daemon
ii activity-log-manager 0.9.7-0ubuntu23.16.04. amd64 blacklist configuration user interface for Zeitgeist
ii adduser 3.113+nmu3ubuntu4 all add and remove users and groups
ii adium-theme-ubuntu 0.3.4-0ubuntu1.1 all Adium message style for Ubuntu
ii adwaita-icon-theme 3.18.0-2ubuntu3.1 all default icon theme of GNOME (small subset)
ii aisleriot 1:3.18.2-1ubuntu1 amd64 GNOME solitaire card game collection
ii alien 8.95 all convert and install rpm and other packages
ii alsa-base 1.0.25+dfsg-0ubuntu5 all ALSA driver configuration files
ii alsa-utils 1.1.0-0ubuntu5 amd64 Utilities for configuring and using ALSA
ii amd64-microcode 3.20191021.1+really3.2 amd64 Processor microcode firmware for AMD CPUs
ii anacron 2.3-23 amd64 cron-like program that doesn't go by time
RPM:是由Red Hat 公司开发的包管理系统,功能强大,安装升级查询卸载非常简单,Fedora, Centos都是用这种管理系统。
RPM包的优缺点
优点
包管理系统简单
安装速度快
缺点
不能看原码
功能选择不如源码包灵活
依赖性强,安装a需要先安装b
软件包选择建议:
源码包:给客户大量访问,建议源码包,源码包效率更高(LAMP)
RPM包:少量用户访问或者本地使用,建议RPM包,管理方便
4.安装rpm包
rpm包的命名规则
httpd-2.4.4-1.x86_64.rpm:apache在linux里面就叫httpd,2.4.4版本号,1发布次数,x86_64适合的硬件平台。
包全名:操作未安装的软件包,则使用包全名,而且需要注意绝对路径
包名:操作已经安装的包,使用包名即可,因为系统会产生RPM包的数据库(/var/lib/rpm), 而且不需要注意绝对路径。
练习:centos7用rpm的形式,安装apache
rmp -ivh 全包名
-i: install安装
-v:显示详细信息
-h:打印安装进度
原因:需要先下载挂载到指定目录下,因此这些包都得先挂载,特别麻烦,而且安装中各种依赖,对于安装顺序也有要求,因此出现了 yum 在线安装,解决这些问题。
常见的目rpm安装源有:http://mirrors.163.com/centos/6/os/x86_64/Packages/,下载后用 rmp -ivh 包名 安装即可
YUM
1. rpm软件包形式的管理虽然方便,但是需要手工解决软件包的依赖关系。很多时候安装一个软件安装一个软件需要安装1个或者多个其他软件,手动解决时,很复杂,yum解决这些问题。Yum是rpm的前端程序,主要目的是设计用来自动解决rpm的依赖关系,其特点:
1) 自动解决依赖关系
2) 可以对rpm进行分组,基于组进行安装操作
3) 引入仓库概念,支持多个仓库
4) 配置简单
2. yum仓库用来存放所有的现有的.rpm包,当使用yum安装一个rpm包时,需要依赖关系,会自动在仓库中查找依赖软件并安装。仓库可以是本地的,也可以是HTTP、FTP、nfs形式使用的集中地、统一的网络仓库。
3. 仓库的配置文件/etc/yum.repos.d目录下
1)先将httpd需要的几个rpm包下载到指定目录,不安装,目录为/mnt/cdfom/Packages
yum -y install --downloadonly httpd --downloaddir=/mnt/cdrom/Packages/ 将包下载到指定目录下
[root@macbook Packages]# yum -y install --downloadonly httpd --downloaddir=/mnt/cdrom/Packages/
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.tuna.tsinghua.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 httpd.x86_64.0.2.4.6-97.el7.centos 将被 安装
--> 正在处理依赖关系 httpd-tools = 2.4.6-97.el7.centos,它被软件包 httpd-2.4.6-97.el7.centos.x86_64 需要
--> 正在处理依赖关系 /etc/mime.types,它被软件包 httpd-2.4.6-97.el7.centos.x86_64 需要
--> 正在处理依赖关系 libaprutil-1.so.0()(64bit),它被软件包 httpd-2.4.6-97.el7.centos.x86_64 需要
--> 正在处理依赖关系 libapr-1.so.0()(64bit),它被软件包 httpd-2.4.6-97.el7.centos.x86_64 需要
--> 正在检查事务
---> 软件包 apr.x86_64.0.1.4.8-7.el7 将被 安装
---> 软件包 apr-util.x86_64.0.1.5.2-6.el7 将被 安装
---> 软件包 httpd-tools.x86_64.0.2.4.6-97.el7.centos 将被 安装
---> 软件包 mailcap.noarch.0.2.1.41-2.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
==========================================================================================================================
Package 架构 版本 源 大小
==========================================================================================================================
正在安装:
httpd x86_64 2.4.6-97.el7.centos updates 2.7 M
为依赖而安装:
apr x86_64 1.4.8-7.el7 base 104 k
apr-util x86_64 1.5.2-6.el7 base 92 k
httpd-tools x86_64 2.4.6-97.el7.centos updates 93 k
mailcap noarch 2.1.41-2.el7 base 31 k
事务概要
==========================================================================================================================
安装 1 软件包 (+4 依赖软件包)
总下载量:3.0 M
安装大小:10 M
Background downloading packages, then exiting:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/5): apr-1.4.8-7.el7.x86_64.rpm | 104 kB 00:00:00
(2/5): apr-util-1.5.2-6.el7.x86_64.rpm | 92 kB 00:00:00
(3/5): httpd-tools-2.4.6-97.el7.centos.x86_64.rpm | 93 kB 00:00:00
(4/5): httpd-2.4.6-97.el7.centos.x86_64.rpm | 2.7 MB 00:00:00
(5/5): mailcap-2.1.41-2.el7.noarch.rpm | 31 kB 00:00:00
--------------------------------------------------------------------------------------------------------------------------
总计 4.6 MB/s | 3.0 MB 00:00:00
exiting because "Download Only" specified
[root@macbook Packages]# ls
apr-1.4.8-7.el7.x86_64.rpm httpd-2.4.4-1.x86_64.rpm httpd-tools-2.4.6-97.el7.centos.x86_64.rpm
apr-util-1.5.2-6.el7.x86_64.rpm httpd-2.4.6-97.el7.centos.x86_64.rpm mailcap-2.1.41-2.el7.noarch.rpm
2)使用 rpm -ivh xxxx.rpm安装
[root@macbook Packages]# ls
apr-1.4.8-7.el7.x86_64.rpm httpd-2.4.4-1.x86_64.rpm httpd-tools-2.4.6-97.el7.centos.x86_64.rpm
apr-util-1.5.2-6.el7.x86_64.rpm httpd-2.4.6-97.el7.centos.x86_64.rpm mailcap-2.1.41-2.el7.noarch.rpm
[root@macbook Packages]# rpm -ivh /mnt/cdrom/Packages/httpd-tools-2.4.6-97.el7.centos.x86_64.rpm
错误:依赖检测失败:
libapr-1.so.0()(64bit) 被 httpd-tools-2.4.6-97.el7.centos.x86_64 需要
libaprutil-1.so.0()(64bit) 被 httpd-tools-2.4.6-97.el7.centos.x86_64 需要
这种依赖关系就很强,先安装libapr-1.so.0,还要先下载这个包东西,rpm可能适合先将所有需要的依赖都下载下来,然后在执行安装。
5.安装dpkg包
版本 | 格式 | 工具 |
Ubuntu | .deb | apt,apt-cache,apt-get,dpkg |
Debian | .deb | apt,apt-cache,apt-get,dpkg |
apt和dpkg的区别
apt是会解决和安装模块的依赖问题,并会咨询软件仓库,是在线安装。
dpkg只能安装本地的deb文件,不会关心Ubuntu的软件仓库内的软件,不会解决模块的依赖关系。
两者的区别是dpkg绕过apt包管理数据库对软件包进行操作,所以你用dpkg安装过的软件包用apt可以再安装一遍,系统不知道之前安装过了,将会覆盖之前dpkg的安装。
apt和dpkg就相当于centos的 rpm和yum的关系。
公司项目中基本都是使用dpkg的形式从自己搭建的服务器上安装离线包。
dpkg常用指令
dpkg -i package.deb # 安装一个 Debian 软件包,如手动下载的文件。
dpkg -c package.deb # 列出 package.deb 的内容。
dpkg -I package.deb # 从 package.deb 中提取包信息。
dpkg -r package # 移除一个已安装的包。
dpkg -P package # 完全清除一个已安装的包。和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。
dpkg -L package # 列出 package 安装的所有文件清单。
dpkg -s package # 显示已安装包的信息。
dpkg -reconfigure package # 重新配制一个已经安装的包,如果它使用的是 debconf (debconf 为包安装提供了一个统一的配置界面)。
dpkg -S package # 查看软件在哪个包里;
dpkg -b ${DIR_BUILD} ./icsPortal_${VERSION}_amd64.deb
apt常用指令
sudo apt-get install # package 安装包
sudo apt-get reinstall # package - - reinstall 重新安装包
sudo apt-get remove # package 删除包
sudo apt-get remove --purge # package 删除包,包括删除配置文件等
sudo apt-get autoremove --purge # package 删除包及其依赖的软件包配置文件等
sudo apt-get update # 更新源
sudo apt-get upgrade # 更新已安装的包
sudo apt-get dist-upgrade # 升级系统
apt search :搜索能够安装的xx版本
root@ubuntu:/# apt search pymysql
Sorting... Done
Full Text Search... Done
python-pymysql/xenial-updates,xenial-updates 0.7.2-1ubuntu1 all
Pure-Python MySQL driver - Python 2.x
python3-pymysql/xenial-updates,xenial-updates 0.7.2-1ubuntu1 all
Pure-Python MySQL Driver - Python 3.x
apt-get install -d package_name:只下载不安装xxx二进制包
root@ubuntu:/# apt-get install -d redis-server Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: libjemalloc1 redis-tools Suggested packages: ruby-redis The following NEW packages will be installed: libjemalloc1 redis-server redis-tools # 需要下载三个包 0 upgraded, 3 newly installed, 0 to remove and 96 not upgraded. 2 not fully installed or removed. Need to get 519 kB of archives. After this operation, 1,507 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 libjemalloc1 amd64 3.6.0-9ubuntu1 [78.9 kB] Get:2 http://us.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 redis-tools amd64 2:3.0.6-1ubuntu0.4 [95.5 kB] Get:3 http://us.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 redis-server amd64 2:3.0.6-1ubuntu0.4 [344 kB] Fetched 519 kB in 6s (77.5 kB/s) Download complete and in download only mode
看redis包的安装位置
root@ubuntu:/var/cache/apt/archives# ls |grep redis
redis-server_2%3a3.0.6-1ubuntu0.4_amd64.deb # .deb包
redis-tools_2%3a3.0.6-1ubuntu0.4_amd64.deb
root@ubuntu:/var/cache/apt/archives# pwd
/var/cache/apt/archives # 默认的安装位置
注意:apt-get install -d xxx, 只能将包下载到 /var/cache/apt/archives 下,用户无法指定下载目录,都是用默认目录(因为这个目录是包作者维护的,一般都是默认目录)
apt-get source pkgname --download-only 只下载不安装源码包
xiaoming@iZwz9434lxf5ptexiu13giZ:~$ apt-get source redis-server --download-only
Reading package lists... Done
Picking 'redis' as source package instead of 'redis-server'
NOTICE: 'redis' packaging is maintained in the 'Git' version control system at:
git://github.com/lamby/pkg-redis.git
Please use:
git clone git://github.com/lamby/pkg-redis.git
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 1,413 kB of source archives.
Get:1 http://mirrors.cloud.aliyuncs.com/ubuntu xenial-updates/universe redis 2:3.0.6-1ubuntu0.4 (dsc) [2,135 B]
Get:2 http://mirrors.cloud.aliyuncs.com/ubuntu xenial-updates/universe redis 2:3.0.6-1ubuntu0.4 (tar) [1,373 kB]
Get:3 http://mirrors.cloud.aliyuncs.com/ubuntu xenial-updates/universe redis 2:3.0.6-1ubuntu0.4 (diff) [38.3 kB]
Fetched 1,413 kB in 1s (1,030 kB/s)
Download complete and in download only mode
xiaoming@iZwz9434lxf5ptexiu13giZ:~$ cd /var/cache/ap
apparmor/ apt/
xiaoming@iZwz9434lxf5ptexiu13giZ:~$ cd /var/cache/apt/archives/ # 源码包并没有在默认的位置,源码包在哪里下载就在哪里放置
xiaoming@iZwz9434lxf5ptexiu13giZ:/var/cache/apt/archives$ ls
lock partial ssl-cert_1.0.37_all.deb vsftpd_3.0.3-3ubuntu2_amd64.deb
xiaoming@iZwz9434lxf5ptexiu13giZ:/var/cache/apt/archives$
# 源码包位置,建议要统一目录存放源码包
root@iZwz9434lxf5ptexiu13giZ:/home/xiaoming# ls
redis_3.0.6-1ubuntu0.4.debian.tar.xz redis_3.0.6-1ubuntu0.4.dsc redis_3.0.6.orig.tar.gz
# .dsc 源码包的描述文件,包含包的名称,文件列表和校验信息。
# .tar.xz debian包的打包文件,里面包含编译次源码包并将其打包为debain包的控制文件
# .orig.tar.gz 真正的源代码,dpkg-source xxxx.orig.tar.gz 专门的解压命令解压
apt list:查看已经安装的包
apt几个缺省路径
下载的软件存放位置:/var/cache/apt/archives # apt-get二进制包位置,
安装后软件默认位置:/usr/share
可执行文件位置:/usr/bin
配置文件位置:/etc
库文件位置:/usr/lib
apt-cache 搜索包的管理
apt-cache search redis-server
root@ubuntu:/var/cache/apt/archives# apt-cache search redis-server # 搜索这个包的简要信息,以及使用情况
python-hiredis - redis protocol reader for Python 2.X using hiredis
python3-hiredis - redis protocol reader for Python using hiredis
redis-server - Persistent key-value database with network interface
apt-cache show redis-server:显示这个包的详细信息,大小,依赖等
root@ubuntu:/var/cache/apt/archives# apt-cache show redis-server
Package: redis-server
Architecture: amd64
Version: 2:3.0.6-1ubuntu0.4
Priority: optional
Section: universe/misc
Source: redis
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Chris Lamb <lamby@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 897
Depends: adduser, redis-tools (= 2:3.0.6-1ubuntu0.4), init-system-helpers (>= 1.18~), libc6 (>= 2.14), libjemalloc1 (>= 2.1.1)
Filename: pool/universe/r/redis/redis-server_3.0.6-1ubuntu0.4_amd64.deb
Size: 344118
MD5sum: b5df6ebd74a56c5b2b0151d48c6af898
SHA1: 48459cffc057f3f6a1445ee7ff4cced8b6a5f653
SHA256: f955dec576fa3cf5beb5354aed586f9c0f59fd159eab9631454a1198cac012e2
SHA512: 24f939178cc792fd27a25109f18d9c988df8c98c503d110afe948c90dc204a094ef3b5eb8bcff87d00e6862fcb56c340fa67fe12e0b4209e6720896b5fcf1f3e
Homepage: http://redis.io/
Description-en: Persistent key-value database with network interface
Redis is a key-value database in a similar vein to memcache but the dataset
is non-volatile. Redis additionally provides native support for atomically
manipulating and querying data structures such as lists and sets.
.
The dataset is stored entirely in memory and periodically flushed to disk.
Description-md5: 9160ed1405585ab844f8750a9305d33f
Package: redis-server
Priority: optional
Section: universe/misc
Installed-Size: 896
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Chris Lamb <lamby@debian.org>
sudo apt-cache showpkg package 显示软件包信息,包括包的依赖关系,包的提供者
sudo apt-cache pkgnames 打印软件包列表中所有包的名字
sudo apt-cache dumpavail 打印软件包列表中所有包的简介信息
sudo apt-cache depends package 了解使用依赖
sudo apt-cache rdepends package 是查看该包被哪些包依赖
6. deb包
deb包的特点
1. 主要用于Debain和ubuntu中。dpkg 是Debian Packager 的简写。俗称deb包。
2. 基于tar包,所以同样会记录着文件的权限信息(读、写、可执行)、所有者、用户组等
为什么要将代码打包发布?
1. 新功能新依赖,不能让用这个产品的机器装这个依赖,因此需要把项目运行及所需的环境打成一个包,例如 docker的image,只要在本地机上装上docker执行运行镜像的容器即可。
2.安全考虑,打包其实就是将源代码编译成字节码,二进制形式,防止代码泄露。
练习一:将一个.py文件打成一个deb包
step1:任意位置创建一个空的文件夹
root@iZwz9434lxf5ptexiu13giZ:/home# ls deb_test1 deb_test1.log deb_test1_v1.0.deb test_output uftp vsftpd搭建.md xiaoming xiaowang xiaowang.txt yyz
step2: 按照debain包的规范文件结构,创建目录和文件
boot:放置文件夹的地方,一般是真个工程,我这里放置的是一个.pyc文件
DEBIAN:固定写法
control:这个文件主要描述软件包的名称(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和联系方式)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。最后一行必须为空
Package:yyztest # 程序名称 Version:1.0 # 版本 Description:let me take you to happy planet # 程序说明 Section:net # 类别 utils, net, mail, text, x11 Priority:standard # 软件对于系统重要程序,require, standard, optional, extra Essential:no # 是否是系统最基本的软件包 yes/no yes的话,不允许卸载,除非强制卸载 Architecture:amd64 # 软件支持的平台架构 i386, amd64, m68k, sparc, alpha, powerpc Source:flask_test # 软件包源代码名称 maintainer:yan # 拥有者
#####----没用的到参数----#######
Pre-Depends 软件安装前需要依赖的包
Suggests 建议安装的其他软件和包
Recommends 推荐安装的其他软件和包
postinst:负责完成安装包时的配置工作。如新安装或升级的软件重启服务。软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。
root@iZwz9434lxf5ptexiu13giZ:/home/deb_test1/DEBIAN# cat postinst #!/bin/bash # deb安装完成后先执行这个脚本 # 覆盖重定向 echo "welcome to my wrold, deb already installed " > /home/deb_test1.log
preinst:在Deb包文件解包之前(即软件安装前),将会运行该脚本。可以停止作用于待升级软件包的服务,直到软件包安装或升级完成。本例为空文件
prerm:该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。本例为空文件
postrm:负责修改软件包链接或文件关联,或删除由它创建的文件。软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行。
root@iZwz9434lxf5ptexiu13giZ:/home/deb_test1/DEBIAN# cat postrm #!/bin/bash # 软件卸载后会执行这个脚本 rm -rf /home/deb_test1.log echo "goodbye!"
本例中etc、tmp、opt、usr都是空文件夹
网上usr的使用:
step3:开始打包
# TODO