软件相关概念
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

预处理(Pre-Processing)
- 将所有的#define 删除,并且展开所有的宏定义
- 处理所有的条件预编译指令,比如 #if,#ifdef,#elif,#else,#endif 等
- 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置
- 删除所有的注释,//,/**/
- 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
- 保留所有的#pragma 编译指令,因为编译需要使用它们
编译(Compiling)
编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生成的汇编 代码
汇编(Assembling)
汇编是将汇编代码转变成机器码可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于 编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可
链接(Linking)
通过调用链接器 ld 来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件

软件链接
- 静态链接:在程序编译时,将程序中使用的所有库文件(包括标准库和用户自定义库)中的代码和数据都 “复制” 到最终的可执行文件中。
- 动态链接:在程序编译时,不将库文件中的代码和数据复制到可执行文件中,而是在程序运行时 “由操作系统动态加 载” 所需的库文件。
库文件
查看二进制程序所依赖的库文件: 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 --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
|

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 命令


yum list: 已安装的程序包

安装升级删除程序包
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 仓库
- 在 yum server 机上搭建 web 服务,保证其它机器能能过 web 服务访问本机
- 在 yum server 机上搭建 yum 仓服务
- 在 client 机上将 yum 的 repos 源指向 yum server 机
- 测试
复制其他的
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 的常用指令集合。

仓库结构
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
结构:

-
创建 debian 目录
1
|
mkdir debian && cd debian
|
-
在 debian 目录下创建 DEBIAN 目录
1
|
mkdir DEBIAN && cd DEBIAN
|
-
DEBIAN 下放入包管理工具的元数据
-
创建 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!!!!!! # 开头有空格
|
-
确定软件安装目录;在 debian 下创建 usr/bin 目录,并将 exCary 这个程序放入。
1
2
3
|
cd ..
mkdir -p usr/bin
mv /root/exCary /root/debian/usr/bin/
|
-
DEBIAN 下创建,安装后动作文件 postinst,卸载前动作文件 prerm。
1
2
3
4
5
|
vim postinst
chmod +x postinst
vim prerm
chmod +x prerm
|
-
添加配置文件。
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
|
-
在 debian 目录外,使用 dpkg-deb 命令打包,生成 debian.deb
1
|
dpkg-deb --build debian/
|
-
使用 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
|



snap:新软件包格式
软件包目录:/dev/loop0 挂载点,只读。
一个只读的文件系统。
应用自身的执行文件、库、 依赖包都被放在这个只读目录,意味着该目录不能被随意篡改和写入。
一个可写入的区域。
squashFS 文件系统的引入,使得 snap 的安全性要优于传统的 Linux 软件包。
1
2
3
4
5
|
install
remove
list
find
info
|
每个己安装的包都有一个挂载点。
源码包部署
- 部署 make 编译环境(特殊的编程语言,有专用的编译工具;java:ant|maven)
- 获取源码代码文件(.tar.gz)
- 解压软件包
- 编译安装软件
- configure 定制配置(没有 configure,使用 autoconf 生成 configure)
- make 编译生成配置文件
- make install 转移文件到安装目录
- 将可执行文件路径加入 PATH 环境变量
- 测试
编译环境准备
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
|