软件相关概念
ABI
ABI : Application Binary Interface
Windows与Linux不兼容
ELF(Executable and Linkable Format) Linux
PE(Portable Executable)Windows
API
API即Application Programming Interface,API可以在各种不同的操作系统上实现给应用程序提供完全 相同的接口,而它们本身在这些系统上的实现却可能迥异,主流的操作系统有两种,一种是Windows系 统,另一种是Linux系统。由于操作系统的不同,API又分为Windows API和Linux API。在Windows平 台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了软 件移植困难,
POSIX
POSIX 标准的出现就是为了解决上面2个的问题。
POSIX:Portable Operating System Interface 可移植操作系统接口,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。
Linux和windows都要实现基本的posix标准,程序就在源代码级别可移植了。
posix(可移植操作系统接口)
- API 兼容,意味着开发库兼容,因此,源代码可跨平台
- ABI 兼容,编译后的程序可以跨平台
GPL
GPL(GNU通用公共许可证)
如果你发布这样一个程序的副本,不管是收费的还是免费的,你必须将你具有的一切权利给予你的接受者;你必须保证他们能收到或得到源程序;
库
编译好的二进制格式
可执行程序,本身不能作为程序执行入口,但可以被调用
1# 查看二进制程序所依赖的库文件
2ldd /path/xxxfile
3
4#加载配置文件中指定的库文件 (一些编译程序后,可能要执行的命令)
5ldconfig
6
7# 显示本机已经缓存的所有可用库文件名及文件路径映射关系
8ldconfig -p
配置文件
1/etc/ld.so.conf
2/etc/ld.so.conf.d/*.conf
缓存文件
1/etc/ld.so.cache
程序
预编译,编译 汇编 链接
静态链接
动态链接:dll(windows),so(shared object,linux)
os,cpu
注意: os 平台,应用程序必须为特定平台所支持的版本
硬件平台,应用程序必须为特定的cpu 所支持
x86 = 32
软件包
- 二进制文件
- 库文件
- 配置文件
- 帮助文件
二进制程序: /bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
如 nginx /usr/local/nginx
配置文件:/etc
库 :/lib,/usr/lib,/lib64,/usr/local/lib,/usr/local/lib64
帮助文件: man文件,info 文件, README,INSTALL,ChangLog
man COMMAND
到某路径下找与命令同名的通常以.gz结尾的压缩文件的名字 ; /usr/share/man
利用 cpio工具查看包文件列表
1rpm2cpio xxx.rpm |cpio -itv 预览包内文件
2rpm2cpio xxx.rpm |cpio -id "*.conf" 释放包内文件
程序包管理器
软件包管理器功能:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序
包的安装、卸载、查询、升级和校验等管理操作
包管理器应该具有的基本功能
打包、安装、查询、升级、卸载、校验、数据库管理
主流的程序包管理器
-
redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
-
debian:deb文件, dpkg 包管理器
包命名
- 源代码打包文件命名
- name-VERSION.tar.gz|bz2|xz
- VERSION: major.minor.release
linux 内核源码示例
1 linux-5.7.2.tar.xz
- rpm包命名方式
- name-VERSION-release.arch.rpm
- VERSION: major.minor.release
- release:release.OS
- arch
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64
- powerpc: ppc
- 跟平台无关:noarch
示例
1bash-3.2-32.el5_9.1.i386.rpm
2bash-4.2.46-19.el7.x86_64.rpm
3bash-4.4.19-7.el8.x86_64.rpm
4bash-4.4.19-7.el8.aarch64.rpm
5bash-4.4.19-7.el8.ppc64le.rpm
6bc_1.07.1-2_amd64.deb
7bc_1.07.1-2_s390x.deb
分类和拆包
软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中。
包的分类:
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包
安装软件包时,会因为缺少依赖的包,而导致安装包失败。
解决依赖包管理工具:
- yum:rpm包管理器的前端工具
- dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum
- apt:deb包管理器前端工具
- zypper:suse上的rpm前端管理工具
获取程序包的途径
系统发版的光盘或官方网站
1https://www.centos.org/download/
2http://mirrors.aliyun.com
3https://mirrors.huaweicloud.com/
4https://mirror.tuna.tsinghua.edu.cn/
5http://mirrors.sohu.com
6http://mirrors.163.com
7http://cdimage.ubuntu.com/releases/
8http://releases.ubuntu.com
第三方组织提供
- Fedora-EPEL:Extra Packages for Enterprise Linux
1https://fedoraproject.org/wiki/EPEL
2https://mirrors.aliyun.com/epel/
3https://mirrors.cloud.tencent.com/epel/
-
SCL: Software Collections,提供较高版本的第三方软件包
-
Community Enterprise Linux Repository:http://www.elrepo.org,支持最新的内核和硬件相关包
-
Rpmforge:官网:http://repoforge.org/, RHEL推荐,包很全,即将关闭
软件项目官方站点
http://yum.mariadb.org/10.4/centos8-amd64/rpms/
http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/
搜索引擎
注意:第三方包建议要检查其合法性,来源合法性,程序包的完整性
自己制作
将源码文件,利用工具,如:rpmbuild,fpm 等工具制作成rpm包文件
rpm包管理器
安装
rpm -i ,--install
-v:
-vv 详细信息
-vvv
-h :hash 以#的个数显示安装进度 -个#代表%2点进度
rmp -ivh xxxxx.rpm --test //仅测试,不真正执行安装过程
如果存在依赖:
解决依赖关系
忽律依赖关系: --nodeps
已经有了重新安装:
-ivh --replacepkgs
原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件
升级
rpm 包之升级
rpm -U :升级或安装
rpm -F 升级,不存在就不执行安装
rpm -Uvh package_name
rpm -Fvh package_name
升级注意项:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留
查询
1rpm -q package #查询某单个包是否安装
2rpm -qa #查询所有已经安装的包
3rpm -qi package_name #查询包的描述信息
4rpm -ql package_name #查询包安装之后在当前系统生成文件列表
5rpm -qf /path/to/somefile #查询某文件是哪个包安装生成的
6rpm -qd package_name #查询安装后生成的帮助文档
7rpm -qc package_name #查询安装后生成的配置文件
8rpm -q --scripts package_name #查询包相关的脚本
9
10查询尚未安装的rpm包文件的相关信息:
11 查询安装后会生成的文件列表:rpm -qpl /path/to/pack_file
12 查询其描述信息:rpm -qpi /path/to/package_file
包卸载
rpm -e , –erase
rpm -e package_name
-–test : 卸载测试
rpc {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers] [–test] PACKAGE_NAME …
如果卸载被其他程序所依赖的包: 1.把依赖者一同卸载 2.忽律依赖关系 –nodeps (不建议) 3.不再卸载
包校验
检查包的完整性和签名
rpm -K|–checksig rpmfile
在检查包的来源和完整性前,必须导入所需要公钥
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录至rpm相关的数据库中,可以用来检查包中的文件是否和当初安装时有所变化
1[vagrant@maozhongyu yum]$cd /etc/pki/
2[vagrant@maozhongyu pki]$ls
3CA ca-trust java nssdb rpm-gpg rsyslog tls
4[vagrant@maozhongyu pki]$cd rpm-gpg/
5[vagrant@maozhongyu rpm-gpg]$ls
6RPM-GPG-KEY-CentOS-7 RPM-GPG-KEY-EPEL-7
7RPM-GPG-KEY-CentOS-Debug-7 RPM-GPG-KEY-puppetlabs-PC1
8RPM-GPG-KEY-CentOS-Testing-7
9[vagrant@maozhongyu rpm-gpg]$rpm -V centos-release
10S.5....T. c /etc/issue
11.......T. c /etc/issue.net
12[vagrant@maozhongyu rpm-gpg]$rpm -qf /etc/issue
13centos-release-7-2.1511.el7.centos.2.10.x86_64
1检查包安装后生成的文件是否被修改过
2 rpm -V package_name
3 S file_size
4 M 权限
5 5 文件内容md5不一样
6 D 主设备号,
7 L 路径改变
8 U
9 G
10 T
11 P
12
13 rpm包管理:检验来源合法性和软件包完整性
14 包完整性:通过单向加密机制(md5|sha1)
15 来源合法性:通过公钥加密机制(RSA)
16 倒入制作者的公钥:centos 发行版的公钥在iso文件中
17 倒入命令 rpm --import /path/to/gpg-key-file
18 检查 rpm -K /path/to/package_file 或者 rpm --checksig /path/to/package_file
19 --nosignature : 不检查来源合法性
20 --nodigest :不检查完整性
数据库重建
rpm包安装时生成的信息,都放在rpm数据库中
1/var/lib/rpm
可以重建数据库
rpm --initdb; 初始化
如果事先不存在一个数据库,则新建之
rpm --rebuilddb 重建
直接重建数据库,会覆盖原有的库;
yum和dnf
CentOS 使用 yum, dnf 解决rpm的包依赖关系
YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
yum/dnf 工作原理
yum/dnf 是基于C/S 模式
yum 服务器存放rpm包和相关包的元数据库
yum 客户端访问yum服务器进行安装或查询等
yum 实现过程
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询远数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。
yum客户端配置
yum客户端配置文件
1/etc/yum.conf #为所有仓库提供公共配置
2/etc/yum.repos.d/*.repo: #为每个仓库的提供配置文件
帮助参考: man 5 yum.conf
repo仓库配置文件指向的定义:
配置文件有2段组成
1[main]
2主配置段
3
4[repositoryID]
5name=Some name for this repository
6baseurl=url://path/to/repository/ (仓库的访问路径)
7enabled={1|0}
8gpgcheck={1|0}
9gpgkey=URL # 公钥文件(可以在本地,也可是服务器路径)
10enablegroups={1|0}
11failovermethod={roundrobin|priority}
12 roundrobin:意为随机挑选,默认值
13 priority:按顺序访问
14cost= 默认为1000
baseurl:
1ftp ftp://server/path/to/repo
2http http://server/path/to/repo
3nfs nfs://server/nfs_path
4file file://path/to/repository
注意:yum仓库指向的路径一定必须是repodata目录所在目录
yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号,如:8,7,6
$arch: CPU架构,如:aarch64, i586, i686,x86_64等
$basearch:系统基础平台;i386, x86_64
$contentdir:表示目录,比如:centos-8,centos-7
$YUM0-$YUM9:自定义变量
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i386
yum源
Rocky 系统的yum源
1#南京大学
2https://mirror.nju.edu.cn/rocky/$releasever/ #上海交大
3https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/ #山东大学
4https://mirrors.sdu.edu.cn/rocky/$releasever/
CentOS系统的yum源
1#阿里云
2https://mirrors.aliyun.com/centos/$releasever/ #腾讯云
3https://mirrors.cloud.tencent.com/centos/$releasever/ #华为云
4https://repo.huaweicloud.com/centos/$releasever/ #清华大学
5https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/
EPEL的yum源
1#阿里云
2https://mirrors.aliyun.com/epel/$releasever/x86_64
3#腾讯云
4https://mirrors.cloud.tencent.com/epel/$releasever/x86_64
5#华为云
6https://mirrors.huaweicloud.com/epel/$releasever/x86_64
7#清华大学
8https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/x86_64
用脚本实现创建yum仓库配置文件
1[root@centos7 ~]# cat yum.sh
2#!/bin/bash
3mkdir /etc/yum.repos.d/backup
4mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
5cat > /etc/yum.repos.d/base.repo <<EOF
6[base]
7name=base
8baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch
9gpgcheck=0
10EOF
为CentOS 8 配置 yum 的系统和EPEL源仓库
1[root@centos8 ~]#cat /etc/yum.repos.d/base.repo
2[BaseOS]
3name=BaseOS
4baseurl=file:///misc/cd/BaseOS
5gpgcheck=1
6gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
7[AppStream]
8name=AppStream
9baseurl=file:///misc/cd/AppStream
10gpgcheck=0
11[epel]
12name=EPEL
13baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
14gpgcheck=0
15enabled=1
16[extras]
17name=extras
18baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os
19gpgcheck=0
注意:与之前的版本不同,CentOS 8 系统有两个yum 源:BaseOS和AppStream ,需要分别设置两个仓库
yum-config-manager命令
可以生成yum仓库的配置文件及启用或禁用仓库,来自于yum-utils包
增加仓库 yum-config-manager –add-repo URL或file
1[root@centos8 ~]#rpm -qf `which yum-config-manager `
2dnf-utils-4.0.2.2-3.el8.noarch
3[root@centos8 ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo
4Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/dockerce.repo
5[root@centos8 ~]#ls /etc/yum.repos.d/
6backup base.repo docker-ce.repo
禁用仓库 yum-config-manager –disable “仓库名” #启用仓库
yum-config-manager –enable “仓库名”
自己创建yum仓库
下载所有yum仓库的相关包和meta 数据
1#CentOS 8 dnf 工具集成
2dnf reposync --help #查看帮助
3#默认只下载rpm包,不下载 meta数据,需要指定--download-metadata 才能下载 meta
4dnf reposync --repoid=REPOID --download-metadata -p /path
5#CentOS 7 以前版本,reposync工具来自于yum-utils包
6reposync --repoid=REPOID --download-metadata -p /path
创建私有yum仓库
createrepo [options]
11.搞个目录里面有很多rpm 包
22.create repo directory_name
33.cd /etc/yum.repos.d/
44.vim directory_name.repo
5 [openstack]
6 name=Openstack Repository
7 baseurl= http://ip/openstack ##目录在www的openstack 这个是基于http的。 还有其他协议支持
8 enabled=1
9 gpgcheck=0 #不监测
105. yum repolist
11 yum list all | grep openstack 其实就是多了这个仓库了
12
13测试实现 yum repository 的配置
14 1.准备文件服务器,使用httpd为列,请事先确保已经安装httpd程序包
15 2.在/var/www/html目录,使用一个目录来保存准备制作成yum仓库的所有rpm包
16 3.并安装上里面的包
下载阿里云的extras源,制作私有yum源
1[root@repo-server ~]#yum repolist
2[root@repo-server ~]#dnf reposync --repoid=extras --download-metadata -p
3/var/www/html/centos
4[root@repo-server ~]#ls /var/www/html/centos/
58 extras
6[root@repo-server ~]#ls /var/www/html/centos/extras/
7Packages repodata
8
9[root@repo-client ~]#cat /etc/yum.repos.d/test.repo
10[BaseOS]
11name=BaseOS
12baseurl=http://10.0.0.8/centos/8/BaseOS
13gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
14[AppStream]
15name=Appstream
16baseurl=http://10.0.0.8/centos/8/AppStream/
17gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
18[extras]
19name=extras
20baseurl=http://10.0.0.8/centos/extras/
yum常用命令
1yum list | wc -l #看看多少个包
2yum list [all| installed| available] #installed 已经安装的。 available可用的尚未安装的 //列出包
3
4yum info package_name;
5yum clean all # /var/cache/yum/x86_64/7/base 会被清空
6yum clean [all|packages|metadata|expire-cache|rpmdb|plugins]: #清理缓存
7#查询组信息
8yum grouplist
9#看包组信息
10yum groupinfo "package_group_name"
11yum install package_name ...; #安装指定程序包
12yum reinstall package_name;#重新安装
13yum check-update #检查升级
14yum update package_name #升级指定的程序包
15 #现在的版本x-1.2.1 x-1.2.2 x-1.2.3
16 #要升级到指定版本 yum update x-1.2.2
17yum remove|erase package_name #删除包
18
19yum provides|whatprovides /path/to/somefile #查询某文件是哪个包安装生成的
20yum provides ifconfig (centos7 默认没装)
21#例如 yum provides /etc/passwd
22yum groupinstall "group_name";#安装指定的包组
23yum groupremove "group_name" #卸载指定的包组
24
25#安装本地包
26yum install /path/to/package_file
27#手动禁止检查来源及完整性 --nogpgcheck
28yum install /tmp/zsh-2.3.1.2-el6.x86_64.rpm --nogpgcheck
只下载相关的依赖包,而不安装
1#/data/目录如果不存在,会自动创建
2[root@centos8 ~]#yum -y install --downloadonly --downloaddir=/data/httpd httpd
3[root@centos8 ~]#ls /data/httpd/
4apr-1.6.3-9.el8.x86_64.rpm httpd-2.4.37-
516.module_el8.1.0+256+ae790463.x86_64.rpm
6apr-util-1.6.1-6.el8.x86_64.rpm httpd-filesystem-2.4.37-
716.module_el8.1.0+256+ae790463.noarch.rpm
8apr-util-bdb-1.6.1-6.el8.x86_64.rpm httpd-tools-2.4.37-
916.module_el8.1.0+256+ae790463.x86_64.rpm
10apr-util-openssl-1.6.1-6.el8.x86_64.rpm mailcap-2.1.48-3.el8.noarch.rpm
11centos-logos-httpd-80.5-2.el8.noarch.rpm mod_http2-1.11.3-
123.module_el8.1.0+213+acce2796.x86_64.rp
注意: 下载包也可以通过启用配置文件实现
1[root@centos7 ~]# cat /etc/yum.conf
2[main]
3cachedir=/var/cache/yum/$basearch/$releasever #缓存路径
4keepcache=1 #如果为1,则下载rpm并缓存下来,不删除,默认安装rpm后会删除rpm包
查看yum事务历史
CentOS 7以前版本日志 : /var/log/yum.log
CentOS 8 版本日志 : /var/log/dnf.rpm.log 、 /var/log/dnf.log
Ubuntu 软件管理
Debian软件包通常为预编译的二进制格式的扩展名".deb",类似rpm文件,因此安装快速,无需编译软 件。包文件包括特定功能或软件所必需的文件、元数据和指令
- dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
- apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构,类似于yum
dpkg 常见用法
1#删除包,不建议,不自动卸载依赖于它的包
2dpkg -r package
3#删除包(包括配置文件)
4dpkg -P package
5#列出当前已安装的包,类似rpm -qa
6dpkg -l
7#显示该包的简要说明
8dpkg -l package
9#列出该包的状态,包括详细信息,类似rpm –qi
10dpkg -s package
11#列出该包中所包含的文件,类似rpm –ql
12dpkg -L package
13#搜索包含pattern的包,类似rpm –qf
14dpkg -S <pattern>
15#配置包,-a 使用,配置所有没有配置的软件包
16dpkg --configure package
17#列出 deb 包的内容,类似rpm –qpl
18dpkg -c package.deb
19#解开 deb 包的内容
20dpkg --unpack package.deb
注意:一般建议不要使用dpkg卸载软件包。因为删除包时,其它依赖它的包不会卸载,并且可能无法再正常运行
apt
apt 相当于 apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。 ubuntu16.04引入。
APT包索引配置文件
1/etc/apt/sources.list
2/etc/apt/sources.list.d
修改阿里云的APT源为清华源
1root@ubuntu2004:~# sed -i 's/mirrors.aliyun.com/mirrors.tuna.tsinghua.edu.cn/'
2/etc/apt/sources.list
常用命令
1#安装包:
2apt install tree zip
3#安装deb包,注意:包文件前必须加路径
4apt install ./mongodb-database-tools-ubuntu1804-x86_64-100.5.1.deb
5#安装图形桌面
6apt install ubuntu-desktop
7#删除包:
8apt remove tree zip
9
10#说明:apt remove中添加--purge选项会删除包配置文件,谨慎使用
11#更新包索引,相当于yum clean all;yum makecache
12apt update
13#升级包:要升级系统,请首先更新软件包索引,再升级
14apt upgrade
15#apt列出仓库软件包,等于yum list
16apt list
17#搜索安装包
18apt search nginx
19#查看某个安装包的详细信息
20apt show apache2
21#在线安装软件包
22apt install apache2
23#卸载单个软件包但是保留配置⽂件
24apt remove apache2
25#删除安装包并解决依赖关系
26apt autoremove apache2
27#更新本地软件包列表索引,修改了apt仓库后必须执⾏
28apt update
29
30#卸载单个软件包删除配置⽂件
31apt purge apache2
32#升级所有已安装且可升级到新版本的软件包
33apt upgrade
34#升级整个系统,必要时可以移除旧软件包。
35apt full-upgrade
36#编辑source源⽂件
37apt edit-sources
38#查看仓库中软件包有哪些版本可以安装
39apt-cache madison nginx
40#安装软件包的时候指定安装具体的版本
41apt install nginx=1.14.0-0ubuntu1.6
42#查看文件来自于哪个包,类似redhat中的yum provides <filename>
43apt-file search 'string' #默认是包含此字符串的文件
44apt-file search -x '正则表达式'
45apt-file search -F /path/file
46
47# 查看文件的依赖
48apt depends keepalived
ubuntu建议安装的常用包
1[root@ubuntu1804 ~]#apt purge ufw lxd lxd-client lxcfs liblxc-common
2[root@ubuntu1804 ~]#apt install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev
3zlib1g-dev gcc openssh-server iotop unzip zip