软件
什么是软件包:
- 电脑程序Program,程序员使用编程语言写的一个代码文本,内部是包含了该语言的语特性,字符,特殊符号,语句等等。
什么是软件程序:
- 软件程序,就是程序员通过编译语言写好的一堆代码,通过一些方式运行,比如编译后,生成一个应用程序,成为软件,比如网易云,qq,微信.
- 在linux中得程序也是这么得来的 比如/usr/sbin/ls /usr/sbin/echo 等等也是程序员写好的程序编译成为的脚本文件。
- 例如:使用的golang语言,写完的代码,需要编译,编译后的是看不到源码的,直接在linux ./xxx.go 即可启动 组成:可执行命令 + 配置文件 + 数据文件 = go后端程序。
不同操作系统下的软件包后缀:
- windows 使用的是 qq.exe
- linux centos 使用的是 qq.rpm
- manos 苹果系统 qq.dmg
软件包:
- 软件包,就是将
二进制命令(通过编译的产物)
+配置文件
+数据打包的
一个单个文件
。- 例如:linux的nginx其中/usr/bin/nginx 就是编译后的程序。/etc/nginx/nginx.conf 就是它的配置文件。
1.源码包
源码包:
- 就是一大堆源代码程序,是由程序员按照特定的格式和语法编写出来的。计算机只能识别机器语言,也就是二进制语言,所以源码包安装之前需要
编译
。- 编译过程耗时较长(将源代码变为二进制程序), 大多数用户不懂开发,编译过程中可能会有各种错误,用户无力解决。了解决使用源码包安装的问题,Linux 软件包的安装出现了使用二进制包的安装方式。
为什么编译:
- 比如python的 print("hello word"),如果在计算机中进行使用,就需要将这段代码解释为计算机认识的0101机器码,有些语言需要进行编译操作比如C,有些语言可以借助解释器翻译成为机器码,让计算机知道。
语言的场景:
- 系统级开发:C/C++:httpd、nginx ,golang:docker。
- 应用及开发:java:hadoop,hbase,python:openstack。
编译程序过程:
- 当程序员通过如C语言写完代码后,并不能立即运行, 因为计算机不认识这些代码(就是一堆英文字母)。电脑只认识机器语言(二进制的0和1组成的语言) 如图:将源代码通过编译器转为机器可以认识的0101二进制。
1-1.编译过程/解释过程
1.安装go解释器
yum install golang -y
2.编写源码
vim hello.go
package main
import "fmt"
func main() {
fmt.Println("hello go!")
}
3.直接执行不编译
要求:不编译,需要其他的机器有go解释器,并且版本相同,包也要有
go run hello.go
4.编译 # 生成二进制命令,直接./脚本 执行
# 编译后的文件为什么这么大,虽然只是打印 hello go! 一段话,但是将使用的依赖全部加了进去,所以文件就大。
# 编译的好处,编译后的二进制命令,可以再任何的linux环境下(架构相同),都可以直接运行,一次编译,终身使用(docker也是这种理念)
go build hello.go
2.二进制包
是什么:
- 已经被编译过的软件包,打开及使用,比如go语言写的程序,编译后,成为一个可执行文件,将可以执行文件+配置文件打包后发给其他的机器,那么解压后直接就可以使用。
- 已经编译好的二进制压缩文件:(使用cat查看,内部文件就是一堆二进制,
编译二进制包
)*.tar.gz格式,下载解缩即用。- 二进制源码包:(
没有编译的包
,需要自己编译一下才能使用),下载后需要解压,在根据要求进行编译成为一个二进制命令。
3.安装方式
- rpm(centos)deb(ubuntu)包,使用yum或者apt命令可以直接安装。
- yum或者apt使用install指令进行安装。
- 源码包或者二进制包安装,前者需要编译配置麻烦,后者只需要解压即可。
4.软件包字段含义
mysql-community-client-5.7.10-1.el7.i686.rpm
mysql-community-client:软件的名称mysql社区版
5.7.10:版本
1:发布次数
el7:操作系统
i686:操作系统平台架构
4.系统架构
架构 | 说明 |
---|---|
x86_64 | 针对64位cpu进行优化编译设置,包含core2以上级别的cpu,以及amd的athlon 64位以后得级别,都属于这一类的平台,向后兼容,支持32位x86代码,意味着32位的代码程序也可以在这个平台上运行。主流。代指全部的64位架构。 |
i386 | 几乎所有的x86平台,不论是旧的Pentium或者是新的Pentium-IV与K7系统CPU,都可以正常工作。这里的i 指的是Intel兼容的CPU,而386 指的是CPU的等级。适用于几乎所有的32位x86平台。 |
i586 | 针对586级别的计算机进行编译优化,包括Pentium第一代MMX CPU,AMD的K5,K6系统CPU等。是对i386的一种优化和增强。32位x86平台。 |
i686 | Pentium 2以后的Intel系统CPU及K7以后等级的CPU。32位x86平台。 |
noarch | noarch 是一个特殊的术语,用来描述那些不依赖于特定硬件架构的软件包,意味着这类软件包可以再任何架构的linux系统中运行。 |
Linux安装
安装方式:
- yum 安装
- rpm 安装
- 源码编译安装
安装考虑的问题:
- 安装一些基础的工具使用yum安装
- 安装一些大型的第三方程序,使用源码编译安装(可以定制)
- 断网环境:将需要的安装的程序.rpm上传到linux上进行安装(yum来管理,自动获取依赖关系)
- 限制软件版本:去官网找对应版本进行安装
- 安装复杂的软件,以及需要定制需求的软件,可以选择编译安装,因为可以定制化(安装路径,开启一些定制化的功能等等)
1.rpm安装
rpm安装特点:
- 将安装的软件先编译过,并且打包为rpm机制的安装包,通过包内的默认数据库记录这个软件需要的必要依赖,会根据系统内的依赖进行判断,是否满足安装包的依赖需求。
注意:
- 软件安装环境必须与打包环境一致。
- 需要满足软件的依赖需求。
- 卸载软件时,可能会导致其他软件无法使用,A软件时B软件的依赖,卸载A,B软件就无法使用。
优点:
- 已经对软件编译过了,直接使用,没有编译的烦恼。
- 会检查系统的磁盘,操作系统版本,避免文件被错误安装。
- 软件本身提供,版本信息,依赖属性,软件用途,软件所含文件等信息,方便了解软件。
- rpm会使用数据库记录软件的相关参数,便有升级,删除,查询等操作。
# 可以在软件官网中,找到rpm安装包,和qq微信,安装相同概念,打包好的包,直接下载安装即可
rpm是什么:
1.RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是centos系统中,默认的管理应用程序的一个工具。
2.和windows上的控制面板中卸载更新是一样的,rpm就相当于windows上的卸载安装控制面板。
使用流程
1.获取rpm格式的软件包,如mysql-5.7.rpm
2.通过rpm命令,也就是linux内置的一个工具,来安装这个mysql-5.7.rpm
# 注意,如果你的mysql不是通过rpm包安装的,也就无法通过rpm工具管理。
rpm 可以比喻 windows中得安装包
windows中得安装包:qq.exe winxin.exe # 鼠标点击安装
centos中 : xxxx.rpm xxxx2.rpm # 用命令参数安装
1-1.rpm命令
# 注意:可以通过网站进行搜索rpm包或者deb包进行安装,效率高,比在官方网站找的要快一些。
1.从网站中找下载
https://www.rpmfind.net 搜索需要的软件包或者从指定的官方网站中找。
2.可以从光盘(或者镜像文件)中读取;
(工作里,大多数离线服务器安装,也都会使用光盘镜像中提供的rpm包),镜像文件中内置了很多rpm包,光盘插入服务器光驱。
3.运维人员,将包下载好,然后拷贝到服务器上。
命令:
rpm
参数:
-v 显示日志
-h 安装时输出hash记号
-U 根据指定的rpm包对机器中的软件进行升级
-q 查询软件包
-e 删除软件包
-i 安装软件包
-l 查看配置文件需要配合 -q 参数 /var/lib/rpm/ 提供的
-f 查看配置文件属于哪个软件包需要配合 -q 参数 /var/lib/rpm/ 提供的
-a 查询所有安装的软件包
-V 将要校验的软件包
--rebuilddb 重新建立 rpm 数据库,如果数据库损坏或者出现问题,需要进行重建。
/var/lib/rpm/ 是rpm数据库存储位置
1-2.rpm安装卸载升级
# 下载删除升级操作 https://nginx.org/packages/centos/7/x86_64/RPMS/
1.从下载二个rpm包
wget -O /opt/nginx-1.10.1-1.el7.ngx.x86_64.rpm https://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.1-1.el7.ngx.x86_64.rpm # 低版本
wget -O /opt/nginx-1.18.0-2.el7.ngx.x86_64.rpm https://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-2.el7.ngx.x86_64.rpm # 高版本 可能会出现依赖文件
2.安装
rpm -ivh nginx-1.10.1-1.el7.ngx.x86_64.rpm
3.查询
rpm -q nginx
4.升级 # 需要指定一个比当前版本更高的rpm包
rpm -U nginx-1.18.0-2.el7.ngx.x86_64.rpm
5.卸载
rpm -e nginx
1-3.rpm查看配置信息
1.查看包相关文件信息
rpm -ql nginx
2.查看某个文件属于哪个包
rpm -qf /etc/ssh/sshd_config
1-4.rpm依赖报错解决
1.需要查看error报错
2.安装报错说的缺少的依赖关系进行安装即可,需要一步一步的将缺少依赖关系进行安装。
3.注意依赖冲突
比如:卸载vim
1. yum remove -y vim # 卸载
2.在使用rpm安装,可能会出现依赖冲突
3.依赖冲突,vim源版本过高,低版本无法安装的情况
4.需要卸载vim的原依赖关系
5.起始就是没有卸载干净
1.先卸载原来的vim
yum remove -y vim
2.拷贝 /mnt/Packages/ 的vim相关的rpm包
ls /mnt/Packages/vim* | xargs -i cp {} ./
3.安装vim
rpm -i vim-enhanced-7.4.629-7.el7.x86_64.rpm
3.安装依赖
根据缺少的依赖进行安装。
1-5.软件包依赖检查
1.针对安装完毕的软件进行检查
rpm -qR 软件包
2.使用rpmreaper
yum install -y rpmreaper
1.使用命令进行入交互模式
rpmreaper
2.使用指令
/ # 进行搜索
r # 展开软件包,查看依赖
3.使用yum工具
yum install yum-utils -y
使用命令进行查看
repoquery --requires --resolve 软件包
例如查看nginx
[root@shell test]# repoquery --requires --resolve nginx
pcre-0:8.32-17.el7.x86_64
openssl-1:1.0.2k-22.el7_9.x86_64
bash-0:4.2.46-35.el7_9.x86_64
centos-logos-0:70.0.6-3.el7.centos.noarch
pcre-0:8.32-17.el7.i686
gperftools-libs-0:2.6.1-1.el7.x86_64
systemd-0:219-78.el7_9.2.x86_64
glibc-0:2.17-317.el7.i686
nginx-filesystem-1:1.20.1-10.el7.noarch
zlib-0:1.2.7-21.el7_9.x86_64
glibc-0:2.17-326.el7_9.x86_64
centos-indexhtml-0:7-9.el7.centos.noarch
openssl11-libs-1:1.1.1k-7.el7.x86_64
# 同时提供下载功能
yumdownloader --destdir='下载路径' 软件包名称
1-6.软件校验查询
# 使用 rpm -Va 校验安装包的文件哪些被修改了。
rpm -Va # 就是校验全部的软件包,修改了哪些文件数据。
[root@shell pluginconf.d]# rpm -Va
S.5....T. c /etc/profile # /etc/profile 文件是 配置文件,大小被修改导致MD5不同,文件的创建时间发生变化。
missing 代表文件在系统中找不到了。
S.5....T. 中出现一下内容代表的含义:
S:文件大小(Size)已更改。
M:文件权限(Mode)已更改,即文件的访问权限(如读、写、执行)发生了变化。
5:文件的 MD5 校验和(Checksum)已更改,这通常意味着文件内容已经被修改。
D:文件的设备主(Device major number)已更改,这通常与字符或块设备文件有关。
L:文件的链接(Link)地址已更改,这可能意味着符号链接指向的目标发生了变化。
U:文件的所属用户(User)已更改。
G:文件的属组(Group)已更改。
T:文件的时间戳(Timestamp)已更改,这可能包括文件的创建时间、修改时间或访问时间。
c 有什么含义:
c 配置文件
d 文档
g 属于鬼文件,该文件不被某个文件所包含
l 授权文件
r 自述文件
/etc/profile 文件名称
# S.5....T. c /etc/profile 代表什么意思:
/etc/profile 文件是 配置文件,大小被修改导致MD5不同,文件的创建时间发生变化。也就是说明当前这个文件被人修改过,添加或者删除了内容,与原内容不一样了。
2.dpkg安装
以ubuntu的一个管理安装程序
命令:
dpkg
参数:
-i <包.deb> 安装
-r <软件名> 删除,保留配置
-p <软件名> 移除软件包并清除配置文件
-L <软件名> 与软件相关的文件
-l <软件名> 显示全部/显示包的版本
-S <软件名> 搜索所属的包内容
-s <软件名> 显示包状态详细信息。(作者,架构,依赖动态函数库,作用说明等等) # 软件必须存在
-c <软件名.deb> 显示软件包内文件列表
-I <软件名.deb> 显示依赖关系
安装包的后缀:*.deb
2-1.安装
1.下载
sudo wget https://nginx.org/packages/ubuntu/pool/nginx/n/nginx/nginx_1.18.0-2~focal_amd64.deb
2.安装
sudo dpkg -i nginx_1.18.0-2~focal_amd64.deb
3.查看版本
sudo dpkg -l nginx
4.查看软件相关的文件
sudo dpkg -L nginx
5.卸载
sudo dpkg -r nginx # 配置文件以及nginx相关的文件不会删除
sudo dpkg -P nginx # 删除一切
3.安装方式
3-1.源码安装/编译安装
名词:
- 开放源码:程序代码,是人可以看懂的程序语言,计算机看不懂。
- 编译程序:将人懂的程序代码,编译为计算机可以看懂机器码。
- 可执行文件:通过编译程序变为的二进制程序后计算机能够看懂的执行文件。例如/etc/passwd。
流程:
- 编写程序代码,就是一般的文本文件,在将这个文件通过'编译器'编译为系统能看懂的二进制程序,经过编译器编译与链接后,就会生成一个可执行的二进制文件。
函数库是什么:
- 类似于子程序角色(函数或方法,它们是程序中的一个独立部分,用于执行特定的任务。),可以被调用来执行的一段函数功能,可能需要编译的源代码中引用了某个函数库,比如openssh软件就需要使用openssl加密库,openssh内部就调用了openssl加密库内的函数,所以在编译过程中需要openssl这个软件依赖。
# 安装淘宝nginx
http://tengine.taobao.org/download.html
# 操作流程:
1.下载
2.解压
3.编译安装 (相当于将源码文件编译一个二进制命令的操作,需要配合的安装需要的依赖)
2-1.安装操作
1.获取软件包
wget http://tengine.taobao.org/download/tengine-2.3.3.tar.gz
2.解压缩
tar -zxvf tengine-2.3.3.tar.gz && cd tengine-2.3.3
3.安装相关依赖环境 # 编译安装安装时需要安装依赖
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel pcre
yum -y install gcc gcc-c++ autoconf automake libtool make cmake
4.执行编译参数,让nginx安装支持其他参数 # 编译为二进制命令和相应的配置文件
./configure --prefix=/usr/local/tnginx --with-http_ssl_module
执行后会在文件夹下生产一个 Makefile 文件
Makefile 文件作用:
定义了一组规则和依赖关系,用于自动化构建过程。
configure 命令脚本:
进行设置一些参数,生成一个Makefile的文件进行自动化构建
参数说明:
--prefix=指定安装路径
--with-http_ssl_module 开启https 模块
5.执行编译安装
make && make install
执行完毕后,就会在 --prefix 参数生成对应的目录文件
6.执行验证
/usr/local/tnginx/sbin/nginx && netstat -utnlp | grep nginx
# 注意,因为时源码编译安装的,删除时直接删除指定的安装目录即可
rm -rf /usr/local/tnginx/
# 配置相应的启动脚本或者环境比变量
在 /etc/profile 中添加 PATH = /usr/local/tnginx/bin:$PATH # 永久添加环境变量
2-2.configure与make与make install
configure:
在源码文件中,这个文件的作用就是记录源码如何编译的详细信息,也就是一个脚本文件,当执行时,会根据当前系统的环境生成一个makefile的指令文件,告知make工具如何编译和连接程序。# 是一个编译指令文件。
执行脚本时会将进行检测:
是否安装了必要的库文件和头文件,以及是否支持某些特性,从而确定是否可以在当前系统上编译该软件。
可以进行自定义配置:
1.路径
2.是否启动某些功能
make:
是一个自动化的工具,它会根据makefile的指令来编译源码,当执行make命令时,会先找到makefile文件来编译源码。
make会根据./configure生成的Makefile来编译源代码,生成可执行文件或库文件。
make install:
这一步是将编译好的程序安装到系统的标准位置。
这一步不是自动的,需要你手动执行,以确保你有权限安装软件,并且可以控制安装的位置。
当执行configure或者config文件脚本进行检测:
1.是否有合适的编译程序可以编译本软件的程序代码。
2.是否已经存在本软件所需要的函数库,或者其他相关软件。
3.操作系统平台是否适合本软件,包含linux内核版本。
4.内核的头定义文件是否存在(驱动程序必须检测。)
2-3.源码文件
一般下载的源码程序,都是进行压缩过的,源码文件中:
1.源码文件
2.检测程序文件(configure或config的脚本文件)
3.程序简易说明与安装说明(LICENSE 或者 README)
2-4.简单示例
2-4-1.单一程序
1.单一脚本
vim hello.c
#include <stdio.h>
main(){
printf("hello world\n");
}
2.编译
gcc hello.c # 在默认情况下,不加入任何配置信息,生成的可执行文件时 a.out
2-4-2.目标文件(object file)
目标文件是什么:
生成的目标文件(object file)是编译过程中的一个中间产物。目标文件包含了编译器从源代码转换来的机器代码,但是还没有被链接成最终的可执行文件。
为什么需要生成目标文件:
因为源码中不单单有一个文件,而是有多个文件组成的,比如A文件中有变量name,而B文件需要这个变量,那么就需要A编译为目标文件,然后在链接到A文件,生成可执行文件。
# 在编译的过程中,会进行记录这类型的依赖关系,然后使用连接器(通常是gcc命令中的-o选项后面跟着输出的可执行文件名)来连接目标文件(A.o、B.o、C.o),在链接阶段,链接器会查看每个目标文件中的符号(变量和函数)和它们之间的依赖关系,然后解决这些依赖关系,将它们合并成一个单一的可执行文件。链接器将所有目标文件中的代码和数据合并,并解决所有外部依赖,最终生成一个包含所有代码和数据的可执行文件。
理解:
1.A 文件中有 name变量 是B文件需要。
2.B 文件的 age变量 是C文件需要。
3.C是整个程序的出口文件main函数所在的位置。
gcc -c A.c B.c C.c # 生成目标文件,会自动处理源文件中的依赖声明
gcc -o program A.c B.c C.c # 生成可执行文件program,链接(链接阶段会处理目标文件之间的依赖关系)合并为单个可执行文件,将代码数据依赖整合。
编译:
gcc -c hello.c # 这条命令就会生成目标文件 hello.o
目标文件后缀:*.o
# main 函数只能出现一次(也可以使用多个main函数需要使用预处理器)。
1.第一个文件
vim file-1.c
#include <stdio.h>
main(){
printf("file1\n");
filemain(); /*调用file-2.c的函数*/
}
2.第二个文件
vim file-2.c
#include <stdio.h>
filemain(){
printf("file2\n");
}
3.生成目标文件
gcc -c file-2.c file-1.c
3.链接合并
gcc -o file file-2.o file-1.o
2-4-3.调用外部函数
1.代码文件
vim sin.c
#include <math.h> // 调用外部的函数库
#include <stdio.h>
main(){
float value;
value = sin ( 3.14 / 2 ); /* 使用数学公式计算三角函数 */
printf("%f\n",value);
}
2.执行编译
gcc sin.c -lm -o sin
-lm 用于确保你的程序能够正确链接到数学库,从而使用其中的数学函数(确保在不同平台下的兼容性)。
2-4-4.gcc简易用法
1.将源码编译目标文件,不具备制作链接等功能
gcc -c hello.c
2.在编译时,依据环境给与优化
gcc -O hello.c
3.将编译结果输出成为某个特定的名称
gcc -o xxx hello.o
4.在编译时删除较多的信息
gcc -o xxx hello.o -Wall
2-4-5.函数库
函数库分为:
静态(static)
动态(dynamic)
静态:
1.扩展名 *.a,通常为 libxxx.a的类型
2.这种类型的函数库在编译时会整合到执行程序中(全部的),所以利用静态的库会导致文件比较大。
2.这类型的函数库,可以进行独立运行,不需要再向外部读取函数库的内容。
4.升级难,如果函数库升级了,那么整个可执行文件,必须要重新编译才能将新版本的函数库整合到程序中。函数库升级,代码重新编译。
动态:
1.扩展名 .so
2.不会将整个库都整合到程序中,而是指向的位置而已,只有使用到了动态库时,程序才会读取它。程序只是指向动态库,而是包含,所以编译后的文件就会小很多。
3.不能独立执行,文件路径不能变化,必须存在(如果动态库不存在,那么当程序执行时就会出现报错),因为程序中指向了这个动态库。
4.虽然无法独立执行,如果动态库进行了升级,程序不会重新编译,因为程序只是指向了这个动态库。
函数库存放:
/usr/lib 和 /usr/lib64 # 系统库
/usr/local/lib 和 /usr/local/lib64 # 第三方函数库
头部文件
/lib/include/ # 系统头部文件
/usr/local/include # 第三方头部文件
# 注意:
linux倾向于使用动态函数库,因为非常方便函数库升级,如果使用静态的函数库,如果升级就会对系统造成很大的冲击(系统使用静态函数库)。
2-4-6.怎么加快动态库的读取
已经知道linux大多是使用将函数库做成静态函数库,怎么进行提升函数库读取的性能?在硬件方面,磁盘的效率远远没有内存的效率高。那么就可以将静态函数库先读取到内存中(内存的缓存区),然后软件使用时直接在内存调用。
/etc/ld.so.conf作用:
# 文件是Linux系统中动态链接器(ld.so)的配置文件,它包含了动态链接器搜索动态库(shared libraries)的默认路径列表。
当程序启动时会根据这个动态连接器配置文件路径找到相应的所需的动态库。。
ldcongif命令作用:
# 刷新动态链接器的运行时绑定,会读取/etc/ld.so.conf以确保动态链接器的缓存是最新的。
及时的更新/etc/ld.so.conf配置并且更新缓存。
/etc/ld.so.chache作用:
# 文件是由ldconfig命令生成和更新的。
当程序启动时,动态链接器会读取这个缓存文件,以快速找到所需的动态库,而不需要遍历所有路径。
如何将动态库读取到内存中:
1.在/etc/ld.so.conf内写下需要读取到内存的动态库的目录地址(目录不是文件)。
2.使用ldconfig将/etc/ld.so.conf配置信息更新/etc/ld.so.chache文件,可用的动态库的路径和依赖信息,以便动态链接器可以快速访问。
3.ldconfig命令会更新或者生成/etc/ld.so.chache文件,用于动态链接库加速搜索动态库缓存。
操作流程:
1.添加路径到/etc/ld.so.conf
echo '/usr/lib/gcc' >> /etc/ld.so.conf
2.执行命令加载
ldconfig
3.查看
ldconfig -p
2-4-7.动态函数库解析
命令:
ldd
参数:
-v 列出全部内容
-d 重新将数据丢失link点显示
-r 将elf有关的错误显示
使用:
ldd 程序的绝对路径
例如: 查看passwd的动态函数库解析
ldd /usr/bin/passwd # 0x00007fe2956ab000 就是动态函数库存储的内存地址
2-5.Makefile文件
1.第一个文件
vim file-1.c
#include <stdio.h>
main(){
printf("file1\n");
filemain(); /*调用file-2.c的函数*/
}
2.第二个文件
vim file-2.c
#include <stdio.h>
filemain(){
printf("file2\n");
}
如果将这连个文件进行编译为可执行文件,还行就两个,执行两条命令即可,如果时10 100 100 个文件的情况下操作就麻烦了。
3.构建makefile
vim makefile # 注意正常的缩进
# 定义编译器
CC = gcc # 定义变量
# 定义目标文件
main: file-1.o file-2.o
$(CC) -o main file-1.o file-2.o
# 从对应的 .c 文件生成 .o 文件
file-1.o: file-1.c
$(CC) -c file-1.c
file-2.o: file-2.c
$(CC) -c file-2.c
# 清理生成的文件,你可以通过运行 make clean 来删除目标文件和可执行文件,只保留源文件,不会自动执行。
clean:
rm -f main file-1.o file-2.o
4.执行命令
make
2-6.编译安装的过程
1.下载源码,解压(使用软件前需要查看对应的文档。)
2.建立makefile文件,需要使用 ./configure 执行命令,来创建makefile文件,检测当前你的系统和相关的软件属性。
3.编译命令执行 make(使用当前目录下的makefile文件作为参数配置进行make操作) ,将源码编译为二进制文件
4.安装程序,会根据makefile脚本的 install 目标指令进行安装到指定的目录上。
例如:淘宝nginx 执行完毕 ./configure
[root@shell tengine-2.3.3]# find ./ -type f -name 'Makefile'
./Makefile
./objs/Makefile # 真正的makefile脚本
比如:
make install # 就需要 makefile文件中有这个install目标,如果没有就执行不了
2-7.验证软件的正确性
# 防止下载的软件被人篡改过。
命令:
md5sum 或者 sha1sum
比如:
1.下载源码包
wegt https://tengine.taobao.org/download/tengine-2.4.1.tar.gz
2.使用md5sum验证
md5sum tengine-2.4.1.tar.gz
[root@shell opt]# md5sum tengine-2.4.1.tar.gz
8a3c754741539723af977246dfb260dd tengine-2.4.1.tar.gz # 然后与官网的提供的md5进行对比
3-2.二进制安装
二进制安装最为简单,不需要关注编译环境问题,直接是一个二进制命令直接就能使用。
3--2-1.安装java
1.下载
wget -O /opt/java-8u43.tar.gz https://download.java.net/openjdk/jdk8u43/ri/openjdk-8u43-linux-x64.tar.gz
2.解压
tar -zxvf /opt/java-8u43.tar.gz
3.查看目录
ls java-se-8u43-ri/
4.进入bin目录执行java命令查看版本
/opt/java-se-8u43-ri/bin/java -version
5.配置相关的环境变量
ln -s /opt/java-se-8u43-ri /opt/java # 设置一个软件链接
在 /etc/profile 添加java需要的环境变量
export JAVA_HOME=/opt/java
export PATH=${PATH}:${JAVA_HOME}/bin
soucer /etc/profile # 加载一下环境变量
6.执行查看版本
java -version
3-3.rpm/deb安装
3-3-1.网上下载rpm/deb
# 根据系统版本从对应软件网站中下载指定的rpm包进行安装
1.下载:
wget -O /opt/nginx-1.10.1-1.el7.ngx.x86_64.rpm https://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.1-1.el7.ngx.x86_64.rpm
2.安装
rpm -ivh nginx-1.10.0-1.el7.ngx.x86_64.rpm
3-3-2.本地光盘形式
# 注意:
使用的系统ios镜像是完整版(rpm包比较全而且多)还是轻量版(rpm包少)。
1.找到指定的光驱。
find /dev -type b # 找到块设备文件
# 查看当前服务器的挂载的ios镜像光盘
/dev/sr0
sr 表示 SCSI 光驱(SCSI CD-ROM。
0 表示 这是系统中的第一个此类设备。
2.挂载到本地目录
mount /dev/sr0 /mnt # 进行挂载
3.统计rpm包有多少个
ls /mnt/Packages/ | wc -l
4.在 /mnt/Packages/ 目录下找到需要的rpm包安装即可,需要处理依赖关系
ls /mnt/Packages/ | grep 'vim*'
[root@shell Packages]# ls /mnt/Packages/ | grep 'vim'
vim-common-7.4.629-7.el7.x86_64.rpm
vim-enhanced-7.4.629-7.el7.x86_64.rpm
vim-filesystem-7.4.629-7.el7.x86_64.rpm
vim-minimal-7.4.629-7.el7.x86_64.rpm
vim-X11-7.4.629-7.el7.x86_64.rpm
5.取消挂载
umonut /mnt
3-3-3.远程传输
通过 src 或者 rz 等等方式将rpm包发送到linux服务器中
4.升级安装命令
代表 | 软件管理机制 | 使用命令 | 在线升级机制 |
---|---|---|---|
Red Hat/Fedora | rpm | rpm,rpmbuild | yum |
Dabian/Ubuntu | dpkg | dpkg | apt,apt-get |
1.yum命令
是什么:
- yum命令是一个管理rpm包的工具。可以对centos与红帽发行版本的软件进行 更新 删除 修改 下载等功能。
- yum 主要针对管理 rpm包安装的程序,使用rpm命令安装的*.rpm包是可以被管理的。
- yum 工具本质上就是给linux安装rpm包程序,rpm命令简化版,直接从源中获取rpm包,处理依赖下载安装,一条命令直接完成。
- rpm命令 -> 网站下载rpm -> 处理依赖 -> 安装,无论是rpm命令安装还是yum安装都是可以被systemctl进行管理的。
文件路径 | 作用 |
---|---|
/var/lib/rpm | RPM数据库的存储位置 |
/etc/yum.repo.d/ | 存放yum的仓库源文件。 |
/etc/yum.conf | yum的配置文件。 |
/var/log/yum.log | 存放yum的日志。 |
/var/cache/yum/ | 存放yum的缓存内容。 |
/etc/yum/pluginconf.d | yum插件目录 |
配置文件:
/etc/yum.conf
yum的仓库:当使用yum命令安装程序是,就会读取当前目录下的配置文件对应的下载软件。
/etc/yum.repo.d/
yum的缓存路径:
/var/cache/yum/
命令:
yum
指令:
clean 指令 # 清除全部的yum缓存
all:清除全部
packages:清除软件包
metadata:源数据
dbcache:清除sqlite文件
headers:标头
rpmdb:删除rpm缓存
expire-cache:过期缓存
plugins:插件
一般使用:yum clean all
check-update # 检查可用的软件包更新
deplist <软件名称> # 检查软件的依赖
info <软件名称> # 检查软件的详情
install <软件名称> # 安装软件包
list 指令 # 列出所有的可用包(包含已安装的和未安装的)
yum list installed # 列出已安装的软件包
yum list available # 列出未安装的软件包 根据 /etc/yum.repo.d/ 配置仓库获取
history # 显示yum的安装卸载记录
rpmdb # 验证已安装包的完整性,包括头文件和内容,确保没有损坏的包。
makecache # 生成缓存
search <软件名称> # 搜索软件
shell # 进入交互模式
update <软件名称> # 更新一个或者全部的包
# 注意:
为什么centos不需要执行yum update 因为 yum自动更新软件包索引(缓存)所以不需要进行 yum update。
为什么ubutun需要先 apt update,因为不会更新软件包索引,需要先运行 apt update 命令来更新索引。
update-minimal # 更新系统中的软件包,但只限于那些必须更新的包,那些没有它们系统将无法正常工作或存在安全风险的包。(并不是所有的版本都支持)
upgrade # 会检查所有已安装的包,并升级那些有新版本可用的包。
可用参数:
--security:只升级那些被标记为安全相关的软件包。
repolist # 显示当前的全部软件包仓库
reinstall <软件名称> # 重新安装软件包,只会对已安装的包生效
erase <软件名称> # 从系统中删除一个包或者多个包
1-1.yum源
是什么:
- 是指存放 RPM 软件包的服务器或本地目录,这些源提供了系统安装、更新和删除软件包所需的包。简单理解就是安装程序包的仓库。
分类:
- 在线服务器(官方),就是在线仓库。
- 本地仓库,本地设置目录作为yum源,这通常用于测试、离线安装或当你需要控制软件包的来源时。
- 第三方仓库,除了官方提供的仓库外,还有第三提供的。第三方仓库提供了额外的软件包,这些软件包可能不在官方仓库中。
yum缓存:
- 首次下载后 yum install nginx 这个依赖就会作为一个缓存,便于下一个软件安装时,使用了nginx的依赖,不用从网上获取,而是从缓存获取,这个就是yum的
cache
缓存。
1-2.yum仓库配置文件
# yum仓库的文件,放在一个固定的目录中:/etc/yum.repos.d/ 采用 ini 配置文件格式
vim /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
priority=1
keepcache=1
仓库配置参数解释:
[epel]:仓库的表示用于在 YUM 中唯一标识这个仓库,必须是唯一的,如果重复就会被覆盖。标识是随机取的
name:是仓库的名字 $basearch 变量会替换为系统的架构
baseurl:指定仓库的下载软件包地址的url
failovermethod:这行指定了当多个仓库提供相同软件包时,YUM 如何选择仓库。
参数:
priority 会根据顺序选择,优先使用排在前面的仓库。
roundrobin 随机选择
enabled:表示仓库是否要启用,1 表示启用 0 表示禁用。
gpgcheck:这行指定是否启用 GPG 签名检查。1 表示启用 0 表示禁用。
gpgkey:用于验证软件包签名的 GPG 签名密钥文件的路径,禁用 GPG 检查可能会降低安全性,因为 YUM 不会验证软件包的签名。
keepcache:yum每次操作后保留软件包缓存。0 清理缓存(默认)1 保留缓存中的软件包。
priority:yum安装时使用仓库的优先级 参数范围:1-99 1是最高优先级。
1-3.yum配置文件
/etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
配置参数说明:
cachedir:指定 YUM 缓存的存储目录,默认是 /var/cache/yum。
keepcache:设置为 1 时,YUM 会在事务完成后保留下载的包;设置为 0 时,包会被删除。也可以在仓库配置文件中设置。
debuglevel:设置调试级别,控制日志记录的信息。
logfile:日志存放位置,默认是 /var/log/yum.log。
exactarch:设置为 1 时,YUM 只安装精确匹配的架构包。# 按照其他的架构也无法使用
obsoletes:设置为 1 时,YUM 会安装更新版本的包来替换已安装的过时包。
plugins:启用或者禁用插件。1 启用 0 禁用
pluginpath:插件的搜索路径
reposdir:设置repo文件的目录 默认是 /etc/yum.repos.d。
gpgcheck:设置为 1 时,YUM 会检查所有包的 GPG 签名,0不检查。
installonly_limit:在 YUM 配置中用来控制 "install only" 包(仅安装包)的更新行为。设置为1不会自动更新,设置为0就会自动更新。设置为5就默认更新5个"install only" 包。
bugtracker_url:当需要报告与 YUM 相关的 bug 时,可以访问这个 URL 提交 bug 报告。
distroverpkg:这个参数指定了一个软件包的名称,该软件包提供了发行版的版本信息。
# 其他参数:
proxy:设置 YUM 连接到远程仓库时使用的 HTTP 代理服务器。
proxy_username 和 proxy_password:设置代理服务器的用户名和密码。
installonly_limit:设置为 1 时,installonlypkgs 只适用于安全和 bugfix 更新。
assumeyes:设置为 1 默认回答yes,默认设置 0
bandwidth:限制带宽,字节每秒(B/s)为单位。
timeout:设置 YUM 操作的超时时间。单位秒。
retries:临时故障时尝试重新执行操作的次数。默认是3。
max_retries:设置最大重试次数,默认通常是5。
exclude:阻止 YUM 从仓库中下载这些软件包 exclude=package1,package2,package3 或者 exclude=kernel*
includepkgs:允许 YUM 从仓库中下载这些软件包 includepkgs=package1,package2, 或者 includepkgs=kernel*
installonlypkgs:在 YUM 配置中用来指定某些软件包应该只在系统安装时被安装,而在后续的系统更新时不被升级或替换。这个写包被称为"install only",通常这个些包是系统运行必要的包(更新后会导致系统不稳定)。设置为 1 不会对这些包更新,但是也可以进行手动更新yum update xxx。
installonlypkg:指定一个包列表,只安装不更新 installonlypkg=package1,package2,
skip_broken:设置为 1 时,YUM 会跳过无法解决的依赖关系。
errorlevel:设置错误级别,用于控制 YUM 在遇到错误时的行为。
1-4.rpm本地仓库(本地光盘)
注意:
- 如果有物理服务器,一般服务服务器,没有外置光驱,需要自己买一个,并且刻录一个centos 7的光盘( 光驱 + 刻录有centos7的光盘 链接服务器,挂载光盘)。
- 使用的vmware,直接挂载ios镜像即可,需要确定vmware有链接镜像光盘。
- 不要使用迷你的ios镜像源,内部的rpm包不全,并且配置yum仓库,好多东西没有
1.挂载设备块
mount /dev/sr0 /mnt
2.在 /etc/yum.repo.d/ 创建一个 仓库配置文件
vim /etc/yum.repo.d/myrom.rpeo
# 内容如下
[base]
name=yum-cdrom
baseurl=file:///mnt # file:// /mnt 地址指向/mnt目录
enabled=1
gpgcheck=0
# 解释 file:// 什么意思
是统一资源定位(url)的前缀,它用来表示文件系统中的文件路径。
可以通过 crul file:///opt/123.log 可以直接进行访问读取 /opt/123.log文件中的内容
3.清除缓存,加载缓存
yum clean all
yum makecache
4.查看仓库列表
yum repolist all
5.通过vim进行尝试,是否可以使用。
yum remove vim vim-*
yum install vim # 进行安装测试是否配置正常
1-5.rpm远程仓库(网络源)
为什么用网络源:
- 如阿里的网络源,内容比较齐全,但是有局限性。中小型公司使用这种源,也有大型公司使用,方便,不用维护。
- 一般大公司,都会自己配置内部的yum源,因为企业内部使用devops全链路流水线,代码上传 > 下载 > yum仓库 > 全部为流水线形式,centos平台,其他在说,就比如阿里源停了,那么使用阿里源的公司就无法使用了。
网络源本质:
- 就是从阿里源官网下载了一个yum源的配置文件,他的baseurl地址指向的就是阿里云的yum仓库,所有的yum install 就是从它的仓库中下载程序。
网络源有哪些:
1.下载阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
2.清理缓存
yum clean all
yum makecache
3.查看仓库
yum repolist
1-6.rpm自建仓库
# 将安装软件包以及软件包的依赖保存在本地机器上,在通过某中方式,让其他机器下载。
操作流程:
1.相关的软件包,以及它使用的依赖包
2.将这些包,存放到指定的文件目录中。
3.将这个目录设置为yum仓库。
4.提供远程访问当前目录的操作。
# 注意:
依赖问题。
1-6-1.创建自建仓库
# 机器A操作
1.创建一个软件目录
mkdir /test
2.安装软件包
# 当前命令操作,不对软件进行安装,而是将相关的软件包下载到/test目录下
yum install --downloadonly --downloaddir=/test httpd*
3.将 /test 文件夹成为一个yum可以识别的仓库
yum install -y createrepo # 需要借助createrepo命令
4.借助nginx的文件索引功能实现远程仓库。
#配置信息:
vim /etc/nginx/conf.d/index.conf
server {
listen 80;
server_name _;
charset utf-8;
location /{
autoindex on; # 开启文件开启目录索引
autoindex_exact_size off; # 展示文件大小
autoindex_localtime on; # 展示时间
root /test; # 展示地址
}
}
5.进行访问nginx进行测试
1-6-2.使用自建仓库
# 机器B
1.创建rpm文件
vim /etc/yum.repos.d/test.repo
[base]
name=192.168.85.133-linux-yum-cdrom
baseurl=http://192.168.85.133
enabled=1
gpgcheck=0
2.清除缓存
yum clean all
yum makececha
3.检查仓库
yum repolist
4.安装测试
yum install httpd -y
1-7.配置mysql源
# 其他软件源配置也与这个相同操作。配置软件源,可以在正规网站上下载程序,安全可靠,同时还可以指定需要的版本
网站:https://dev.mysql.com/downloads/repo/yum/
mysql:ftp服务器地址:https://repo.mysql.com/
1.通过下载地址找到ftp服务器的5.7的rmp包url地址(这个是一个5.7集合的大版本rmp仓库)
https://repo.mysql.com//yum/mysql-5.7-community/el/7/x86_64/
2.编写仓库配置文件
[mysql56]
name="mysql5.7"
baseurl=https://repo.mysql.com//yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=0
1-8.yum下载慢
1.更换yum源,清华 阿里 腾讯
2.修改当前机器的dns解析地址
3.更换网络环境
4.如果下载特别慢,几kb每秒,断开重试,可能是网络波动导致网络不稳定
1-9.缓存流程
默认的缓存目录:/var/cache/yum
1.当yum install nginx
2.先去/etc/yum.repos.d/*.repo文件中找你是那个源仓库-->阿里源仓库
3.就会通过 网络请求 从阿里源仓库下载 nginx.rpm以及 依赖工具.rpm
5.缓存cache,在当从/var/cache/yum/架构系统/...,存放的很多下载好的rpm包的缓存,
便于下次下载不用去阿里云中下载,而是从这个缓存目录中找,并且安装
优点:速度快,节省网络资源消耗
缺点:如果版本不适用,那么就需要主动清理
4.下载到你的linux机器上
2.apt命令
2-1.apt仓库配置解读
仓库源位置:
/etc/apt/sources.list
/etc/apt/sources.list.d/
配置语法:
deb [选项] <URL> <发行版> [组件...]
deb-src [选项] <URL> <发行版> [组件...]
区别:作用就是告诉apt命令那种类型的包从哪个url中下载
deb url # 这个指令告诉 apt 从指定的 URL 下载二进制软件包。这些软件包是编译好的,可以直接安装在系统上。
deb-src url # 这个指令与 deb 类似,但它是用来下载软件包的源代码。这通常用于那些想要从源代码编译软件包的用户,或者需要修改软件包源代码的情况。
发行版指令(指特定的版本,不通的版本不一样):
focal 长期支持版本的代号
focal-updates 针对长期支持的版本更新的软件包(这些更新可能包括安全更新、bug修复和性能改进。)
组件指令(用来区分包的类型和组织):
main 这个组件包含了由Ubuntu团队支持的免费和开源软件包
restricted 组件包含了一些因为法律或版权限制不能包含在 main 组件中的软件包
universe 组件是一个由社区维护的软件包集合,包含了大量的开源软件。
multiverse 组件包含了不自由的软件包,即那些不符合Ubuntu的自由软件哲学的软件包。
例如当前的仓库:
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
# 解释:
二进制地址:https://mirrors.aliyun.com/ubuntu/
focal:24.04 LTS 长期支持版本
main restricted universe multiverse :包含了官方包,因为法律或版权限制包,社区包,不符合规定的包
2-2.配置方式
2-2-1.配置方式1
# 通过指令的方式:
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
2-2-2.配置方式2
# 细粒度配置
Types: deb # 表示这些仓库包含的是Debian软件包(.deb 文件)
URIs: http://archive.ubuntu.com/ubuntu/ # 仓库的url
Suites: noble noble-updates noble-backports # 指定了支持的Ubuntu发行版代号。
Components: main universe restricted multiverse # 指定了包含的软件包组件
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg # 用于验证软件包签名的密钥环文件路径
2-2-3.配置阿里源
# 注意,请根据当前ubuntu版本选择
1.打开文件
vim /etc/apt/sources.list.d/ali.list
2.写入内容
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
2-3.apt命令参数
命令:
apt
参数:
list 列出全部的安装程序
list 软件名称 # 列出相关软件的
-a # 列出全部的
search 软件名称 # 搜索软件
remove 软件包 # 删除
install 软件包 # 安装
reinstall 软件包 # 重新安装
autoremove # 自动移除所有的未使用的软件包
updatp # 更新可用软件包列表
upgrade # 安装升级软件包来升级系统
full-upgrade # 通过移除/安装/升级软件包来升级系统。
edit-sources # 编辑源信息文件。
satisfy # 满足依赖字符串。
purge # 卸载软件,同时删除对应的文件
2-4.搭建私有可道云盘
1.卸载nginx相关依赖
sudo apt remove nginx-* -y
2.安装软件
# 安装添加管理源的工具
sudo apt install software-properties-common
# 第三方的 PHP 仓库,这个仓库提供了 PHP 7.4 的包。
sudo add-apt-repository ppa:ondrej/php
sudo apt install php7.4 php7.4-fpm php7.4-gd php7.4-curl php7.4-mbstring nginx unzip -y
3.下载源码,解压
sudo wget -O /opt/kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
unzip -d /kodcloud /opt/kodexplorer4.40.zip
sudo chmod -R 777 /kodcloud/
4.编写nginx配置
server{
listen 81;
server_name _;
root /kodcloud;
index index.php index.html;
location ~ \.php$ {
root /kodcloud;
fastcgi_pass 127.0.0.1:9000; # 修改为 unix:/var/run/php/php7.4-fpm.sock
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
5.修改php-fpm配置
vim /etc/php/7.4/fpm/pool.d/www.conf
;listen = /run/php/php7.4-fpm.sock # 注释,添加;就是注释
listen = 127.0.0.1:9000 # 添加,如果不添加就修改nginx的配置
5.启动查看
sudo systemctl restart nginx php7.4-fpm