软件管理,磁盘存储,文件系统以及网络协议
目录
硬盘存储术语CHS
- head:磁头 磁头数=盘面数
- track:磁道 磁道=柱面数
- sector:扇区,512bytes
- cylinder:柱面 1柱面=512 * sector数/trackhead数=51263*255=7.84M
#查看CHS
[root@localhost ~]# fdisk -l /dev/sda
Disk /dev/sda:30 GiB,32212254720 字节,62914560 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x69b7b195
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 62914559 60815360 29G 8e Linux LVM
#0代表SSD,1代表机械
[root@localhost ~]# lsblk -d -o name,rota
NAME ROTA
sda 1
sr0 1
磁盘存储管理
磁盘分区的优点:
- 优化I/O性能
- 实现磁盘空间配额限制
- 提高修复速度
- 隔离系统和程序
- 采用不同文件系统
分区方式:
两种分区方式:MBR,GPT
MBR结构
Boot Sector(引导扇区):
位置:硬盘的第一个扇区(LBA 0)。
大小:512 字节。
内容:
Bootstrap Code(引导代码):占用前 446 字节,用于启动操作系统的代码。
Partition Table(分区表):占用接下来的 64 字节,包含最多 4 个主分区的描述信息。
Signature(签名):最后 2 字节,固定为 0xAA55,用于标识这是一个有效的 MBR 扇区。
Partition Table(分区表):
每个分区条目:16 字节。
条目数量:最多 4 个条目。
内容:
Status(活动标志):1 字节,表示该分区是否为活动分区。
CHS Address(柱面-磁头-扇区地址):6 字节,表示分区的起始和结束位置。
Partition Type(分区类型):1 字节,表示分区的类型(如 NTFS、FAT32 等)。
LBA Address(逻辑块地址):8 字节,表示分区的起始 LBA 地址和分区的大小。
Extended Partitions(扩展分区):
逻辑分区:扩展分区可以包含多个逻辑分区,每个逻辑分区有自己的分区表。
链式结构:逻辑分区的分区表位于扩展分区的第一个扇区,每个逻辑分区指向下一个逻辑分区的分区表。
优点
兼容性:广泛支持旧操作系统和 BIOS。
简单:结构简单,容易理解和实现。
缺点
分区限制:最多只能有 4 个主分区(或 3 个主分区加 1 个扩展分区)。
最大容量:支持的最大分区大小为 2 TB(使用 512 字节扇区)
GPT结构
Protective MBR(保护性 MBR):
位置:硬盘的第一个扇区(LBA 0)。
内容:类似于传统的 MBR,但只有一个占位的分区,用于防止旧的操作系统误认为硬盘是未分区的。
Primary GPT Header(主 GPT 头):
位置:硬盘的第二个扇区(LBA 1)。
大小:通常为 512 字节。
内容:
Signature(签名):固定为 EFI PART。
Version(版本号):GPT 规范的版本。
Size(大小):GPT 头的大小。
CRC32 Checksum(校验和):用于验证 GPT 数据的完整性。
Current LBA(当前 LBA 地址):GPT 头所在的位置。
Backup LBA(备份 LBA 地址):备份 GPT 头所在的位置。
Partition Entries LBA(分区条目 LBA 地址):分区条目表的起始位置。
Number of Partition Entries(分区条目数量):分区条目的总数。
Size of Partition Entry(分区条目大小):每个分区条目的大小。
Partition Entries(分区条目表):
位置:从 Partition Entries LBA 开始。
内容:
Partition Type GUID(分区类型 GUID):表示分区的类型。
Unique Partition GUID(唯一分区 GUID):表示分区的唯一标识。
Starting LBA(起始 LBA 地址):分区的起始位置。
Ending LBA(结束 LBA 地址):分区的结束位置。
Attributes(属性):分区的属性。
Name(名称):分区的名称。
Backup GPT Header(备份 GPT 头):
位置:硬盘的最后一个扇区(LBA -1)。
内容:与主 GPT 头相同,用于冗余和恢复。
优点
分区数量:支持最多 128 个分区。
最大容量:支持超过 2 TB 的分区大小,理论上支持到 EB(Exabyte)级别的分区。
冗余:主 GPT 头和备份 GPT 头提供冗余,增强了数据的可靠性。
唯一标识:每个分区都有唯一的 GUID,便于管理和识别。
缺点
兼容性:不被所有旧操作系统和 BIOS 支持,需要 UEFI 引导。
复杂性:结构相对复杂,实现和管理较为复杂
总结
-
MBR:适用于小容量硬盘(<= 2 TB),最多支持 4 个主分区,兼容旧操作系统和 BIOS。
-
GPT:适用于大容量硬盘(> 2 TB),支持更多分区(最多 128 个),提供冗余和唯一标识,需要 UEFI 引导。
分区管理
#列出块设备
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─rl-root 253:0 0 26G 0 lvm /
└─rl-swap 253:1 0 3G 0 lvm [SWAP]
sr0 11:0 1 2G 0 rom
#查看分区情况
[root@localhost ~]# blkid
/dev/sdb1: UUID="b47109a2-041c-4c77-97c3-bf37caf8b307" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="058053f9-01"
/dev/sdb5: UUID="1687a324-305d-4821-aa09-c6ce363ff5be" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="058053f9-05"
/dev/sda1: UUID="982d5922-9968-45a9-9859-6ef07c69a7ec" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="69b7b195-01"
/dev/sda2: UUID="98V7kE-7aau-G2sA-extU-3uaQ-Oq56-5AfVXZ" TYPE="LVM2_member" PARTUUID="69b7b195-02"
/dev/sr0: BLOCK_SIZE="2048" UUID="2021-11-14-09-30-59-00" LABEL="Rocky-8-5-x86_64-dvd" TYPE="iso9660" PTUUID="6b8b4567" PTTYPE="dos"
/dev/mapper/rl-root: UUID="30bcee18-3966-47e9-8b91-cd0e8ae0312a" BLOCK_SIZE="512" TYPE="xfs"
/dev/mapper/rl-swap: UUID="eda505fd-1f26-4fd4-89fd-980c9789c618" TYPE="swap"
创建分区命令
fdisk 管理MBR分区
gdisk 管理GPT分区(和fdisk用法类似)
parted 高级分区操作,可以是交互或非交互方式
分区类型
主分区
标识:主分区的编号通常是从 1 开始的连续数字,例如 /dev/sda1、/dev/sda2。
限制:最多 4 个主分区。
扩展分区
标识:扩展分区通常编号为 /dev/sda4(如果前三个是主分区)。
限制:一个磁盘上只能有一个扩展分区。
逻辑分区
标识:逻辑分区的编号从 5 开始,例如 /dev/sda5、/dev/sda6。
限制:逻辑分区只能从扩展分区里分,例如:扩展分区有10G,那么创建逻辑分区时最大只有10G,且创建个数没有限制。
fdisk命令
fdisk [设备名]
常用选项:
p:打印当前磁盘的分区表
n:创建新分区
d:删除分区
t:更改分区类型
w:保存更改并退出 fdisk
q:不保存更改并退出 fdisk
l:列出所有已知的分区类型
m:显示所有可用的命令
范例:
#创建主分区
[root@localhost ~]# lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 30G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 29G 0 part
sdb 8:16 0 20G 0 disk
sr0 11:0 1 2G 0 rom
rl-root 253:0 0 26G 0 lvm /
rl-swap 253:1 0 3G 0 lvm [SWAP]
[root@localhost ~]# lsblk /dev/sdb -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
[root@localhost ~]# fdisk /dev/sdb
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x058053f9 的新 DOS 磁盘标签。
命令(输入 m 获取帮助):n #创建新分区
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):p #创建主分区
分区号 (1-4, 默认 1): #选择分区号
第一个扇区 (2048-41943039, 默认 2048): #从2048往后开始
上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): +5G
创建了一个新分区 1,类型为“Linux”,大小为 5 GiB。
命令(输入 m 获取帮助):p #查看分区表
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x058053f9
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 10487807 10485760 5G 83 Linux
命令(输入 m 获取帮助):w #保存退出
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
[root@localhost ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 5G 0 part
#创建扩展分区和逻辑分区
[root@localhost ~]# fdisk /dev/sdb
命令(输入 m 获取帮助):n
分区类型
p 主分区 (1个主分区,0个扩展分区,3空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):e
分区号 (2-4, 默认 2):
第一个扇区 (10487808-41943039, 默认 10487808):
上个扇区,+sectors 或 +size{K,M,G,T,P} (10487808-41943039, 默认 41943039): +5G
创建了一个新分区 2,类型为“Extended”,大小为 5 GiB。
命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x058053f9
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 10487807 10485760 5G 83 Linux
/dev/sdb2 10487808 20973567 10485760 5G 5 扩展
命令(输入 m 获取帮助):n
分区类型
p 主分区 (1个主分区,1个扩展分区,2空闲)
l 逻辑分区 (从 5 开始编号)
选择 (默认 p):l
添加逻辑分区 5
第一个扇区 (10489856-20973567, 默认 10489856):
上个扇区,+sectors 或 +size{K,M,G,T,P} (10489856-20973567, 默认 20973567): +2G
创建了一个新分区 5,类型为“Linux”,大小为 2 GiB。
命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x058053f9
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 10487807 10485760 5G 83 Linux
/dev/sdb2 10487808 20973567 10485760 5G 5 扩展
/dev/sdb5 10489856 14684159 4194304 2G 83 Linux
命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
[root@localhost ~]# lsblk /dev/sdb -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
sdb1 8:17 0 5G 0 part
sdb2 8:18 0 1K 0 part
sdb5 8:21 0 2G 0 part
扩展分区:显示为 1K 是正常的,因为它是一个容器分区,不直接存储数据。
验证方法:使用 fdisk -l 或 parted print 命令可以查看扩展分区和逻辑分区的详细信息
文件系统
- 创建好分区后,只是相当于创建了一个容量空间,需要创建一个文件系统来负责管理和存储文件信息。
- 从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。
- 创建文件系统可以理解为windows的磁盘格式化,一个新加盘,如果没有进行格式化处理是没有办法使用的。
- 在创建文件系统时可以指定块大小,块即存放文件的最小单位,例如:指点块大小为4k,无论存放的文件有多小,它都要占据4k的存储空间。
linux中常用的文件系统
Ext4 (Fourth Extended File System)
特点:
* EXT4是Linux系统下的日志文件系统,是EXT3文件系统的后继版本
* Ext4的文件系统容量达到1EB,而支持单个文件则达到16TB
* 理论上支持无限数量的子目录
* Ext4文件系统使用64位空间记录块数量和 inode数量
* Ext4的多块分配器支持一次调用分配多个数据块
* 修复速度更快
应用场景:目前最常用的 Linux 文件系统之一,广泛应用于各种 Linux 发行版。
XFS (Extended File System)
特点:
* 根据所记录的日志在很短的时间内迅速恢复磁盘文件内容
* 用优化算法,日志记录对整体文件操作影响非常小
* 是一个全64-bit的文件系统,最大可以支持8EB的文件系统,而支持单个文件则达到8EB
* 能以接近裸设备I/O的性能存储数据
应用场景:适用于需要高性能存储的场景,如数据库服务器和文件服务器。
挂载
- 挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为。
- 卸载:为解除此关联关系的过程。
- 挂载点下原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空。
- 进程正在使用中的设备无法被卸载。
创建文件系统
#sda的文件系统是xfs,挂载到了/root下,sdb什么都没有
[root@localhost yum.repos.d]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs 982d5922-9968-45a9-9859-6ef07c69a7ec /boot
└─sda2 LVM2_membe 98V7kE-7aau-G2sA-extU-3uaQ-Oq56-5AfVXZ
├─rl-root xfs 30bcee18-3966-47e9-8b91-cd0e8ae0312a /
└─rl-swap swap eda505fd-1f26-4fd4-89fd-980c9789c618 [SWAP]
sdb
├─sdb1
├─sdb2
└─sdb5
sr0 iso9660 Rocky-8-5-x86_64-dvd 2021-11-14-09-30-59-00
#给sdb1创建了ext4
[root@localhost yum.repos.d]# mkfs.ext4 /dev/sdb1
mke2fs 1.45.6 (20-Mar-2020)
创建含有 1310720 个块(每块 4k)和 327680 个inode的文件系统
文件系统UUID:b47109a2-041c-4c77-97c3-bf37caf8b307
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912, 819200, 884736
正在分配组表: 完成
正在写入inode表: 完成
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成
#给sdb5创建xfs
[root@localhost ~]# mkfs.xfs /dev/sdb5
meta-data=/dev/sdb5 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
#检查和修复文件系统错误
[root@localhost /]# fsck.ext4 /dev/sdb1
e2fsck 1.45.6 (20-Mar-2020)
/dev/sdb1 已挂载。
e2fsck: 无法继续,已中止。
[root@localhost /]# xfs_repair /dev/sdb5
xfs_repair: /dev/sdb5 contains a mounted filesystem
Unmount or use the dangerous (-d) option to repair a read-only mounted filesystem
fatal error -- couldn't initialize XFS library
#显示 XFS 文件系统的详细信息
[root@localhost /]# xfs_info /dev/sdb5
meta-data=/dev/sdb5 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载命令
mount [options] file
常见选项:
-t fstype 指定要挂载的设备上的文件系统类型,如:ext4,xfs
-o ro 只读挂载
-o rw 只写挂载
-o remount 重新挂载
-w read and write, 读写挂载,此为默认设置,可省略
-n 不更新/etc/mtab,mount不可见
-a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有
auto功能)
-L 'LABEL' 以卷标指定挂载设备
-U 'UUID' 以UUID指定要挂载的设备
-B, --bind 绑定目录到另一个目录上
#查看挂载情况
[root@localhost ~]# mount
#临时挂载
[root@localhost ~]# mount /dev/sdb1 /logs
#只读挂载,只能在/mysql目录里读文件
[root@localhost /]# mount -o ro /dev/sdb5 /mysql
#取消挂载
[root@localhost ~]# umount /dev/sdb1 /logs
#永久挂载(defaults代表默认规则即rw,也可以直接修改为ro)
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: UUID="b47109a2-041c-4c77-97c3-bf37caf8b307" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="058053f9-01"
#复制sdb1的UUID,按照格式写入
[root@localhost ~]# vim /etc/fstab
/dev/mapper/rl-root / xfs defaults 0 0
UUID=982d5922-9968-45a9-9859-6ef07c69a7ec /boot xfs defaults 0 0
/dev/mapper/rl-swap none swap defaults 0 0
UUID=b47109a2-041c-4c77-97c3-bf37caf8b307 /logs ext4 defaults 0 0
#配置文件生效 (-a代表新增加的行会生效,如果是在原基础上进行修改则不会生效)
[root@localhost ~]# mount -a
#重新挂载(只修改了fstab的内容,没有新加行)
[root@localhost ~]# mount -o remount /logs
swap虚拟内存
查看swap大小
[root@localhost /]# free -h
total used free shared buff/cache available
Mem: 3.6Gi 205Mi 3.0Gi 8.0Mi 440Mi 3.2Gi
Swap: 3.0Gi 0B 3.0Gi
禁用swap
[root@localhost /]# swapoff -a
#用#注释掉swap那行
[root@localhost /]# vim /etc/fstab
启用swap
[root@localhost /]# swapon -a
#删除swap那行的#
[root@localhost /]# vim /etc/fstab
添加swap分区
#使用 l 查看id编号 , 使用 t 修改id为82,即swap
[root@localhost /]# fdisk /dev/sdb
命令(输入 m 获取帮助):n
分区类型
p 主分区 (1个主分区,1个扩展分区,2空闲)
l 逻辑分区 (从 5 开始编号)
选择 (默认 p):l
添加逻辑分区 6
第一个扇区 (14686208-20973567, 默认 14686208):
上个扇区,+sectors 或 +size{K,M,G,T,P} (14686208-20973567, 默认 20973567): +1G
创建了一个新分区 6,类型为“Linux”,大小为 1 GiB。
命令(输入 m 获取帮助):l
0 空 24 NEC DOS 81 Minix / 旧 Linu bf Solaris
1 FAT12 27 隐藏的 NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 隐藏 或 In c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx
5 扩展 41 PPC PReP Boot 86 NTFS 卷集 da 非文件系统数据
6 FAT16 42 SFS 87 NTFS 卷集 db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux 纯文本 de Dell 工具
8 AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt
9 AIX 可启动 4f QNX4.x 第3部分 93 Amoeba e1 DOS 访问
a OS/2 启动管理器 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad 休 ea Rufus 对齐
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 隐藏的 FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC
12 Compaq 诊断 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 隐藏的 FAT16 <3 61 SpeedStor ab Darwin 启动 f4 SpeedStor
16 隐藏的 FAT16 63 GNU HURD 或 Sys af HFS / HFS+ f2 DOS 次要
17 隐藏的 HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST 智能睡眠 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b 隐藏的 W95 FAT3 70 DiskSecure 多启 bb Boot Wizard 隐 fd Linux raid 自动
1c 隐藏的 W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e 隐藏的 W95 FAT1 80 旧 Minix be Solaris 启动 ff BBT
命令(输入 m 获取帮助):t
分区号 (1,2,5,6, 默认 6): 6
Hex 代码(输入 L 列出所有代码):82
命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x058053f9
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 10487807 10485760 5G 83 Linux
/dev/sdb2 10487808 20973567 10485760 5G 5 扩展
/dev/sdb5 10489856 14684159 4194304 2G 83 Linux
/dev/sdb6 14686208 16783359 2097152 1G 82 Linux swap / Solaris
已将分区“Linux”的类型更改为“Linux swap / Solaris”。
命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x058053f9
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 10487807 10485760 5G 83 Linux
/dev/sdb2 10487808 20973567 10485760 5G 5 扩展
/dev/sdb5 10489856 14684159 4194304 2G 83 Linux
/dev/sdb6 14686208 16783359 2097152 1G 82 Linux swap / Solaris
创建 swap 文件系统
[root@localhost /]# mkswap /dev/vdb6
挂载swap
[root@localhost /]# vim /etc/fstab
#添加这一行
UUID=b47109a2-041c-4c77-97c3-bf37caf8b345 swap swap defaults 0 0
#swap生效
[root@localhost /]# swapon -a
修改swap的启动阈值
[root@localhost /]# vim /etc/sysctl.conf
#添加这行
vm.swappiness = 10
#文件生效
[root@localhost /]# sysctl -p
#查看阈值
[root@localhost /]# cat /proc/sys/vm/swappiness
10
LVM
LVM 的基本概念
- Physical Volume (PV):物理卷,即物理硬盘或分区,它是 LVM 的基础。
- Volume Group (VG):卷组,由一个或多个物理卷组成,相当于一个大的存储池。
- Logical Volume (LV):逻辑卷,从卷组中划分出来的虚拟分区,可以格式化为文件系统并挂载使用。
LVM 的基本操作流程
- 创建物理卷 (PV)
- 创建卷组 (VG)
- 创建逻辑卷 (LV)
- 格式化和挂载逻辑卷
#在原有盘的空闲空间里再分出一个分区作为物理卷
[root@localhost ~]# fdisk /dev/sdb
命令(输入 m 获取帮助):n
分区类型
p 主分区 (1个主分区,1个扩展分区,2空闲)
l 逻辑分区 (从 5 开始编号)
选择 (默认 p):p
分区号 (3,4, 默认 3):
第一个扇区 (20973568-41943039, 默认 20973568):
上个扇区,+sectors 或 +size{K,M,G,T,P} (20973568-41943039, 默认 41943039): +5G
创建了一个新分区 3,类型为“Linux”,大小为 5 GiB。
命令(输入 m 获取帮助):t
分区号 (1-3, 默认 3): 3
Hex 代码(输入 L 列出所有代码):8e #修改id编码为8e
已将分区“Linux”的类型更改为“Linux LVM”。
命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x058053f9
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 10487807 10485760 5G 83 Linux
/dev/sdb2 10487808 20973567 10485760 5G 5 扩展
/dev/sdb3 20973568 31459327 10485760 5G 8e Linux LVM
命令(输入 m 获取帮助):w
分区表已调整。
正在同步磁盘。
#创建 物理卷
[root@localhost ~]# pvcreate /dev/sdb3
Physical volume "/dev/sdb3" successfully created.
#创建卷组,testvg是卷组名
[root@localhost ~]# vgcreate testvg /dev/sdb3
Volume group "testvg" successfully created
#创建逻辑卷, -L 2G是卷大小, -n后接卷组名 log_lv是逻辑卷名
[root@localhost ~]# lvcreate -L 2G -n testvg log_lv
Volume group "log_lv" not found
Cannot process volume group log_lv
常用查询命令:
pvdisplay #查看物理卷详细信息
vgdisplay #查看卷组详细信息
lvdisplay #查看逻辑卷详细信息
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name testvg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <5.00 GiB
PE Size 4.00 MiB #PE是指块大小,在创建卷组的时候可以指定块的大小(-s 16M即一个块的大小是16M)
Total PE 1279 #1279*4就等于卷组的大小
Alloc PE / Size 512 / 2.00 GiB
Free PE / Size 767 / <3.00 GiB
VG UUID OEKnZ4-HsGz-ZfZD-v4iS-mjZu-BbWD-PKxjlw
#给逻辑卷创建文件系统
[root@localhost ~]# mkfs.ext4 /dev/testvg/log_lv
mke2fs 1.45.6 (20-Mar-2020)
创建含有 524288 个块(每块 4k)和 131072 个inode的文件系统
文件系统UUID:92eef0d9-7839-4588-ac59-44f36dae360b
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912
正在分配组表: 完成
正在写入inode表: 完成
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成
#添加挂载点
[root@localhost ~]# vim /etc/fstab
UUID=92eef0d9-7839-4588-ac59-44f36dae360b /logs ext4 defaults 0 0
#注意:不能挂载到原有的目录上,会导致覆盖,数据丢失,需要挂载到新目录。
#配置生效
[root@localhost ~]# mount -a
扩容逻辑卷
#将卷组剩余的存储大小全部加到逻辑卷里
[root@localhost ~]# lvextend -l +100%free /dev/mapper/testvg/log_lv
Size of logical volume testvg/log_lv changed from 2.00 GiB (512 extents) to <5.00 GiB (1279 extents).
Logical volume testvg/log_lv successfully resized.
#将原来的逻辑卷的文件系统同步到新加入的存储里
[root@localhost ~]# resize2fs /dev/testvg/log_lv
resize2fs 1.45.6 (20-Mar-2020)
/dev/testvg/log_lv 上的文件系统已被挂载于 /logs;需要进行在线调整大小
old_desc_blocks = 1, new_desc_blocks = 1
/dev/testvg/log_lv 上的文件系统现在为 1309696 个块(每块 4k)。
卷组扩容
#创建lvm分区
[root@localhost ~]# fdisk /dev/sdb
命令(输入 m 获取帮助):n
分区类型
p 主分区 (2个主分区,1个扩展分区,1空闲)
l 逻辑分区 (从 5 开始编号)
选择 (默认 p):p
已选择分区 4
第一个扇区 (31459328-41943039, 默认 31459328):
上个扇区,+sectors 或 +size{K,M,G,T,P} (31459328-41943039, 默认 41943039):
创建了一个新分区 4,类型为“Linux”,大小为 5 GiB。
命令(输入 m 获取帮助):t
分区号 (1-4, 默认 4): 4
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”。
命令(输入 m 获取帮助):w
分区表已调整。
正在同步磁盘。
#创建物理卷
[root@localhost ~]# pvcreate /dev/sdb4
Physical volume "/dev/sdb4" successfully created.
#将物理卷加入到testvg卷组里
[root@localhost ~]# vgextend testvg /dev/sdb4
Volume group "testvg" successfully extended
#逻辑卷扩容,在原基础上+2G(-L 10G则是总大小变成10G)
# -r 是自动同步文件系统
[root@localhost ~]# lvextend -r -L +2G /dev/testvg/log_lv
RAID硬盘阵列
RAID 0
工作原理:数据被分割成块,然后交替写入多个硬盘。每个硬盘上存储一部分数据.
利用率:100%。
冗余性:无冗余。任何一块硬盘故障都会导致数据丢失。
性能:读写性能非常高,因为数据可以并行读写。
最少硬盘数:2 块硬盘。
RAID 1
工作原理:数据被完全复制到两个或多个硬盘上。每个硬盘上存储相同的完整数据,相当于备份。
利用率:50%。只有总容量的一半被用于存储数据。
冗余性:高冗余。任何一个硬盘故障都不会影响数据的完整性。
性能:读性能高,因为可以从任意一个硬盘读取数据;写性能一般,因为需要同步写入所有硬盘。
最少硬盘数:2 块硬盘。
RAID 5
工作原理:把数据和相对应的奇偶校验信息存储到组成的RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分布存储于不同的磁盘上,当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息区恢复被损坏的数据.
利用率:(n-1)/n,其中 n 是硬盘的数量。例如,4 块硬盘的利用率是 75%。
冗余性:中等冗余。可以容忍一个硬盘故障而不会丢失数据。
性能:读性能高,因为数据可以并行读取.
最少硬盘数:3 块硬盘。
RAID 10
工作原理:先将硬盘分成两个或多个 RAID 1 组,然后在这几个 RAID 1 组之间进行 RAID 0 条带化。
利用率:50%。每个 RAID 1 组的利用率是 50%,再进行条带化后的利用率仍然是 50%。
冗余性:高冗余。可以容忍每个 RAID 1 组中的一个硬盘故障。
性能:读写性能都非常高,因为数据可以并行读写。
最少硬盘数:4 块硬盘
RAID 10
工作原理:先将硬盘分成两个或多个 RAID 0 组,然后在这几个 RAID 0 组之间进行 RAID 1 镜像。
利用率:50%。每个 RAID 0 组的利用率是 100%,再进行镜像后的利用率是 50%。
冗余性:高冗余。可以容忍每个 RAID 0 组中的一个硬盘故障。
性能:读写性能都非常高,因为数据可以并行读写。
最少硬盘数:4 块硬盘。
软件包管理
常见的程序包管理器
RPM
RPM 是一个低级别的包管理工具,主要用于处理 .rpm 包文件。它提供了基本的包管理功能,如安装、删除、查询和验证软件包。
rpm命令
安装 .rpm 文件:
rpm -ivh <package_file.rpm>
安装 .rpm 文件并忽略依赖关系:
rpm -ivh --nodeps <package_file.rpm>
删除已安装的包:
rpm -e <package_name>
删除已安装的包并忽略依赖关系:
sudo rpm -e --nodeps <package_name>
查看已安装包的信息:
rpm -q <package_name>
查看已安装包的文件列表:
rpm -ql <package_name>
查看已安装包的配置文件列表:
rpm -qc <package_name>
查看已安装包的依赖关系:
rpm -qR <package_name>
查找包含特定文件的包:
rpm -qf <file_path>
列出所有已安装的包:
rpm -qa
更新 .rpm 文件:
rpm -Uvh <package_file.rpm>
刷新包数据库并更新包:
rpm -Fvh <package_file.rpm>
验证已安装包的完整性:
rpm -V <package_name>
验证所有已安装包的完整性:
rpm -Va
YUM/DNF(centos)
DNF是 CentOS 8 及更高版本以及其他基于 Red Hat 的发行版中的默认包管理器。(是YUM的升级版)
yum客户端配置
/etc/yum.conf #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo #为仓库提供配置文件
[root@localhost etc]# cat yum.conf
[main]
gpgcheck=1 #安装包前要做包的合法和完整性校验
installonly_limit=3 #同时可以安装3个包,最小值为2,如设为0或1,为不限制
clean_requirements_on_remove=True #删除包时,是否将不再使用的包删除
best=True #升级时,自动选择安装最新版,即使缺少包的依赖
skip_if_unavailable=False
搭建yum仓库
[root@localhost yum.repos.d]# cat Rocky-BaseOS.repo
[baseos]
name=Rocky Linux $releasever - BaseOS
#mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[root@localhost yum.repos.d]# cat Rocky-AppStream.repo
[appstream]
name=Rocky Linux $releasever - AppStream
#mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=AppStream-$releasever
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
yum命令
yum repolist all # 显示仓库列表
yum repolist -v # 显示仓库的详细信息
yum update # 更新所有已安装的包
yum install <package_name> # 安装包sudo yum remove <package_name> # 删除包
yum clean all # 清理缓存
yum makecache # 构建缓存
APT/dpkg(ubuntu)
dpkg:主要用于处理 .deb 包文件,提供低级别的包管理功能,适合于手动安装、删除和查询单个包文件。
apt:高级的包管理工具,提供了更高级别的包管理功能,如依赖解析、包列表更新、多源管理等。
dpkg用法:
#安装包,不支持包的依赖
dpkg -i package.deb
#删除包,不建议,不自动卸载依赖于它的包
dpkg -r package
#删除包(包括配置文件)
dpkg -P package
#列出当前已安装的包,类似rpm -qa
dpkg -l
#显示该包的简要说明
dpkg -l package
#列出该包的状态,包括详细信息,类似rpm –qi
dpkg -s package
#列出该包中所包含的文件,类似rpm –ql
dpkg -L package
#搜索包含pattern的包,类似rpm –qf
dpkg -S <pattern>
#配置包,-a 使用,配置所有没有配置的软件包
dpkg --configure package
#列出 deb 包的内容,类似rpm –qpl
dpkg -c package.deb
#解开 deb 包的内容
dpkg --unpack package.deb
dpkg范例:
#列出系统上安装的所有软件包
dpkg -l
#列出软件包安装的文件
dpkg -L bash
#查看/bin/bash来自于哪个软件包
dpkg -S /bin/bash
#安装本地的 .deb 文件
dpkg -i /mnt/cdrom/pool/main/z/zip/zip_3.0-11build1_amd64.deb
#卸载软件包
dpkg -r zip
注意:一般建议不要使用dpkg卸载软件包。因为删除包时,其它依赖它的包不会卸载,并且可能无法再
正常运行
apt范例:
修改阿里云的APT源为清华源
sed -i 's/mirrors.aliyun.com/mirrors.tuna.tsinghua.edu.cn/'
/etc/apt/sources.list
#安装包:
apt install tree zip
#安装deb包,注意:包文件前必须加路径
apt install ./mongodb-database-tools-ubuntu1804-x86_64-100.5.1.deb
#安装图形桌面
apt install ubuntu-desktop
#删除包:
apt remove tree zip
#说明:apt remove中添加--purge选项会删除包配置文件,谨慎使用
#更新包索引,相当于yum clean all;yum makecache
apt update
#升级包:要升级系统,请首先更新软件包索引,再升级
apt upgrade
#apt列出仓库软件包,等于yum list
apt list
#搜索安装包
apt search nginx
#查看某个安装包的详细信息
apt show apache2
#在线安装软件包
apt install apache2
#卸载单个软件包但是保留配置⽂件
apt remove apache2
#删除安装包并解决依赖关系
apt autoremove apache2
#更新本地软件包列表索引,修改了apt仓库后必须执⾏
apt update
#卸载单个软件包删除配置⽂件
apt purge apache2
#升级所有已安装且可升级到新版本的软件包
apt upgrade
#升级整个系统,必要时可以移除旧软件包。
apt full-upgrade
#编辑source源⽂件
apt edit-sources
#查看仓库中软件包有哪些版本可以安装
apt-cache madison nginx
#安装软件包的时候指定安装具体的版本
apt install nginx=1.14.0-0ubuntu1.6
软件管理案例
#查找存在的文件来自于哪个包
#dpkg -S filename :在当前安装的包里查找文件
dpkg -S /bin/ls
#查看包相关信息
#显示系统安装包的统计信息,可以统计已经安装包的数量,大小,占用空间等
apt-cache stats
#显示xxx包的信息,可以看到某个包的源、版本等信息
apt-cache show xxx #更详细
apt show xxx
#查看仓库中的指定软件的所有版本
apt-cache madison xxx
#查看文件的依赖
#查询软件xxx依赖哪些包
apt depends xxx
apt-cache depends xxx
#查询软件xxx被哪些包依赖
apt rdepends xxx
apt-cache rdepends xxx
#ubuntu常用包
apt purge ufw lxd lxd-client lxcfs liblxc-common
apt install iproute2 ntpdate tcpdump telnet traceroute nfskernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev
zlib1g-dev gcc openssh-server iotop unzip zip
搭建私有yum仓库
YUM的工作原理:
- 配置文件:
YUM 使用 /etc/yum.repos.d/ 目录下的 .repo 文件来配置仓库。每个 .repo 文件定义了一个或多个仓库,指定了仓库的名称、URL 和其他属性。 - 元数据同步:
YUM 会从配置的仓库中下载元数据(如包列表、依赖关系等)。元数据通常包括包的名称、版本、依赖关系等信息。 - 依赖解析:
YUM 使用下载的元数据来解析依赖关系,确保安装的包及其依赖都能正确安装。YUM 会自动处理依赖关系,确保所有必要的包都被安装。 - 事务管理:
YUM 在执行安装、更新或删除操作时,会创建一个事务,确保操作的原子性和一致性。如果某个操作失败,YUM 会回滚事务,确保系统的一致性。 - 缓存管理:
*YUM 会缓存下载的包和元数据,以减少网络流量和提高性能。缓存通常存储在 /var/cache/yum/ 目录下。
DNF工作原理:
- 配置文件:
DNF 使用与 YUM 相同的配置文件,即 /etc/yum.repos.d/ 目录下的 .repo 文件。每个 .repo 文件定义了一个或多个仓库,指定了仓库的名称、URL 和其他属性。 - 元数据同步:
DNF 会从配置的仓库中下载元数据。元数据通常包括包的名称、版本、依赖关系等信息。DNF 使用更高效的元数据格式,提高了下载和解析速度。 - 依赖解析:
DNF 使用更高效的依赖解析算法,能够更好地处理复杂的依赖关系。DNF 会自动处理依赖关系,确保所有必要的包都被安装。 - 模块支持:
DNF 支持模块,允许用户在多个软件包集合中选择特定的模块流。模块化功能使得用户可以更容易地管理和更新软件包集合。 - 事务管理:
DNF 在执行安装、更新或删除操作时,会创建一个事务,确保操作的原子性和一致性。如果某个操作失败,DNF 会回滚事务,确保系统的一致性。 - 缓存管理:
DNF 会缓存下载的包和元数据,以减少网络流量和提高性能。缓存通常存储在 /var/cache/dnf/ 目录下。
以本机作为yum仓库的服务器,让其他主机能够使用本机配置的私有仓库。
第一步:安装httpd(或者nginx),让其他主机能够访问服务
[root@localhost etc]# yum install -y httpd
第二步:创建yum目录
[root@localhost etc]# mkdir -p /var/www/html/rockylinux/8/{BaseOS,extras,AppStream}
[root@localhost etc]# tree /var/www/html
/var/www/html
└── rockylinux
└── 8
├── AppStream
├── BaseOS
└── extras
5 directories, 0 files
注意:/var/www/html 是 Apache HTTP 服务器的默认文档根目录。当用户通过浏览器访问你的网站时,Apache 会从这个目录中读取文件并发送给客户端。所以我们的仓库需要放在这个目录下。
#使用光盘作为yum仓库
第三步:挂载光盘,并将光盘内自带的BaseOS复制到/var/www/html/rockylinux/8/下
[root@localhost BaseOS]# mount /dev/cdrom /mnt
[root@localhost BaseOS]# cp -r /mnt/* /var/www/html/rockylinux/8/
第四步:在客户机上配置新的yum仓库,原先的yum源记得先备份
[root@localhost yum.repos.d]# cat /etc/yum.repos.d/test.repo
[BaseOS]
name=my BaseOS
baseurl=http://192.168.93.200/rockylinux/8/BaseOS
gpgkey=0
[AppStream]
name=appstream
baseurl=http://192.168.93.200/rockylinux/8/AppStream/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[extras]
name=my extras
baseurl=http://192.168.93.200/rockylinux/8/extras/
gpgcheck=0
#检查是否生效
[root@localhost yum.repos.d]# yum repolist
Repository extras is listed more than once in the configuration
仓库 id 仓库名称
AppStream appstream
baseos my BaseOS
epel Extra Packages for Enterprise Linux 8 - x86_64
extras my extras
#清除缓存
[root@localhost yum.repos.d]# yum clean all
#生成缓存
[root@localhost yum.repos.d]# yum makecache
从网上拉取extras仓库拉取到本地
[root@localhost yum.repos.d]# dnf reposync --repoid=extras --download-metadata -p /var/www/html/rockylinux/8/
系统安装之后的常用初始化步骤
Rocky linux
# 更新所有已安装的包
dnf upgrade
# 安装常用的开发工具和库
dnf install epel-release
dnf groupinstall "Development Tools"
dnf install vim wget curl git
# 启动or关闭 防火墙
systemctl enable firewalld
systemctl stop firewalld
# 查看当前的防火墙规则
firewall-cmd --list-all
# 永久关闭 SELinux(可选)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 配置时区
timedatectl set-timezone Asia/Shanghai
ubuntu
# 更新包列表
apt update
# 升级所有已安装的包
apt upgrade
# 安装常用的开发工具和库
apt install build-essential
apt install vim wget curl git
# 配置时区
timedatectl set-timezone Asia/Shanghai
OSI七层模型
物理层
作用:最底层,负责物理传输。(简单理解就是网线)。
协议:Ethernet、ISDN、SONET、SDH、USB、HDMI、Wi-Fi等。
数据链路层
作用:负责节点之间的可靠传输。
协议:Ethernet、PPP(点对点协议)、HDLC(高级数据链路控制)、ATM(异步传输模式)等。
网络层
作用:负责数据包的路由选择和转发。
协议:IP(互联网协议)、ICMP(互联网控制消息协议)、ARP(地址解析协议)、RARP(反向地址解析协议)、RIP(路由信息协议)等。
传输层
作用:负责两个节点之间的数据传输,确保数据能够被可靠的传输到目标地址。
协议:TCP(传输控制协议)、UDP(用户数据报协议)等。
会话层
作用:负责建立和管理会话。
协议:NetBIOS、RPC(远程过程调用)、SQL(结构化查询语言)、SMB(服务器消息块)、TLS(传输层安全)、SSL(安全套接层)等。
表示层
作用:负责数据的表示和转换。
协议:JPEG、MPEG、ASCII、PNG、GIF、TLS、SSL等。
应用层
作用:负责应用程序之间的通信,提供用户接口和服务。它是 OSI 模型的最高层,直接面向用户。
协议:HTTP(超文本传输协议)、HTTPS(安全超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、IMAP(互联网邮件访问协议)、DNS(域名系统)、SNMP(简单网络管理协议)、Telnet等。
linux端口的简单介绍
端口号范围:
0-1023:系统端口,通常由系统服务使用。
1024-49151:注册端口,可以被用户进程使用。
49152-65535:动态端口,通常由操作系统自动分配给客户端连接。
端口类型:
TCP(传输控制协议):面向连接的协议,提供可靠的传输。
UDP(用户数据报协议):无连接的协议,提供不可靠但高效的传输。
#查看所有监听的 TCP 端口
[root@localhost ~]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp6 0 0 ::1:323 :::*
#查看所有监听的 UCP 端口
[root@localhost ~]# netstat -uln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp6 0 0 ::1:323 :::*
#查看监听的指定端口
[root@localhost ~]# netstat -tuln | grep 80
tcp6 0 0 :::80 :::* LISTEN
#查看firewalld防火墙规则
[root@localhost ~]# firewall-cmd --list-all
# 添加允许特定端口的规则
[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=53/udp --permanent
# 重新加载firewalld防火墙规则
[root@localhost ~]# firewall-cmd --reload
# 删除允许特定端口的规则
[root@localhost ~]# firewall-cmd --remove-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --remove-port=53/udp --permanent
# 重新加载防火墙规则
[root@localhost ~]# firewall-cmd --reload
# 查看当前的 iptables 规则
[root@localhost ~]# iptables -L -v -n
# 保存 iptables 规则
[root@localhost ~]# service iptables save
# 删除特定端口的规则
[root@localhost ~]# iptables -D INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -D INPUT -p udp --dport 53 -j ACCEPT
# 保存 iptables 规则
[root@localhost ~]# service iptables save
# 测试与远程主机的特定端口的连接
[root@localhost ~]# telnet 192.168.93.201:80
# 临时调整动态端口范围
[root@localhost ~]# sysctl -w net.ipv4.ip_local_port_range="20000 60000"
# 永久调整
[root@localhost ~]# nano /etc/sysctl.conf
net.ipv4.ip_local_port_range = 20000 60000
[root@localhost ~]# sysctl -p
# 查看当前的动态端口范围
[root@localhost ~]# sysctl net.ipv4.ip_local_port_range
TCP简单介绍
TCP特性:
工作在传输层
面向连接协议
全双工协议
半关闭
将数据打包成段,排序
确认机制
数据恢复,重传
错误检查
流量控制,滑动窗口
拥塞控制,慢启动和拥塞避免算法
TCP包头结构:
字段 | 长度(字节) | 描述 |
---|---|---|
源端口 | 2 | 发送方的端口号 |
目标端口 | 2 | 接收方的端口号 |
序列号 | 4 | 当前数据包的第一个字节的序列号 |
确认号 | 4 | 下一个期望接收的数据包的序列号 |
数据偏移 | 1 | 表示 TCP 头部的长度,以 32 位(4 字节)为单位 |
保留 | 1 | 保留字段,必须设为 0 |
控制标志 | 1 | 包含多个标志位,每个位表示一个标志 |
窗口大小 | 2 | 接收方的接收窗口大小,表示发送方可以发送的最大数据量 |
校验和 | 2 | 用于检查整个 TCP 报文段的完整性 |
紧急指针 | 2 | 如果 URG 标志被设置,表示紧急数据的偏移量 |
选项 | 可变 | 用于提供额外的功能,如最大段大小(MSS)、窗口缩放等 |
填充 | 可变 | 用于确保头部长度为 32 位的倍数 |
控制标志
标志 | 位 | 描述 |
---|---|---|
URG | 5 | 紧急指针有效 |
ACK | 4 | 确认号字段有效 |
PSH | 3 | 推送数据,要求接收方立即将数据传递给上层应用 |
RST | 2 | 重置连接,用于强制断开连接 |
SYN | 1 | 同步序列号,用于建立连接 |
FIN | 0 | 结束连接,用于关闭连接 |
TCP 三次握手
TCP 三次握手是建立连接的过程,确保双方准备好进行数据传输。以下是三次握手的详细步骤:
第一次握手:
客户端发送一个带有 SYN 标志的 TCP 段到服务器。
客户端的序列号为 seq=x。
客户端进入 SYN_SENT 状态。
第二次握手:
服务器收到客户端的 SYN 段后,回复一个带有 SYN 和 ACK 标志的 TCP 段。
服务器的序列号为 seq=y,确认号为 ack=x+1。
服务器进入 SYN_RECV 状态。
第三次握手:
客户端收到服务器的 SYN+ACK 段后,回复一个带有 ACK 标志的 TCP 段。
客户端的序列号为 seq=x+1,确认号为 ack=y+1。
客户端进入 ESTABLISHED 状态。
服务器收到客户端的 ACK 段后,进入 ESTABLISHED 状态。
简单总结:客户端发送 SYN,服务器回复 SYN+ACK,客户端再发送 ACK,双方进入 ESTABLISHED 状态
TCP 四次挥手
TCP 四次挥手是断开连接的过程,确保双方都准备好结束连接。以下是四次挥手的详细步骤:
第一次挥手:
客户端发送一个带有 FIN 标志的 TCP 段到服务器。
客户端的序列号为 seq=x。
客户端进入 FIN_WAIT_1 状态。
第二次挥手:
服务器收到客户端的 FIN 段后,回复一个带有 ACK 标志的 TCP 段。
服务器的序列号为 seq=y,确认号为 ack=x+1。
服务器进入 CLOSE_WAIT 状态。
客户端收到服务器的 ACK 段后,进入 FIN_WAIT_2 状态。
第三次挥手:
服务器完成数据传输后,发送一个带有 FIN 标志的 TCP 段到客户端。
服务器的序列号为 seq=y+1。
服务器进入 LAST_ACK 状态。
第四次挥手:
客户端收到服务器的 FIN 段后,回复一个带有 ACK 标志的 TCP 段。
客户端的序列号为 seq=x+1,确认号为 ack=y+2。
客户端进入 TIME_WAIT 状态,等待 2MSL(最大段生存时间)后完全关闭连接。
服务器收到客户端的 ACK 段后,进入 CLOSED 状态。
简单总结:客户端发送 FIN,服务器回复 ACK,服务器发送 FIN,客户端回复 ACK,双方进入关闭状态
ip地址分类
IPv4 地址主要分为五类:A 类、B 类、C 类、D 类和 E 类。其中,A 类、B 类和 C 类用于单播地址,D 类用于组播地址,E 类保留用于实验和研究。
1. A 类地址
地址范围:0.0.0.0 到 127.255.255.255
网络号:前 8 位(第一个字节)
主机号:后 24 位(剩余三个字节)
子网掩码:默认为 255.0.0.0 或 /8
示例:10.0.0.1,子网掩码为 255.0.0.0
特点:适用于大型网络,每个网络最多可以有 16,777,214 台主机。
2. B 类地址
地址范围:128.0.0.0 到 191.255.255.255
网络号:前 16 位(前两个字节)
主机号:后 16 位(剩余两个字节)
子网掩码:默认为 255.255.0.0 或 /16
示例:172.16.0.1,子网掩码为 255.255.0.0
特点:适用于中型网络,每个网络最多可以有 65,534 台主机。
3. C 类地址
地址范围:192.0.0.0 到 223.255.255.255
网络号:前 24 位(前三个字节)
主机号:后 8 位(最后一个字节)
子网掩码:默认为 255.255.255.0 或 /24
示例:192.168.1.1,子网掩码为 255.255.255.0
特点:适用于小型网络,每个网络最多可以有 254 台主机。
4. D 类地址
地址范围:224.0.0.0 到 239.255.255.255
用途:组播地址,用于多播通信
特点:不用于单播地址,而是用于向多个主机发送数据。
5. E 类地址
地址范围:240.0.0.0 到 255.255.255.255
用途:保留用于实验和研究
特点:不用于常规网络通信。
IP 地址的组成
一个 IPv4 地址由 32 位二进制数组成,通常以点分十进制的形式表示,分为四个 8 位(一个字节)的部分,每个部分用一个点分隔。例如,192.168.1.1。
二进制表示
192.168.1.1 的二进制表示为:
192 -> 11000000
168 -> 10101000
1 -> 00000001
1 -> 00000001
组合起来就是:11000000.10101000.00000001.00000001
子网掩码
子网掩码用于区分网络地址和主机地址。子网掩码也是一个 32 位的二进制数,通常也以点分十进制的形式表示。
A 类地址:默认子网掩码为 255.0.0.0 或 /8
二进制表示:11111111.00000000.00000000.00000000
B 类地址:默认子网掩码为 255.255.0.0 或 /16
二进制表示:11111111.11111111.00000000.00000000
C 类地址:默认子网掩码为 255.255.255.0 或 /24
二进制表示:11111111.11111111.11111111.00000000
特殊地址
回环地址:127.0.0.1,用于本地主机的测试。
广播地址:255.255.255.255,用于向网络内的所有主机发送数据。
私有地址:用于内部网络,不直接连接到互联网。
A 类:10.0.0.0 到 10.255.255.255
B 类:172.16.0.0 到 172.31.255.255
C 类:192.168.0.0 到 192.168.255.255
总结
A 类地址:适用于大型网络,网络号占 8 位,主机号占 24 位。
B 类地址:适用于中型网络,网络号占 16 位,主机号占 16 位。
C 类地址:适用于小型网络,网络号占 24 位,主机号占 8 位。
D 类地址:用于组播通信。
E 类地址:保留用于实验和研究。
举例:
计算201.222.200.111/18计算主机数和子网掩码
给定的 CIDR 表示法 /18 表示子网掩码中有 18 位是网络位,其余 14 位是主机位。
子网掩码的二进制表示
网络位:18 位
主机位:32 - 18 = 14 位
因此,子网掩码的二进制表示为:
11111111.11111111.11000000.00000000
将其转换为点分十进制表示:
255.255.192.0
计算主机数
主机数是指在一个子网中可以分配给主机的 IP 地址数量。由于主机位是 14 位,主机数的计算公式为:
主机数 = 2^主机位 - 2
这里减去 2 是因为一个子网中的第一个地址通常用作网络地址,最后一个地址用作广播地址。
主机位:14 位
计算主机数:
主机数 = 2^14 - 2
= 16384 - 2
= 16382
当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?
1. 计算 A 的网络地址
IP 地址: 10.0.1.1
子网掩码: /16,即 255.255.0.0
将 IP 地址和子网掩码转换为二进制形式:
IP 地址: 10.0.1.1 -> 00001010.00000000.00000001.00000001
子网掩码: 255.255.0.0 -> 11111111.11111111.00000000.00000000
进行按位与运算:
00001010.00000000.00000001.00000001
11111111.11111111.00000000.00000000
------------------------------------
00001010.00000000.00000000.00000000
将结果转换为点分十进制表示:
10.0.0.0
因此,A 的网络地址是 10.0.0.0。
2. 计算 B 的网络地址
IP 地址: 10.0.2.2
子网掩码: /24,即 255.255.255.0
将 IP 地址和子网掩码转换为二进制形式:
IP 地址: 10.0.2.2 -> 00001010.00000000.00000010.00000010
子网掩码: 255.255.255.0 -> 11111111.11111111.11111111.00000000
进行按位与运算:
00001010.00000000.00000010.00000010
11111111.11111111.11111111.00000000
------------------------------------
00001010.00000000.00000010.00000000
将结果转换为点分十进制表示:
10.0.2.0
因此,B 的网络地址是 10.0.2.0。
3. 比较网络地址
A 的网络地址: 10.0.0.0
B 的网络地址: 10.0.2.0
由于 10.0.0.0 和 10.0.2.0 不相同,因此 A 和 B 不在同一个网段。
虽然 A 和 B 不在同一个网段,但是只要网络中存在适当的路由配置,A 和 B 是可以相互通信的。