目录
软件运行和编译
1.1软件相关概念
1.1.1 ABI
ABI即 Application Binary Interface
Windows与Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
库级别的虚拟化
Linux: WINE
Windows:Cygwin
1.1.2 API
API即Application Programming lnterface,API可以在各种不同的操作系统上实现给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能洞异,主流的操作系统有两种,一种是Windows系统,另一种是Linux系统。由于操作系统的不同,API又分为Windows API和Linux AP1。在Windows平台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了软件移植困难,POSIX标准的出现就是为了解决这个问题
POSIX: Portable Operating System lnterface 可移植操作系统接口,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。Linux和windows都要实现基本的posix标准,程序就在源代码级别可移植了
1.1.3 开发语言
系统级开发
- 汇编语言
- C
- C++
应用级开发
- java
- Python
- go
- php
- perl
- delphi
- basic
- ruby
- bash
1.2 C语言程序的实现过程
C程序源代码 --> 预处理 --> 编译 --> 汇编 ->链接
- 预处理(Pre-Processing)
- 编译 (Compiling)
- 汇编 (Assembling)
- 链接 (Linking)
gcc编译过程范例:
这里有一个hello.c文件
#分步骤编译运行
gcc -E he11o.c -o he11o.i 对he11o.c文件进行预处理,生成了he11o.i 文件
gcc -s he11o.i -o he11o.s 对预处理文件进行编译,生成了汇编文件
gcc -c he11o.s -o he11o.o 对汇编文件进行编译,生成了目标文件
gcc he11o.o -o he11o 对目标文件进行链接,生成可执行文件
#一步实现编译过程
gcc he11o.c -o he11o 直接编译链接成可执行目标文件
1.3 软件模块的静态和动态链接
链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态和动态链接
1.3.1 静态链接
-
把程序对应的依赖库复制一份到包
-
生成模块文件libxxx.a
-
嵌入程序包
-
升级难,需重新编译
-
占用较多空间,迁移容易
1.3.2 动态链接
-
只把依赖加做一个动态链接
-
生成模块文件libxxx.so
-
连接指向
-
占用较少空间,升级方便
1.3.3 模块 (库) 文件
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件:
ldconfig #加载配置文件中指定的库文件
/sbin/ldconfig -p #显示本机已经缓存的所有可用库文件名及文件路径映射关系
配置文件
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
缓存文件
/etc/ld.so.cache
1.4 Java程序编译运行过程
2 软件包和包管理器
2.1 软件包介绍
开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软件。
用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具dpkg也就应运而生,可用来管理deb后缀的"包"文件。从而著名的"package"概念第一次出现在GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统
2.1.1 软件包中的文件分类
- 二进制文件
- 库文件
- 配置文件
- 帮助文件
范例:利用cpio工具查看包文件列表
rpm2cpio 包文件|cpio -itv 预览包内文件
rpm2cpio 包文件|cpio -id “*.conf”释放包内文件
2.1.2 程序包管理器
软件包管理器功能
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序包的安装.卸载、查询、升级和校验等管理操作
主流的程序包管理器
- redhat: rpm文件,rpm包管理器,rpm: edhat Package Manager,RPM Package Manager
- debian: deb文件,dpkg 包管理器
例: 统计rpm的架构类型及相应的包数量(先进入/misc/cd/BaseOS/Packages)
#ls *.rpm |rev|cut -d. -f2|rev|sort|uniq -c 将当前目录下文件反转后以.为分隔符取第二列再反转回然后排序最后统计不同字符串的数量
403 i686
224 noarch
1082 x86_64
#ls *.rpm | egrep -o '[^.]+\.rpm$'|cut -d. -f1|sort|uniq -c 与上面等价,使用cut与正则表达式
#ls *.rpm | egrep -o '[^.]+\.rpm$'|egrep -o '^[^.]+'|sort|uniq -c 与上面等价,使用正则表达式
2.1.3 包的命名
源代码打包文件命名
name-VERSION.tar.gzlbz2|xz
VERSION: major.minor.release
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
2.1.4 分类和拆包
软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中
包的分类
- Application-VERSION-ARCHrpm 主包
- Application-devel-VERSION-ARCHrpm 开发子包
- Application-utils-VERSION-ARHC.rpm 其它子包
- Application-libs-VERSION-ARHC.rpm 其它子包
2.1.5 包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包
安装软件包时,会因为缺少依赖的包,而导致安装包失败。
解决依赖包管理工具:
- yum rpm包管理器的前端工具
- dnf Fedora 18+ rpm包管理器前端管理工具,Centos 8 版代替 yum
- apt deb包管理器前端工具
- zypper suse上的rpm前端管理工具
2.1.6 程序包管理器相关文件
1.包文件组成(每个包独有)
- 包内的文件
- 元数据,如 包的名称,版本,依赖性,描述等
- 可能会有包安装或卸载时运行的脚本
2.数据库(公共): /var/lib/rpm
- 程序包名称及版本
- 依赖关系
- 功能说明
- 包安装后生成的各文件路径及校验码信息
2.1.7 获取程序包的途径:
软件包需要事先将源码进行编译后打包形成,获取包的途径如下
2.1.7.1 系统发版的光盘或官方网站
Centos 镜像
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
Ubuntu 镜像
http://cdimage.ubuntu.com/releases/
http://releases.ubuntu.com
2.1.7.2 第三方组织提供
Fedora-EPEL: Extra Packages for Enterprise Linux
https://fedoraproject.org/wiki/EPEL
https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr
Rpmforge: 官网: http://repoforge.org/, RHEL推荐,包很全,即将关闭
Community Enterprise Linux Repository: http://www.elrepo.org/, 支持最新的内核和硬件相关包
2.1.7.3 软件项目官方站点
http://yum.mariadb.org/10.4/centos8-amd64/rpms/
http://repo.mysgl.com/yum/mysgl-8.0-community/el/8/x86_64/
2.1.7.4 搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
注意:
第三方包建议要检查其合法性,来源合法性,程序包的完整性
2.1.7.5 自己制作
将源码文件,利用工具,如: rpmbuild,fpm等工具制作成rpm包文件
包管理器rpm
CentoS系统上使用rpm命令管理程序包
功能:
- 安装、卸载 (常存在依赖性导致失败,不推荐使用)
- 升级、查询、校验、数据库维护
3.1 安装
格式
rpm {-i|--install} [install-options] PACKAGE_FILE..
选项:
-v verbose
-VV
-h 以#显示程序包管理执行进度
-i 安装
-e 卸载
-q 查找
-qi 查看包的详细描述信息,不跟路径,跟包名即可
-ql 查看包在系统中生成的文件,不跟路径,跟包名即可
-qf 查看磁盘上某文件来自于哪个包,后跟路径。功能依赖于rpm的公共索引数据库
-qpi rpm包 不安装查看包的相信描述信息,-p表示后面跟的是rpm包的具体文件路径
-qpl rpm包 列出包将来会在系统中生成的文件
--repalcepkgs | force 覆盖安装|强制安装(当文件存在时)
常用组合:
rpm -ivh PACKAGE_FILE...
rpm包安装[install-options]
–test: 测试安装,但不真正执行安装,即dry run模式
例:
#rpm -q zip查询zip包是否存在,下载包时可以配合&> /null 和yum使用
#rpm -qa|grep http 模糊匹配名中带有http的包
libnghttp2-1.33.0-3.el8_2.1.x86_64
#rpm -qa "*http*"
libnghttp2-1.33.0-3.el8_2.1.x86_64
3.2 升级和降级
rpm包升级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE..
rpm {-F|--freshen} [instal-options] PACKAGE_FILE...
-
upgrade 安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
-
freshen 安装有旧版程序包,则“升级”,如果不存在旧版程序包,则不执行升级操作
–oldpackage 降级
–force 强制安装
常用组合
rpm -Uvh PACKAGE_FILE...
rpm -Fvh PACKAGE_FILE...
升级注意项:
- 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
- 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留
3.3 包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]:
-a 所有包
-f 查看指定的文件由哪个程序包安装生成
-p rpmfile 针对尚未安装的程序包文件做查询操作
[query-options]:
--changelog 查询rpm包的changelog
-c 查询程序的配置文件
-d 查询程序的文档
-i information
-l 查看指定的程序包安装后生成的所有文件
--scripts 程序包自带的脚本
与CAPABILITY(文件等)相关
--whatprovides CAPABILITY 查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY 查询指定的CAPABILITY被哪个包所依赖
--provides 列出指定程序包所提供的CAPABILITY
-R 查询指定的程序包所依赖的CAPABILITY
常用查询用法
-qa
-q PACKAGE
-qi PACKAGE
-qc PACKAGE
-ql PACKAGE
-qd PACKAGE
-q --scripts PACKAGE
-qf FILE
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE,...
3.4 包卸载
格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
注意:当包卸载时,对应的配置文件不会删除,以FILENAME.rpmsave形式保留
#rpm -e rpm --nodeps 忽略依赖性,即强行卸载rpm
#reboot进入rescue模式
#mkdir /mnt/cdrom 创建临时目录以将光盘挂载
#mount /dev/sr0 /mnt/cdrom 将/dev/sr0挂载到/mnt/cdrom
#rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.el7.x86_64.rpm --root=/mnt/sysimage
#使用rescue模式下的rpm命令安装rpm-4.11~~包到真正的根目录下
#reboot 重启
3.5 包校验
在安装包时,系统也会检查包的来源是否是合法的
rpm -K|--checksig rpmfile 检查包的完整性和签名
在检查包的来源和完整性前,必须导入所需要公钥:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial 导入CentOS8的密钥
rpm -qa "gpg-pubkey*" 查询导入的密钥
例: 最后写着 signatures OK
#rpm -K /var/cache/PackageKit/8/metadata/baseos-8-x86_64/packages/kernel-4.18.0-348.7.1.el8_5.x86_64.rpm
/var/cache/PackageKit/8/metadata/baseos-8-x86_64/packages/kernel-4.18.0-348.7.1.el8_5.x86_64.rpm: digests signatures OK
校验:软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录下来,可以用来检查包中的文件是否和当初安装时有所变化
rpm {-V|--verify} [select-options] [verify-options]
S file size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P capabilities differ
例:
#rpm -Va 系统里所有被修改的文件
.M....... /var/lib/AccountsService/icons
S.5....T. c /etc/bashrc
S.5....T. c /etc/profile
3.6 数据库
rpm包安装时生成的信息,都放在rpm数据库中
/var/lib/rpm
可以重建数据库
rpm {--initdb|--rebuilddb}
initdb 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb 重建已安装的包头的数据库索引目录
yum和dnf
Centos使用yum,dnf解决rpm的包依赖关系
YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包
up2date的替代工具,CentOS 8用dnf代替了yum,不过保留了和yum的兼容性,配置也是通用的
4.1 yum/dnf 工作原理
yum/dnf是基于C/S模式
- yum服务器存放rpm包和相关包的元数据库
- yum客户端访问yum服务器进行安装或查询等
yum实现过程
- 先在yum服务器上创建 yum repository (仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),
- 当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询远数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装
yum服务器的仓库可以多种形式存在:
file:// 本地路径
http://
https://
ftp://
注意:yum仓库指向的路径一定必须是repodata目录所在目录
如:https://repo.huaweicloud.com/centos/8-stream/AppStream/x86_64/os/repodata/,yum仓库指向即前面的到os/结束
4.2 yum客户端配置
yum客户端配置文件
/etc/yum.conf #为所有仓库提供公共配置
/etc/yum. repos . d/* . repo: #为每个仓库的提供配置文件
帮助参考: man 5 yum.conf
相关变量
yum的repo配置文件中可用的变量:
- $releasever 当前OS的发行版的主版本号,如: 8,7,6
- $arch CPU架构,如: aarch64,i586,i686,x86_64等
- $basearch 系统基础平台; i386,x86_64
- $contentdir 表示目录,比如: centos-8,centos-7
- Y U M O − YUMO- YUMO−YUM9 自定义变量
范例: CentOS 8配置文件
#ll /etc/yum.conf
lrwxrwxrwx. 1 root root 12 Sep 18 2021 /etc/yum.conf -> dnf/dnf.conf
#cat /etc/yum.conf
[main]
gpgcheck=1 #安装包前要做包的合法和完整性校验
insta1lonly_limit=3 #同时可以安装3个包,最小值为2,如设为0或1,为不限制
clean_requirements_on_remove=True #删除包时,是否将不再使用的包删除
best=True #升级时,自动选择安装最新版,即使缺少包的依赖
repo仓库配置文件指向的定义
[repositoryID]
name=Some name for this repository
baseur1=ur1://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enabTegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin: 意为随机挑选,默认值
priority:按顺序访问
cost= 默认为1000
baseurl指向的路径:
阿里云提供了写好的Centos和ubuntu的仓库文件下载链接
http://mirrors.aliyun.com/repo
CentOS系统的yum源:
#阿里云
https://mirrors.aliyun.com/centos/KaTeX parse error: Expected 'EOF', got '#' at position 22: …ever/os/x86_64 #̲华为云 https://mir…releasever/os/x86_64
EPEL的yum源
#阿里云
https://mirrors.aliyun.com/epel/$releasever/x86_64
阿里巴巴开源软件
https://opsx.alibaba.com/
阿里云:https://mirrors.aliyun.com
华为云:https://repo.huaweicloud.com
范例:为CentOS 7用系统安装光盘作的本地yum仓库
#挂载光盘至某目录,如/mnt/cdrom
mount /dev/cdrom /mnt/cdrom
#创建配置文件
[root@centos7 ~]#vim /etc/yum.repos.d/centos7.repo
[Centos7]
name=Centos 7
baseur1=file:///mnt/cdrom
gpgcheck=0
enabTed=1
范例:为Centos8配置 yum 的系统和EPEL源仓库
[root@centos8 ~]#cat /etc/yum.repos.d/base.repo
[Baseos]
name=Baseos
baseur1=file:///misc/cd/Baseos
gpgcheck=1
gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[Appstream]
name=Appstream
baseur1=file:///misc/cd/Appstream
gpgcheck=0
[epe1]
name=EPEL
baseur7=http://mirrors.aliyun.com/epel/Sreleasever/Everything/$basearch
gpgcheck=0
enabled=1
[extras]
name=extras
baseur1=https://mirrors.aliyun.com/centos/Sreleasever/extras/$basearch/os
gpgcheck=0
注意:与之前的版本不同,CentOS 8系统有两个yum 源: BaseOS和AppStream,需要分别设置两个仓库
yum-config-manager命令 可以生成yum仓库的配置文件及启用或禁用仓库,来自于yum-utils包
直接修改文件
格式:
#增加仓库
yum-config-manager --add-repo URL或file
#禁用仓库
yum-config-manager --disable “仓库名”
#启用仓库
yum-config-manager --enable “仓库名”
创建yum仓库配置的脚本sh:
#!/bin/bash
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat >/etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=file:///misc/cd/ 学习期间使用这个,优先使用光盘
https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch
gpgcheck=0
[extras]
name=extra
baseurl=https://mirrors.aliyun.com/centos/\$releasever/extras/\$basearch
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/\$releasever/\$basearch
gpgcheck=0
EOF
4.3 yum命令
4.3.1 显示仓库列表
yum repolist [OPTION] 默认只显示启用的仓库
OPTION:
all 显示所有仓库,包括启用与未启用
enabled 显示启用仓库
disabled 显示未启用仓库
--enablerepo=NAME 使用命令临时启用NAME仓库(不修改文件)
--disablerepo=NAME 使用命令临时禁用NAME仓库
例:
#yum --enablerepo=ep* repolist 临时启用名为ep*的仓库
#yum --disablerepo=* --enablerepo=App* --enablerepo=Ba* list available
available 显示未被安装的包
4.3.2 显示程序包
yum repolist
4.3.3 安装程序包
yum install packagel [package2] [...]
yum reinstall packagel [package2] [...] #重新安装
4.3.4 卸载程序包
yum remove | erase packagel [package2] [...]
4.3.5 升级和降级
yum update [packagel] [package2] [...]
yum downgrade packagel [package2] [...] (降级)
yum update 升级所有的能升级的
检查可用升级:
yum check-update
4.3.6 查询
查看程序包information:
yum info [...] 等价于 rpm -qi
查看指定的特性(可以是某文件)是由哪个程序包所提供
yum provides | whatprovides featurel [feature2] [...]
以指定的关键字搜索程序包名及summary信息
yum search string1 [string2] [...]
查看指定包所依赖的capabilities,并显示来源哪个包
yum deplist package1 [package2] [...]
4.3.7 仓库缓存
清除目录/var/cache/yum/缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建缓存:
yum makecache
4.3.8 查看yum事务历史
yum 执行安装卸载命令会记录到相关日志中
日志文件:
/var/log/dnf.log C8上
/var/log/yum.log C7
日志命令
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
4.3.9 安装及升级本地程序包
yum localinstall|install rpmfile1 [rpmfile2] [...l
yum localupdate|update rpmfile1 [rpmfile2] [...]
4.3.10 包组管理的相关命令
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist|group list [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...] 查看包组的镶嵌信息
4.3.11 实现私用yum仓库
下载所有yum仓库的相关包和meta 数据
#Centos 8 dnf 工具集成
dnf reposync --he1p #查看帮助
dnf reposync --repoid=REPOID --download-metadata -p /path
默认只下载rpm包,而不下载meta元数据,需要指定–download-metadata才能下载
#Centos 7 以前版本,reposync工具来自于yum-uti1s包
reposync --repoid=REPOID --download-metadata -p /path
例:
[root@repo-server ~]#dnf reposync --repoid=extras --download-metadata -p /var/www/html/centos/
CentOS Linux 8 - Extras 203 B/s | 1.5 kB 00:07
CentOS Linux 8 - Extras 2.1 kB/s | 16 kB 00:07
(1/38): centos-release-advanced-virtualization-1.0-4.el8.noarch.rpm 5.6 kB/s | 16 kB 00:02
(2/38): centos-release-ceph-octopus-1.0-1.el8.noarch.rpm 13 kB/s | 8.8 kB 00:00
(3/38): centos-release-ceph-nautilus-1.2-2.el8.noarch.rpm 2.5 kB/s | 8.8 kB 00:03
(4/38): centos-release-ansible-29-1-2.el8.noarch.rpm 1.8 kB/s | 8.4 kB 00:04
(5/38): centos-release-ceph-pacific-1.0-1.el8.noarch.rpm 4.5 kB/s | 8.8 kB 00:01
[root@repo-server extras]#ls /var/www/html/centos/extras/
Packages repodata
创建私有yum仓库
createrepo [options] <directory>
范例:创建局域网的基于Base的私有yum源
#仓库服务器配置
[root@repo-server ~]#yum -y instal1 httpd
[root@repo-server ~]#systemct] enable --now httpd
[root@repo-server ~]#mkdir /var/www/html/centos/8 -pv
[root@repo-server ~]#mount /dev/sr0 /mnt/ 工作中,直接拷贝目录
[root@repo-server ~]#cp -a /mnt/* /var/www/html/centos/8 工作
[root@repo-client ~]#mount /dev/sr0 /var/www/html/centos/8 学习中,直接挂载
#yum客户端配置
[root@repo-client yum.repos.d]#cat test.repo
[BaseOS]
name=BaseOS
baseurl=http://10.0.0.209/centos/8/BaseOS/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[AppStream]
name=AppStream
baseurl=http://10.0.0.209/centos/8/AppStream/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[extras]
name=extras
baseurl=http://10.0.0.209/centos/extras/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[root@repo-client yum.repos.d]#yum repolist all
repo id repo name status
AppStream AppStream enabled
BaseOS BaseOS enabled
extras extras enabled
#下载相关仓库包和元数据
[root@centos8 ~]#dnf reposync --repoid=epe1 --download-metadata -p /var/www/htm7
#--download-metadata 加此选项可以下载元数据
#下面两个步骤只有没meta数据才需要执行
#[root@centos8 ~]#dnf -y insta11 createrepo httpd
#[root@centos8 ~]#createrepo /var/www/htm1/epe1
[root@centos8 ~]#1s /var/www/html/epe1/
Packages repodata
[rootacentos8 ~]#systemct1 enable --now httpd 使下次启动系统,服务仍然启动
[root@centos8 ~]#vim /etc/yum.repos.d/base.repo
[epe1]
name=EPEL
baseur1=http://10.0.0.100/epel/
4.3.12 DNF 介绍
DNF,即DaNdiFied,是新一代的RPM软件包管理器,发行日期是2015年5月11日,DNF 包管理器采用Python 编写,发行许可为GPLV2,首先出现在Fedora 18 发行版中在RHEL 8.0 版本正式取代了YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等
配置文件:
/etc/dnf/dnf.conf
仓库文件:
/etc/yum.repos.d/ *.repo
日志
/var/log/dnf.rpm.1og
/var/log/dnf.log
DNF使用帮助:man dnf
dnf用法与yum一致
dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf reposync
dnf instal1 httpd
dnf remove httpd
dnf clean all 清理所有缓存
dnf makecache 创建缓存
dnf list installed 列出已安装的包
dnf list available 列出尚未安装的可用包
dnf search nano 搜索命令
dnf history undo 1 重做历史1的操作
Centos7使用 dnf,下载并安装下面包
4.3.13 yum Troubleshooting
yum和dnf失败最主要原因:
-
yum的配置文件格式或路径错误
解决方法:检查/etc/yum.repos.d/*.repo文件格式
-
yum cache
解决方法: yum clean all
-
网络不通
解决方法:网卡配置
5 程序包编译
5.1 源码编译介绍
程序包编译安装
源代码–>预处理–>编译–>汇编–>链接–>执行
多文件:文件中的代码之间,很可能存在跨文件依赖关系
虽然有很多开源软件将软件打成包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软件,可能需要自已下载源码,进行编译安装。
另外即使提供了包,但是生产中需要用于软件的某些特性,仍然需要自行编译安装。但是利用源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具可以大大减少编译过程的复杂度
5.2 开源程序源代码的获取
项目官方自建站点
- apache.org(ASF: Apache Software Foundation)
- mariadb.org
- …
代码托管
- Github.com
- gitee.com
- SourceForge.net
- code.google.com
5.3 编译源码的项目工具
**C、C++**的源码编译:使用make 项目管理器
configure脚本 --> Makefile.in --> Makefile
相关开发工具
- autoconf:生成configure脚本
- automake:生成Makefile.in
java的源码编译:使用maven
5.4 C语言源代码编译安装过程
利用编译工具,通常只需要三个大的步骤
-
./configure 脚本
(1)通过选项传递参数,指定安装路径、启用特性等,执行时会参考用户的指定以及Makefile.in文件生成Makefile
(2)检查依赖到的外部环境,如依赖的软件包
-
make 根据Makefile文件,会检测依赖的环境,构建应用程序
-
make install 复制文件到相应路径
注意:安装前可以通过查看README,INSTALL获取帮助
5.4.1 编译安装准备
准备:安装相关的依赖包
- 开发工具: make,gcc(c/c++编译器GNU C Complier)
- 开发环境: 开发库 (glibc: 标准库),头文件,可安装开发包组 Development Tools
- 软件相关依赖包
生产实践:基于最小化安装的系统建议安装下面相关包
yum instal] gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages autoconf
5.4.2 编译安装
第一步: 运行 configure 脚本,生成Makefile 文件
其选项主要功能
- 可以指定安装位置
- 指定启用的特性
卸载:rm所有安装的目录、配置文件即可
获取其支持使用的选项
./configure --help
选项分类:
安装路径设定:
- --prefix=/PATH 指定默认安装位置,默认为/usr/local/
- --sysconfdir=/PATH 配置文件安装位置
- System types 支持交叉编译
软件特性和相关指定:
-
Optional Features 可选特性
--disable-FEATURE
--enable-FEATURE[=ARG]
-
OptionalPackages 可选包
--with-PACKAGE[=ARG] 依赖包
--without-PACKAGE 禁用依赖关系
注意:通常被编译操作依赖的程序包,需要安装此程序包的"开发"组件,其包名一般类似于name-devel-VERSION
第二步: make
第三步: make install
例:C7上编译安装最新版tree
#1 安装相关的依赖包或工具
[root@centos7 ~]#yum insta11 gcc make
#2 下载源码并解压
[root@centos7 ~]#tar xvf tree-1.8.0.tgz
#3 进入解压缩的目录,README和INSTALL
[root@centos7 ~]#cd tree-1.8.0/
[root@centos7 tree-1.8.0]#cat README
[root@centos7 tree-1.8.0]#cat INSTALL
#4 修改源码的版本号
[root@centos7 tree-1.8.0]#vim tree.c
:%s/v1\.8\.0/v8.8.8
#5 编译准备
[root@centos7 tree-1.8.0]#vim Makefile
prefix = /apps/tree
#6 编译 确保在目录下
[root@centos7 tree-1.8.0]#make
#7 安装
[rootacentos7 tree-1.8.0]#make install
#此时已经可以使用,不过需要到目录下使用 ./tree
#8 修改PATH变量 使新命令优先级高于旧命令
[root@centos7 ~]#echo 'PATH=/apps/tree/bin:$PATH'> /etc/profile.d/tree.sh
#命令默认按$PATH列出的几个目录顺序查询,所以这里我们只需要将新命令放在原命令的前面,即可提高优先级
[root@centos7 ~]#. /etc/profile.d/tree.sh
#9 验证结果
[root@centos7 ~]#tree --version
#10 添加man帮助 此时man帮助文档尚未添加到man帮助的查询路径下
[root@centos7 ~]#vim /etc/man_db.conf
MANDATORY_MANPATH /apps/tree/man
#11 使用man帮助
[root@centos7 ~]#man tree
实例:C8编译安装CmatriX
#1 安装相关的依赖包或工具
[root@centos8 ~]#yum insta11 gcc make autoconf ncurses-devel
#2 下载源码并解压
[root@centos8 ~]#wget https://github.com/abishekvashok/cmatrix/releases/download/v2.0/cmatrix-v2.0-Butterscotch.tar
#tar xvf cmatrix-v2.0-Butterscotch.tar -C /usr/local/src
#3 进入解压缩的目录,README和INSTALL
[root@centos8 ~]#cd /usr/local/src/cmatrix
cat README / INSTALL
#4 配置
[root@centos8 cmatrix]#./configure --prefix=/apps/cmatrix 指定安装目录
#5 编译并安装
[root@centos8 cmatrix]#make && make insta11
#6 配置环境
[root@centos8 ~]#echo 'PATH=/apps/cmatrix/bin:SPATH'> /etc/profile.d/cmatrix.sh 添加变量(适合多个变量)
[root@centos8 ~]##. /etc/profile.d/cmatrix.sh
或:
[root@centos8 ~]#ln -sv /apps/cmatrix/bin/cmatrix /usr/local/bin/ 为生成的命令添加软链接(适合一个文件)
#7 运行cmatrix
[root@CentOS8 bin]#cmatrix -a -b -C green
#8 帮助
[root@centos8 ~]#vim /etc/man_db.conf
MANDATORY_MANPATH /apps/cmatrix/share/man
[root@centos8 ~]#man cmatrix
范例: centos8 编译安装httpd-2.4.41
#1 安装包
[root@centos8 ~]#dnf instal1 gcc make apr-devel apr-util-devel pcre-devel openssl-devel
yum -y install redhat-rpm-config-125-1.el8.noarch
#2 下载并解压缩包
[root@centos8 ~]#wget -P /usr/local/src https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.bz2
[root@centos8 ~]#tar xvf httpd-2.4.57.tar.bz2
#3 配置
[rootacentos8 ~]#cd httpd-2.4.57/
[root@CentOS8 httpd-2.4.57]#./configure --prefix=/apps/httpd --sysconfdir=/etc/httpd --enable-ssl
#4 编译并安装
[root@CentOS8 httpd-2.4.57]#make -j 4 && make install
#5 配置环境
[root@centos8 httpd-2.4.57]#echo 'PATH=/apps/httpd/bin:$PATH' > /etc/profile.d/httpd.sh
[root@centos8 httpd-2.4.57]#. /etc/profile.d/httpd.sh
#6 运行
[root@centos8 httpd-2.4.57]#apachectl start
#7 指定用apache用户运行
[root@centos8 ~]#useradd -r -s /sbin/nologin -d /var/www -c Apache -u 48 apache 为apache建立系统账号
[root@centos8 ~]#vim /etc/httpd24/httpd.conf
user apache
group apache
#8 生效和验证
[root@centos8 ~]#apachectl restart
#查看
[root@centos8 ~]#ps aux
5.4.3 安装后的配置
- 二进制程序目录导入至PATH环境变量中
编辑文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:SPATH - 相关用户及文件
有些开源软件编译完成后,还需要创建相关的用户及文件 - 导入帮助手册
编辑/etc/man.config|man_db.conf文件添加一个MANPATH
6 Ubuntu 软件管理
Debian软件包通常为预编译的二进制格式的扩展名”.deb”,类似rpm文件,因此安装快速,无需编译软件。包文件包括特定功能或软件所必需的文件、元数据和指令
- dpkg: package manager for Debian,类似于rpm,dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
- apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构,类似于yum
6.1 APT工作原理
在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据每个DEB 包的包头(Header) 信息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一旦APT 服务器内的DEB有所变动,要使用genbasedir产生新的DEB索引清单。
客户端在进行安装或升级时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。
当客户端需要安装、升级或删除某个软件包时客户端计算机取得DEB索引清单压缩文件后,会将其解压置放于 ar/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的时候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装或是可以升级的
6.2 dpkg 包管理器
帮助参看:man dpkg
dpkg 常见用法:
#安装包
dpkg -i package.deb
#删除包,不建议,不自动卸载依赖于它的包
dpkg -r package
#删除包(包括配置文件)
dpkg -P package
#列出当前已安装的包,类似rpm -ga
dpkg -l
#显示该包的简要说明,类似rpm -qi
dpkg -l package
#列出该包的状态,包括详细信息,类似rpm -qi
dpkg -s package
#列出该包中所包含的文件,类似rpm -g1
dpkg -L package
#搜索包含pattern的包,类似rpm -qf
dpkg -s <pattern>
#配置包,-a 使用,配置所有没有配置的软件包
dpkg --configure package
#列出 deb 包的内容,类似rpm -qp1
dpkg -c package.deb
#解开deb包的内容
dpkg --unpack package.deb
范例:
#列出系统上安装的所有软件包
dpkg -l
#列出软件包安装的文件
dpkg -L bash
#查看/bin/bash来自于哪个软件包
dpkg -s /bin/bash
#安装本地的 .deb 文件
dpkg -i /mnt/cdrom/pool/main/z/zip/zip_3.0-11build1 amd64.deb
#卸载软件包
dpkg -r zip
注意:一般建议不要使用dpkg卸载软件包。因为删除包时,其它依赖它的包不会卸载,并且可能无法再正常运行
6.3 apt
Debian 使用apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命令行与GUI兼顾的工具是 aptitude,
之前最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令中,在2014年apt 命令发布第一个稳定版,Ubuntu 16.04引入新特性之一便是 apt 命令,apt命令解决了命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。在使用 apt 命令时,用户不必再由apt-get 转到 apt-cache 或 apt-config,提供管理软件包所需的必要选项
apt 相当于apt-get、apt-cache和apt-config 中最常用命令选项的集合
apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。
此外,启用的几个特性也非常有帮助。
例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示用户可升级的软件包个数
apt 与apt-get 有一些类似的命令选项,但它并不能完全下兼容 apt-get 命令也即可用apt 替换部分 apt-get系列命令,但不是全部
apt命令用法
查看帮助:apt help
apt与apt-get命令对比
apt特有的命令
apt Tist 列出包含条件的包(已安装,可升级等)
apt edit-sources 编辑源列表
APT包索引配置文件
/etc/apt/sources.Tist
/etc/apt/sources.list.d
可以修改上面文件为国内的安装源,提高速度
参考链接: https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.53322f70fghx56
apt命令操作(如安装和删除软件包) 日志文件
/var/log/dpkg.log
示例:
#安装包:
apt install tree zip
#安装图形桌面
apt install ubuntu-desktop
#删除包:
apt remove tree zip
#说明: apt remove中添加--purge选项会删除包配置文件,谨慎使用
#更新包索引:相当于yum clean all
apt update
#升级包:要升级系统,请首先更新软件包索引,再升级
apt upgrade
#apt列出仓库软件包,等于yum Tist
apt list
#搜索安装包
apt search nginx
#查看某个安装包的详细信息
apt show apache2
#在线安装软件包
apt install apache2
#卸载单个软件包但是保留配置文件
apt remove apache2
#删除安装包并解决依赖关系
apt autoremove apache2
#更新本地软件包列表索引,修改了apt仓库后必须执行
apt update
#卸载单个软件包删除配置文件
apt purge apache2
#升级所有已安装且可升级到新版本的软件包
apt upgrade
#升级整个系统,必要时可以移除旧软件包。
apt fu11-upgrade
#编辑source源文件
apt edit-sources
#查看仓库中软件包有哪些版本可以安装
apt-cache madison nginx
#安装软件包的时候指定安装具体的版本
apt insta11 nginx=1.14.0-0ubuntul.6