Linux基础
1.总结RAID的特性
1.1RAID 0
AID 0:条带化(Striping),将数据分成多个区段,平均分配到多个硬盘上,实现并行读写,提高性能
缺点:
没有冗余,一旦有硬盘损坏,数据就无法恢复
需要硬盘数:
至少需要2个硬盘,空间利用率为100%
1.2RAID 1
RAID 1:镜像(Mirroring),将相同的数据写入两个或多个硬盘,实现数据备份,提高可靠性
缺点:
写入速度较慢,空间利用率较低
需要硬盘数:
至少需要2个硬盘,空间利用率为50%
1.3RAID 5
RAID 5:带奇偶校验的条带化(Striping with Parity),在RAID 0的基础上,增加了奇偶校验信息,分散存储在各个硬盘上,实现数据恢复
缺点:
虽然速度较快,但校验运算较复杂,性能受影响
需要硬盘数:
至少需要3个硬盘,空间利用率为(n-1)/n,其中n为硬盘个数
1.4RAID 10
RAID 10:镜像+条带化(Mirroring and Striping),将多个RAID 1的硬盘对组合成RAID 0,实现数据冗余和并行读写
缺点:
虽然读写速度快,可靠性高,但成本高,空间利用率低
需要硬盘数:
至少需要4个硬盘,空间利用率为50%
1.5RAID 01
RAID 01:条带化+镜像(Striping and Mirroring),将多个RAID 0的硬盘组组合成RAID 1,实现数据冗余和并行读写
缺点:
与RAID 10类似,但恢复能力较弱,一旦有一个RAID 0组损坏,数据就无法恢复
需要硬盘数:
至少需要4个硬盘,空间利用率为50%
2.LVM磁盘扩容
1.1 LVM简述
LVM(Logical Volume Manager)是一种将多个独立的硬盘分区组合成一个大容量、高性能、高可靠性的磁盘阵列的技术。LVM可以实现磁盘空间的动态管理,当一个逻辑卷(LV)的空间不足时,可以从卷组(VG)中划分出更多的空间,或者将新的物理卷(PV)加入到卷组中,从而扩大逻辑卷的容量
1.2 LVM实现
在虚拟机添加新磁盘
#不关机识别新磁盘
[14:07:00root@localhost ~]# ll /sys/class/scsi_host/ |wc -l
34
[14:08:37root@localhost ~]# for i in {0..32};do echo '- - -' > /sys/class/scsi_host/host$i/scan;done
###查看磁盘状况
[14:09:12root@localhost ~]# fdisk -l
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1deb2465
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 211814399 209715200 100G 83 Linux
/dev/sda3 211814400 216008703 4194304 2G 82 Linux swap / Solaris
/dev/sda4 216008704 419430399 203421696 97G 5 Extended
/dev/sda5 216010752 419430399 203419648 97G 83 Linux
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
##对磁盘分区创建LVM
[14:09:16root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x1876f911.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +2G
Created a new partition 1 of type 'Linux' and of size 2 GiB.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2):
First sector (4196352-41943039, default 4196352):
Last sector, +sectors or +size{K,M,G,T,P} (4196352-41943039, default 41943039): +5G
Created a new partition 2 of type 'Linux' and of size 5 GiB.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1876f911
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4196351 4194304 2G 83 Linux
/dev/sdb2 4196352 14682111 10485760 5G 83 Linux
###转换磁盘类型
Command (m for help): t
Partition number (1,2, default 2): 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'.
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1876f911
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4196351 4194304 2G 8e Linux LVM
/dev/sdb2 4196352 14682111 10485760 5G 8e Linux LVM
##保存退出
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks
######
#创建物理卷
[14:12:21root@localhost ~]# pvcreate /dev/sdb1
-bash: pvcreate: command not found #需要安装软件
dnf -y install lvm2
[14:15:04root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[14:15:06root@localhost ~]# pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
###ok创建完成
#创建卷组
[14:15:44root@localhost ~]# vgs #查看现有卷组
[14:16:49root@localhost ~]#
vgcreate n /dev/sd{b1,c}
[14:18:34root@localhost ~]# vgcreate luomu /dev/sdb{1,2} #创建卷组并加入
Volume group "luomu" successfully created
[14:18:44root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
luomu 2 0 0 wz--n- 6.99g 6.99g
#创建逻辑卷
[14:18:50root@localhost ~]# lvcreate -n wudi -L 6G luomu
Logical volume "wudi" created.
[14:21:38root@localhost ~]# lsblk #查看信息
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 100G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 97G 0 part /data
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 2G 0 part
│ └─luomu-wudi 253:0 0 6G 0 lvm
└─sdb2 8:18 0 5G 0 part
└─luomu-wudi 253:0 0 6G 0 lvm
sr0 11:0 1 10G 0 rom
[14:22:01root@localhost ~]# vgs #查看卷组剩余空间
VG #PV #LV #SN Attr VSize VFree
luomu 2 1 0 wz--n- 6.99g 1016.00m
[14:25:19root@localhost ~]# mkfs -t ext4 /dev/luomu/wudi #创建文件系统,不支持xfs
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 1572864 4k blocks and 393216 inodes
Filesystem UUID: 1e64e448-6587-4853-acdf-407ef57d3477
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
[14:26:26root@localhost ~]# mount /dev/luomu/wudi /mnt #挂载逻辑卷
#将当前卷组中的所有空闲空间全都分配到逻辑卷中:
lvcreate -l +100%FREE 卷组名字 -n 逻辑卷名字
##扩容需要先创建LVM磁盘然后加入到卷组进行逻辑卷扩容,这里我比较懒就不演示了
##缩容不推荐
3.总结程序包管理器
3.1Rocky,Centos,RedHat
3.1.1 RPM
参数:
-a 查询所有套件。
-c 只列出组态配置文件,本参数需配合"-l"参数使用
-d 只列出文本文件,本参数需配合"-l"参数使用
-i 显示套件的相关信息
-l 显示套件的文件列表
-q 使用询问模式,当遇到任何问题时,rpm指令会先询问用户
-R 显示套件的关联性信息
-s 显示文件状态,本参数需配合"-l"参数使用
-v 显示指令执行过程
-h 显示安装进度
-qa 查看系统中已安装的所有RPM软件包列表
-qi 查看指定软件的详细信息(information)
-ql 列出该软件所有的文件与目录所在的完整文件名(list)
-qc 列出该软件所有的配置文件(找出在/etc下的文件)
-qd 列出该软件所有的说明文件(找出与man相关的文件)
-qR 列出与该软件有关的依赖软件所含的文件(Required)
优点:
由于已经编译完成井且打包完华,所以软件传输与安装上很方便(不需要再重新编译)。
RPM 在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装。
RPM 本身提供软件版本信息、依赖属性检查、软件用途说明、软件所含文件等信息;便于了解软件
RPM 管理使用数据库记录RPM文件的相关参数,便于查询、删除、升级与反安装。
缺点:
由于 RPM 文件是已经打包好的数据,也就是说,里面的数据已经都编译完成了,所以,该软件安装文件几乎只能安装在原本默认的硬件与操作系统版本中。
所以你的主机系统环境必须要与当初建立这个软件安装文件的主机环境相同才行。
不解决依赖关系
3.1.2YUM
YUM简述:
yum(Yellow dog Updater, Modified)是一种用于Linux系统的软件包管理工具,它基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装
[14:27:31root@localhost ~]# which yum
/usr/bin/yum
[14:44:44root@localhost ~]# ll /usr/bin/yum #yum和dnf的关系
lrwxrwxrwx. 1 root root 5 Nov 9 2021 /usr/bin/yum -> dnf-3
选项:
yum clean all #清除换存
yum info #查看软件信息
yum clean all #清理缓存
yum list #也支持模糊搜索
yum repolist #列出yum仓库
yum makecache #构建缓存
yum search #搜索
yum provids #查询文件来自于那个包,没有安装的也可以查
yum grouplist #查看包组
##YUM的配置需要基于YUM源
进入/etc/yum.repos.d/目录,查看或编辑以.repo为扩展名的文件
#实现本地YUM源
#需要先挂载本地的光盘
[14:56:39root@localhost ~]# mount /dev/sr0 /mnt
mount: /mnt: /dev/sr0 already mounted on /mnt.
[14:56:57root@localhost ~]# cd /mnt/
[14:57:09root@localhost mnt]# ls
AppStream BaseOS EFI images isolinux LICENSE media.repo TRANS.TBL
vim /etc/fstab
/dev/sr0: BLOCK_SIZE="2048" UUID="2021-11-14-09-31-13-00" LABEL="Rocky-8-5-x86_64-dvd" TYPE="iso9660" PTUUID="06729585" PTTYPE="dos"
UUID=2021-11-14-09-31-13-00 /mnt iso9660 defaults 0 0
##添加永久挂载
#编写YUM配置
/etc/yum.repo.d/*.repo
[BaseOS]
name=BaseOS
baseurl=file:///mnt/BaseOS
enabled=1 #1 将该仓库作为软件包源;0 不将该仓库作为更新和安装时的软件包源
gpgcheck=0 #禁用所有仓库中的软件包的GPG签名检查,包括本地软件包安装
[AppStream]
name=AppStream
baseurl=file:///mnt/AppStream
enabled=0
gpgcheck=0
###执行yum clean all 和 yum makecache
3.2 Ubuntu
3.2.1 DPKG
简介:
DPKG(Debian Package Manager)是一种用于Linux系统的软件包管理工具,它可以用来安装、构建、卸载、管理deb格式的软件包。DPKG是Debian及其衍生发行版(如Ubuntu,Knoppix等)的主要包管理工具
选项
-i #安装
-r #不删除配置文件
-p #删除所有
-l #查询安装所有的包,也可以单独查询一个包
-s #详细信息
-L #涵盖的文件列表
-S #查看这个文件来自于那个包
###类似与RPM
3.2.2 APT
简介:
APT(Advanced Packaging Tool)是一种用于Linux系统的软件包管理工具,它基于DPKG包管理,能够从指定的服务器自动下载deb格式的软件包并且安装,可以自动处理软件包之间的依赖关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。APT是Debian及其衍生发行版(如Ubuntu,Knoppix等)的主要包管理工具
apt update #配置缓存
apt remove #移除软件包 autoremove删除彻底
apt purade #移除安装包的配置文件
apt upgrade #升级所有可升级的软件包
apt full-upgrade #升级软件包的时候自动处理依赖关系
apt search #搜索
apt show #显示安装细节
apt cahe madison #列出服务器上的所有版本;软件后面=[指定版本]
apt list #列出包含条件的包(已安装,可升级等)
#####
#配置apt仓库
/etc/apt/sources.list
#把国内的链接复制进去
4.搭建私有YUM仓库
#准备两台服务器
10.0.0.38;10.0.0.8
##在10.0.0.38配置网络yum源,这里我使用的是阿里云的源
[BaseOS]
name=BaseOS
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/x86_64/os/
gpgcheck=0
[AppStream]
name=AppStream
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/x86_64/os/
gpgcheck=0
#在10.0.0.38上面安装httpd
yum -y install httpd
systemctl enable --now httpd #启动
systemctl disable --now firewalld #关闭防火墙
setenforce 0 #临时关闭selinux
永久关闭:修改/etc/selinux/config文件中的SELINUX=enforcing为disabled
#配置httpd的配置目录
mkdir -p /var/www/html/rockylinux/8/ #创建目录
#拉取网络yum源到本地
yum reposync --repoid=BaseOS --download-metadata -p /var/www/html/rockylinux/8/
yum reposync --repoid=AppStream --download-metadata -p /var/www/html/rockylinux/8/
[16:24:46root@localhost 8]# ls
AppStream BaseOS
#配置10.0.0.8 yum源测试
[BaseOS]
name=BaseOS
baseurl=http://10.0.0.38/rockylinux/8/BaseOS
gpgcheck=0
[AppStream]
name=AppStream
baseurl=http://10.0.0.38/rockylinux/8/AppStream
gpgcheck=0
###测试
[16:37:44root@localhost yum.repos.d]# yum -y install lrzsz
Installed:
lrzsz-0.12.20-43.el8.x86_64
Complete!
#安装成功
5.初始化系统
这里我写了一个脚本
####修改网卡名字和关闭防火墙selinux,和配置独立ip,yum源,和vim配置,支持Rocky和Ubuntu
OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
#系统的版本
OS_NAME=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+) (.*)"$@\1@p' /etc/os-release`
#系统的版本
OS_RELEASE=`sed -rn '/^VERSION_ID=/s@.*="?([0-9.]+)"?@\1@p' /etc/os-release`
#系统的具体版本号
OS_RELEASE_VERSION=`sed -rn '/^VERSION_ID=/s@.*="?([0-9]+)\.?.*"?@\1@p' /etc/os-release`
#系统版本号
selinux () {
case $OS_ID in
Rocky)
systemctl disable --now firewalld &>/dev/null
sed -inr 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
;;
Ubuntu)
ufw disable &>/dev/null
timedatectl set-timezone Asia/Shanghai
echo "Ubuntu 时区到上海"
;;
*)
echo "不支持"
;;
esac
}
network_name () {
PASSWORD="123456"
P_COLOR=32
C_COLOR=36
R_PS1=$(echo "PS1='\[\e[1;${P_COLOR}m\][\t\u@\h \W]\\$ \[\e[0m\]'" >> ~/.bashrc)
U_PS1=$(echo "PS1='\[\e[1;${C_COLOR}m\][\t\u@\h \W]\\$ \[\e[0m\]'" >> ~/.bashrc)
if [[ $OS_ID == "Rocky" ]];then
yum -y install autofs && systemctl start autofs && ls /misc/cd
systemctl start autofs &>/dev/null && ls /misc/cd || yum -y install autofs;systemctl enable --now autofs;ls /misc/cd
sed -ri.bsk '/^GRUB_CMDLINE_LINUX=/s#(.*quiet)#\1 net.ifnames=0#' /etc/default/grub
mv /etc/sysconfig/network-scripts/ifcfg-* /etc/sysconfig/network-scripts/ifcfg-eth0
grub2-mkconfig -o /etc/grup2.cfg &>/dev/null
${R_PS1}
else
echo ${PASSWORD} |sed -ri.bask 's/(^GRUB_CMDLINE_LINUX=")("$)/\1net.ifnames=0\2/' /etc/default/grub
${U_PS1}
grub-mkconfig -o /boot/grub/grub.cfg &>/dev/null
mv /etc/netplan/00-installer-config.yaml /etc/netplan/eth0.yaml
echo ${PASSWORD} |sudo -S sed -ri 's@#(PermitRootLogin )prohibit-password@\1yes@' /etc/ssh/sshd_config
sudo systemctl restart sshd
sudo -S passwd root <<-EOF
${PASSWORD}
${PASSWORD}
EOF
fi
}
check_ip(){
local IP=$1
VALID_CHECK=$(echo ${IP}|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo ${IP}|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
if [ ${VALID_CHECK} == "yes" ]; then
echo "IP ${IP} available!"
return 0
else
echo "IP ${IP} not available!"
return 1
fi
else
echo "IP format error!"
return 1
fi
}
ip () {
ETHNAME="eth0"
if [ ${OS_ID} == "Rocky" ];then
while true; do
read -p "请输入IP地址: " IP
check_ip ${IP}
[ $? -eq 0 ] && break
done
read -p "请输入子网掩码位数: " C_PREFIX
while true; do
read -p "请输入网关地址: " GATEWAY
check_ip ${GATEWAY}
[ $? -eq 0 ] && break
done
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<-EOF
NAME=${ETHNAME}
DEVICE=${ETHNAME}
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=${IP}
PREFIX=${C_PREFIX}
GATEWAY=${GATEWAY}
DNS1=223.5.5.5
DNS2=180.76.76.76
EOF
nmcli connection reload && nmcli connection up ens160
echo "配置PS1 配置了独立IP 阿里云yum源 修改网卡名结束,倒计时十秒关机"
elif [ ${OS_RELEASE_VERSION} == "22" -a ${OS_ID} == Ubuntu ];then
while true; do
read -p "请输入IP地址: " IP
check_ip ${IP}
[ $? -eq 0 ] && break
done
read -p "请输入子网掩码位数: " C_PREFIX
while true; do
read -p "请输入网关地址: " GATEWAY
check_ip ${GATEWAY}
[ $? -eq 0 ] && break
done
cat > /etc/netplan/*.yaml <<-EOF
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
addresses: [${IP}/${C_PREFIX}]
routes:
- to: default
via: ${GATEWAY}
nameservers:
addresses: [223.5.5.5, 180.76.76.76]
EOF
netplan apply
echo "配置PS1 配置了独立IP 修改网卡名结束,倒计时十秒关机"
elif [ ${OS_RELEASE_VERSION} == "20" -a ${OS_ID} == Ubuntu ];then
while true; do
read -p "请输入IP地址: " IP
check_ip ${IP}
[ $? -eq 0 ] && break
done
read -p "请输入子网掩码位数: " C_PREFIX
while true; do
read -p "请输入网关地址: " GATEWAY
check_ip ${GATEWAY}
[ $? -eq 0 ] && break
done
cat > /etc/netplan/*.yaml <<-EOF
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
dhcp6: no
addresses: [${IP}/${C_PREFIX}]
gateway4: ${GATEWAY}
nameservers:
addresses: [223.5.5.5, 180.76.76.76]
EOF
netplan apply
echo "配置PS1 配置了独立IP 修改网卡名结束,倒计时十秒关机"
fi
}
vim_disposition () {
cat > ~/.vimrc <<EFO
set ts=4
set expandtab
set ignorecase
set shiftwidth=4
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#**********************************************************************************************")
call setline(4,"#Author: luomu")
call setline(5,"#QQ: 2754835633")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#MIRROR: www.xswhsy.cn")
call setline(9,"#Description: The test script")
call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
call setline(11,"#*********************************************************************************************")
call setline(12,"")
endif
endfunc
autocmd BufNewFile * normal G
EFO
}
yum_yuan () {
if [ $OS_ID == Rocky ];then
if [ $OS_RELEASE_VERSION == "8" ];then
yum_8
fi
else
echo "暂时没有配置"
fi
}
yum_8 () {
local YUM="/etc/yum.repos.d/"
[ -d ${YUM}back ] || mkdir ${YUM}back
mv ${YUM}*.repo ${YUM}back
cat > ${YUM}base.rock8.repo <<EFO
[BaseOS]
name=BaseOS
baseurl=file:///misc/cd/BaseOS
https://mirrors.aliyun.com/rockylinux/\$releasever/BaseOS/x86_64/os/
http://mirrors.163.com/rocky/\$releasever/BaseOS/x86_64/os/
https://mirrors.nju.edu.cn/rocky/\$releasever/BaseOS/x86_64/os/
https://mirrors.sjtug.sjtu.edu.cn/rocky/\$releasever/BaseOS/x86_64/os/
http://mirrors.sdu.edu.cn/rocky/\$releasever/BaseOS/x86_64/os/
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///misc/cd/AppStream
https://mirrors.aliyun.com/rockylinux/\$releasever/AppStream/x86_64/os/
http://mirrors.163.com/rocky/\$releasever/AppStream/x86_64/os/
https://mirrors.nju.edu.cn/rocky/\$releasever/AppStream/x86_64/os/
https://mirrors.sjtug.sjtu.edu.cn/rocky/\$releasever/AppStream/x86_64/os/
http://mirrors.sdu.edu.cn/rocky/\$releasever/AppStream/x86_64/os/
gpgcheck=0
[extras]
name=extras
baseurl=https://mirrors.aliyun.com/rockylinux/\$releasever/extras/\$basearch/os
http://mirrors.163.com/rocky/\$releasever/extras/\$basearch/os
https://mirrors.nju.edu.cn/rocky/\$releasever/extras/\$basearch/os
https://mirrors.sjtug.sjtu.edu.cn/rocky/\$releasever/extras/\$basearch/os
http://mirrors.sdu.edu.cn/rocky/\$releasever/extras/\$basearch/os
gpgcheck=0
enabled=1
[PowerTools]
name=CentOS-\$releasever - PowerTools
baseurl=https://mirrors.aliyun.com/rockylinux/\$releasever/PowerTools/\$basearch/os/
http://mirrors.163.com/rocky/\$releasever/PowerTools/\$basearch/os/
http://mirrors.sdu.edu.cn/rocky/\$releasever/PowerTools/\$basearch/os/
https://mirrors.sjtug.sjtu.edu.cn/rocky/\$releasever/PowerTools/\$basearch/os/
http://mirrors.sdu.edu.cn/rocky/\$releasever/PowerTools/\$basearch/os/
gpgcheck=0
enabled=0
[epel]
name=EPEL
baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/\$releasever/Everything/\$basearch
https://mirrors.cloud.tencent.com/epel/\$releasever/Everything/\$basearch
https://mirrors.huaweicloud.com/epel/\$releasever/Everything/\$basearch
https://mirrors.aliyun.com/epel/\$releasever/Everything/\$basearch
gpgcheck=0
enabled=1
EFO
}
main () {
selinux
network_name
ip
vim_disposition
yum_yuan
}
main
sleep 10 && shutdown -r now
6.一键安装nginx
脚本
##支持Rocky和Ubuntu,写了service文件
#!/bin/bash
NGINX_VERSION=1.24.0
NGINX_DIR=/usr/local/src
INSTALL_DIR=/usr/local/nginx
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_BLUE="echo -en \\033[1;34m"
SETCOLOR_NORMAL="echo -en \E[0m"
${SETCOLOR_BLUE} "$1" && $MOVE_TO_COL
${SETCOLOR_NORMAL}
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
disposition () {
mkdir ${NGINX_DIR}/..nginx
case $ID in
rocky|centos)
yum -y install wget gcc openssl-devel pcre-devel zlib-devel make
;;
ubuntu)
apt -y install build-essential make gcc openssl libssl-dev zlib1g-dev libpcre3-dev wget
;;
*)
color "不支持此系统" 1
exit 1
;;
esac
}
install_nginx () {
cd ${NGINX_DIR}
wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz || { echo "下载失败!";exit 20; }
tar xvf nginx-${NGINX_VERSION}.tar.gz
cd ${NGINX_DIR}/nginx-${NGINX_VERSION}
./configure --prefix=${INSTALL_DIR} --with-http_ssl_module
make -j `grep -c processor /proc/cpuinfo`&& make install
if [ $? -ne 0 ];then
rm -rf ${INSTALL_DIR}/nginx*
rm -rf ${NGINX_DIR}/..nginx
color "安装失败" 1
exit 10
else
NGINXINSTALL_DIR=${INSTALL_DIR}
cat > /lib/systemd/system/nginx.service <<EFO
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=${INSTALL_DIR}/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running "nginx -t" from the cmdline.
# https://nginx.org/
ExecStartPre=/usr/bin/rm -f ${INSTALL_DIR}/logs/nginx.pid
ExecStartPre=${INSTALL_DIR}/sbin/nginx -t
ExecStart=${INSTALL_DIR}/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EFO
color "安装成功" 0
fi
}
start_naginx () {
systemctl daemon-reload
systemctl enable --now nginx &>/dev/null
systemctl is-active nginx &>/dev/null || color "nginx 启动失败,退出" 1;exit
}
main () {
disposition
install_nginx
start_naginx
}
main
7.互联网OSI模型
互联网OSI模型是一种描述互联网工作方式的概念模型,它将互联网的功能分为七层,每一层都有特定的任务和协议。这七层分别是
应用层:为用户提供各种网络服务,如文件传输、电子邮件、网页浏览等。常见的应用层协议有HTTP、FTP、SMTP、DNS等
表示层:负责数据的格式转换、加密和压缩,使不同系统之间的数据可以互相识别和理解。常见的表示层协议有MIME、SSL、TLS等
会话层:负责建立、管理和终止通信会话,以及数据的分割和同步。常见的会话层协议有RPC、SSH、NetBIOS等
传输层:负责在两个主机之间提供可靠或不可靠的数据传输服务,以及流量控制和拥塞控制。常见的传输层协议有TCP、UDP、SCTP等
网络层:负责为数据包选择最佳的传输路径,以及进行分组、路由和寻址。常见的网络层协议有IP、ICMP、ARP、RARP等
数据链路层:负责在相邻的网络设备之间建立和维护数据链路,以及进行帧的封装和解封装,以及差错控制和流量控制。常见的数据链路层协议有以太网、PPP、HDLC、SLIP等
物理层:负责将比特流(0和1)转换为电信号、光信号或无线信号,以及在物理媒介上进行传输。常见的物理层协议有RS-232、V.35、光纤、无线电等

8.调整动态端口范围
#查看默认端口范围
[16:55:09root@localhost ~]# sysctl -a|grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
sysctl -w net.ipv4.ip_local_port_range="20000 60000" #临时更改端口范围
#永久更改
[16:55:25root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_local_port_range=20000 60000
:wq
[16:58:57root@localhost ~]# sysctl -p #保存
net.ipv4.ip_local_port_range = 20000 60000
[16:58:58root@localhost ~]# sysctl -a|grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 20000 60000 #查看已经更改
#
9.TCP包头协议,三次握手四次挥手
9.1 TCP包头协议
TCP包头协议是指TCP报文段的格式,它包含了一些重要的字段,如源端口号、目的端口号、序号、确认号、标志位等,这些字段用于实现TCP的可靠传输和连接管理。TCP的三次握手和四次挥手是指建立和终止一个TCP连接时,需要客户端和服务器之间交换的报文段的数量和顺序。三次握手的目的是同步双方的初始序号和确认号,以及交换TCP窗口大小信息。四次挥手的目的是释放双方的资源,以及确保数据的完整传输
9.2 三次握手
三次握手:
第一次握手:客户端发送一个SYN报文段,指定一个初始序号seq=x,并告诉服务器自己想要连接的端口号
第二次握手:服务器收到SYN报文段后,回复一个SYN+ACK报文段,指定一个初始序号seq=y,并确认客户端的序号ack=x+1,同时告诉客户端自己的端口号
第三次握手:客户端收到SYN+ACK报文段后,回复一个ACK报文段,确认服务器的序号ack=y+1,同时可以携带数据
9.3 四次挥手
四次挥手:
第一次挥手:客户端发送一个FIN报文段,表示自己没有数据要发送了,请求关闭连接,同时指定一个结束序号seq=u
第二次挥手:服务器收到FIN报文段后,回复一个ACK报文段,确认客户端的序号ack=u+1,同时告诉客户端自己还有数据要发送
第三次挥手:服务器发送完数据后,发送一个FIN报文段,表示自己也没有数据要发送了,请求关闭连接,同时指定一个结束序号seq=v
第四次挥手:客户端收到FIN报文段后,回复一个ACK报文段,确认服务器的序号ack=v+1,同时进入等待状态,等待一段时间后,如果没有收到服务器的重传请求,就关闭连接
10.总结IP地址分类
10.1 ip地址划分
IP地址是用来标识互联网上的每一个网络和主机的数字地址,它由32位二进制数组成,通常用点分十进制表示。IP地址根据网络号和主机号的长度和分配方式,分为A、B、C、D、E五类,其中A、B、C三类是常用的地址,D类是多点广播地址,E类是保留地址。下面是对每一类地址的简要总结
A类地址:第一个字节为网络号,后三个字节为主机号,最高位为0,范围是1.0.0.0到126.255.255.255,共有126个网络,每个网络可以容纳16777214个主机,适用于大型网络。
B类地址:前两个字节为网络号,后两个字节为主机号,最高位为10,范围是128.0.0.0到191.255.255.255,共有16382个网络,每个网络可以容纳65534个主机,适用于中等规模的网络。
C类地址:前三个字节为网络号,最后一个字节为主机号,最高位为110,范围是192.0.0.0到223.255.255.255,共有2097150个网络,每个网络可以容纳254个主机,适用于小型网络。
D类地址:前四个字节为组播地址,最高位为1110,范围是224.0.0.0到239.255.255.255,用于一次寻址一组计算机,实现多点广播。
E类地址:前四个字节为保留地址,最高位为1111,范围是240.0.0.0到255.255.255.255,用于将来使用
10.2 CIDR(无类别域间路由)
CIDR(无类别域间路由)是一种IP地址分配和路由选择的方法,它可以更有效地管理IP地址。CIDR采用更灵活的地址分配方法,通过在IP地址中使用可变长度的前缀,实现更细粒度的地址划分。CIDR的优势是可以减少IP地址的浪费,提高地址的利用率,以及减少路由表的大小,提高路由的效率。
CIDR的IP地址划分方法是将IP地址分为两部分,一部分是网络前缀,表示网络的范围,另一部分是主机标识,表示网络中的具体主机。网络前缀的长度可以根据网络的规模和需求灵活指定,而不受传统的A、B、C类的限制。网络前缀的长度用一个斜杠后面的数字表示,例如192.168.1.0/24,表示网络前缀为24位,即前三个字节为网络号,最后一个字节为主机号。这样,一个IP地址就可以用一个网络前缀和一个主机标识来表示,例如192.168.1.1/24,表示该主机属于192.168.1.0/24这个网络。
CIDR的IP地址划分方法还可以实现对网络的层次划分,即在一个大的网络中,可以根据需要划分出多个子网,每个子网可以有自己的网络前缀和主机标识。例如,一个192.168.0.0/16的网络,可以划分为256个子网,每个子网的网络前缀为192.168.x.0/24,其中x为0到255的任意值,表示子网号。每个子网可以容纳254个主机,每个主机的主机标识为192.168.x.y/24,其中y为1到254的任意值,表示主机号
10.2.1 如何将10.0.0.0/8划分32个子网,求每个子网的掩码,主机数
首先,您需要确定子网掩码的长度。由于10.0.0.0/8是一个A类地址,它的默认子网掩码是255.0.0.0,也就是前8位是网络号,后24位是主机号。为了划分出32个子网,您需要从主机号中借用5位作为子网号,这样每个子网就有2^5=32个可能的值。因此,子网掩码的长度是8+5=13位,也就是255.248.0.0
其次,您需要确定每个子网的地址范围。由于每个子网有5位子网号,您可以用二进制数表示它们,从00000到11111,共32个。然后,您可以将子网号填入子网掩码中的借用位,得到每个子网的第一个地址,也就是网络地址。例如,第一个子网的子网号是00000,那么它的网络地址是10.0.0.0;第二个子网的子网号是00001,那么它的网络地址是10.8.0.0;以此类推,直到第32个子网的子网号是11111,它的网络地址是10.248.0.0。
最后,您需要确定每个子网的主机数和可用地址。由于每个子网有24-5=19位主机号,您可以用二进制数表示它们,从0000000000000000000到1111111111111111111,共219=524288个。然而,您不能使用全0和全1的主机号,因为它们分别表示网络地址和广播地址,用于特殊用途。因此,每个子网的可用地址是219-2=524286个,从网络地址加1到广播地址减1。例如,第一个子网的可用地址范围是10.0.0.1到10.7.255.254;第二个子网的可用地址范围是10.8.0.1到10.15.255.254;以此类推,直到第32个子网的可用地址范围是10.248.0.1到10.255.255.254