软件管理

Linux中的软件包管理器,二进制安装软件包,源码安装软件

软件相关概念

ABI

ABI(Application Binary Interface,应用程序二进制接口)是一种定义了应用程序与操作系统 或者硬件之间交互方式的接口标准,不同的操作系统,他的 ABI 接口是不一样的。

windows 与 linux 中的 ABI 格式是不兼容的

  • windows 中的是 PE (Portable Executable ) 格式
  • Linux 中的是 ELF ( Executable and Linkable Format ) 格式

API

API 即 Application Programming Interface,API 可以在各种不同的操作系统上实现给应用程 序提供完全相同的接口。

posix

posix 规约,程序员们在开发程序的时候不用再关心,同一段程序逻辑功能在进行调用的时候,应该 使用哪个平台的哪条底层命令,而只需要使用 基于这些底层平台抽象封装出来的功能函数文件即可,而这个功 能函数文件的调用方式 无论在 linux 平台 还是 windows 平台,都是一样的。

程序编译:C

image-20241104192745736

预处理(Pre-Processing)

  1. 将所有的#define 删除,并且展开所有的宏定义
  2. 处理所有的条件预编译指令,比如 #if,#ifdef,#elif,#else,#endif 等
  3. 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置
  4. 删除所有的注释,//,/**/
  5. 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
  6. 保留所有的#pragma 编译指令,因为编译需要使用它们

编译(Compiling)

编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生成的汇编 代码

汇编(Assembling)

汇编是将汇编代码转变成机器码可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于 编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可

链接(Linking)

通过调用链接器 ld 来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件

image-20241104193019170

软件链接

  • 静态链接:在程序编译时,将程序中使用的所有库文件(包括标准库和用户自定义库)中的代码和数据都 “复制” 到最终的可执行文件中。
  • 动态链接:在程序编译时,不将库文件中的代码和数据复制到可执行文件中,而是在程序运行时 “由操作系统动态加 载” 所需的库文件。

库文件

  • 内核模块(Kernel Modules):

    .ko

    .o

    位 于/lib/modules/$(uname -r)/kernel/目录下的子目录中。

  • 共享库(Shared Libraries):

    .so

    存储在/lib、/usr/lib 或/usr/local/lib 等目录下。

查看二进制程序所依赖的库文件: ldd

rmp:包管理器

手工包安装

不会自动关联依赖包

1
2
3
4
5
-q				# 查询安装的软件包基本信息
-ivh			# 安装软件
-evh			# 卸载软件
-Uvh			# 升级软件,无软件,安装
-Fvh			# 升级软件,无软件,不安装
  • 不要频繁对内核做升级操作
  • 升级后旧配置文件可能被重命名,以 FILENAME.rpmsnew 格式保留
  • 包卸载时,对应的配置文件不会删除,以 FILENAME.rpmsave 格式保留

包查询

1
2
3
4
5
6
7
rpm
-qa					# 所有
-qi	name			# info
-ql					# 查看指定的程序包安装后生成的所有文件
-qf	filename		# 查看指定的文件由哪个包安装生成
-qd					# 查询程序的文档
-qp packge			# 查询软件包的信息

包检验

1
rpm -K

在检查包的来源和完整性前,必须导入所需要公钥

1
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

包更新日志

1
rpm -q --changelog packageName

dnf/yum

管理 rpm 包文件的工具,具有管理包依赖的功能

C/S 模式:客户端/服务器模式

服务器上元数据(包依赖结构的管理文件) bh:repodata 目录下

添加源

1
2
3
4
5
# 在/etc/yum.repos.d/目录下创建配置文件

# 元数据缓存地址
/var/cache/dnf
/var/cache/yum

image-20241104170119875

1
2
3
4
5
yum-config-manager --add-repo=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/

# yum仓库管理
yum repolist
yum repolist -v Repo-name

yum 命令

1
--no-resolve		# 不下载依赖

image-20241104171612684

image-20241104171622705

yum list: 已安装的程序包

image-20241104172030898

安装升级删除程序包

1
2
3
4
5
6
7
yum install
yum reinstall

yum localinstall	# 安装本地软件包

--installroot		#指定安装目录
--downloadonly		#只下载,不安装
1
2
yum remove package
yum erase package		# 可卸载多个包
1
2
3
yum uodate package			# 更新;要加包名,否则都更新
yum downgrade package		# 降级
yum check-update			# 检查可更新

包组管理

多个软件包,打包成组

一起安装

1
2
3
4
yum groupinstall
yum groupupdate
yum groupremove
yum groupinfo

自建 yum 仓库

  1. 在 yum server 机上搭建 web 服务,保证其它机器能能过 web 服务访问本机
  2. 在 yum server 机上搭建 yum 仓服务
  3. 在 client 机上将 yum 的 repos 源指向 yum server 机
  4. 测试

复制其他的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# yum仓同步工具
dnf reposync --repoid=REPOID --download-metadata -p /path


#安装web服务
yum install -y httpd

# 自启动web服务
systemctl enable --now httpd.service

#将阿里云的extras 源的相关数据下载到本地,给客户端使用
yum reposync --repoid=nju-extras --download-metadata -p /var/www/html/
#将本地光盘中的内容CP到web目录中,给客户端使用
mkdir /cdrom
mount /dev/sr0 /cdrom
cp -r /cdrom/BaseOS/* /var/www/html/BaseOS

80 端口开放

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# firewalld端口开放
# 查看开放的端口
firewall-cmd --list-ports
# 开放80端口; --zone #作用域    --add-port=80/tcp #添加端口,格式为:端口/通讯协议
# --permanent 永久生效,没有此参数重启后失效
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 重启防火墙
firewall-cmd --reload

# iptables 端口开放
vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
systemctl restart iptables.service

ubuntu 防火墙

1
2
3
4
5
ufw
# 列出规则
ufw app list
# 允许规则
ufw allow 'Apache Full'

SElinux

1
2
# 为软链接目录添加适当的 SELinux 上下文标记。httpd_sys_content_t
chcon -R -t httpd_sys_content_t /ownYum

自建

根据目录中的 rpm 包生成 repodata 元数据

1
2
3
4
5
6
7
createrepo [OPTION] <directory_to_index>

createrepo 所有包的目录的目录(local)

local-Package
	 |
	 -repodata

dpkg: Ubuntu 软件管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
dpkg

-i				# 安装软件包
--unpack		# 解包
-V				# 检查是否安装
-l				# 列出已安装的包
-c	.deb		# 查看包里文件
--info .deb		# 查看包的信息
-L				# 查看安装的软件包里的文件
-p				# 查看可安装的包

-r				# 删除包
-P				# 删除包,包括配置
-s				# 查看包信息
-C				# 包校验

-S				# 反查包

apt: Ubuntu 软件管理

客户/ 服务器架构(c/s)+

apt 是 apt-get, apt-cache, apt-config 的常用指令集合。

image-20241105112922293

仓库结构

  • dists:元数据
  • pool:软件包
1
2
3
4
/var/cache/apt/				# DEB索引清单缓存位置+
apt-cache stats				# 缓存信息查看
apt-cache depends name		# 查看软件包的依赖项
apt-cache rdepends name		# 查看被那些软件包依赖

命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
-d				# 只下载包,不安装
-q				# 静默
-y

info
update			# 更新元数据
search
search --names-only name
show			# 显示细节
install
remove
purge			# 删除软件,包括配置
autoremove		# 删除不在被依赖的软件包

upgrade			# 更新软件包,不卸载旧包;安全地更新现有包,而不改变系统包的整体结构或依赖关系。
full-upgrade	# 更新软件包,会卸载旧包;从一个主要版本升级到下一个版本时使用

--no-upgrade	# 已存在,不升级
--only-upgrade	# 只升级不安装
# 异常严重报错,修复
apt --fix-broken install

deb 打包

准备程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
int main(){
    printf("	 ^		\n");
    printf("	/ \	\	n");
    printf("	| |	\	n");
    printf("	| |		\n");
    printf("	| |		\n");
    printf("  \=====/	\n");
    printf("	[*]	\n");
    return 0;
}
1
2
3
4
5
6
7
gcc exCary.c -o exCary

file exCary
exCary: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=196519d2cc3f5fe087f6d584b25940d315e7ef5c, for GNU/Linux 3.2.0, not stripped

du -sh exCary
16K     exCary

打包 deb

结构:

image-20241105191614518

  1. 创建 debian 目录

    1
    
    mkdir debian && cd debian
    
  2. 在 debian 目录下创建 DEBIAN 目录

    1
    
    mkdir DEBIAN && cd DEBIAN
    
  3. DEBIAN 下放入包管理工具的元数据

  4. 创建 control 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Package: Excalibur
    Version: 1.0
    Architecture: amd64
    Maintainer: Loong
    Installed-Size: 16K
    Depends:
    Homepage: nop
    Description: This is an image.
     !!!!!!Excalibur!!!!!!	# 开头有空格
    
  5. 确定软件安装目录;在 debian 下创建 usr/bin 目录,并将 exCary 这个程序放入。

    1
    2
    3
    
    cd ..
    mkdir -p usr/bin
    mv /root/exCary /root/debian/usr/bin/
    
  6. DEBIAN 下创建,安装后动作文件 postinst,卸载前动作文件 prerm。

    1
    2
    3
    4
    5
    
    vim postinst
    chmod +x postinst
    
    vim prerm
    chmod +x prerm
    
  7. 添加配置文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # 在debian下创建etc/Excalibur目录
    mkdir -p etc/Excalibur && cd etc/Excalibur
    
    # 创建配置文件
    vim Excalibur.conf
    
    # 在DEBIAN下,创建conffiles文件,在里面写入配置文件路径
    vim conffiles
    # /etc/Excalibur/Excalibur.conf
    
  8. 在 debian 目录外,使用 dpkg-deb 命令打包,生成 debian.deb

    1
    
    dpkg-deb --build debian/
    
  9. 使用 dpkg-name,使包名符合规范

    1
    2
    
    dpkg-name debian.deb
    dpkg-name: info: moved 'debian.deb' to './Excalibur_1.0_arm64.deb'
    

验证

1
dpkg -i Excalibur_1.0_arm64.deb

image-20241105191130101

image-20241105191300466

image-20241105191509393

snap:新软件包格式

软件包目录:/dev/loop0 挂载点,只读。

一个只读的文件系统。

​ 应用自身的执行文件、库、 依赖包都被放在这个只读目录,意味着该目录不能被随意篡改和写入。

一个可写入的区域。

squashFS 文件系统的引入,使得 snap 的安全性要优于传统的 Linux 软件包。

1
2
3
4
5
install
remove
list
find
info

每个己安装的包都有一个挂载点。

源码包部署

  1. 部署 make 编译环境(特殊的编程语言,有专用的编译工具;java:ant|maven)
  2. 获取源码代码文件(.tar.gz)
  3. 解压软件包
  4. 编译安装软件
    1. configure 定制配置(没有 configure,使用 autoconf 生成 configure)
    2. make 编译生成配置文件
    3. make install 转移文件到安装目录
  5. 将可执行文件路径加入 PATH 环境变量
  6. 测试

编译环境准备

1
2
3
4
5
6
7
yum install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl devel systemd-devel zlib-devel
yum install vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages
# yum groupinstall "Development Tools" "System Tools" 包组安装不全

apt install build-essential gcc g++ libc6 libc6-dev libpcre3 libpcre3-dev libssl-dev libsystemd-dev zlib1g-dev
apt install vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-common manpages-dev
# apt install build-essential 包组安装不全

准备源码包

1
wget https://nginx.org/download/nginx-1.26.2.tar.gz

解压源码包

1
tar -xvf nginx-1.26.2.tar.gz

编译配置

缺少依赖库时,./configure 会有报错。make 无法进行。

如果中间失败,提示缺少依赖项,通过 yum search 查找软件包名称,然后安装,安装后重新执行 ./configure

1
2
3
4
5
6
7
./configure --prefix=/nginx
--prefix	#
--user		# 用户名称
--with-		# 可选模块

make
make install
1
./nginx -s stop