一、磁盘阵列RAID
"RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 于1987年在加州大学伯克利分校发明的。在1988年6月SIGMOD会议上提交的论文"A Case for Redundant Arrays of Inexpensive Disks"(中文翻译:廉价磁盘冗余阵列案例)中提出。
为了提升磁盘系统性能,他们提出用许多块廉价的磁盘做成一个磁盘组,在性能上超过昂贵的大型机上的单个大容量磁盘。
简称磁盘阵列
利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。
RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。
简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作。
RAID功能实现
- 提高IO能力,磁盘并行读写
- 提高耐用性,磁盘冗余算法来实现
RAID实现的方式
- 外接式磁盘阵列:通过扩展卡提供适配能力
- 内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置
- 软件RAID:通过OS实现,比如:群晖的NAS
级别:多块磁盘组织在一起的工作方式有所不同
参考链接:https://zh.wikipedia.org/wiki/RAID
RAID-0
以 chunk 单位,读写数据,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。 但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失
读、写性能提升
可用空间:N*min(S1,S2,...)
无容错能力
最少磁盘数:1+
RAID-1
也称为镜像, 两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID 0相同。另外写入速度有微小的降低。
读性能提升、写性能略有下降
可用空间:1*min(S1,S2,...)
磁盘利用率:50%
有冗余能力
最少磁盘数:2+
RAID-5
读、写性能提升
可用空间:(N-1)*min(S1,S2,...)
有容错能力:允许最多1块磁盘损坏
最少磁盘数:3, 3+
RAID-10
读、写性能提升
可用空间:N*min(S1,S2,...)/2
有容错能力:每组镜像最多只能坏一块
最少磁盘数:4, 4+
RAID-01
多块磁盘先实现RAID0,再组合成RAID1
二、LVM磁盘扩容及缩容
逻辑卷管理器(LVM)
LVM:Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,允许在多个物理设备间重新组织文件系统
LVM可以弹性的更改LVM的容量
通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中的PE加到LV中以加大容量
实现过程
- 将设备指定为物理卷
- 用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的
- 在物理卷上创建的逻辑卷, 是由物理区域(PE)组成
- 可以在逻辑卷上创建文件系统并挂载
pv管理工具
将块设备创建为物理卷,本质上就是给块设备打一个标签,块设备数量和物理卷数量是对应的,有几个块设备,就可以创建几个物理卷,块设备容量大小不限,可以跨分区。
显示pv信息
pvs #简要pv信息显示
pvdisplay #显示详细信息
创建pv
pvcreate /dev/DEVICE
删除pv
pvremove /dev/DEVICE
范例:
#创建pv
[root@ubuntu2204 ~]# pvcreate /dev/sdb1 /dev/sdc
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc" successfully created.
#查看
[root@ubuntu2204 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 ubuntu-vg lvm2 a-- <198.00g 99.00g
/dev/sdb1 lvm2 --- 5.00g 5.00g
/dev/sdc lvm2 --- 20.00g 20.00g
#查看指定PV
[root@ubuntu2204 ~]# pvdisplay /dev/sdc
"/dev/sdc" is a new physical volume of "20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID sNIAGt-c68i-k8Bs-6Xnl-gpu9-hRDx-iffwbN
#移除
[root@ubuntu2204 ~]# pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.
vg管理工具
显示卷组
vgs
vgdisplay
创建卷组
vgcreate [-s Size ] vgname pv1 [pv2...]
#-s 指定PE大小,数字加单位,单位为 k|K|m|M|g|G|t|T|p|P|e|E
管理卷组
vgextend vgname pv1 [pv2...] #往卷组中添加物理卷
vgreduce vgname pv1 [pv2...] #从卷组中移除物理卷
删除卷组
删除vg之前,要先把对应的 pv 解除绑定 (pvmove)
vgremove vgname
范例:
#创建vg
[root@ubuntu2204 ~]# vgcreate -s 16M testvg /dev/sdb1 /dev/sdc
Volume group "testvg" successfully created
#查看vg
[root@ubuntu2204 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
testvg 2 0 0 wz--n- <24.97g <24.97g
ubuntu-vg 1 1 0 wz--n- <198.00g 99.00g
#查看vg
[root@ubuntu2204 ~]# vgdisplay testvg
--- Volume group ---
VG Name testvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size <24.97 GiB #总大小
PE Size 16.00 MiB #PE大小
Total PE 1598 #总PE数量
Alloc PE / Size 0 / 0 #己分配的PE
Free PE / Size 1598 / <24.97 GiB #可用PE
VG UUID lm1nmp-0SS1-icze-jnWP-UHhb-VYma-AxOaJW
范例:扩展vg
[root@ubuntu2204 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 ubuntu-vg lvm2 a-- <198.00g 99.00g
/dev/sdb1 testvg lvm2 a-- 4.98g 4.98g
/dev/sdb2 lvm2 --- 5.00g 5.00g
/dev/sdc testvg lvm2 a-- 19.98g 19.98g
#往testvg中增加 pv
[root@ubuntu2204 ~]# vgextend testvg /dev/sdb2
Volume group "testvg" successfully extended
#再次查看pv
[root@ubuntu2204 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 ubuntu-vg lvm2 a-- <198.00g 99.00g
/dev/sdb1 testvg lvm2 a-- 4.98g 4.98g
/dev/sdb2 testvg lvm2 a-- 4.98g 4.98g
/dev/sdc testvg lvm2 a-- 19.98g 19.98g
lv管理工具
显示逻辑卷
lvs
Lvdisplay
创建逻辑卷
lvcreate {-L N[mMgGtT]|-l N} -n NAME VolumeGroup
-L|--size N[mMgGtT] #指定大小
-l|--extents N #指定PE个数,也可用百分比
-n Name #逻辑卷名称
扩展逻辑卷
lvextend {-L N[mMgGtT]|-l N} LV_NAME
#常用选项
-L|--size [+]Size[mMgGtT] #N个单位大小,也可写成+10M
-l|--extents [+]Number[PERCENT] #N个PE,也可以写成+10,表示在原基础上加10个PE大小,
+100%free 表示把剩下空间都用完
-r|--resizefs #自动重置文件系统大小
缩减逻辑卷
lvreduce {-L N[mMgGtT]|-l N} LV_NAME
#常用选项
-L|--size [-]Size[mMgGtT] #N个单位大小,也可写成-10M
-l|--extents [-]Number[PERCENT] #N个PE,也可以写成-10,表示在原基础上减10个PE大小
删除逻辑卷
lvremove /dev/VG_NAME/LV_NAME
重设文件系统大小
修改了逻辑卷大小后,要同步文件系统
fsadm [options] resize device [new_size[BKMGTEP]]
resize2fs [-f] [-F] [-M] [-P] [-p] lvname #只支持ext系列文件系统
xfs_growfs /mountpoint #只支持xfs 文件系统
范例:创建lv
#从 testvg 中创建lv1,大小为 100个PE
[root@ubuntu2204 ~]# lvcreate -l 100 -n lv1 testvg
Logical volume "lv1" created.
#创建lv2,大小为5G
[root@ubuntu2204 ~]# lvcreate -L 5G -n lv2 testvg
Logical volume "lv2" created.
#创建lv3,大小为剩下可用PE数量的 20%
[root@ubuntu2204 ~]# lvcreate -l 20%free -n lv3 testvg
Logical volume "lv3" created.
#创建lv4,大小为指定vg的10%
[root@ubuntu2204 ~]# lvcreate -l 10%VG -n lv4 testvg
Logical volume "lv4" created.
范例:查看
#查看
[root@ubuntu2204 ~]# lvs /dev/testvg/lv*
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
lv1 testvg -wi-a----- 1.56g
lv2 testvg -wi-a----- 5.00g
lv3 testvg -wi-a----- 4.67g
lv4 testvg -wi-a----- 2.98g
#查看
[root@ubuntu2204 ~]# lvdisplay /dev/testvg/lv1
--- Logical volume ---
LV Path /dev/testvg/lv1
LV Name lv1
VG Name testvg
LV UUID ZSGR11-oJqR-Be33-OEZa-LSBG-bCVZ-hqCt8y
LV Write Access read/write
LV Creation host, time ubuntu2204, 2023-05-14 17:22:25 +0800
LV Status available
# open 0
LV Size 1.56 GiB
Current LE 100
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
逻辑卷的使用跟硬盘分区使用一样,要先创建文件系统,再进行挂载
扩展和缩减逻辑卷
在线扩展逻辑卷
扩展逻辑卷之前,要先保证卷组上还有空间
两步实现,先扩展逻辑卷,再扩容文件系统
#第一步实现逻辑卷的空间扩展
lvextend -L [+]N[mMgGtT] /dev/VG_NAME/LV_NAME
#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/VG_NAME/LV_NAME
#针对xfs
xfs_growfs MOUNTPOINT
一步实现容量和文件系统的扩展
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
缩减逻辑卷
注意:缩减有数据损坏的风险,建议先备份再缩减,不支持在线缩减,要先取消挂载,xfs文件系统不支持缩减
缩减流程
#取消挂载
umount /dev/VG_NAME/LV_NAME
#文件系统检测,e2fsck可写成fsck
e2fsck -f /dev/VG_NAME/LV_NAME
#缩减文件系统到指定大小
resize2fs /dev/VG_NAME/LV_NAME N[mMgGtT]
#缩减逻辑卷
lvreduce -L [-] N[mMgGtT] /dev/VG_NAME/LV_NAME
#重新挂载
mount /dev/VG_NAME/LV_NAME mountpoint
简化缩减流程
umount /dev/VG_NAME/LV_NAME
lvreduce -L N[mMgGtT] -r /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint
范例:缩减XFS文件系统的逻辑卷
#因为XFS文件系统不支持缩减,可以用下面方式缩减
#先备份XFS文件系统数据
[root@ubuntu2204 ~]# apt install xfsdump
#备份/data挂载点对应的逻辑卷
#注意挂载点后面不要加/,否则会出错:xfsdump: ERROR: /data/ does not identify a file system
[root@ubuntu2204 ~]# xfsdump -f data.img /data
#卸载文件系统
[root@ubuntu2204 ~]# umount /data
#缩减逻辑卷
[root@ubuntu2204 ~]# lvreduce -L 10G /dev/vg0/lv0
#重新创建文件系统
[root@ubuntu2204 ~]# mkfs.xfs -f /dev/vg0/lv0
#重新挂载
[root@ubuntu2204 ~]# mount /dev/vg0/lv0 /data
#还原数据
[root@ubuntu2204 ~]# xfsrestore -f data.img /data
三、程序包管理器
总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何获取命令获取?
Linux系统中常用的程序包管理器有以下几种:
- dpkg:Debian Linux系统中使用的程序包管理器,通过dpkg命令可以安装、卸载、查询和更新软件包,其对应的前端工具有apt-get和aptitude等。
- RPM:Red Hat Package Manager,最初由Red Hat Linux发明,现在已成为Linux标准基础之一。RPM包管理器可以在各种Linux发行版中使用,包括Red Hat、Fedora、CentOS等。
- pacman:Arch Linux发行版中使用的程序包管理器,它支持依赖关系管理,并且允许用户自定义软件库。
- Portage:由Gentoo Linux发明的程序包管理器,通过源代码构建和安装软件包,具有高度自动化和定制化的特点。
- YUM:基于RPM包格式的软件包管理器,提供了依赖关系解决方案和自动下载和安装功能,其主要应用于CentOS、Fedora和Red Hat等Linux操作系统。
这些程序包管理器都有自己的特点和优缺点,根据不同的需求和使用场景进行选择。例如,在Debian Linux系统中,可以使用dpkg和apt-get来快速管理软件包;而在RHEL/CentOS系统中,则可以使用YUM或dnf进行软件包的管理。
一个Linux程序包中可以包含多个文件,不同的程序包可能包含的文件也有所不同。
一般来说,一个典型的程序包可能包含以下类型的文件:
- 程序可执行文件:这是程序包中最关键的文件之一,它是实际运行程序的二进制文件。
- 配置文件:程序包中可能包含了一些配置文件,这些文件包含了程序的一些配置信息,例如,端口号、数据库连接信息等。
- 文档文件:为了方便用户使用程序,程序包通常会包含一些用户手册、帮助文档、使用说明等文档文件。
- 库文件:很多程序需要使用到一些共享库文件,程序包中可能会包含这些库文件,以便于程序能够正确地运行。
- 图标文件和资源文件:程序包还可能包含一些图标文件和其它资源文件,这些文件可以提高用户体验。
- 安装脚本:一些程序包可能会包含一些安装脚本,这些脚本可以在程序安装前或安装后执行一些预处理或后续操作。
总之,程序包中的文件类型和数量因程序而异,但通常都包含了一些核心文件(如可执行文件和依赖库文件等)和与程序相关的配置文件和文档信息。
yum/dnf/apt总结程序包获取途径,以及rpm,yum,apt命令选项示例。
有多种途径可以获取Linux程序包,常见的途径包括以下几种:
- 官方软件源:Linux操作系统通常都会提供一些官方的软件源,用户可以直接通过软件包管理器来获取并安装程序包。例如,在Debian和Ubuntu中,可以使用apt-get或aptitude等命令来获取和安装软件包;在Fedora和CentOS中,可以使用yum或dnf等命令来安装软件包。
- 第三方软件源:除了官方软件源外,还有很多第三方软件源可以获取程序包。例如,在Ubuntu中,可以使用ppa工具添加第三方软件源;在CentOS中,则可以通过EPEL(Extra Packages for Enterprise Linux)来获取额外的软件包。
- 官方网站:一些软件开发者会在其官方网站上提供程序包的下载链接。用户可以访问官方网站并手动下载相应的程序包进行安装。
- 手动编译:对于一些开源项目,用户也可以从其官方的源代码中进行编译,并手动安装生成的程序包。需要注意的是,手动编译可能需要消耗一定的时间和精力,并且需要手动解决依赖关系等问题。
总之,在Linux系统中获取程序包有多种途径,用户可以根据实际需求和情况选择合适的方式进行获取和安装。
包管理器rpm
CentOS系统上使用rpm命令管理程序包
功能:安装、卸载、升级、查询、校验、数据库维护
RPM是 Red Hat Package Manager 的缩写,是一种Linux软件包管理工具。它可以用来安装、查询、更新和删除程序包,下面是一些常见的rpm命令选项示例。
安装
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v|verbose #显示详细信息
-vv #更详细
-h #显示安装进度条
--test #测试安装,但不真正执行安装,即dry run模式
--nodeps #忽略依赖关系
--replacefiles #忽略软件包之间的冲突的文件
--replacepkgs #如果软件包已经有了,重新安装软件包
--nosignature #不检查来源合法性
--nodigest #不检查包完整性
--noscripts #不执行程序包脚本,相当于 --nopre --nopost --nopreun --nopostun --nopretrans --noposttrans
--nopre #不执行程序包中安装前脚本
--nopost #不执行程序包中安装前脚本
--nopreun #不执行程序包中卸载前脚本
--nopostun #不执行程序包中卸载后脚本
--nopretrans #安装前不执行与程序同名脚本
--noposttrans #安装后不执行与程序同名脚本
#常用组合
rpm -ivh PACKAGE_FILE ...
范例:
#不需要依赖
[root@loaclhost Packages]$ rpm -ivh vsftpd-3.0.3-35.el8.x86_64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]
#需要依赖
[root@loaclhost Packages]$ rpm -ivh httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64.rpm
error: Failed dependencies:
httpd-filesystem = 2.4.37-43.module_el8.5.0+1022+b541f3b1 is needed by httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64
httpd-tools = 2.4.37-43.module_el8.5.0+1022+b541f3b1 is needed by httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64
升级和降级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade #安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
freshen #安装有旧版程序包,则“升级”,如果不存在旧版程序包,则不执行安装操作
--oldpackage #降级
--force #强制安装
#常用组合
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
升级注意项:
- 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
- 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把旧版本文件重命名(FILENAME.rpmnew)后保留
包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a #所有包
-f #查看指定的文件由哪个程序包安装生成
-p rpmfile #针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY #查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY #查询指定的CAPABILITY被哪个包所依赖
[query-options]
--changelog #查询rpm包的changelog
-c #查询程序的配置文件
-d #查询程序的文档
-i #information
-l #查看指定的程序包安装后生成的所有文件
--scripts #程序包自带的脚本
--provides #列出指定程序包所提供的CAPABILITY
-R #查询指定的程序包所依赖的CAPABILITY
#常用查询组合
-qi PACKAGE
-qf FILE
-qc PACKAGE
-ql PACKAGE
-qd PACKAGE
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE
-qa
范例:列出所有已安装的包
[root@rocky86 h]# rpm -qa
......
[root@rocky86 h]# rpm -qa | grep passwd
passwd-0.80-4.el8.x86_64
范例:是否安装
#己安装
[root@rocky86 h]# rpm -q nginx
nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64
[root@rocky86 h]# echo $?
0 #
没有安装,找不到包
[root@rocky86 h]# rpm -q php
package php is not installed
[root@rocky86 h]# echo $?
1
范例:查询包详细信息
[root@rocky86 h]# rpm -qi nginx
Name : nginx
Epoch : 1
Version : 1.14.1
Release : 9.module+el8.4.0+542+81547229
Architecture: x86_64
Install Date: Thu 14 Jul 2022 10:11:12 AM CST
Group : System Environment/Daemons
Size : 1669719
License : BSD
Signature : RSA/SHA256, Thu 10 Jun 2021 05:22:38 PM CST, Key ID
15af5dac6d745a60
Source RPM : nginx-1.14.1-9.module+el8.4.0+542+81547229.src.rpm
Build Date : Thu 10 Jun 2021 05:10:40 PM CST
Build Host : ord1-prod-x86build005.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : [email protected]
Vendor : Rocky
URL : http://nginx.org/
Summary : A high performance web server and reverse proxy server
Description :
Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
IMAP protocols, with a strong focus on high concurrency, performance and low
memory usage.
#没有安装,可以指定程序包
[root@rocky86 h]# rpm -qi httpd
package httpd is not installed
#-p指定rpm 包文件,新版可以省略此选项
[root@rocky86 h]# rpm -qip httpd-2.4.37-
47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
Name : httpd
Version : 2.4.37
Release : 47.module+el8.6.0+823+f143cee1.1
Architecture: x86_64
Install Date: (not installed)
Group : System Environment/Daemons
Size : 4499434
License : ASL 2.0
Signature : RSA/SHA256, Wed 11 May 2022 02:40:26 AM CST, Key ID
15af5dac6d745a60
Source RPM : httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.src.rpm
Build Date : Wed 11 May 2022 02:06:03 AM CST
Build Host : ord1-prod-x86build003.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : [email protected]
Vendor : Rocky
URL : https://httpd.apache.org/
Summary : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.
范例:根据文件查询包信息
[root@rocky86 h]# rpm -qf /usr/sbin/nginx
nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64
[root@rocky86 h]# rpm -qf /usr/bin/passwd
passwd-0.80-4.el8.x86_64
[root@rocky86 h]# rpm -qf /etc/passwd
setup-2.12.2-6.el8.noarch
#还没安装的包,此处不能省略-p参数
[root@rocky86 h]# rpm -qpf httpd-2.4.37-
47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64
#自己编译的,不属于任何包
[root@rocky86 0727]# rpm -qf test
file /root/0727/test is not owned by any package
范例:查询配置文件
[root@rocky86 0727]# rpm -qc nginx
/etc/logrotate.d/nginx
/etc/nginx/fastcgi.conf
......
#没安装的指定包文件,新版可省略-p参数
[root@rocky86 h]# rpm -qpc httpd-2.4.37-
47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
......
范例:列出包内所有文件
[root@rocky86 0727]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx/fastcgi.conf
......
#没安装的指定包文件,新版可省略-p参数
[root@rocky86 h]# rpm -qpl httpd-2.4.37-
47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
/etc/httpd/conf
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
......
范例:查询文档文件
[root@rocky86 0727]# rpm -qd nginx
/usr/share/doc/nginx/CHANGES
/usr/share/doc/nginx/README
/usr/share/man/man3/nginx.3pm.gz
......
#指定包文件,新版可省略-p参数
[root@rocky86 h]# rpm -qpd httpd-2.4.37-
47.module+el8.6.0+823+f143cee1.1.x86_64.rpm | head
/usr/share/doc/httpd/ABOUT_APACHE
/usr/share/doc/httpd/CHANGES
......
范例:查询安装脚本
[root@rocky86 h]# rpm -q --scripts postfix
preinstall scriptlet (using /bin/sh):
# Add user and groups if necessary
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
......
范例:短路安装
#短路或,如果没有安装,就执行安装操作
[root@rocky86 v]# rpm -q vsftpd || rpm -ivh vsftpd-3.0.3-35.el8.x86_64.rpm
package vsftpd is not installed
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]
包卸载
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
范例:
[root@rocky86 v]# rpm -evh vsftpd
Preparing... ################################# [100%]
Cleaning up / removing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]
[root@rocky86 v]# rpm -q vsftpd
package vsftpd is not installed
范例:短路卸载
[root@rocky86 v]# rpm -q vsftpd && rpm -evh vsftpd
vsftpd-3.0.3-35.el8.x86_64
Preparing... ################################# [100%]
Cleaning up / removing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]
注意:当包卸载时,对应的配置文件不会删除(前提是该文件被改动过), 以FILENAME.rpmsave形式保留
包校验
在安装包时,系统也会检查包的来源是否是合法的
检查包的完整性和签名
rpm -K|checksig rpmfile
范例:
[root@rocky86 v]# rpm -K vsftpd-3.0.3-35.el8.x86_64.rpm
vsftpd-3.0.3-35.el8.x86_64.rpm: digests signatures OK
在检查包的来源和完整性前,必须导入所需要公钥
范例:
#导入公钥
[root@rocky86 v]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
#查看己导入的公钥
[root@rocky86 v]# rpm -qa "gpg-pubkey"
gpg-pubkey-2f86d6a1-5cf7cefb
gpg-pubkey-6d745a60-60287f36
#查看
[root@rocky86 v]# rpm -qi gpg-pubkey-6d745a60-60287f36
Name : gpg-pubkey
Version : 6d745a60
Release : 60287f36
Architecture: (none)
......
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录下来,可以用来检查包中的文件是否和当初安装时有所变化
格式:
rpm {-V|--verify} [select-options] [verify-options]
#字段说明
S #文件大小不一样
M #文件权限不一样或文件类型不一样
5 #md5 校验值不一样
D #版本号值不一样
L #链接路径不一样
U #属主发生了改变
G #属组发生了改变
T #修改时间发生了改变
P #功能发生了改变
c|d|g|l|r #文件类型 c配置文件, d数据文件,g该文件不属于此处,l许可文件(licens
file),r自述文件(READ ME)
#如果占位符是 . 则表示该处与安装时没有任何改变
范例:
#安装之后没有修改任何文件
[root@rocky86 v]# rpm -V vsftpd
[root@rocky86 v]# echo $?
0 #
安装之后修改了配置文件
[root@rocky86 v]# rpm -V nginx
S.5....T. c /etc/nginx/nginx.conf
[root@rocky86 v]# echo $?
1
数据库
rpm包安装时生成的信息,都放在rpm数据库中
[root@rocky86 v]# ll /var/lib/rpm
total 144016
-rw-r--r--. 1 root root 5218304 Jul 27 16:11 Basenames
-rw-r--r--. 1 root root 16384 Jul 20 16:09 Conflictname
-rw-r--r-- 1 root root 286720 Jul 27 16:21 __db.001
可以重建数据库
rpm {--initdb|--rebuilddb}
initdb #初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb #重建已安装的包头的数据库索引目录
包更新日志
rpm -q --changelog packageName
范例:
[root@rocky86 v]# rpm -q --changelog nginx
* Thu Jun 10 2021 Mustafa Gezen <[email protected]> - 1.14.1-9
- Debrand default pages
* Fri Aug 30 2019 Lubos Uhliarik <[email protected]> - 1:1.14.1-9
......
yum和dnf
CentOS使用 yum,dnf 解决 rpm 的包依赖关系
YUM:Yellowdog Update Modififier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
[root@loaclhost ~]$ll /usr/bin/yum
lrwxrwxrwx. 1 root root 5 Mar 24 17:08 /usr/bin/yum -> dnf-3
yum/dnf 工作原理
yum/dnf 是基于C/S 模式
- yum 服务器存放rpm包和相关包的元数据库
- yum 客户端访问yum服务器进行安装或查询等
yum 实现过程
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装包时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。
创建新源
当使用yum install xxx 或 yum update xxx 时
先去看源能不能连上,如果能连上,则下载源里面的 repodata(如果不是新源,则直接查询本地己存在的repodata)
然后再去 repodata 里面查询,是否有 xxx 包,如果有,则去源的服务器下载 xxx.rpm(包括依赖包)
然后开始安装,完成后删除包信息
yum客户端配置
yum客户端配置文件
/etc/yum.conf #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo #为每个仓库的提供配置文件
获得帮助
[root@rocky86 ~]# man 5 yum.conf
公共配置
[root@rocky86 ~]# ll /etc/yum.conf
lrwxrwxrwx. 1 root root 12 Mar 24 17:08 /etc/yum.conf -> dnf/dnf.conf
[root@rocky86 ~]# cat /etc/yum.conf
[main]
gpgcheck=1 #安装包前要做包的合法和完整性校验
installonly_limit=3 #同时可以安装3个包,最小值为2,如设为0或1,
为不限制
clean_requirements_on_remove=True #删除包时,是否将不再使用的包删除
best=True #升级时,自动选择安装最新版,即使缺少包的依
赖
skip_if_unavailable=False #跳过不可用的
repo仓库配置文件指向的定义
[repositoryID]
name=Some name for this repository #仓库名称
baseurl=url://path/to/repository/ #仓库地址
mirrorlist=http://list/ #仓库地址列表,在这里写了多个 baseurl指向
的地址
enabled={1|0} #是否启用,默认值为1,启用
gpgcheck={1|0} #是否对包进行校验,默认值为1
gpgkey={URL|file://FILENAME} #校验key的地址
enablegroups={1|0} #是否启用yum group,默认值为 1
failovermethod={roundrobin|priority} #有多个baseurl,此项决定访问规则,
roundrobin 随机,priority:按顺序访问
cost=1000 #开销,或者是成本,YUM程序会根据此值来决定
优先访问哪个源,默认为1000
baseurl 有多种写法,支持多种协议
注意:yum仓库指向的路径一定必须是repodata目录所在目录
baseurl=file:///cdrom/AppStream/
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=http://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=ftp://10.0.0.159/
常见变量
$arch #CPU架构 aarch64|i586|i686|x86_64
$basearch #系统基本体系结构i386|x86_64
$releasever #系统版本
#带变量的写法
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?
arch=$basearch&repo=BaseOS-$releasever
#替换后的值
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=x86_64&repo=BaseOS-8
RockyLinux国内源
来源机构 | 地址 |
阿里云 | |
中国科学技术大学 | |
南京大学 | |
上海交通大学 | |
东软信息学院 |
Rocky8.6上配置aliyun的repo源
[root@rocky86 yum.repos.d]# cat aliyun-baseos.repo
[aliyun-baseos]
name=aliyun baseos
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/BaseOS/x86_64/os/
gpgcheck=0
Rocky8.6上配置南京大学的repo源
[root@rocky86 yum.repos.d]# cat nju-extras.repo
[nju-extras]
name=nju extras
baseurl=https://mirrors.nju.edu.cn/rocky/8.6/extras/x86_64/os/
gpgcheck=0
Rocky8.6上配置 本地repo源
[root@rocky86 yum.repos.d]# cat cdrom-appstream.repo
[cdrom-appstream]
name=cdrom appstream
baseurl=file:///cdrom/AppStream/
gpgcheck=0
yum-config-manager
安装
该命令来自 yum-utils 包
[root@rocky86 yum.repos.d]# rpm -qf `which yum-config-manager `
yum-utils-4.0.21-11.el8.noarch
#常用选项
--add-repo=URL #添加repo源
--disable repoid #禁用源
--enable repoid #启用源
范例:
#添加repo源
[root@rocky86 ~]# yum-config-manager --addrepo=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
Adding repo from: https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
#查看
[root@rocky86 yum.repos.d]# cat mirrors.nju.edu.cn_epel_8_Everything_x86_64_.repo
[mirrors.nju.edu.cn_epel_8_Everything_x86_64_]
name=created by dnf config-manager from
https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
baseurl=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
enabled=1
#禁用源
[root@rocky86 yum.repos.d]# yum-config-manager --disable
mirrors.nju.edu.cn_epel_8_Everything_x86_64_
#启用源
[root@rocky86 yum.repos.d]# yum-config-manager --enable
mirrors.nju.edu.cn_epel_8_Everything_x86_64_
yum命令
Yum(全称为 Yellowdog Updater, Modified)是Linux系统下基于RPM的软件包管理器,它可以自动解决程序包之间的依赖关系,方便用户进行软件安装、升级和删除等操作。以下是一些常用的yum命令选项示例。
yum命令的用法
yum [options] COMMAND
#常用选项
-c file|--config file #指定配置文件,默认使用
/etc/yum.conf
-v|--verbose #显示详细信息
-b|--best #尝试在可用包中寻找最匹配的版
本
-y|--assumeyes #自动回答为 yes
--nogpgcheck #不进行包校验
--repo repoid|--repoid repoid #指定repo源
--enablerepo repoid #临时启用repo源,可用通配符
--disablerepo repoid #临时禁用repo源,可用通配符
--nodocs #不安装文档
--skip-broken #跳过有问题的包
--enable #启用源,配合 configmanager
--disable #禁用源,配合 configmanager
-x package|--exclude package|--excludepkgs package #排除指定包,可用通配符
--downloadonly #只下载,不安装
#常用子命令
autoremove #卸载包,同时卸载依赖
check-update #检查可用更新
clean #清除本地缓存
downgrade #包降级
group #包组相关
help #显示帮助信息
history #显示history
info #显示包相关信息
install #包安装
list #列出所有包
makecache #重建缓存
reinstall #重装
remove #卸载
repolist #显示或解析repo源
search #包搜索,包括包名和描述
显示仓库列表
格式:
yum repolist [options]
#常用选项
-v|--verbose #显示详细信息
--repo repoid|--repoid repoid #指定repo源
--all #显示所有源
--enabled #所有enabled状态的源,默认项
--disabled #所有disabled 的源
范例:
#默认显示所有 enable 的 repo
[root@rocky86 yum.repos.d]# yum repolist
repo id repo name
aliyun-baseos aliyun baseos
cdrom-appstream cdrom appstream
nju-extras nju extras
#同默认选项
[root@rocky86 yum.repos.d]# yum repolist --enabled
repo id repo name
aliyun-baseos aliyun baseos
cdrom-appstream cdrom appstream
nju-extras nju extras
#显示disabled 的源
[root@rocky86 yum.repos.d]# yum repolist --disabled
特别提示
yum repolist enabled 等价于 yum repolist --enabled
但是
yum repolist --enabled 可以写成 yum --enabled repolist
yum repolist enabled 不能写成 yum enabled repolist
要理解哪些是子命令,哪些是选项,哪些是参数
范例:显示指定源具体信息
[root@rocky86 yum.repos.d]# yum repolist --repoid=aliyun-baseos -v
Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfoinstall, download, generate_completion_cache, groups-manager, kpatch, needsrestarting, playground, repoclosure, repodiff, repograph, repomanage, reposync
YUM version: 4.7.0
cachedir: /var/cache/dnf
Last metadata expiration check: 0:11:43 ago on Wed 27 Jul 2022 09:00:06 PM CST.
Repo-id : aliyun-baseos
Repo-name : aliyun baseos
Repo-revision : 8.6
Repo-distro-tags : [cpe:/o:rocky:rocky:8]: , , 8, L, R, c, i, k, n, o, u,
x, y
Repo-updated : Fri 22 Jul 2022 12:15:13 PM CST
Repo-pkgs : 2,200
Repo-available-pkgs: 2,198
Repo-size : 2.6 G
Repo-baseurl : https://mirrors.aliyun.com/rockylinux/8.6/BaseOS/x86_64/os/
Repo-expire : 172,800 second(s) (last: Wed 27 Jul 2022 09:00:06 PM CST)
Repo-filename : /etc/yum.repos.d/aliyun-baseos.repo
Total packages: 2,200
显示程序包
格式:
yum list [options] [PACKAGE [PACKAGE ...]
#常用选项
--all #显示所有包,包括己安装的和repo源
中的可用包
--available #所有可用包
--installed #所有己安装的包
--extras #所有额外包
--updates #所有可更新的包
#上述选项可以替换成对应的 all,installed 这种子命令,但要注意位置
--showduplicates #相同的包,显示所有版本
选项可以放在参数后面,但子命令不行
范例:
#参数写法,位置不一样,但结果相同
[root@rocky86 ~]# yum list sos --installed
Installed Packages
sos.noarch 4.2-15.el8 @anaconda
[root@rocky86 ~]# yum list --installed sos
Installed Packages
sos.noarch 4.2-15.el8 @anacond
#子命令写法,位置不一样,结果不同
[root@rocky86 ~]# yum list installed sos
Installed Packages
sos.noarch 4.2-15.el8
@anaconda
[root@rocky86 ~]# yum list sos installed
Last metadata expiration check: 1:01:48 ago on Thu 28 Jul 2022 09:55:02 AM CST.
Installed Packages
sos.noarch 4.2-15.el8
@anaconda
Available Packages
sos.noarch 4.2-19.el8_6
aliyun-baseos
不带包名时,结果一致
#子命令写法
[root@rocky86 ~]# yum list installed | wc -l
1421
#选项写法
[root@rocky86 ~]# yum list --installed | wc -l
1421
这种东西我们不要去扣,按照标准的 命令 选项 参数 这种格式来写,茴香豆的茴字有三种写法还是
四种写法,没有意义,不要做孔乙己
范例:
#显示所有包,包括己安装的和repo源中的可用包
[root@rocky86 yum.repos.d]# yum list
#默认同 all
[root@rocky86 yum.repos.d]# yum list | wc -l
7168
[root@rocky86 yum.repos.d]# yum list --all | wc -l
7168
#所有可用包
[root@rocky86 yum.repos.d]# yum list --available | wc -l
5747
#所有己安装的包
[root@rocky86 yum.repos.d]# yum list --installed
#所有可更新的包
[root@rocky86 yum.repos.d]# yum list --updates
#己安装的是 4.2-15
[root@rocky86 yum.repos.d]# yum list --installed | grep sos
sos.noarch 4.2-15.el8 @anaconda
#可更新到 4.2-19
[root@rocky86 yum.repos.d]# yum list --updates | grep sos
sos.noarch 4.2-19.el8_6 aliyun-baseos
#所有以 z 开头的包,包括己安装的和可安装的
[root@rocky86 yum.repos.d]# yum list --all z*
范例:显示所有可用包
#默认显示4.2-19
[root@rocky86 ~]# yum list --available sos
Last metadata expiration check: 1:13:48 ago on Thu 28 Jul 2022 09:55:02 AM CST.
Available Packages
sos.noarch 4.2-19.el8_6 aliyun-baseos
#其实有两个版本
[root@rocky86 ~]# yum list --available --showduplicates sos
Last metadata expiration check: 1:14:00 ago on Thu 28 Jul 2022 09:55:02 AM CST.
Available Packages
sos.noarch 4.2-15.el8 aliyun-baseos
sos.noarch 4.2-19.el8_6 aliyun-baseo
范例:指定repo源
#两个源都有php包
[root@rocky86 yum.repos.d]# yum list --available php
Last metadata expiration check: 0:00:50 ago on Thu 28 Jul 2022 11:15:47 AM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda aliyunappstream
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda cdromappstream
#禁用某个源
[root@rocky86 yum.repos.d]# yum list --available --disablerepo=cdrom-appstream
php
Last metadata expiration check: 0:03:10 ago on Thu 28 Jul 2022 11:15:47 AM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda aliyunappstrea
#只能使用某个源
[root@rocky86 yum.repos.d]# yum list --available --repo=cdrom-appstream php
Last metadata expiration check: 14:19:19 ago on Wed 27 Jul 2022 09:00:08 PM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda cdromappstrea
#通配符写法
[root@rocky86 yum.repos.d]# yum list --available --repo=cd* php
Last metadata expiration check: 14:19:48 ago on Wed 27 Jul 2022 09:00:08 PM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda cdromappstrea
范例:通配符写法
[root@rocky86 yum.repos.d]# yum list --available --repoid=a* --repoid=cd* *sos*
Last metadata expiration check: 0:08:32 ago on Thu 28 Jul 2022 11:15:47 AM CST.
Available Packages
abrt-plugin-sosreport.x86_64 2.10.9-21.el8.rocky.0
aliyun-appstream
abrt-plugin-sosreport.x86_64 2.10.9-21.el8.rocky.0
cdrom-appstream
sos.noarch 4.2-19.el8_6
aliyun-baseos
sos-audit.noarch 4.2-19.el8_6
aliyun-baseos
sos-collector.noarch 1.8-2.el8
aliyun-appstream
sos-collector.noarch 1.8-2.el8
cdrom-appstream
[root@rocky86 yum.repos.d]# yum list --installed *sos*
Installed Packages
sos.noarch 4.2-15.el8
@anacond
安装程序包
yum install [options] PACKAGE [...]
yum reinstall [options] PACKAGE [...]
#常用选项
--installroot path #指定安装目录
--downloadonly #只下载,不安装
--downloaddir path|--destdir path #指定下载目录,如果下载目录不
存在,则自动创建
范例:
[root@rocky86 yum.repos.d]# rpm -q httpd
package httpd is not installed
#安装
[root@rocky86 yum.repos.d]# yum install httpd
#只下载不安装
[root@rocky86 yum.repos.d]# yum install httpd --downloadonly --
downloaddir=/tmp/httpd
卸载程序包
yum remove [options] PACKAGE [...]
yum erase [options] PACKAGE [...]
范例:
[root@rocky86 yum.repos.d]# yum remove httpd
#卸载多个包
[root@rocky86 yum.repos.d]# yum erase httpd ngnix
升级和降级
yum update [options] PACKAGE [...] #升级
yum downgrade [options] PACKAGE [...] #降级
yum check-update #检查可用升级
范例:
#列出所有可更新的包
[root@rocky86 yum.repos.d]# yum check-update
#检查指定的包是否可更新
[root@rocky86 yum.repos.d]# yum check-update sos
Last metadata expiration check: 0:50:56 ago on Thu 28 Jul 2022 01:19:46 PM CST.
sos.noarch 4.2-19.el8_6 aliyun-baseo
#升级指定包
[root@rocky86 yum.repos.d]# yum update sos
查询
yum info [options] PACKAGE [...] #查看程序包的 information 信息
yum provides [options] PROVIDE #查看文件是由哪个包提供
yum search [options] KEYWORD #根据关健字搜索,范围包括包名和描述信息
yum deplist [options] PACKAGE [...] #查询包的依赖
范例:
#所有包
[root@rocky86 yum.repos.d]# yum info sos
Last metadata expiration check: 1:10:03 ago on Thu 28 Jul 2022 01:19:46 PM CST.
Installed Packages
Name : sos
Version : 4.2
Release : 15.el8
Architecture : noarch
Size : 2.5 M
Source : sos-4.2-15.el8.src.rpm
Repository : @System
From repo : anaconda
Summary : A set of tools to gather troubleshooting information from a
system
URL : https://github.com/sosreport/sos
License : GPLv2+
Description : Sos is a set of tools that gathers information about system
: hardware and configuration. The information can then be used for
: diagnostic purposes and debugging. Sos is commonly used to help
: support technicians and developers.
Available Packages
Name : sos
Version : 4.2
Release : 19.el8_6
Architecture : noarch
Size : 776 k
Source : sos-4.2-19.el8_6.src.rpm
Repository : aliyun-baseos
Summary : A set of tools to gather troubleshooting information from a
system
URL : https://github.com/sosreport/sos
License : GPLv2+
Description : Sos is a set of tools that gathers information about system
: hardware and configuration. The information can then be used for
: diagnostic purposes and debugging. Sos is commonly used to help
: support technicians and developers.
#己安装的包
[root@rocky86 yum.repos.d]# yum info --installed sos
Installed Packages
Name : sos
Version : 4.2
Release : 15.el8
Architecture : noarch
Size : 2.5 M
Source : sos-4.2-15.el8.src.rpm
Repository : @System
From repo : anaconda
Summary : A set of tools to gather troubleshooting information from a
system
URL : https://github.com/sosreport/sos
License : GPLv2+
Description : Sos is a set of tools that gathers information about system
: hardware and configuration. The information can then be used for
: diagnostic purposes and debugging. Sos is commonly used to help
: support technicians and developers.
范例:rpm
[root@rocky86 yum.repos.d]# rpm -qi sos
Name : sos
Version : 4.2
Release : 15.el8
Architecture: noarch
Install Date: Sun 03 Jul 2022 08:50:37 PM CST
Group : Applications/System
Size : 2597877
License : GPLv2+
Signature : RSA/SHA256, Mon 02 May 2022 06:18:20 PM CST, Key ID
15af5dac6d745a60
Source RPM : sos-4.2-15.el8.src.rpm
Build Date : Tue 12 Apr 2022 03:03:04 PM CST
Build Host : ord1-prod-a64build004.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : [email protected]
Vendor : Rocky
URL : https://github.com/sosreport/sos
Summary : A set of tools to gather troubleshooting information from a system
Description :
Sos is a set of tools that gathers information about system
hardware and configuration. The information can then be used for
diagnostic purposes and debugging. Sos is commonly used to help
support technicians and developers.
查看指定的特性(可以是某文件)是由哪个程序包所提供:
#默认所有
[root@rocky86 yum.repos.d]# yum provides /usr/sbin/sos
Last metadata expiration check: 1:19:01 ago on Thu 28 Jul 2022 01:19:46 PM CST.
sos-4.2-15.el8.noarch : A set of tools to gather troubleshooting information
from a system
Repo : @System
Matched from:
Filename : /usr/sbin/sos
sos-4.2-15.el8.noarch : A set of tools to gather troubleshooting information
from a system
Repo : aliyun-baseos
Matched from:
Filename : /usr/sbin/sos
sos-4.2-19.el8_6.noarch : A set of tools to gather troubleshooting information
from a system
Repo : aliyun-baseos
Matched from:
Filename : /usr/sbin/sos
#指定repo源
[root@rocky86 yum.repos.d]# yum provides /usr/sbin/nginx --repoid=cdromappstream
Last metadata expiration check: 17:52:24 ago on Wed 27 Jul 2022 09:00:08 PM CST.
nginx-1:1.14.1-9.module+el8.4.0+542+81547229.x86_64 : A high performance web
server and reverse proxy server
Repo : @System
Matched from:
Filename : /usr/sbin/nginx
nginx-1:1.14.1-9.module+el8.4.0+542+81547229.x86_64 : A high performance web
server and reverse proxy server
Repo : cdrom-appstream
Matched from:
Filename : /usr/sbin/nginx
在包名和关键字中搜索
[root@rocky86 ~]# yum search redis
Last metadata expiration check: 1:46:18 ago on Thu 28 Jul 2022 01:19:46 PM CST.
====================== Name Exactly Matched: redis ======================
redis.x86_64 : A persistent key-value database
===================== Name & Summary Matched: redis ======================
pcp-pmda-redis.x86_64 : Performance Co-Pilot (PCP) metrics for Redis
redis-devel.x86_64 : Development header for Redis module development
redis-doc.noarch : Documentation for Redis including man pages
#多个关键字,且 关系
[root@rocky86 ~]# yum search redis key-value
Last metadata expiration check: 1:49:16 ago on Thu 28 Jul 2022 01:19:46 PM CST.
===================== Name & Summary Matched: key-value, redis ==============
redis.x86_64 : A persistent key-value database
查看指定包所依赖的库和程序
[root@rocky86 ~]# yum deplist nginx --installed
package: nginx-1:1.14.1-9.module+el8.4.0+542+81547229.x86_64
dependency: /bin/sh
dependency: config(nginx) = 1:1.14.1-9.module+el8.4.0+542+81547229
dependency: libc.so.6()(64bit)
......
仓库缓存
缓存目录为 /var/cache/dnf/ ( /var/cache/yum/ )
yum clean [options] {metadata,packages,dbcache,expire-cache,all} #清空缓存
yum makecache #构建缓存
范例:
[root@rocky86 ~]# yum clean all
[root@rocky86 ~]# yum makecache
查看yum事务历史
yum 执行安装卸载命令会记录到相关日志中
日志文件 /var/log/dnf.log ( /var/log/yum.log )
yum history [options] [info|list|redo|undo]
yum history #默认查看所有
yum history list #同上
yum history package #查看与指定包有关的日志
info N #查看第N条记录的具体执行内容
undo N #回滚第N条记录
redo N #重新执行第N条记录
范例:
[root@rocky86 yum.repos.d]# yum history
ID | Command line | Date and time
| Action(s) | Altered
---------------------------------------------------------------------------------
---------------------------
12 | install -y autofs | 2022-05-09
15:26 | Install | 1
11 | -y install redis | 2022-05-05
09:59 | Install | 1
10 | remove redis | 2022-05-05
09:59 | Removed | 1
9 | install gcc-c++ | 2022-05-03
08:56 | I, U | 3
8 | install -y php | 2022-04-30
17:22 | Install | 14
7 | install -y gcc | 2022-04-30
16:28 | I, U | 9
6 | install -y redis | 2022-04-28
08:51 | Install | 1
5 | install -y patch | 2022-04-26
17:06 | Install | 1
4 | install postfix | 2022-04-20
15:48 | Install | 1
3 | | 2022-04-19
20:01 | Install | 1
2 | remove cockpit | 2022-04-09
18:20 | Removed | 1
1 | | 2022-04-05
22:23 | Install | 1378 EE
范例:查看详细信息
[root@rocky86 yum.repos.d]# yum history info 10
Transaction ID : 10
Begin time : Thu 07 Jul 2022 05:45:58 PM CST
Begin rpmdb : 1369:90d27365a8703f09a08db06a491620ab881c4789
End time : Thu 07 Jul 2022 05:46:01 PM CST (3 seconds)
End rpmdb : 1373:d3940c76e2de15edf987259441fd48582757a5c0
User : root <root>
Return-Code : Success
Releasever : 8
Command Line : install pcre-devel
Comment :
Packages Altered:
Install pcre-cpp-8.42-6.el8.x86_64 @aliyun-base-os
Install pcre-devel-8.42-6.el8.x86_64 @aliyun-base-os
Install pcre-utf16-8.42-6.el8.x86_64 @aliyun-base-os
Install pcre-utf32-8.42-6.el8.x86_64 @aliyun-base-os
范例:包历史查询
[root@rocky86 yum.repos.d]# yum history redis
ID | Command line | Date and time | Action(s) |
Altered
---------------------------------------------------------------------------------
-----------------
8 | install -y redis | 2022-07-05 16:56 | Install |
1
7 | remove -y redis | 2022-07-05 16:52 | Removed |
1
6 | install -y redis | 2022-07-05 16:50 | Install |
1
安装及升级本地程序包
yum localinstall|install [options] rpmfile1 [...] #安装本地RPM包
yum localupdate|update [options] rpmfile1 [...] #使用本地RPM包升级
包组管理的相关命令
yum grouplist [options] #列出所有包组
yum groupinstall [options] group1 [...] #包组安装
yum groupupdate [options] group1 [...] #包组升级
yum groupremove [options] group1 [...] #包组卸载
yum groupinfo [options] group1 [...] #包组查询
范例:
[root@rocky86 yum.repos.d]# yum grouplist
......
......
[root@rocky86 yum.repos.d]# yum groupinfo "Server with GUI"
......
......
[root@rocky86 yum.repos.d]# yum groupinfo "Core"
[root@rocky86 yum.repos.d]# yum groupinstall "Server with GUI"
实现私用 yum仓库
架构图
IP | 角色 |
10.0.0.150 | yum server |
10.0.0.152 | client |
步骤
- 在 yum server 机上搭建 web 服务,保证其它机器能能过web服务访问本机
- 在 yum server 机上搭建 yum 仓服务
- 在 client 机上将yum 的 repos 源指向 yum server 机
- 测试
服务端配置
#安装web服务
[root@rocky86 ~]# yum install -y httpd
#关闭防火墙
[root@rocky86 ~]# systemctl disabled --now firewalld.service
#开启web服务
[root@rocky86 ~]# systemctl enable --now httpd.service
#将阿里云的extras 源的相关数据下载到本地,给客户端使用
[root@rocky86 ~]# yum reposync --repoid=nju-extras --download-metadata -p
/var/www/html/
#将本地光盘中的内容CP到web目录中,给客户端使用
[root@rocky86 ~]# mkdir /cdrom
[root@rocky86 ~]# mount /dev/sr0 /cdrom
[root@rocky86 ~]# cp -r /cdrom/BaseOS/* /var/www/html/BaseOS
客户端配置
[root@rocky86 ~]# cat /etc/yum.repos.d/private-extras.repo
[private-extras]
name=private extras
baseurl=http://10.0.0.157/extras/
gpgcheck=0
[root@rocky86 ~]# cat /etc/yum.repos.d/private-baseos.repo
[private-baseos]
name=private baseos
baseurl=http://10.0.0.157/BaseOS/
gpgcheck=0
yum仓库同步工具
#CentOS 8 dnf 工具集成
dnf reposync --repoid=REPOID --download-metadata -p /path
dnf reposync --help #查看帮助
#CentOS 7 以前版本,reposync工具来自于yum-utils包
reposync --repoid=REPOID --download-metadata -p /path
创建yum仓库工具
可以根据目录中的 rpm 包生成 repodata 元数据
createrepo [OPTION] <directory_to_index>
DNF介绍
DNF,即 DaNdiFied,是新一代的RPM软件包管理器。DNF 发行日期是2015年5月11日,DNF 包管理器采用Python 编写,发行许可为GPL v2,首先出现在Fedora 18 发行版中。在 RHEL 8.0 版本正式取代了 YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等;
yum程序在安装的过程中,如果被终止,下次再执行将无法解决依赖,DNF可解决此问题;
#配置文件
/etc/dnf/dnf.conf
#仓库文件
/etc/yum.repos.d/ *.repo
#日志
/var/log/dnf.rpm.log
/var/log/dnf.log
#使用帮助
man dnf
dnf用法与yum一致
dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf reposync
dnf install httpd
dnf remove httpd
dnf clean all
dnf makecache
dnf list installed
dnf list available
dnf search nano
dnf history undo 1
CentOS 7 使用 dnf ,下载并安装下面包
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/python2-libcomps-0.1.8-12.el7.x86_64.rpm
wget https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/libcomps-0.1.8-12.el7.x86_64.rpm
yum Troubleshooting
故障排错
yum 和 dnf 失败最主要原因 | 解决方法 |
yum的配置文件格式或路径错误 | 检查/etc/yum.repos.d/*.repo文件格式 |
yum cache | yum clean all |
网络不通 | 网卡配置 |
Ubuntu 软件管理
Debian 软件包通常为预编译的二进制格式的扩展名“.deb”,类似 rpm 文件,因此安装快速,无需编译软件。包文件包括特定功能或软件所必需的文件、元数据和指令
- dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
- apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构(c/s)
rhel 系列与 debian系列包管理对比
操作系统 | 包文件后缀 | 本地包管 理器 | 网络包管 理器 | 网络包管理工作模式 | 配置文件 |
rhel | rpm | rpm | yum/dnf | C/S | /etc/yum.repos.d/*.repo |
debian | deb | dpkg | apt | C/S | /etc/apt/sources.list |
APT工作原理
在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据每个DEB 包的包头(Header)信息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一旦APT 服务器内的DEB有所变动,要使用genbasedir产生新的DEB索引清单。
客户端在进行安装或升级时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。当客户端需要安装、升级或删除某个软件包时,客户端计算机取得DEB索引清单压缩文件后,会将其解压置放于 /var/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的时候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装或是可以升级的。
dpkg 包管理器
dpkg [<option> ...] <command>
#常用选项
-i|--install package.deb #安装包
--unpack package.deb #解包
-r|--remove packageName #删除包,不建议,不自动卸载依赖于它的包
-P|--purge packageName #删除包(包括配置文件)
-V|--verify packageName #检查包是否安装
--get-selections pattern #根据正则筛选包,并打出列表
--set-selections #从标准输入里读出要选择的软件。
--clear-selections #取消选中所有不必要的软件包。
--update-avail packageFile #替换现有可安装的软件包信息。
--merge-avail packageFile #把文件中的信息合并到系统中。
--clear-avail #清除现有的软件包信息。
--forget-old-unavail #忘却已被卸载的不可安装的软件包。
-s|--status packageName #显示指定软件包的详细状态,类似于 rpm -qi
-p|--print-avail packageName #显示当前机器上所有可安装的包
-L|--listfiles packageName #列出属于指定软件包的文件,类似于 rpm -ql
-l|--list [pattern] #列出当前己安装的包,类似于rpm -qa
-S|--search pattern #根据文件查询是来自于哪个包,类似于 rpm -
qf
-C|--audit [pattern] #检查是否有软件包残损
--yet-to-unpack #列出标记为待解压的软件包
--predep-package #列出待解压的预依赖
--compare-vesions v1 - b #比较版本号
--force-help #显示本强制选项的帮助信息
-Dh|--debug=help #显示有关出错调试的帮助信息
--info packageFile #列出包相关信息
-c packageFile #列出包内文件,类似于 rpm -qpl
范例:查询包是否安装
root@ubuntu22:~# dpkg -V vim
root@ubuntu22:~# echo $?
0
root@ubuntu22:~# dpkg -V nginx
dpkg: package 'nginx' is not installed
root@ubuntu22:~# echo $?
1
范例:安装卸载
dpkg 的软件安装分为解包和配置两部份
#查询
root@ubuntu22:~# dpkg -V firmware-sof-signed
dpkg: package 'firmware-sof-signed' is not installed
#安装
root@ubuntu22:~# dpkg -i /cdrom/pool/restricted/f/firmware-sof/firmware-sofsigned_2.0-1ubuntu2_all.deb
Selecting previously unselected package firmware-sof-signed.
(Reading database ... 108476 files and directories currently installed.)
Preparing to unpack .../firmware-sof-signed_2.0-1ubuntu2_all.deb ...
Unpacking firmware-sof-signed (2.0-1ubuntu2) ...
Setting up firmware-sof-signed (2.0-1ubuntu2) ...
#查询
root@ubuntu22:~# dpkg -l firmware-sof-signed
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===================-============-============-
=================================
ii firmware-sof-signed 2.0-1ubuntu2 all Intel SOF firmware - signed
#卸载
root@ubuntu22:~# dpkg -r firmware-sof-signed
(Reading database ... 108702 files and directories currently installed.)
Removing firmware-sof-signed (2.0-1ubuntu2) ...
范例:根据条件列出己安装的包
root@ubuntu22:~# dpkg --get-selections v*
vim install
vim-common install
vim-runtime install
vim-tiny install
范例:显示所有可安装的包
root@ubuntu22:~# dpkg -p
......
#显示指定包
root@ubuntu22:~# dpkg -p mawk
Package: mawk
Priority: required
Section: utils
Installed-Size: 229
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
......
范例:显示己安装的列表
mage@ubuntu22:~$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-====================-=====================-==========-
=============================>
ii adduser 3.118ubuntu5 all add and remove users
and groups
ii amd64-microcode 3.20191218.1ubuntu2 amd64 Processor microcode
firmware for AMD CPUs
ii apparmor 3.0.4-2ubuntu2 amd64 user-space parser
utility for AppArmor
ii apport-symptoms 0.24 all symptom scripts for
apport
ii apt 2.4.5 amd64 commandline package
manager
ii apt-utils 2.4.5 amd64 package management
related utility programs
ii base-files 12ubuntu4 amd64 Debian base system
miscellaneous files
ii base-passwd 3.5.52build1 amd64 Debian base system
master password and group files
ii bash 5.1-6ubuntu1 amd64 GNU Bourne Again SHell
ii bash-completion 1:2.11-5ubuntu1 all programmable completion
for the bash shell
范例:通配符
mage@ubuntu22:~$ dpkg -l "vi*"
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-====================-===================-=============-
=============================
ii vim 2:8.2.3995-1ubuntu2 amd64 Vi IMproved -
enhanced vi editor
un vim-athena <none> <none> (no description
available)
ii vim-common 2:8.2.3995-1ubuntu2 all Vi IMproved - Common
files
un vim-doc <none> <none> (no description
available)
un vim-gtk3 <none> <none> (no description
available)
un vim-nox <none> <none> (no description
available)
ii vim-runtime 2:8.2.3995-1ubuntu2 all Vi IMproved -
Runtime files
un vim-scripts <none> <none> (no description
available)
ii vim-tiny 2:8.2.3995-1ubuntu2 amd64 Vi IMproved - enhanced
vi editor - compact version
un virtualbox-guest-modules <none> <none> (no description
available)
范例:具体包名
mage@ubuntu22:~$ dpkg -l vim
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-======================-===================-==============-
=================================
ii vim 2:8.2.3995-1ubuntu2 amd64 Vi IMproved -
enhanced vi editor
该列表从左到右共七列
#Desired Status Err Name Version Architecture Description
#Desired 期望状态
u Unknown #没有安装过
i Install #请求安装
r Remove #请求卸载
p Purge #请求卸载并清理
h Hold #保持
#Status 当前状态
n Not #软件没有安装
i Inst #安装完成并完成配置
c Conf-files #己卸载,但还有保留配置文件
u Unpacked #己解压缩,但没有配置
f halF-conf #配置时出错
h Half-inst #安装时出错
w trig-aWait #触发器等待
t Trig-pend #触发器是未决状态
#Err 错误状态
#正常情况下为空
h #被锁定,有其它包对此依赖,无法升级
r Reinst-required, #被损坏,需要重装才能正常使用
x #被损坏且被锁定
#Name 包名
#Version 版本
#Architecture 平台架构
#Description 包的描述信息
#前三列常见组合
ii #安装成功
pn #安装后卸载
un #没有安装过
iu #安装了但是没有配置
rc #己卸载,但还有配置文件
范例:显示包详细信息
mage@ubuntu22:~$ dpkg -s vim
Package: vim
Status: install ok installed
Priority: optional
Section: editors
Installed-Size: 3916
Maintainer: Ubuntu Developers <[email protected]>
Architecture: amd64
Version: 2:8.2.3995-1ubuntu2
Provides: editor
Depends: vim-common (= 2:8.2.3995-1ubuntu2), vim-runtime (= 2:8.2.3995-
1ubuntu2), libacl1 (>= 2.2.23), libc6 (>= 2.34), libgpm2 (>= 1.20.7),
libpython3.10 (>= 3.10.0), libselinux1 (>= 3.1~), libsodium23 (>= 1.0.14),
libtinfo6 (>= 6)
Suggests: ctags, vim-doc, vim-scripts
Description: Vi IMproved - enhanced vi editor
.....
范例:列出包内所有文件
root@ubuntu22:~# dpkg -L vim
/.
/usr
/usr/bin
/usr/bin/vim.basic
/usr/share
/usr/share/bug
/usr/share/bug/vim
......
范例:查看deb包文件信息
root@ubuntu22:~# dpkg --info /cdrom/pool/main/a/amd64-microcode/amd64-
microcode_3.20191218.1ubuntu2_amd64.deb
new Debian package, version 2.0.
size 32474 bytes: control archive=1720 bytes.
76 bytes, 2 lines conffiles
699 bytes, 17 lines control
973 bytes, 12 lines md5sums
1259 bytes, 46 lines * postinst #!/bin/sh
.......
范例:列出deb包内的所有文件
root@ubuntu22:~# dpkg -c /cdrom/pool/main/a/amd64-microcode/amd64-
microcode_3.20191218.1ubuntu2_amd64.deb
drwxr-xr-x root/root 0 2021-10-07 10:09 ./
drwxr-xr-x root/root 0 2021-10-07 10:09 ./etc/
drwxr-xr-x root/root 0 2021-10-07 10:09 ./etc/default/
-rw-r--r-- root/root 328 2019-12-21 04:12 ./etc/default/amd64-microcode
drwxr-xr-x root/root 0 2021-10-07 10:09 ./etc/modprobe.d/
-rw-r--r-- root/root 154 2021-10-07 10:09 ./etc/modprobe.d/amd64-
microcode-blacklist.conf
drwxr-xr-x root/root 0 2021-10-07 10:09 ./lib/
drwxr-xr-x root/root 0 2021-10-07 10:09 ./lib/firmware/
......
范例:查询文件来自于哪个包
root@ubuntu22:~# dpkg -S "/etc/ssh/ssh_config"
openssh-client: /etc/ssh/ssh_config
apt 命令用法
Debian 使用 apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命令行与 GUI 兼顾的工具是 aptitude ,之前最常用的 Linux 包管理命令都被分散在了 apt-get、aptcache 和 apt-config 这三条命令中。
在 2014 年apt 命令发布第一个稳定版,Ubuntu 16.04 引入新特性之一便是 apt 命令,apt 命令解决了命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 aptconfig 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 aptconfig,提供管理软件包所需的必要选项
apt 相当于 apt-get、apt-cache 和 apt-config 中最常用命令选项的集合
apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。此外,启用的几个特性也非常有帮助。例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示用户可升级的软件包个数
apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令,也即可用 apt 替换部分apt-get 系列命令,但不是全部
apt 命令 | 被取代的命令 | 命令的功能 |
apt install | apt-get install | 安装软件包 |
apt remove | apt-get remove | 移除软件包 |
apt purge | apt-get purge | 移除软件包及配置文件 |
apt update | apt-get update | 刷新存储库索引 |
apt upgrade | apt-get upgrade | 升级所有可升级的软件包 |
apt autoremove | apt-get autoremove | 自动删除不需要的包 |
apt full-upgrade | apt-get dist-upgrade | 在升级软件包时自动处理依赖关系 |
apt search | apt-cache search | 搜索应用程序 |
apt show | apt-cache show | 显示安装细节 |
apt是Debian和Ubuntu等Linux发行版中的高级包管理器,它可以用来安装、升级和删除软件包,同样也能够解决程序包之间的依赖关系。以下是一些常用的apt命令选项示例。
apt [options] command
#options
-h|--help #显示帮助
-v|--version #显示版本
-y|--yes #自动回答yes
-q|--quiet #安静模式
#command
list #根据名称列出软件包
search #搜索软件包描述
show|info #显示软件包细节
install #安装软件包
remove #移除软件包
autoremove #卸载所有自动安装且不再使用的软件包
update #更新可用软件包列表,只更新索引文件,不具体更新软
件
upgrade #通过 安装/升级 软件来更新系统
full-upgrade #通过 卸载/安装/升级 来更新系统
edit-sources #编辑软件源信息文件
apt --fix-broken install
范例:
#列出所有包
root@ubuntu22:~# apt list
#列出所有己安装的包
root@ubuntu22:~# apt list --installed
#列出所有可升级的包
root@ubuntu22:~# apt list --upgradeable
范例:指定包名或通配符
root@ubuntu22:~# apt list redis*
Listing... Done
redis-redisearch-doc/jammy 1:1.2.2-4 all
redis-redisearch/jammy 1:1.2.2-4 amd64
redis-sentinel/jammy 5:6.0.16-1ubuntu1 amd64
redis-server/jammy 5:6.0.16-1ubuntu1 amd64
redis-tools/jammy 5:6.0.16-1ubuntu1 amd64
redis/jammy 5:6.0.16-1ubuntu1 all
root@ubuntu22:~# apt list --installed redis*
Listing... Done
范例:搜索
#在包名和描述信息中搜索
root@ubuntu22:~# apt search nginx
#使用正则匹配搜索条件
root@ubuntu22:~# apt search "^ngin*"
#仅在包名中搜索
root@ubuntu22:~# apt search --names-only nginx
范例:查询包的具体信息
root@ubuntu22:~# apt info nginx
Package: nginx
Version: 1.18.0-6ubuntu14.1
Priority: optional
Section: web
Origin: Ubuntu
......
#显示所有版本
root@ubuntu22:~# apt show nginx -a
Package: nginx
Version: 1.18.0-6ubuntu14.1
Priority: optional
Section: web
Origin: Ubuntu
......
Package: nginx
Version: 1.18.0-6ubuntu14
Priority: optional
Section: web
Origin: Ubuntu
......
范例:安装
root@ubuntu22:~# apt install nginx
#同时安装多个包
root@ubuntu22:~# apt install nginx redis -y
#安装指定版本的包,默认安装最新版
root@ubuntu22:~# apt install nginx=1.14.0-0ubuntu1
#安装nginx 包,如果己存在,则不升级
root@ubuntu22:~# apt install nginx --no-upgrade
#只升级不安装
root@ubuntu22:~# apt install nginx --only-upgrade
范例:卸载
#仅卸载nginx包
root@ubuntu22:~# apt remove -y nginx
#卸载所有依赖包
root@ubuntu22:~# apt autoremove nginx
范例:更新和升级
#纺计源中可更新的信息,并不执行具体更新
root@ubuntu22:~# apt update
Hit:1 https://mirrors.aliyun.com/ubuntu jammy InRelease
Get:2 https://mirrors.aliyun.com/ubuntu jammy-updates InRelease [114 kB]
Get:3 https://mirrors.aliyun.com/ubuntu jammy-backports InRelease [99.8 kB]
......
......
Fetched 1,853 kB in 4s (425 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
32 packages can be upgraded. Run 'apt list --upgradable' to see them.
#更新所有己安装的包
root@ubuntu22:~# apt upgrade
#更新某个具体的包
root@ubuntu22:~# apt install --only-upgrade nginx
范例:编辑源
root@ubuntu22:~# apt edit-sources
root@ubuntu22:~# vim /etc/apt/sources.list
范例:缓存信息
#显示当前系统安装包的统计信息,包括己安装的数量,大小,占用空间等
root@ubuntu22:~# apt-cache stats
Total package names: 115071 (3,222 k)
Total package structures: 102921 (4,529 k)
Normal packages: 67637
......
#查看源中指定软件的所有版本
root@ubuntu22:~# apt-cache madison nginx
nginx | 1.18.0-6ubuntu14.1 | https://mirrors.aliyun.com/ubuntu jammyupdates/main amd64 Packages
nginx | 1.18.0-6ubuntu14.1 | https://mirrors.aliyun.com/ubuntu jammysecurity/main amd64 Packages
nginx | 1.18.0-6ubuntu14 | https://mirrors.aliyun.com/ubuntu jammy/main
amd64 Packages
范例:查询依赖
#查看nginx有哪些依赖
root@ubuntu22:~# apt-cache depends nginx
nginx
|Depends: nginx-core
|Depends: nginx-full
......
Breaks: <libnginx-mod-http-lua>
#查看nginx被哪些包依赖
root@ubuntu22:~# apt-cache rdepends nginx | head
nginx
Reverse Depends:
nginx-core
nginx-light
nginx-full
nginx-extras
libnginx-mod-stream-geoip
nginx-core
nginx-extras
APT包索引配置文件
更新配置文件之后,要执行 apt update
/etc/apt/sources.list
/etc/apt/sources.list.d/
配置文件格式说明
deb URL section1 section2
#字段说明
deb #固定开头,表示是二进制包的仓库,如果deb-src开头,表示是源码库
URL #库所在的地址,可以是网络地址,也可以是本地镜像地址
section1 #Ubuntu版本的代号,可用 lsb_release -sc 命令查看,也可以用 cat
/etc/os-release
section2 #软件分类,main完全自由软件 restricted不完全自由的软件,universe社区支持
的软件,multiverse非自由软件
section1 #主仓
section1-backports #后备仓,该仓中的软件当前版本不一定支持
section1-security #修复仓,主要用来打补丁,有重大漏洞,需要在当前版本中修复
时,会放此仓
section1-updates #非安全性更新仓,不影响系统安全的小版本迭代放此仓
section1-proposed #预更新仓,可理解为新版软件的测试放在此仓,测试一段时间后
会移动到 updates仓或security仓,非专业人士勿用
范例:
root@ubuntu22:~# cat /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu jammy main restricted #表示使用主仓中的 main和 restricted 源
# deb-src https://mirrors.aliyun.com/ubuntu jammy main restricted
deb https://mirrors.aliyun.com/ubuntu jammy-updates main restricted
# deb-src https://mirrors.aliyun.com/ubuntu jammy-updates main restricted
在ubuntu库中,有两个重要目录,分别是dists和 pool
dists 目录中存放的是该源仓库中的元数据,包括软件包的名称,适用的架构平台,版本号,依赖关系等
pool 目录中存放的是具体包文件
root@ubuntu22:~# tree /cdrom/dists/
/cdrom/dists/
├── jammy
│ ├── main
│ │ ├── binary-amd64
│ │ │ ├── Packages.gz
│ │ │ └── Release
│ │ ├── binary-i386
│ │ │ ├── Packages.gz
│ │ │ └── Release
│ │ └── source
│ ├── Release
│ ├── Release.gpg
│ └── restricted
│ ├── binary-amd64
│ │ ├── Packages.gz
│ │ └── Release
│ ├── binary-i386
│ │ ├── Packages.gz
│ │ └── Release
│ └── source
├── stable -> jammy
└── unstable -> jammy
apt命令操作(如安装和删除软件包)日志文件
/var/log/dpkg.log
ubuntu 开启root用户远程登录
#如果没有设置过root用户密码,先设root密码
sudo passwd root
#切换到 root 用户
su -
#修改配置文件
vim /etc/ssh/sshd_config
#将 #PermitRootLogin yes 改为 PermitRootLogin yes,大约是在 35行,保存退出
#重启sshd服务
service sshd restart
黑客帝国
root@ubuntu20:~# apt install cmatrix
root@ubuntu20:~# cmatrix
root@ubuntu20:~# cmatrix -C blue
好莱坞
root@ubuntu20:~# apt install hollywood
root@ubuntu20:~# hollywood
查看系统信息
root@ubuntu20:~# apt install screenfetch
root@ubuntu20:~# screenfetch
snap 工具
Snap 包是 Ubuntu 16.04 LTS 发布时引入的新应用格式包。目前已流行在 Ubuntu 且在其他如Debian、Arch Linux、Fedora、Kaili Linux、openSUSE、Red Hat 等 Linux 发行版上通过 snapd 来安装使用 snap 应用。
当你在安装完 snap 后,你会发现在在根目录下会出现如 /dev/loop0 的挂载点,这些挂载点正是 snap软件包的目录。Snap 使用了 squashFS 文件系统,一种开源的压缩,只读文件系统,基于 GPL 协议发行。一旦 snap 被安装后,其就有一个只读的文件系统和一个可写入的区域。应用自身的执行文件、库、依赖包都被放在这个只读目录,意味着该目录不能被随意篡改和写入。
squashFS 文件系统的引入,使得 snap 的安全性要优于传统的 Linux 软件包。同时,每个 snap 默认都被严格限制(confined),即限制系统权限和资源访问。但是,可通过授予权限策略来获得对系统资源的访问。这也是安全性更好的表现。
默认 Snap 应用格式包,专为物联网设备、嵌入式平台设计的迷你 Ubuntu。
snap 常用命令
install #安装
remove #移除
find #查找
list #列出己安装的包
info #查看包信息
范例:
#列出所有己安装的包
[root@ubuntu2204 ~]# snap list --all
Name Version Rev Tracking Publisher Notes
core20 20220318 1405 latest/stable canonical✓ base,disabled
core20 20230404 1879 latest/stable canonical✓ base
lxd 5.0.0-b0287c1 22923 5.0/stable/… canonical✓ disabled
lxd 5.0.2-838e1b2 24322 5.0/stable/… canonical✓ -
snapd 2.59.2 19122 latest/stable canonical✓ snapd
#每个己安装的包都有一个挂载点
[root@ubuntu2204 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 63.3M 1 loop /snap/core20/1879
loop1 7:1 0 53.2M 1 loop /snap/snapd/19122
loop2 7:2 0 111.9M 1 loop /snap/lxd/24322
loop3 7:3 0 61.9M 1 loop /snap/core20/1405
loop4 7:4 0 79.9M 1 loop /snap/lxd/22923
......
......
四、搭建私有yum仓库
简要总结yum/dnf工作原理。并搭建私有yum仓库(base,epel源)给另一个虚拟机使用。
Yum是一种基于RPM包管理的工具,它可以自动解决软件包之间的依赖关系,并且能够从多个软件源中查找和下载适当的软件包。
Yum的工作原理如下:
软件源配置:首先,用户需要通过yum配置软件源,指定Yum需要从哪些源中获取软件包信息和软件包文件。
包列表更新:Yum会自动从软件源获取软件包列表信息,并在本地进行缓存和更新。每次执行Yum操作前,都会自动更新本地的软件包列表。
依赖关系解决:当用户需要安装或更新一个软件包时,Yum会自动检查该软件包的依赖关系,从而确定需要下载和安装的其他软件包。
下载安装:一旦确定了需要下载和安装的软件包及其依赖关系,Yum会自动从软件源中下载相应的软件包,并校验其完整性和正确性。如果软件包已经下载过,则会直接使用本地缓存中的软件包进行安装或升级操作。
reposync
yum reposync是一个用于同步Yum存储库的工具。它可以在本地创建一个与远程存储库相同的目录结构,并下载所有必需的软件包,以便可以离线使用这些软件包或将它们传输到其他计算机。
使用 yum reposync,你可以指定要同步的存储库及其本地路径。下面是使用yum reposync同步Yum存储库的基本步骤:
安装yum-utils软件包。如果你使用的是CentOS、Red Hat或Fedora,你可以使用以下命令来安装:
sudo yum install yum-utils
创建一个本地存储库目录。例如,如果你想将存储库同步到“/var/www/html/yum”目录,则可以使用以下命令创建该目录:
sudo mkdir -p /var/www/html/yum
运行yum reposync命令进行同步。例如,假设你要同步名为“epel”的存储库,可以使用以下命令:
sudo reposync -g -l -d --repoid=epel --newest-only --download-metadata --download_path=/var/www/html/yum/
其中参数的含义如下:
-g:启用GPG验证
-l:将元数据文件写入本地缓存
-d:下载对应的软件包
--repoid:指定要同步的存储库ID
--newest-only:只下载最新的软件包
--download-metadata:同时下载元数据文件
--download-path:指定本地存储库目录路径
这将从远程epel存储库下载最新的元数据和软件包,并将它们存储在指定的本地路径中。
完成同步后,你可以使用HTTP服务器提供本地存储库的服务。例如,如果你使用Apache HTTP服务器,可以将以下内容添加到httpd.conf文件中:
Alias /yum /var/www/html/yum
<Directory "/var/www/html/yum">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
然后重启Apache HTTP服务,你就可以通过访问"http://yourserver/yum/"来浏览本地存储库了。
五、系统初始化步骤
Rocky/CentOS/RHEL 初始化
关闭防火墙
systemctl disable --now firewalld
关闭SELinux
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
实现邮件通信
yum -y install postfix mailx
systemctl enable --now postfix
配置 yum 源
CentOS8:BaseOS, appstream, epel
CentOS7:BaseOS, epel
安装常用软件
1. yum -y install bash-completion psmisc lrzsz tree man-pages redhat-lsb-core zip unzip bzip2 wget tcpdump ftp rsync vim lsof
设置网卡NAT
IP地址:10.0.0.X/24
GATEWAY:10.0.0.2
DNS:10.0.0.2,180.76.76.76
[root@rocky8 ~]#sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 ifnames=0"#' /etc/default/grub
[root@rocky8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg;reboot
时间同步
将CentOS7的时区设置为上海
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
安装网络时间协议服务
yum install -y ntp
将ntp服务设置为缺省启动
systemctl enable ntpd
修改启动参数,增加-g -x参数,允许ntp服务在系统时间误差较大时也能正常工作
echo "OPTIONS="-g -x"" > /etc/sysconfig/ntpd
启动ntp服务
service ntpd restart
对准时间
ntpdate asia.pool.ntp.org
对准硬件时间和系统时间
/sbin/hwclock --systohc
开始自动时间同步到远程NTP服务器
timedatectl set-ntp true
要禁用NTP时间同步(取消)
timedatectl set-ntp false
自动挂载光盘
yum -y install autofs
systemctl enable --now autofs
Ubuntu 初始化
设置时区
timedatectl set-timezone Asia/Shanghai
安装常用软件
apt install -y vim net-tools openssh-server
六、一键安装httpd脚本
CPUS=`grep -c processor /proc/cpuinfo` #获取cpu总线程数,方便多线程编译
HTTPD_VERSION=2.4.52 #设定HTTPD的版本号
INSTALL_DIR=/apps/httpd #设定安装目录
COLOR="echo -e \E[32;1m" #颜色设定
END="\E[0m"
. /etc/os-release #进入到linux发行版目录
#判断系统发行版是Rocky、CentOS还是ubuntu,然后根据不同的发行版关闭防火墙,安装依赖包
if [ $ID = 'rocky' -o $ID = "centos" ];then
systemctl disable --now firewalld
yum -y install gcc make apr-devel apr-util-devel openssl-devel pcre-devel redhat-rpm-config bzip2
elif [ $ID = 'ubuntu' ];then
atp update
apt -y install libapr* libpcre3* libssl-dev make
else
$COLOR"不支持此系统"$END
exit
fi
cd /usr/local/src #进入到源代码存放目录
rpm -q wget || yum -y install wget #判断是否已经安装wget,没有就安装wget
#下载对应版本的httpd源代码包
wget https://dlcdn.apache.org//httpd/httpd-${HTTPD_VERSION}.tar.bz2 || { $COLOR "下载失败,退出" $END;exit ; }
tar xf httpd-${HTTPD_VERSION}.tar.bz2 #解压缩源代码包
cd httpd-${HTTPD_VERSION} #进入到解压出来的目录
./configure --prefix=${INSTALL_DIR} --enable-ssl --disable-status #配置安装目录,打开ssl模块,关闭status
make -j $CPUS && make install #多线程编译然后安装
ln -s /apps/httpd/bin/apachectl /usr/local/bin/ #把apachectl软链接放到环境变量PATH中
apachectl start && $COLOR"安装成功!"$END #判断安装是否成功,成功就输出提示
$COLOR"请访问:http://`hostname -I`"$END #打开主页测试
七、开放系统互联OSI模型
OSI模型(Open Systems Interconnection model,即开放式系统互联模型)是一种网络协议的规范体系,由国际标准化组织(ISO)提出,旨在使不同厂商生产的计算机网络能互相兼容和通信。
OSI模型将网络通信划分为七个层次,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层都具有特定的功能和对应的协议,并负责将数据包传递给下一层或接收上一层传递的数据包。
- 物理层: 负责传输比特流,即0和1的数字信号,实现原始数据的传输。
- 数据链路层: 将比特流组装成数据帧,并进行物理地址寻址和差错控制等处理。
- 网络层: 负责数据的路由和转发,实现不同网络之间的互联。
- 传输层: 提供端到端的数据传输服务,实现可靠的传输和流量控制等能。
- 会话层: 管理数据交换的会话,管理连接的建立、维护和释放。
- 表示层: 负责数据格式的表示和编码,确保通信双方使用相同的数据式。
- 应用层: 提供各种网络应用服务,如电子邮件、文件传输等。
OSI模型的出现,使得计算机网络中的协议不再局限于某一个特定的厂商或系统,方便了各种不同类型、不同规模的计算机进行互联和数据交换。
以下是OSI模型每一层的常用协议或技术:
- 物理层:该层主要负责将数据编码成比特流,并将其发送到物理介质上进行传输。常用的协议有:
- IEEE 802.3(以太网):常见的局域网协议,支持10Mbps、100Mbps和1Gbps等速率。
- IEEE 802.11(Wi-Fi):无线局域网标准,实现了无线数据传输。
- SONET/SDH(同步光纤网络/同步数字分层层次结构):广域网协议,基于光纤传输,提供高速、可靠的传输服务。
- 数据链路层:该层主要负责将比特流转换成数据帧,并在多个节点之间进行传输。常用的协议有:
- PPP(点对点协议):广泛应用于拨号连接的协议,支持TCP/IP、IPX/SPX等网络协议。
- HDLC(高级数据链路控制):与PPP类似的点对点通信协议,常用于X.25协议和ISDN网络中。
- IEEE 802.3(以太网):该层同时也是物理层的协议,常用于局域网中。
- 网络层:该层主要负责将数据包从源主机发送到目的主机,并跨越多个网络。常用的协议有:
- IP(Internet协议):互联网的核心协议,负责将数据包从源地址路由到目的地址。
- ICMP(Internet控制消息协议):用于传递错误消息和管理信息。
- ARP(地址解析协议):将IP地址转换为物理地址,实现数据链路层与网络层的互连。
- 传输层:该层主要负责在端到端之间提供可靠的数据传输服务。常用的协议有:
- TCP(传输控制协议):提供面向连接、可靠的数据传输服务,实现流量控制和拥塞控制等功能。
- UDP(用户数据报协议):提供无连接、不可靠的数据传输服务,适用于实时通信应用。
- SCTP(流控制传输协议):类似于TCP,但支持多路复用,能够提供更高效的传输服务。
- 会话层:该层主要负责管理不同应用程序之间的会话,包括连接建立、维护和关闭。常用的协议有:
- RPC(远程过程调用协议):在网络中实现分布式系统的通信和调用。
- NetBIOS(网络基本输入/输出系统):在LAN环境中提供基本的应用程序会话服务。
- ISO 8327/CCITT X.225(OSI连接服务):负责建立、维护和释放OSI连接。
- 表示层:该层主要负责数据的格式化和编解码,以确保通信双方都能够理解数据的含义。常用的协议有:
- ASCII(美国标准信息交换码):将文本字符编码成数字,是计算机中最常见的编码方式。
- EBCDIC(扩展二进制编码十进制互换码):用于IBM主机上的字符编码,与ASCII不兼容。
- JPEG(联合图像专家组):用于图像压缩和传输的标准格式。
- 应用层:该层主要为用户提供各种网络应用服务,包括电子邮件、文件传输、网页浏览等。常用的协议有:
- HTTP(超文本传输协议):用于Web页面的访问和传输。
- SMTP(简单邮件传输协议):用于电子邮件的发送。
- FTP(文件传输协议):用于文件的上传和下载。
八、调整动态端口范围
要在Linux中调整动态端口范围为20000-60000,需要进行以下步骤:
以root用户登录Linux系统。
打开并编辑"/etc/sysctl.conf"文件,可以使用vim或nano等文本编辑器打开该文件。
在文件的末尾添加以下行:
net.ipv4.ip_local_port_range = 20000 60000
这样就设置了动态端口范围为20000-60000。
保存并关闭文件。
执行以下命令,使修改生效:
sysctl -p
九、TCP三次握手,四次挥手
TCP(传输控制协议)的包头结构如下:
- 源端口(Source Port):16位,表示发送端口号。
- 目的端口(Destination Port):16位,表示接收端口号。
- 序列号(Sequence Number):32位,表示本次数据发送的序列号。
- 确认号(Acknowledgment Number):32位,表示期望收到下一个报文段的第一个字节的序列号。
- 首部长度(Header Length):4位,表示TCP头部长度(单位为4字节),最大值为60,因此TCP最多可以有40个字节的选项。
- 保留(Reserved):6位,保留字段。
- 标志位(Flags):6位,SYN、ACK、FIN、RST、PSH和URG标识TCP连接状态和数据传输方式。
- 窗口大小(Window Size):16位,表示接收方窗口的大小,用于流量控制。
- 校验和(Checksum):16位,检测TCP头部和数据的完整性。
- 紧急指针(Urgent Pointer):16位,表示紧急数据偏移量,该字段与URG标志一起使用,用于紧急数据传输。
- 选项(Options):可变长度,包含各类TCP选项字段。
TCP通过以上的包头结构来确保数据传输的可靠性和流量控制,同时也支持多种数据传输方式(如紧急数据的传输)。
TCP三次握手是建立TCP连接的过程,具体如下:
- 第一次握手(SYN):客户端向服务器发送一个SYN报文段,并将自己的初始序列号x发送给服务器,此时客户端进入SYN_SENT状态,等待服务器响应。
- 第二次握手(SYN+ACK):服务器接收到客户端发送的SYN报文段后,向客户端回复一个确认报文,其中标识位中设置了SYN和ACK标志,并将自己的初始序列号y和对客户端序列号x+1的确认号一起发送给客户端,此时服务器进入SYN_RECV状态。
- 第三次握手(ACK):客户端接收到服务器发送的SYN+ACK报文段后,将确认号设置为服务器发来的序列号y+1,并发送一个确认报文,其中标识位中只设置了ACK标志,此时客户端进入ESTABLISHED状态,表示TCP连接已经建立成功,服务器也进入ESTABLISHED状态。
在三次握手过程中,客户端负责发送第一次和第三次握手报文段,服务器负责发送第二次握手报文段。通过三次握手可以确保双方都能够收发数据,建立起可靠的TCP连接。若在三次握手过程中某个报文段丢失,则会导致连接建立失败,需要重新进行握手。同时,三次握手还可以防止网络中的恶意attacks,如SYN洪泛attacks。
TCP四次挥手是指在TCP连接中,当客户端或服务器完成数据传输后,需要关闭连接时,双方需要进行一个四步的关闭过程,以保证数据的可靠性和完整性。
具体的过程如下:
第一步:客户端向服务器发送一个FIN报文,表示客户端已经没有数据需要发送了。此时客户端进入FIN_WAIT_1状态。
第二步:服务器收到FIN报文后,向客户端发送一个ACK报文确认收到FIN报文。此时服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。
第三步:当服务器不再需要进行数据传输时,向客户端发送一个FIN报文,告诉客户端服务器已经完成数据传输并准备关闭连接。此时服务器进入LAST_ACK状态。
第四步:客户端收到服务器的FIN报文后,向服务器发送一个ACK报文进行确认。此时客户端进入TIME_WAIT状态,等待可能出现的延迟数据包。服务器收到客户端的ACK报文后,关闭连接,进入CLOSED状态。
总结起来,TCP四次挥手的过程如下: FIN_WAIT_1 -> CLOSE_WAIT -> FIN_WAIT_2 -> LAST_ACK -> TIME_WAIT -> CLOSED。
需要注意的是,在第四步时,客户端会进入TIME_WAIT状态,等待可能出现的延迟数据包,以确保数据的完整性。而如果服务器在接收到客户端的ACK报文后直接关闭了连接,那么可能会导致客户端的ACK报文丢失,从而无法关闭连接,最终导致资源泄露。因此在实际应用中,通常需要在客户端的TIME_WAIT状态结束后,才可以将连接彻底关闭。
十、主机到主机的包传递过程
主机到主机的包传递过程可以简单地概括为以下几个步骤:
- 应用层:发送端应用程序将数据封装为应用层报文,并指定要使用的传输协议(例如HTTP、FTP、SMTP等)。
- 传输层:操作系统利用指定的传输协议将应用层报文进行分段和重组,形成传输层报文段(segment),并添加相应的传输层头部信息,例如源IP和目标IP地址、端口号、序列号等。在TCP协议中,还会进行拥塞控制和流量控制等处理。
- 网络层:操作系统根据目标IP地址选择合适的网络路径和下一跳路由器,然后将传输层报文段封装成网络层数据包(packet),添加相应的网络层头部信息,例如源IP和目标IP地址、TTL(Time To Live)等。
- 数据链路层:操作系统将网络层数据包再次封装成数据链路层帧(frame),添加数据链路层头部信息,例如源MAC地址、目标MAC地址等。然后将数据链路层帧通过网络接口传输到目标主机。
- 物理层:数据链路层帧通过物理层的传输介质进行传输,例如网线或无线信道。
- 接收端:目标主机的网络接口会接收到传输的数据链路层帧,然后将其解封成网络层数据包。接下来,目标主机的操作系统会根据目标IP地址进行路由选择,并将数据报文段交给传输层。
- 传输层:操作系统将接收到的传输层报文段进行重组,并将其还原成原始的应用层报文,然后将其交付给应用程序进行处理。
总之,主机到主机的包传递涉及到多个协议和不同层次的协议栈的处理。每一层的头部信息都是传递和存储的必要条件,也是网络通信效率和可靠性的重要保证。因此,对于网络工程师来说,了解和优化整个传输过程非常重要。
十一、IP地址分类
IP地址是TCP/IP协议族中重要的概念之一,按照网络地址的分类方法,可以分为A、B、C、D四类IP地址。
- A类地址:以0开头,第一个字节范围从1到126,用于大型网络。其中,0和127是保留地址,不可使用。A类地址的网络号占8位,主机号占24位。
- B类地址:以10开头,前两个字节共占用16位,范围从128.0到191.255,用于中等规模的网络。B类地址的网络号占16位,主机号占16位。
- C类地址:以110开头,前三个字节共占用24位,范围从192.0.0到223.255.255,用于小型网络。C类地址的网络号占24位,主机号占8位。
- D类地址:以1110开头,前四个字节共占用32位,没有主机号和网络号,专门用于多点广播。
IP地址的组成:
IPv4地址由32个二进制位组成,通常用4个十进制数表示。例如,“192.168.1.1”就是一个IPv4地址,它由4段,每段8位二进制组成。其中,“192”代表网络号,后3段(“168”、“1”、“1”)代表主机号。在IP地址中,网络号和主机号的划分是由子网掩码进行的。
在IPv6地址中,由于长度为128位,因此通常采用16进制表示。例如,“2001:0db8:85a3:0000:0000:8a2e:0370:7334”就是一个IPv6地址,它由8个16位的块组成,每个块之间用冒号分隔。IPv6地址中,前面的部分代表网络号和子网号,后面的部分代表主机号。子网掩码的作用和IPv4一样,用来划分网络号和主机号。
十二、IP地址计算案例
201.222.200.111/18计算主机数?子网掩码?
主机数:
ip地址总位数减去网络地址位数 32-18=14
主机位数 2^14=16384
减去广播地址和网络地址 16384-2=16382(主机数)
子网掩码:
11111111.11111111.11000000.0
255.255.192.0
十三、判断两个IP是否同一网段
当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?
A用自己的子网掩码分别和自己的IP及对方的IP相与,比较结果,相同则在同一网络,不同则是不同网络。
A判断与B在同一个网络,10.0.0.0网络,可以直连发数据包给B,但B不会回复。B判断与A不在同一个网络,10.0.1.0和10.0.2.0。
如果A和B之间想要通信,要在其中间连接路由器,通过路由器转发它们的数据。
十四、划分子网掩码
如何将10.0.0.0/8划分32个子网?求每个子网的掩码,主机数。
需要划分32个子网,又因为2^5=32
所以网络号要向主机号借5位
子网掩码:
11111111.11111000.0.0
255.248.0.0
主机数:
2^(32-13)-2=524286
十五、网络配置
配置IP地址和子网掩码:使用 ip addr add 命令可以为网络接口添加一个IP地址,再使用 ip link set 命令启用该接口。
$ ip addr add 192.168.1.2/24 dev eth0
$ ip link set eth0 up
其中,192.168.1.2是要配置的IP地址,/24表示子网掩码。
配置网关:使用 route add 命令可以配置网关。
$ ip route add default via 192.168.1.1
其中,192.168.1.1是要配置的网关地址。
配置DNS服务器:使用 echo nameserver > /etc/resolv.conf 命令可以向 /etc/resolv.conf 文件中添加 DNS 服务器地址。
$ echo "nameserver 223.5.5.5" > /etc/resolv.conf
或者
$ nmcli connection modify eth0 ipv4.dns "223.5.5.5 223.6.6.6"
其中,223.5.5.5是要配置的DNS服务器地址。
配置主机名:使用 hostnamectl set-hostname 命令可以设置主机名。
$ hostnamectl set-hostname myhostname
其中,myhostname是要配置的主机名。
Ubuntu的netplan中:
sudo vim /etc/netplan/01-netcfg.yaml
在编辑器中输入以下内容(注意替换成自己的网络信息):
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.1.2/24
gateway4: 192.168.1.1
nameservers:
addresses: [223.5.5.5, 223.6.6.6]
上面的内容添加了一个名为 "eth0" 的网络接口,配置了静态 IP 地址 192.168.1.2/24,指定默认网关 192.168.1.1,并添加了两个 DNS 服务器地址 223.5.5.5 和 223.6.6.6。
保存文件并退出编辑器。运行以下命令来应用配置更改:
$ sudo netplan apply
十六、解析网络配置格式
解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式
ifcfg配置文件有一定的格式要求,下面是一个示例ifcfg-eth0文件的格式:
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.2
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=223.5.5.5
DNS2=223.6.6.6
其中,各个参数的含义如下:
- TYPE:网络接口类型,一般设置为Ethernet
- BOOTPROTO:启用的协议类型,可设置为static(静态IP)或dhcp(动态获取IP)
- NAME:网络接口名称
- DEVICE:网络接口设备名称
- ONBOOT:开机是否启用该网络接口,yes表示启用
- IPADDR:网络接口IP地址
- NETMASK:子网掩码
- GATEWAY:默认网关
- DNS1:首选DNS服务器
- DNS2:备选DNS服务器
需要注意的是,配置文件中参数的格式必须严格按照上述格式规定,每个参数之间使用等号“=”分隔,参数名和值之间没有空格。
十七、bond0配置
创建bonding设备的配置文件
/etc/sysconfig/network-scripts/ifcfg-bond0
NAME=bond0
TYPE=bond
DEVICE=bond0
IPADDR=10.0.0.100
prefix=8
#miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms检测一次链路连接状态,如果有一条线路不通就转入另一条线路
BONDING_OPTS="mode=1 miion=100 fail_over_mac=1"
/etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
/etc/sysconfig/network-scripts/ifcfg-eth1
NAME=eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
十八、ifconfig
通过ifconfig命令结果找到ip地址
ifconfig eth0 | grep 'inet addr:' | awk '{print $2}' | cut -d':' -f2
该命令首先使用 ifconfig 命令获取eth0接口的详细信息,然后使用grep命令过滤出包含 “inet addr:” 的行,接着使用awk命令提取第二列信息,并最后使用cut命令去掉":"字符,得到该网络接口的IP地址。
十九、脚本判断IP是否在线
使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。
NET=10.0.0 #本地网络号
cat /dev/null > hosts.txt
for i in {1..254};do
if ping -c1 -W1 $NET.$i &> /dev/null;then #ping一次持续一秒
echo $NET.$i is up | tee -a hosts.txt
fi
done