一、系统使用介绍
一、操作系统
1.当前的主流linux
#1.红帽系列
RHEL
Centos
Oracle linux
Rocky
#2.debian系列
debian
ubuntu
#3.国产系列
中标麒麟
欧拉
龙蜥
#4.其它
suse
2.centos的替代品
1.RHEL
https://developers.redhat/
#yum安装需要注册才行
2.Alma linux发行版
https://mirrors.almalinux/
#重点推荐,与RHEL1:1二进制兼容,社区开源免费,有资金和其它赞助商支持.所以稳定性和后续的支持会比较友好,有技术保证和安全保证。发行速度快,基本上与redhat同步发布
3.rocky linux
https://rockylinux/zh-CN
#永久免费,社区兼容,也是与RHEL1:1兼容的。发布稍微慢一些,资金支持也差一些。但是用起来差不多。
3.麒麟系统的特点
1.第一次开机需要手动接受许可证
2.9090端口有个自带的监控。有系统,日志,存储,网络,账户,等等信息
4.ubuntu的特点
1.ubuntu默认不能root登陆,只能用别的用户名登陆
2.每次启动完之后,登录页面会加载一些其他的东西
二、系统操作
1.快捷键
光标移动到行首 ctrl a
光标移动到行尾 ctrl e
把光标所在位置到行首的内容剪切(删除) ctrl u
把光标所在位置到行尾的内容剪切(删除) ctrl k
关机 shutdown -h now halt poweroff init 0
重启 shutdown -r now reboot init 6
退出当前用户 ctrl d
锁屏 ctrl + s
解锁 ctrl + q
让当前命令挂起 ctrl + z
2.服务器安装的标准步骤
开机.
配置远程控制卡.
配置raid(raid卡实现) 系统raid 1 剩余raid 5 .
安装系统(U盘安装) 如果大量服务器装机,可以通过cobbler批量装机.
正常安装系统即可.
根据要求部署服务.
关闭.
物理服务器上架.(物理服务器放在机柜上过程)
3.shell是什么
shell的本意是“壳”的意思,其实已经很形象地说明了shell在Linux系统中的作用。shell就是围绕在Linux内核之外的一个“壳”程序,用户在操作系统上完成的所有任务都是通过shell与Linux系统内核的交互来实现的。
shell--OS--内核
4.查看内核信息
uname
uname -a
uname -r
5.安装系统时修改网卡信息
net.ifnames=0 biosdevname=0 #填写在安装系统之前
centos7开始网卡名字变了,ens33 xxxx
网卡名字统一,如果不统一未来服务软件,命令则可能无法使用
一般统一为eth0 eth1形式
vim /boot/grub2/grub.cfg 文件里有两个linux16
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8
改为
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap net.ifnames=0 biosdevname=0 rhgb quiet LANG=zh_CN.UTF-8
如果安装系统之前修改,那么改完就可以了,如果安装系统之后才改,那么也要修改网卡配置文件
二、文件管理
一、目录结构与配置文件
1.linux目录结构
bin 普通用户使用的命令 /bin/ls, /bin/date
sbin 管理员使用的命令 /sbin/service
dev 设备文件 /dev/sda,/dev/sda1
root root用户的家目录
home 普通用户家目录
tmp 临时文件(全局可写:进程产生的临时文件)
var 存放的是一些变化文件,比如数据库,日志,邮件....
media 移动设备默认的挂载点
mnt 手工挂载设备的挂载点
etc 配置文件(系统相关如网络/etc/sysconfig/network
proc 虚拟的文件系统,反映出来的是内核,进程信息或实时状态 ,硬件的状态
usr 系统文件,相当于C:\Windows
usr/local 软件安装的目录,相当于C:\Program
boot 存放的系统启动相关的文件,例如kernel,grub(引导装载程序)
lib 库文件Glibc
lib64 库文件Glibc
2.proc目录介绍
#proc这个目录存放的是系统的各种内存中的进程信息,linux内核配置,系统信息
/proc/cpuinfo # cpu信息 cpu壳数,核心数
/proc/meminfo # 内存信息
/proc/loadavg # 负载信息
/proc/mounts # 挂载信息
/proc/cmdline # 内核
# 这是个虚拟目录,不会占用磁盘空间
# 当运行程序时,自动在proc目录下生成此pid的文件夹,并在此pid结束时消失
3.查看cpu信息
一般用lscpu查看
socket:cpu颗数
二、文件管理基本命令
1.文件,文件夹的基本使用
1.创建文件夹
mkdir
#-p 创建目录,当没有上一级时,自动创建
#-v 显示创建目录的过程
2.复制
cp -r #复制目录及其内容
cp -d #可以复制软连接
cp -p #复制的时候保持属性不变
cp -a #复制所有,相当于drp
3.删除
rm
r --强制递归
f --无需询问
4.查看文件/文件夹
ls -l
ls -t 按照修改时间排序.
ls -r 逆序排序,一般-rt 一起用.
ls -h 以人类可读形式显示大小
5.显示文件内容及行号
cat -n
6.进入目录的命令
cd - #返回上次所在目录
cd ..#进入上层目录
cd ~ #进入家目录
cd . #当前目录,一般与复制移动一起用
7.移动的命令
#/xiaoyu 与 /xiaoyu/ 目前大部分情况下是没有区别的。
mv file ...... dir
8.统计文件夹的大小
du -sh /etc
du -h /etc
-s 不要显示目录中所有的子目录了,只显示汇总信息,不显示所有查看指定目录所占的空间.(block)
2.vim编辑器
1.操作快捷键
#页首
gg
#页尾
G
#行首
^ 0
#行尾
$
#复制
yy
#粘贴
p
#删除
dd
#撤销
u
#从下往上搜索
?
#向上翻页
page up
# 回到最顶端
home
# 跳转到第10行
10gg,10G,:10
#上下左右
h上
j右
k左
l下
2.文件操作
#另存为
w 1.txt
# 行号
set nu
set nonu
3.vim的模式
1.刚进入是命令模式,比如dd gg G
2.编辑模式
3.底行模式,输入:,用于替换,搜索,保存退出
4.可视化模块:批量编辑
4.批量操作行
shift + v
案例01 批量删除文件开头的#
按ctrl + v,进入批量操作模式
选择要操作的区域
然后按d,删除.
案例02 批量给文件开头增加内容 #xiaoyu
按ctrl + v,进入批量操作模式
选择要操作的区域
选完后,按shift + i (I),进入编辑模式
写入内容
按esc等待.
5.搜索
/
6.替换
1,5 s///
% s///
7.vim与vi的区别
最大的区别是vi没有颜色
还一个就是vi只能批量删除,不能批量添加
8.vim中每个插入的区别
i当前位置前插入
I行首插入
a当前位置后追加
A行尾追加
o在当前行之下新开一行
O在当前行之上新开一行
9.vim生成了swp文件怎么办
#1.删除临时文件
#2.恢复未保存数据
vim -r xiaoyu.txt
rm -f .xiaoyu.txt.swp
#重新打开文件即修复了.
#一般用不到,正常都是写好之后发送过去文件,因为这种恢复不一定能完全恢复
三、文件类型
1.常见文件类型
-普通文件
d目录文件
b存储设备文件
c终端设备文件
l链接文件
s套接字文件socket文件
p管道文件
2.查看文件的属性信息
stat /etc/passwd
3.查看文件的类型
file
file /etc/hostname /var/log/wtmp /bin/ls
有普通文件,数据文件,二进制文件
4.etc下常用的文件
hostname 存放主机名
hosts 主机名与ip的对应关系
sysconfig/network-scripts/ifcfg-ens33 网卡配置文件
/etc/rc.local 开机自启动的文件
/etc/fstab 开机自动挂载
/etc/motd 文件内容会在用户登陆的系统后显示
/etc/issue 用户登陆系统前显示
5.ls -l详解
-rw-r--r--. 1 root root 16 6月 15 16:49 adjtime
第1位: 文件类型
第2-10位: 基本权限
第11位: selinux相关
第12位:
第12,13位:用户用户组
第14位: 文件的大小
第一列:文件类型,基本权限,selinux相关
第二列:硬链接数,即多少个文件指向同一个索引节点
第三列:用户
第四列:用户组
第五列:文件大小
第六七八列:月、日、时、分格式。如果更久,会显示年、月、日
最后一列:文件名
#第五列如果是文件夹,通常只显示文件系统默认block的大小。因为这是因为目录本质上是一个文件,存储了该目录中文件和子目录的列表的inode号。大小可以随着目录中内容的增多而增加,但这与实际文件内容大小无关。
6.ls -il详解
#在上一个基础上,第一列添加了inode号
7.selinux
#应用访问控制系统
在linux操作系统中,SELinux提供了一个安全精细化的策略规则,这个类似于网络中的ACL规则,用于对文件进行访问控制。
四、查看文件
1.head
head -n5
head -n 5
head -5
2.tail
tail -n5
tail -5
tail -f
3.less
q 退出
空格或f 下一页
b 上一页
G 最后一行
g 第一行
99g 第99行
/内容 搜索, n向下搜索,N向上搜索
# 选项
less -N 显示行号
4.more
功能不如less多
5.为什么要用这些命令
如果使用cat查看,会刷屏根本停不下来.
如果使用vi/vim查看,从磁盘中加载到内存,占用系统内存,很容易导致系统内存不足.
五、特殊符号
1.管道符号
1.进程管道的意义是什么
指令1的标准输出,作为指令2的标准输入
2.tee管道是什么意思
# 三通管道,即交给另一个程序处理。又保存一份副本
cat /etc/passwd |tee 88.txt | tail -1
# 如果tee 后不带文件,则将结果输入到终端
tee 默认是清空, -a 是追加
3.参数传递 Xargs的作用
# cp rm一些特殊命令就是不服其他程序。
touch /home/file{1..5}
cat >files.txt << EOF
/home/file1
/home/file3
/home/file5
EOF
cat files.txt |rm -rvf
#失败
cat files.txt |xargs rm -rvf
#成功链接rm命令
# xargs其作用是将查找内容一列变为1行
4.|&的使用场景
# 有的输出会被管道符认为是错误输出,所以传递不过去,需要加&
比如curl
2.重定向
1.正确输出
1>等价于 >
1>> 等价于>>
2.错误输出
2>
2>>
3.正确与错误一起输出
ls /home/ /aaaaaaaaa &>list.txt
ls /home/ /aaaa 1>yes.txt 2>no.txt
ls /home/ /aaaa >file 2>&1
4.输入重定向
< 等价 0<
# 输入重定向发送邮件
mail -s "test01" alice < word.txt
# 原理:利用输入重定向,把文件内容代替人为的输入。
六、链接文件
1.如何创建软链接,软连接的特点是什么样的
touch 111.txt
ln -s 111.txt 1.ttt
# 总结
软连接像快捷方式,可以对文件和目录做软连接。
软连接记录的只是源文件的路径。
软连接失去源文件不可用。
2.硬链接的特点
1 创建同分区硬链接成功,创建不同分区硬链接失败。
2 硬链接删除源文件,依然可以用
3 不允许将硬链接指向目录
4 inode号相同
3.软连接实际作用
未来可以设计基于软连接的升级与回滚流程
- 升级:删除旧的软连接,创建软连接指向新的版本即可.
- 回滚:删除旧的软连接,创建软连接指向旧的可用的版本即可.
4.如果源文件被删除或改名或移动走,软连接会如何?
红色闪烁
七、打包及压缩
1.tar的参数与常用命令
-z gzip
-j bzip
-J xzip
-f 文件,指定压缩包,f选项放在这几个选项的最后
-v 显示过程
-c 创建压缩文件
-x 解压缩
-C 重定向到
-t 查看
tar -czvf data-20240208.tar.gz /data/
tar -tf data-20240208.tar.gz /data/
2.gzip
# 一般配合其它命令使用
touch xiaoyu001.txt
gzip xiaoyu001.txt
ll xiaoyu001.txt.gz
# 解压
gzip -d xiaoyu001.txt.gz
#只能对文件进行压缩,不能压缩目录
3.zip、unzip
zip -r etc.zip /etc/
-r用于压缩目录
upzip etc.zip
4.tar命令的安全保护机制是怎么样的,怎么解决
tar: Removing leading `/' from member names
因为我们打包的目标目录或者文件是绝对路径,为防止压缩包中保留绝对路径,解压的时候可能发生覆盖,导致数据,配置丢失。
# 避免提示:使用相对路径打包
tar zcf /tmp/etc.tar.gz etc/
三、用户管理
一、用户管理
1.passwd目录结构
用户名,密码占位符,uid,gid,描述,家目录,登录shell
2.创建用户useradd的参数有哪些
#指定uid
-u
#指定默认组
-g
#指定附加组
-G
#指定家目录
-d
#登录shell
-s
#指定到期时间
-e 2010-03-01
#不创建家目录
-M
3.删除用户
#连同家目录一起删除
userdel -r
4.修改用户选项
usermod -s /sbin/nologin user02
5.shadow文件
1.用户名
2.加密之后的密码
3.过期时间等等信息
#用户影子文件,由于/etc/passwd文件是所有用户都可读的,这样就导致了用户的密码容易出现泄露,因此,linux将用户的密码信息从/etc/passwd中分离出来,单独的放到了一个文件中,这个文件就是/etc/shadow,该文件只有root用户拥有读权限。
6./etc/login.defs文件
用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。
7./etc/default/useradd
定义了新建用户的一些默认属性,比如用户的主目录、使用的shell等等,通过更改此文件,可以改变创建新用户的默认属性值。
8./etc/skel文件
目录定义了新建用户在主目录下默认的配置文件,更改/etc/skel目录下的内容就可以改变新建用户默认主目录的配置文件信息。
二、用户组管理
1.组成员管理
# 将用户追加到组
usermod -aG 组名 用户名
# 将用户覆盖到组
usermod -G 组名 用户名
# 将用户移除组
gpasswd -d 用户名 组名
2.用户组
# 创建组指定gid
groupadd hr -g 1007
# 删除组
groupdel hr
3.group组文件
1.用户组的名字
2.密码
3.gid
4.默认是空,这个组有什么额外的用户
三、su与sudo
1.sudo
1.如何配置
visudo == vim /etc/sudoers
#visudo的好处是这个工具会替你检查你写的语法,填写错误给提示
2.sudoers格式
#who where whom command
xiaoyu ALL=(ALL) /bin/cat, /bin/head, /bin/tail, /bin/less,/bin/more, /bin/grep
#xiaoyu 用户
#ALL 表示从任何的主机上都可以执行,也可以这样 192.168.100.0/24
#(ALL) 是以谁的身份来执行,ALL就代表root可以任何人的身份来执行命令
#ALL 表示任何命令。
3.查看权限
grep xiaoyu /etc/sudoers
sudo -l
4.授权所有命令不需要输入密码
xiaoyu001996 ALL=(ALL) NOPASSWD:ALL
grep xiaoyu001996 /etc/sudoers
5.sudo参数
sudo -u sshd touch /tmp/mysshd #-u指定用户
6.sudo组
%wheel ALL=(ALL) ALL
#意思是wheel组
7.取反的写法
www ALL=(root) NOPASSWD:ALL,!/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root,!/bin/su
#允许www用户执行所有命令,除了passwd后加任意字符、passwd root和su这三类操作。
8.ubuntu是怎么提权的
visudo
通过将用户加入到带sudo权限的用户组实现sudo功能的
然后给用户组授权
2.su
1.su与su -
su命令中的-是su命令的选项,-,-l,--login
意思是更新用户的配置与环境变量
四、故障案例
1.命令行:-bash-4.2$
原因:用户家目录没有,用户家目录下面的配置文件没了 ~/.bashrc ~/.bash_profile
解决:通过/etc/skel/.bash* 复制并解决 这是所有新用户的家目录的模板
四、用户权限
一、基本权限
1.增加执行权限
chmod u+x file1
chmod 755 file1
chmod u+rw,g+r,o+r xiaoyu.txt
2.更改属主属组(冒号还是点)
#1.改变属主属组
chown alice.hr file1
#2.只改属主
chown alice file1
#3.只改属组
chown .hr file1
chgrp it file1
#4.针对目录中的所有文件
-R
二、ACL权限
1.用处
设置不同用户,不同的基本权限(r、w、x)。对象数量不同。
2.设置基本权限
命令 设置 用户或组:用户名:权限 文件对象
setfacl -m u:alice:rw /home/test.txt
3.查看基本权限
getfacl /home/test.txt
4.删除基本权限
#删除组hr的acl权限
setfacl -x g:hr /home/test.txt
#删除所有acl权限
setfacl -b /home/test.txt
三、特殊权限
1.suid
# suid谁在执行这个程序时,将临时获得root权限对应数字4
比如passwd
chmod u+s /usr/bin/cat
2.sgid
#命令的g位置上有一个s或者S,对应的权限数字是2,运行这个命令时相当于这个命令的用户组的权限。
/bin/ssh-agent
3.sticky
对于包含sticky权限的目录,每个用户都可以在目录下面创建内容,但是每个用户只能管理自己的文件.对应数字1
chmod o+t /tmp/
chmod 1777 /tmp/
4.特殊权限授权
chmod 4755 1.txt
4代表suid,2是sgid,1是sticky
四、文件属性chattr(了解)
1.查看默认权限
lsattr file100
2.加上不能删除的属性。
chattr +i file100
3.删除chattr属性
chattr -i file100
# 也可以使用递归
-R
4.都有哪些文件属性
a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。
# 一般是给安全用
五、进程掩码umask
1.查看umask值
umask
#默认
文件夹755 文件644
2.计算
减去umask的值,文件umask如果某一位是奇数,需要减去umask后这一位上+1
3.修改shell umask值(临时)
umask 000
六、权限之间的关系
1.权限配合
1.文件的写权限需要读权限的配合,否则只能追加文件
如果文件只有w只能通过追加方式写入,如果vi/vim写入会清空文件内容只留最新的(:wq!)。
2.x权限需要有r配合
3.目录的r权限查看目录下内容,如果只有r目录下文件的属性信息无法查看提示"?",目录的r权限需要x权限配合.、
4.对于目录x权限表示是否能够进入目录权限,是否能够查看与修改目录下文件的 属性信息 权限。
5.没有w权限无法删除
6.目录的w权限表示在目录下面创建,删除,重命名文件,只有w还不够,需要x配合
2.日常操作与需要的权限
日常操作 | 需要的权限 |
---|---|
查看文件的内容 | 文件要有r权限 |
编辑或修改文件内容 | rw |
执行脚本/命令 | rx |
查看目录内容 | rx |
创建文件,删除文件 | 文件所在目录要有rwx权限 |
重命名 | 文件所在目录要有rwx权限 |
3.用户与用户组的关系
一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。
一对多:即一个用户可以存在多个用户组中。那么此用户具有多个组的共同权限。
多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限。
多对多:多个用户可以存在多个组中。其实就是上面三个对应关系的扩展。
五、进程管理
一、进程介绍
1.僵尸进程
1.什么是僵尸进程,怎么产生的
僵尸进程:由于各种原因导致某个进程挂掉了,但是进程本身仍然存在,还占用着系统资源,这种异常进程僵尸进程。
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
2.怎么查找僵尸进程
ps aux | grep Z
或者top
3.遇到僵尸进程如何解决
1.找出僵尸进程上级进程,结束即可
2.如果上级进程是主进程(pid为1进程),则需要重启linux系统
3.少量不影响,可以不重启,但是多了就会影响服务器性能
4.pstree的使用
#一般用于查看进程间关系
pstree
pstree -p #显示树形结构并输出pid
ps auxf #也可以显示部分所属关系,但是并不直观
#pstree属于psmisc软件包,yum安装psmisc即可.
2.孤儿进程
1.什么是孤儿进程
孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。
孤儿进程会被系统直接接管.(systemd进程)
3.进程的分类
1.系统进程
可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
2.用户进程
通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
3.交互进程
由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
4.批处理进程
该进程是一个进程集合,负责按顺序启动其他的进程。
5.守护进程
守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。
二、基本命令
1.ps
1.ps的参数介绍
#输入字段的含义
ps a 显示所有与终端会话的进程,包括其他用户的进程
ps u 显示指定用户的进程
ps x 显示没有控制终端的进程
2.ps aux参数的含义
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存
RSS: 占用实际内存
TTY: 进程运行的终端
STAT: 进程状态
START: 进程的启动时间
TIME: 进程占用CPU的总时间
COMMAND: 进程文件,进程名
3.ps -ef字段介绍
UID 进程属于的用户
PID 进程id号,大部分都是随机.
PPID 父进程的id号, pstree -p查看详细关系
CMD 进程名字
TTY 哪个终端
4.常见的进程状态
R+ 前台运行中进程 **
R 后台运行进程
S 睡眠,可中断进程(大部分进程)
T 后台挂起的进程(说完挂起命令就懂了)
D 不可中断进程(进程正在进行IO读写) **
Ss 可中断进程(普通)管理进程
S< 可中断的高优先级进程
Ssl可中断的多线程的管理进程 **
Z 僵尸进程 **
X 死掉的进程
5.STAT状态+符号
STAT状态+符号(附加状态)了解 | 描述 |
---|---|
s | 进程是控制进程, Ss进程的领导者,父进程/主进程 |
< | 进程运行在高优先级上,S<优先级较高的进程 |
N | 进程运行在低优先级上,SN优先级较低的进程 |
+ | 当前进程运行在前台,R+该表示进程在前台运行 |
l(小写L) | 进程是多线程的,Sl表示进程是以线程方式运行(与程序) 使用多线程可以让服务或软件支持更改的访问,但是需要软件支持。 |
6.ps进行负载的排序
#1.以cpu升序
ps aux --sort %cpu
#2.以cpu降序
ps aux --sort -%cpu
#-表示逆序
#3.通用sort
ps -no-heading aux |sort -rnk4
7.自定义ps字段
ps axo user,pid,ppid,%mem,command |head -3
8.不输出每一列的标题
ps aux |awk 'NR>1{print $1,$3}'
ps -no-heading axo user,%cpu,stat
9.完全使用ps命令查看去掉标题,指定字段pid,cpu,mem,command的crond进程
ps --no-heading -o pid,%cpu,%mem,command -C crond
# s不输出每一列的标题
# -C 过滤 注意不能跟ax,否则报错
# -o 指定输出列
2.top的使用
1.非交互式
top | awk 'NR==2' #发现不行
top -bn1 | awk 'NR==2'
-b 非交互模式
-n 只输出一次结果
2.定制top的参数
# 每1秒刷新
top -d 1
# 查看指定进程的动态信息
top -d 1 -p 10126
# 查看10126和1号进程
top -d 1 -p 10126,1
3.top命令内部都包含了哪些信息
第一行:w/uptime
第二行:进程汇总信息
第三行:CPU使用率
第四行:内存使用情况
第五行:swap使用情况
4.top命令内部重点掌握哪些
1.第一行的cpu负载
2.第二行的僵尸进程
3.第三行的系统cpu占用和磁盘io等待
#磁盘io等待的意思是,磁盘数据处理不过来了,正在排队的一个指标
4.第五行的已用swap和剩余swap
5.top命令的具体参数与含义
top - 11:45:08 up 18:54, 4 users, load average: 0.05, 0.05, 0.05
程序名--系统时间-运行时间-----登录用户----cpu负载 1-----5----15分钟
Tasks: 176 total, 1 running, 175 sleeping, 0 stopped, 0 zombie
总进程数-------------运行数1-----睡眠数175---------停止数0-------僵死数0
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
cpu使用占比us用户----sy系统----ni优先级-id空闲-----wa等待---hi硬件----si软件----st虚拟机
KiB Mem : 3865520 total, 1100000 free, 580268 used, 2185252 buff/cache
物理内存总数-----------------free空闲1G-------userd使用500M----------缓存占用2G
KiB Swap: 4063228 total, 4063228 free, 0 used. 2917828 avail Mem
交换分区-----总数------------空闲-------------------已使用---可用
6.top的快捷键
q 退出
默认3秒刷新1次,空格立刻刷新
P 默认按照CPU使用率
M 按照内存使用率
# 进阶用法
top输入z进入颜色模式 按 x 标记出当前是按照哪列排序.
shift + > 向右
shift + < 向左
7.htop
支持鼠标操作 进度条显示使用的百分比,是top的升级版,有进度条
3.kill的使用
1.各种kill信号的介绍
给进程发送信号(kill -l列出所有支持的信号)
[root@localhost ~]# kill -l
编号 信号名
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断Ctrl+C
3) SIGQUIT 键盘退出Ctrl+\,类似SIGINT
9) SIGKILL 强制终止,无条件
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 暂停
20)SIGTSTP 键盘暂停Ctrl+Z
# 一般使用9和15
kill -15 1234 正常终止
kill -9 4321 非法杀死
2.kill的三剑客
命令 | 说明 |
---|---|
kill | kill + 进程pid进行结束进程,常用. |
pkill | pkill + 进程名字, 取你狗命(你和狗),模糊查找. |
killall | killall + 进程名字,精确 |
3.标准用法
kill pid #默认发送结束信号
kill -9 pid #发送强制结束信号
#pkill 后面跟的是模糊匹配的名字
#killall 后面跟的是进程的名字,可以终止一组进程。
killall -9 java
4.nice值
1.手动启动不同nice
nice -n -5 sleep 6000 &
nice -n -10 sleep 7000 &
2.手动更改nice值
sleep 7000 &
renice -20 2669
5.lsof(重点掌握)
lsof -p PID:PID是进程号,通过进程号显示程序打开的所有文件及相关进程
lsof -i 通过监听指定的协议、端口、主机等信息,显示符合条件的进程信息。
lsof常用组合:
lsof -c sshd
lsof -g 4918
lsof -i :80
lsof -i tcp:25
lsof -ni :22
lsof -nPi :22
lsof -n 不要把ip反向解析为主机名、域名。
lsof -P 不要把端口解析为对应的服务。
lsof |grep passwd
ps -ef |grep tail
每一列 | 说明 |
---|---|
1 | 命令或服务名字 |
2 | pid |
3 | 用户 |
7 | 文件大小(字节) |
8 | 文件inode号码 |
最后一列 | 文件名 |
6.pgrep
#利用pgrep查询进程ID
pgrep是通过程序的名字来查询进程pid的工具,它通过检查程序在系统中活动的进程,输出进程属性匹配命令行上指定条件的进程的ID
查看sshd进程对应的所有ID,可执行如下命令:
pgrep -f sshd
三、负载、
1.概念
- 负载 load average 平均负载: 最近1分钟 5分钟 15分钟系统平均负载.
- 负载:衡量系统繁忙程度指标.
- 衡量是否繁忙: 数值越接近cpu核心总数,系统的负载越高 .
- 预警: 建议负载达到cpu核心总数的70-80%。
2.负载原理
那到底如何理解平均负载:平均负载是指单位时间内,系统处于可运行状态(R,S)和不可中断状态(D)的平均进程数,也就是平均活跃进程数
负载是衡量正在运行的进程的平均数(可以中断进程和不可中断进程).
系统负载显示出什么信息:
负载主要衡量的是可运行状态(R,S 占用CPU)和不可中断 (io)
3.负载高的排查流程
1.通过监控软件发现系统负载高(w/uptime/top)
2.判断cpu还是io导致的负载高
- cpu高:top中us(user 用户占用的cpu) sy(system占用的cpu)
- io高:top中wa(iowait)磁盘io导致的负载高
3.处理
- 🅰️如果是cpu导致的,排查出哪个进程导致的ps aux过滤出占用cpu较高的进程
- 🅱️如果是IO导致的,排查初级哪个进程导致的,通过iotop -o命令排查
4.分析工具
strace(显示过程)、ltrace(调用)跟踪进程、命令执行过程
perf cpu分析
5.iotop -o 只显示正在读写的进程
四、作业控制jobs
1.前后台调用
1.运行后台程序
sleep 3000 &
2.查看后台进程。
jobs
[1]+ Running sleep 3000 &
#+,-代表,使用fg时,默认调动至前台的进程。先是+,后是-
3.调动后台程序至前台。
fg 1
4.消灭后台进程
kill %1
5.前台调到后台
ctrl+z
1.拿到前台运行
2.杀死
3.继续后台运行
bg 5
2.一些常见的后台运行的办法
1.使用&符号
slepp 300 &
2.nohup 命令&方法
# 案例02 让ping baidu命令后台运行并记录输出
nohup ping -c20 baidu &
tail -f nohup.out
3.nohup指定输出其他文件
#可以保留输出到指定文件中。默认是nohup.out文件中。其他方面与&符号一致。
#nohup 命令 >新的文件 &即可
nohup ping baidu >xiaoyu001-new.txt &
4.screen的优势
一般我们使用&,nohup方法让命令,服务进入后台运行,但是可能不稳定。
这时候可以通过screen命令较为稳定的后台运行一些指令。
5.screen的使用
#1. 安装screen
yum install -y screen
#2. 运行screen
screen
进入screen虚拟窗口
#3. 执行命令
输入命令 ping baidu
#4. 退出screen窗口
退出窗口(异常推荐,正常退出)
ctrl + a 然后 d
#5. 查看screen窗口
screen -ls
#6. 恢复
screen -r tab键选择名字
彻底结束
ctrl + d
6.screen的原理
简易原理:创建screen空间,screen命令维持,在里面运行的命令只要空间在,里面的命令就不会断(后台运行)。
7.各命令对比
& #大部分时候使用这个
nohup #想输出记录
ctrlz #一般用于ctrl+c无法杀死进程的时候用
screen #稳定性好
# 公有云如果长时间不操作会断开连接,所以用screen更稳定一些
六、存储管理
一、硬件介绍
1.磁盘介绍
#SATA
一般家用,一般用于机械硬盘,也有固态硬盘,容量大,价格较低 sda
#SAS
给企业环境使用,一般用于机械硬盘,也有固态硬盘
#PCI-E
企业级使用,固态硬盘用
#U.2
企业级固态硬盘使用。PCI-E类似。
2.磁盘关于参数方面
1.企业级环境磁盘选型
磁盘选型 | 应用建议 |
---|---|
一般情况下,数据备份 | SATA硬盘,10k rpm 4tb,8tb存放备份. |
网站服务器使用 | SAS接口 15k rpm 300G 600G 900G |
高并发网站服务器 | 可以选择固态硬盘PCI-E,SAS,SATA |
4.mbr和gpt如何选择
分区表 | 支持的硬盘容量和主分区个数 | 对应的命令 |
---|---|---|
mbr | 支持2tb以内的硬盘,大于2tb则只识别2tb. 区别主分区,扩展分区,逻辑分区。 | fdisk /parted |
gpt | 支持2tb以上硬盘,主分区无限使用(128个). | gdisk /parted |
二、磁盘管理
1.mbr磁盘基本管理
1.磁盘分区
fdisk /dev/sdb
-d:删除一个分区
-l:查看指定分区的分区表信息
-m:显示fdisk每个交互命令的详细含义
-n:增加一个新的分区
-p:显示分区信息
-q:退出交互操作,不保存操作的内容
-t:改变分区类型
-w:写分区表信息到硬盘,保存操作退出
2.刷新分区表
partprobe /dev/sdb
fdisk -l /dev/sdb
3.格式化
mkfs.ext4 /dev/sdb1
mkfs.xfs
4.挂载
mount -t ext4 /dev/sdb1 /mnt/disk1
# 此处ext4可以省略,系统可以自我识别
5.卸载
umount /dev/sdb4
6.立刻使用挂载命令
mount -a
# 挂载命令只会在重启或者mount -a后执行
7.开机自动挂载
# fstab永久挂载,但是有一定风险
设备名字 挂载点 文件系统类型 默认选项 是否备份 是否检查
/dev/sdb1 /mnt/disk1 ext4 defaults 0 0
# 写入自启动文件 rc.local
vim /etc/rc.d/rc.local
2.gpt磁盘基本管理
1.查看硬盘分区信息
parted /dev/sdb print
2.编辑/dev/sdc
parted /dev/sdc
3.创建分区表gpt格式
mktable gpt 或者mklabel gpt 一样 #注意mbr叫做msdos类型
4.创建分区10mb
mkpart primary 0 10
mkpart primary 10 20
5.创建新分区命令。
#使用格式为:mkpart PART-TYPE [FS-TYPE] START END
#其中,PART-TYPE,表示分区类型,主要有primary(主分区),extended(扩展分区),logical(逻辑区),其中,扩展分区和逻辑分区只针对msdos分区表。
#fs-type,表示文件系统类型,主要有fat32,NTFS,ext2,ext3等,可不填写。
#start,表示分区的起始位置。
#end,表示分区的结束位置。
6.删除分区
rm 1
# 命令格式 rm number 。
7.退出编辑
q 或quit
8.查看信息
print(输出分区信息,可简写为p。该功能有3个选项:)
free,显示该盘的所有信息,并显示磁盘剩余空间。
number, 显示指定的分区的信息。
all或list, 显示所有磁盘信息。
9.select 选择设备。
当输入parted命令后直接回车进入交互模式时,默认设置的是系统的第一块硬盘,如果系统有多块硬盘,需要用select命令选择要操作的硬盘。
例如:select /dev/sdb
3.管理磁盘其它命令
1.查看磁盘
ll /dev/sd*
lsblk
fdisk -l /dev/sdb
df -Th
2.创建一个固定大小的文件
dd if=/dev/zero of=/mnt/disk4/1.txt bs=1M count=1000
4.查看磁盘空间和挂载情况
df -h 人性化显示磁盘占用空间
df -hT 查看磁盘空间并展示文件系统类型
df -hi 查看磁盘分区Inode占用情况
#参数后面可以接路径 ,比如/
4.文件系统
1.常见的文件系统介绍
1.ext4
EXT4是第四代扩展文件系统(英语:Fourth extended filesystem)用于CentOS 6.x ubuntu或公有云使用。
2.xfs
XFS一种高性能的日志文件系统,CentOS 7默认的文件系统类型。
3.ext3
centos 5.x 默认的文件系统
#系统限制
Ext3: 文件系统最大16TB
Ext4: 文件系统最大16TB
XFS : 文件系统最大100TB.
2.线上业务系统选择文件系统标准
Linux下常见的有DOS文件系统类型msdos,windows下的FAT系列(fat16和FAT32)和NTFS文件系统,光盘文件系统ISO-9660,单一文件系统ext2和日志文件系统ext3、ext4、xfs,集群文件系统gfs(Red Hat Global File System)、ocfs2(oracle cluster File System)、虚拟文件系统(比如 /proc),网络文件系统(NFS)。
3.选择合适的文件系统
#ext2
没有日志记录功能,这样就节省了很多磁盘性能。例如linux系统下的/tmp分区就可以采用ext2文件系统。
#ext3
目录结构是线型的,当一个目录下文件较多时,ext3的性能就下降比较多.适合对性能要求不高、数据安全要求不高的业务。属于比较中间的类型
#ext4
延迟分配、多块分配和盘区功能,非常适合大量小文件的操作,如果业务环境是对文件要进行大量的创建和删除操作的话,ext4是更高效的文件系统.例如网站应用,邮件系统等.
#xfs
性能和安全性方面综合考虑的话,xfs文件系统是比较好的选择.一些大数据文件操作,同时,应用本身需要大量日志写操作。但是兼容性就差一些
5.inode与block
1.什么是inode
索引节点
记录文件的属性,大小,权限,属主,属组,连接数,块数量,块的编号
一个文件占用一个inode,同时记录此文件数据所在的block numbber。
inode大小 为 128 bytes
2.什么是block
存储文件的实际数据。
实际存储文件的内容,若文件较大,会占用多个block。
block大小 为默认为4K
3.indeo与block的特点
inode索引节点,存放文件属性信息,block位置。
每创建1个非空文件至少占用1个inode,1个block,一般文件都要有1个inode
1个block默认是4k
inode,block数量是在格式化的时候创建的
正常情况下block的使用会更快
创建小文件不足4k,1个block还有剩余空间,无法给其他文件使用
创建文件大于4k,占用多个block
4.superblock
block 与 inode 的总量;
未使用与已使用的 inode / block 数量;
5.块组
block group
6.查看inode
ll -i #查看文件的inode信息
df -i #所有的inode
7.查看block
df -hT
8.inode与block的关系
inode决定了文件系统中文件的数量。
block决定了文件存储的空间。
9.当分区空间大小消耗完毕,还能否新增文件?
#当block满了之后,就不能再添加新数据了
#当inode满了之后,不能新建文件,但是可以追加进旧文件
三、交换分区
1.交换分区介绍
1.什么是swap交换分区,它存在的意义是什么
从磁盘中开辟出一块空间,临时给内存使用,它是利用磁盘空间虚拟出的一块逻辑内存
内存不足的时候临时充当内存,防止OOM(Out Of Memory)
2.服务器运行java程序,大量占用内存,以至于开始占用swap如何解决?
第一步保证网站正常,增加swap空间.
联合开发一起排查.
1.创建指定大小的文件1g的文件.
2.把文件转换为swap.
3.激活这个swap,把它加入到linux中.
4.记得配置永久挂载.
3.swap的大小
设置交换分区大小为内存的1.5-2倍
生产环境推荐
大于 4GB 而小于 16GB 内存的系统,最小需要 4GB 交换空间;
大于 16GB 而小于 64GB 内存的系统,最小需要 8GB 交换空间;
大于 64GB 而小于 256GB 内存的系统,最小需要 16GB 交换空间。
#补充:公有云可以不配置, 如果是java建议配置一些.
4.什么样的数据会被存储到交换分区
linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存。
linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存。
5.什么情况下,会因为swap分区导致linux死机或服务异常
交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题。
2.交换分区的创建与使用
1.创建指定大小的文件1g的文件.
dd if=/dev/zero of=/tmp/1g bs=1M count=1000
if === input file 输入文件/dev/zero不断输出空.
of === ouput file 输出文件
bs === block size 每次读取多少
count === 读取次数
2.查看格式
#前后做个对比
file /tmp/1g
3.把文件转换为swap(格式化).
mkswap /tmp/1g
4.激活这个swap,把它加入到linux中.
chmod 600 /tmp/1g
swapon /tmp/1g
free -h
5.永久挂载
方法01 : swapon /tmp/1g写入到rc.local
方法02: 写入/etc/fstab
/tmp/1g swap swap defaults 0 0
6.也可以通过fdisk的方式
fdisk /dev/sde
# 可选:划分分区后,将类型设置为82(按t!!!老铁)
partprobe /dev/sde
ll /dev/sde*
# 然后进行格式化
mkswap /dev/sde1
# 挂载
swapon /dev/sde1
# 验证
free -m
7.swap的优化
swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下:
cat /proc/sys/vm/swappiness
也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。
操作系统层面,要尽可能使用内存,对该参数进行调整。
临时调整的方法如下,调成10:
sysctl vm.swappiness=10
要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:
cat /etc/sysctl.conf
vm.swappiness=10
四、实战管理
1.分区容量
1.规划
分区 | 容量 |
---|---|
/data | 最大 |
/boot/efi | 200M |
/boot | 1G |
/ | 10G |
/usr | 10G |
/var | 10G |
2.好处
如果有创建数据分区,那么在重装系统时,就可以重新引用之前的分区,数据分区就不会受影响
2.如何扩容
fdisk 删根分区,然后重创
注意还是原来的序列号,不移除该签名N
根如果不在最后一个分区就麻烦了,或者磁盘没有剩余空间
此时需要移动大目录,然后通过软连接
注意大文件转移要用rsync,因为mv一旦中断将导致数据损坏
五、LVM(逻辑卷管理)
1.LVM创建的流程
1.将磁盘转换成物理券
2.将物理卷加入卷组
3.从卷组中开辟出空间给逻辑卷
2.LVM的创建与管理
1.命令大全
功能 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
scan 扫描 | pvscan | vgscan | lvscan |
craete 建立 | pvcreate | vgcreate | lvcreate |
display 显示 | pvdisplay | vgdisplay | lvdisplay |
remove 删除 | pvremove | vgremove | lvremove |
extend 扩展 | vgextend | lvextend | |
reduce 减少 | vgreduce | lvreduce |
2.将物理磁盘,转换成物理卷-PV
pvcreate /dev/sdc
# 查看PV信息
pvscan
pvs
pvdisplay
3.创建卷组-VG
vgcreate vg1 /dev/sdc
# 查看VG信息
vgs
vgscan
vgdisplay
4.创建逻辑卷LV
lvcreate -L 200M -n lv1 vg1
-L大小 -n卷名 vg1组名(容量的来源)
# 查看lv
lvscan
5.创建文件系统并挂载
mkfs.ext4 /dev/vg1/lv1
mkdir /mnt/lv1
mount /dev/vg1/lv1 /mnt/lv1
6.实用性怎么样
#一般不推荐使用lvm,因为性能低,后期维护性很差,恢复数据比较困难推荐使用标准分区
7.VG扩容
pvcreate /dev/sdd
vgextend vg1 /dev/sdd
8.扩容LV
lvextend -L +200M /dev/vg1/lv1
#先观察文件系统当前容量。
df -Th
resize2fs /dev/vg1/lv1
#再看刷新后的容量
9.xfs格式的如何刷新
xfs_growfs
六、磁盘性能指标
磁盘性能指标 | 说明 |
---|---|
吞吐量(读写速度) | 一般值的是磁盘读写速度 |
iops | 每秒可以进行的io数量(io per second),每秒可以进行读写次数 |
延迟 | 进行读写的时候操作延时 |
故障间的平均时间 | 固态硬盘 基本都是百万小时 |
- 连续读写: dd命令测试
- 随机读写:fio测试
- fio可以测试这些指标
(https://help.aliyun/document_detail/147897.htm)
七、使用extundelete恢复误删除的文件
1.反删除工具有哪些
比较常用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,只是extundelete功能更加强大。
ext3grep仅支持ext3文件系统的恢复,恢复速度较慢,而extundelete可以恢复ext3/ext4文件系统的数据,并且恢复速度很快。
extundelete官网:http://extundelete.sourceforge/
2.恢复原理
extundelete首先会通过文件系统的inode信息(根目录的inode一般为2)来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件。
3.extundelete的安装与使用
tar jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4
./configure
make
make install
#成功安装extundelete后,会在系统中生成一个extundelete可执行文件
extundelete常用选项:
--restore-inode ino[,ino,...],恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。
--restore-file 'path',恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。
--restore-files 'path' ,恢复命令参数,表示将恢复在路径中已列出的所有文件。
--restore-all,恢复命令参数,表示将尝试恢复所有目录和文件。
八、缓存区与缓冲区
1.查看缓存与缓冲
total used free shared buff/cache available
Mem: 2027892 199940 1364984 9804 462968 1630104
Swap: 2097148 0 2097148
# 从内核的角度来查看内存的状态
就是free 1364984
# 从应用层的角度来看系统内存的使用状态
1364984+462968=1827952
available,加上buffer与cache才是真实可用内存
# 对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高文件读取的性能,当应用程序需要用到内存的时候,buffers/cached会很快地被回收,以供应用程序使用。
2.buffers与cached的异同
Buffer(缓冲区)主要用于解决数据传输速度不匹配的问题,它通过临时存储数据来协调不同速度的设备之间的数据交换。例如,在从内存向硬盘写入数据时,数据会先被缓冲到一定大小后再写入硬盘,这样可以减少对硬盘的频繁访问,从而提高效率。Buffer的数据丢失可能会影响数据的完整性,因为这些数据尚未被永久写入存储介质。
Cache(缓存)则是为了提高数据的访问速度,通过存储最近使用或高频使用的数据来减少直接访问较慢存储的需求。例如,将硬盘中的数据读取出来放在内存的缓存区中,这样以后再次访问同一个资源时,速度会快很多。Cache的数据丢失不会影响数据的完整性,但会影响性能,因为缓存中的数据是已经读取但尚未写入硬盘的数据。
在实际应用中,Buffer和Cache都存在于内存中,数据都是临时的,一旦关机数据都会丢失。Buffer主要用于写入操作,而Cache主要用于读取操作。Buffer的大小对性能影响较小,够用即可,而Cache的大小对性能有较大影响,越大性能越好。
3.手动释放缓存cache
释放page cache:
echo 1 > /proc/sys/vm/drop_caches
释放文件节点(inodes)缓存和目录项缓存(dentries),大部分缓存数据都是用的page cache
echo 2 > /proc/sys/vm/drop_caches
释放page cache、dentries和inodes缓存:
echo 3 > /proc/sys/vm/drop_caches
在手动释放内存前,需要使用sync指令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
九、RAID:廉价磁盘冗余阵列
1.概念
最少 | 安全冗余 | 可用容量 | 性能 | 使用场景 | 举例 | |
---|---|---|---|---|---|---|
raid0 | 1 | 最低 | n | 读写最快 | 不要求安全,只要求速度 | 数据库从库,存储从库,web服务器 |
raid1 | =2 | 100% | 1/2 | 写入慢,读OK | 只追求安全 | 系统盘/监控服务器 |
raid5 | 3 | 最多坏1块 | n-1/n | 写入慢,读OK | 对速度安全,对速度要求不高 | 普遍数据库,存储访问量不高 |
raid10 | 4 | 可以坏1半 | 1/2 | 读写很快 | 安全性能都要 | 高并发或高访问量数据库主库,存储 |
1.RAID6
RAID6 是在raid5的基础上,进一步加强数据保护而设计的。它除了每个硬盘上有同级数据的校验带之外,还增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法。意思是,每个数据块有了两个校验保护屏障,即使两块磁盘同时失效也不会影响数据的使用,因此RAID 6的数据冗余性能相当好。
用的XOR异或的校验方式
2.RAID10
两个raid1组成的raid0
# 为什么不是两个raid0组成raid1呢?
假设4块硬盘,两种组合方式只有在同时损失两块硬盘的时候才有区别,同有C42,6中组合方式
其中RAID10容错率在2/3,RAID01容错率在1/3
# 只是理论上这样,但实际操作直接放4块硬盘,选择raid10即可
2.软RAID示例
1.准备4块硬盘
ll /dev/sd*
2.创建RAID
mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd{d,e,f,g}
-C 创建RAID
/dev/md0 第一个RAID设备
-l5 RAID5
-n RAID成员的数量
-x 热备磁盘的数量
可用空间2G
3.格式化,挂载
mkfs.ext4 /dev/md0
mkdir /mnt/raid5
mount /dev/md0 /mnt/raid5
cp -rf /etc /mnt/raid5/etc1
4.查看RAID信息
mdadm -D /dev/md0 //-D 查看详细信息
5.实时观察
watch -n 0.5 'mdadm -D /dev/md0 | tail' //watch持续查看
6.模拟一块硬盘损坏,并移除
mdadm /dev/md0 -f /dev/sde -r /dev/sde
-f --fail
-r --remove
七、文件查找
一、命令查找
1.which
# which ls //从PATH环境变量
2.whereis
# whereis ls //从PATH环境变量
二、locate查找
#1.locate查找文件hosts文件
locate hosts
#2.更新locate数据库
updatedb
三、find
1.基本查找
1.语法
find [path...] [options] [expression] [action]
命令 路径 选项 表达式 动作
2.类型
name
size
maxdepth
type
perm
time
3.按文件查找
# i忽略大小写
find /etc -iname "hos*"
4.按大小
# 文件>5M 文件=5M 文件<5M
find /etc -size 5M
`b' for 512-byte blocks
`c' for bytes
`k' for Kilobytes (units of 1024 bytes)
`M' for Megabytes (units of 1048576 bytes)
`G' for Gigabytes (units of 1073741824 bytes)
5.指定查找的目录深度:maxdepth
# -a and
find / -maxdepth 4 -a -name "ifcfg-en*"
6.按文件属主、属组
find /home -user jack
find /home -group hr
7.按文件类型:f普通文件 b块设备文件 d目录 p管道 l连接
find /tmp -type f
find /dev -type b
8.按文件权限
find . -perm 644 -ls
find . -perm /+x
9.按时间
atime, access time:文件被读取或者执行的时间
ctime, change time:文件属性改变时间
mtime, modify time:文件内容被修改的时间
find /data -mtime +30 -name “.log":查找30天以前的log文件
find /data -amin -30 -name ".log”:查找30min以内被访问的log文件
find /data -cmin 30 -name ".log”:查找第30min改变的log文件
stat /etc/passwd #查看状态
2.找到之后的动作
1.如果不指定,默认就是显示
find . -perm 715 -print #文件名
find . -perm 715 -ls #文件属性
2.找到后删除
find /test -type f -name "test*.txt"|xargs rm
find /test -type f -name "test*.txt" -exec rm -rf {} \;
find /test -type f -name "test*.txt" -delete
rm -f `find /test/ -type f -name "*.txt"`
3.找到后复制
find /test -type f -name "test*.txt" |xargs -i cp {} /test01/
find /test -type f -name "test*.txt" |xargs cp -t /test01/
find /test -type f -name "test*.txt" -exec cp -a {} /test01 \;
4.找到后移动
find /test -type f -name "test*.txt" |xargs -i mv {} /test01/
find /test -type f -name "test*.txt" |xargs mv -t /test01/
find /test -type f -name "test*.txt" -exec mv {} /test01 \;
5.找到后查看
find /test -type f -name "test*.txt" |xargs ls -lh
find /test -type f -name "test*.txt" -exec ls-lh {} \;
6.为什么直接传递的时候,xargs失效
默认管道是无法把数据变化为命令的参数,导致传递失败,find命令找出的内容相当于被丢弃了,就相当于执行ls -lh命令,显示当前目录下内容并详细信息。
前面的命令通过管道传递给后面命令,传递的是 字符串
这个命令(ls)中传递文字符号就不行,传递 参数
通过|xargs把前面命令传递过来的字符串转换为后面命令可以识别参数
7.总结:三种查找文件后的执行方式
优先执行
xarg xarg -i
exec
3.进阶使用
1.find找出/xiaoyu/find/ 以.txt结尾的文件放在/tmp/find.tar.gz
find /xiaoyu/find/ -type f -name '*.txt'|xargs tar zcf /tmp/etc-xargs.tar.gz
find /xiaoyu/find/ -type f -name '*.txt' -exec tar zcf /tmp/find-exec.tar.gz {} \;
#有坑,因为-exec \;执行方式 1个文件1个文件的压缩.
find /xiaoyu/find/ -type f -name '*.txt' -exec tar zcf /tmp/find-exec.tar.gz {} +
# -exec就是将参数,传递到{}中,找到一个,就传递一个,所以后面接不了tar
将\;改成+的意思就是,先执行完查找,然后再批量执行后面的命令
2.为什么要用-t参数
#xrags实际是让参数放到最后,但是很多命令的参数不在最后,所以需要用到-t
cp -t /tmp/ cp -t 目标 源 文件 目录
3.如何执行多条件查找
通过-a连接条件
4.找出/etc/中以.conf结尾大于10kb修改时间是7天之前的文件
find /etc -name "*.conf" -a -size +10k -a -mtime +7
5.取反符号
find / -name "*.conf" ! -name "nginx.conf"
八、软件管理
一、rpm
1.认识rpm包的结构
# 认识rpm包
wget-1.14-15.el7.x86_64.rpm
软件包名-版本号-发布版本-系统平台
#每个RPM文件中包含了已经编译好的二进制可执行文件,其实就是将软件源码文件进行编译安装,然后进行封装,就成了RPM文件。
2.rpm的使用
1.基本命令
-i 安装
-v 可视
-h 百分比
-e 卸载
-U 升级
-q 查询
-qi 软件描述信息
-ql 软件安装路径
-qa 查询软件的名称,判断是否安装
-qf 属于哪个rpm
rpm -q wget
--nodeps 卸载时不检查依赖关系
--force 安装时强制安装
2.ubuntu检查安装软件
#检查是否安装
dpkg -l
#安装
dpkg -i
#检查软件包内容
dpkg -L
#删除
dpkg -r
二、yum
1.yum仓库
1.配置本地仓库
#1.备份移除官方YUM库
mv /etc/yum.repos.d/* /tmp
tar -cfv 1.tar *
#2.编写本地YUM库配置文件
vim /etc/yum.repos.d/dvd.repo
[dvd]
name=dvd
baseurl=file:///mnt/cdrom
gpgcheck=0
#3.挂载安装光盘
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom/
mount -a
ls /mnt/cdrom
2.centos默认的源格式
[base]
name=CentOS-$releasever - Base - mirrors.aliyun
failovermethod=priority
baseurl=
gpgcheck=1
gpgkey=http://mirrors.aliyun/centos/RPM-GPG-KEY-CentOS-7
$releasever 什么系统
$basearch 系统的架构
2.yum基本命令
1.yum常用命令
yum reinstall 重新安装
yum update 升级
yum repolist 查看yum源
yum list httpd 查看软件是否已安装
yum list all 列出仓库中的所有软件包
yum info 软件包名称
yum remove 卸载
yum provides 查询对应的软件名
yum search all 查询对应的软件名
yum clean all 清除所有的缓存
yum groupinstall 安装软件包组
yum localinstall 本地安装
yum deplist 检查软件的依赖关系
yum install --downloadonly --downloaddir=/usr/local/rpms/vim vim
仅下载不安装
#如果执行yum remove,那么系统会提示其它应用也依赖此依赖。
2.ubuntu系统软件包管理
apt源
apt/apt-get > yum
dpkg >rpm
vim /etc/apt/sources.list
deb https://mirrors.aliyun/ubuntu/focal main restricted universe multiverse
deb-src https://mirrors.aliyun/ubuntu//focal main restricted universe multiverse
#会改阿里云就行,直接把配置文件复制过去就行
# 编辑完成之后一定运行apt update命令,用于生成本地缓存,如果不运行,那么就无法安装软件
3.yum配置文件
1./etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever #缓存目录
keepcache=1 #是否保留缓存, 0表示不保留缓存, 1表示保留缓存
logfile=/var/log/yum.log
测试
yum reinstall -y tree cowsay
2.安装清华源
https://mirrors.tuna.tsinghua.edu/help/centos-vault/
sed 's#http://mirrors.aliyun#https://mirrors.tuna.tsinghua.edu#g' /etc/yum.repos.d/CentOS-Base.repo
三、源码
1.源码包的安装过程
#source code 需要经过GCC,C++编译环境编译才能运行
# 编译安装三部曲
1.配置 ./configure
2.编译 make
3.安装 make install
4.测试效果
5.清理掉软件包,解压目录
2.尝试编译安装tengine
1.下载源码包
wget http://tengine.taobao/download/tengine-2.2.0.tar.gz
2.准备编译环境如编译器
yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel
3.解压
useradd www
tar xzvf tengine-2.2.0.tar.gz
cd tengine-2.2.0
4.配置
#“./configure”进行软件安装的环境测试,如果提示缺少某些安装包,就需要进行安装,直到测试通过。
./configure --user=www --group=www --prefix=/usr/local/nginx
5.编译
make
#它最主要的功能就是通过makefile文件来实现的,make过程比较消耗时间,也是源码安装最关键的一个步骤。
6.安装
make install
#此阶段就是将编译好的文件拷贝到安装目录下,瞬间就完成了。
# 如果没有依赖,在make的时候会报错,这时候根据提示,复制缺少的依赖,通过yum search all或yum provides来查询缺少的依赖
# 一般会搜出来很多rpm包,这时优先选择devel的包,ubuntu找dev的
# 报错提示一般是no such file /direcorty
3.源码包的优缺点
(1)、源码安装优点:
源码安装的好处是可以使用最新版本,用户可以自己定制软件功能,安装需要的模块,不需要的功能可以不用安装,此外,用户还可以自己选择安装路径,方便管理,卸载软件也很方便,只需删除对应的安装目录即可。
(2)、源码安装缺点:
由于源码安装非常灵活,可定制软件功能模块,所以对于新手来说,可能会无从下手,找不到方向。另外,源码安装会依赖很多其他软件或库文件,这些依赖软件需要查阅官方文档才知道。
四、dnf
1.dnf基本用法
dnf install net-tools
dnf install psmisc
dnf install vim
dnf install traceroute
2.dnf与yum对比
1.DNF使用libsolv来解析依赖关系,这使其在解决依赖关系时更为高效。相比之下YUM使用公开的API来解析依赖关系,这在处理复杂依赖关系时可能会显得稍逊一筹。
2.DNF是Fedora系统中的默认包管理器,并且在CentOS 8及更高版本中取代了YUM作为默认包管理工具。对于旧版本的系统,仍然可以使用YUM命令进行软件包管理。YUM则是旧版本Fedora和CentOS系统中的默认包管理器
3.DNF支持并行操作,可以同时下载多个软件包,而YUM则相对较为简洁,输出信息较少
3.dnf与yum的关系
dnf安装是yum的升级版,在centos8以上的版本,yum是软连接到dnf的
yum/dnf安装的本质还是rpm文件安装,只不过rpm文件是yum自动通过互联网下载下来的。
五、其它
1.删除软件
一般不推荐使用yum remove,会删除依赖,一般使用rpm -e
九、服务管理
一、systemctl的使用
1.基本用法
1.systemctl参数
1.查看服务运行情况
systemctl list-utils
2.服务开机自启动情况
systemctl list-utils-files
2.如果无法实现systemctl
1.将服务启动命令写入到/etc/rc.local/
2.手写systemctl配置
3.使用systemctl查看启动文件
systemctl cat iptables.service
2.linux运行级别
1.级别介绍
运行级别 | C7 | C6 |
---|---|---|
0 | 关机 | 关机 |
1 | 救援模式 secure,单用户模式,root权限,用于系统维护,禁止远程登录 | 单用户模式,找回root密码. |
2 | 多用户模式,没有NFS和网络 | 无网络的多用户模式. |
3 | 完整的多用户文本模式 | 命令行模式,文本模式,工作默认模式. |
4 | 未使用,默认也是多用户模式 | 未使用,待开发待使用。 |
5 | 图形化界面模式,桌面模式 | 图形化界面模式,桌面模式. X11 |
6 | 重启 | 重启 |
2.查看运行级别
ll /usr/lib/systemd/system/runlevel*.target
lrwxrwxrwx. 1 root root 15 6月 15 16:48 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 6月 15 16:48 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 6月 15 16:48 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月 15 16:48 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月 15 16:48 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 6月 15 16:48 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 6月 15 16:48 /usr/lib/systemd/system/runlevel6.target -> reboot.target
3.修改运行级别
systemctl set-default graphical.target #multi-user.target
4.查看运行级别
systemctl get-default
5.临时切换运行级别
init 6 #重启
init 0 #关机
二、systemd服务脚本编写与管理
1.systemd的基本介绍
1.背景
在CentOS6以及之前版本中,写服务脚本,需要放在/etc/init.d/目录下,这些脚本都是bash脚本,且脚本编写较复杂。而在CentOS7/RHEL7以及以后版本中,采用了一种叫unit的配置文件来管理服务,写服务脚本只需要按照标准格式编写即可。通过systemd命令集可以方便的对这些Unit进行管理。
2.简介
systemd是Linux上系统守护进程管理工具,字幕d(daemon)是守护进程的缩写,所以,systemd的意思就是守护整个系统。systemd可以管理Linux系统中的所有资源,不同的资源统称为Unit,常见的unit有:
Service unit:文件扩展名为.Service,用于定义系统服务
Target unit、文件名扩展为.target,用于模拟实现“运行级别”
Mount unit:文件名扩展为.mount 定义文件系统挂载点。
Systemd是内核启动后的第一个用户进程,PID为1,是所有其它用户进程的父进程。
3.认识service的unit文件
扩展名:.service
service文件存放路径:
/etc/systemd/system/* ―――― 系统管理员手动软件安装包或脚本放置于此,优先级更高
/run/systemd/system/* ―――― 运行时配置文件,这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
/usr/lib/systemd/system/* ―――― 该目录中包含的是软件包安装的单元,也就是说通过yum、dnf、rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下。
/lib/systemd/system: 指向/usr/lib/systemd/system。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在这个目录。
#我们在做的时候,可以直接把配置文件写到/etc/systemd/system下
2.systemd文件编写
1.systemd语法
start:启动指定的unit systemctl start nginx
stop:关闭指定的unit systemctl stop nginx
restart:重启指定unit systemctl restart nginx
reload:重载指定unit systemctl reload nginx
enable:系统开机时自动启动指定unit,前提是配置文件中有相关配置 systemctl enable nginx
disable:开机时不自动运行指定unit systemctl disable nginx
status:查看指定unit当前运行状态 systemctl status nginx
2.service unit文件的例子
#下面/usr/lib/systemd/system/postfix.service文件,它描述的是postfix服务的管理方式:
#记录unit文件的通用信息。
[Unit]
Description=Postfix Mail Transport Agent
#Before, After:定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx之后启动。
After=syslog.target network.target
#记录Service的信息
[Service]
#Type:service的种类
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
#环境配置文件
EnvironmentFile=-/etc/sysconfig/network
#启动服务之前需要启动的程序
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
#安装信息。
[Install]
#何种情况下,服务被启用。
WantedBy=multi-user.target #(多用户环境下启用)
3.type的种类
simple 默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出,那么一切都退出。
forking 标准的启动方式。服务包含父进程和子进程,启动程序后,会调用 fork() 函数,通过父进程生成子进程。
oneshot:这种服务类型就是启动完成,进程就没了。属于一次性启动。
notify:跟simple 类似,但是notify会在当前服务启动完毕,发送一个信号通知Systemd。
4.文件详解
(1)、 [Unit]部分
Description:对本service的描述
Before, After:定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx之后启动。
(2)、 [Service]部分
ExecStart:服务启动时执行的命令,此命令就是服务的主体。
ExecStartPre:ExecStart执行前所调用的命令。
ExecStartPost:ExecStart执行后所调用的命令。
ExecStop:定义停止当前服务时执行的命令。
EnvironmentFile:环境配置文件
PIDFile:指向当前服务 PID file 的绝对路径
注意:启动、重启、停止命令全部要求使用绝对路径
(3)、 [Install]部分
WantedBy:何种情况下,服务被启用。
例如:WantedBy=multi-user.target(多用户环境下启用)
5.开机自启
其实就是把/usr/lib/systemd/system/下的文件软连接到了/etc/systemd/system/下面
十、计划任务
一、at
1.语法
at <TIMESPEC>
任务
ctrl+D
2.时间节点
now +5min
teatime tomorrow (teatime is 16:00)
noon +4 days
5pm august 3 2020
4:00 2019-11-27
3.查询任务
atq
二、crond
1.基本认识
1.定时任务软件包名字和服务名字分别是什么
定时任务软件包名字:cronie , 服务名字(进程)crond
rpm -qa cronie
rpm -ql cronie
2.目录结构
/var/spool/cron #用户的定时任务的配置文件的目录
/var/log/cron #定时任务日志
# 了解
/etc/crontab #不推荐使用,定时任务的配置文件
/etc/cron.hourly/ #系统定时任务,每小时运行
/etc/cron.daily/ #系统定时任务,每小时运行
/etc/cron.weekly/ #系统定时任务,每小时运行
/etc/cron.monthly/ #系统定时任务,每小时运行
3.操作语法
crontab [-u user] [file]
crontab [-u user] [-e|-l|-r |-i]
选项含义如下:
-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
4.基本操作
# 基本操作
创建当前用户计划 crontab -e == vi /var/spool/cron/root #当前用户的名字
查询当前用户计划 crontab -l
删除当前用户计划 crontab -r
2.实际使用
1.文件内容详解
00 02 * * * ls
每天2:00整
00 02 1 * * ls
每月1号2:00整
00 02 14 2 * ls
每年2月14号2:00整
00 02 * * 7 ls
每周日2:00整
00 02 * 6 5 ls
每年6月的周五2:00整 (特殊)
00 02 14 * 7 ls
每月14号2:00整
每周日2:00整
这两个时间都执行
00 02 14 2 7 ls
每年2月14号2:00整
2月每周日2:00整
这两个时间都执行
2.特殊符号
特殊符号 | 说明 | 案例 |
---|---|---|
/ | 每隔多少时间 | ʺ2 * * * * 每2分钟 00 */2 * * * 每2个小时 |
- | 表示范围 | 00 08-22 * * * 08-22点的每个小时运行 00 08-22/3 * * * 08-22点的每3小时运行 |
, | 表示独立时间(没规律) | 00 08,11,14,17,20 * * * |
* | 每,全部/所有(没说具体时间) | *在分钟的位置上表示00-59,每分钟的意思 |
3.注意事项
1.命令使用绝对路径
2.书写的命令或脚本定向到空或追加到文件
3.书写定时任务的时候,尽量添加上一个注释.
4.定时任务未来避免一些故障,推荐使用脚本.
# 书写流程
1.分析要求需要什么样的命令并调试
2.书写脚本(命令较多,功能复杂)与调试
3.书写定时任务的配置文件(绝对路径,定向到空)
4.调试
3.一些案例
1.每天的上午7点到晚上11点 每二个小时运行CMD命令
* 07-23/2 * * * CMD
2.定时任务每天23点到第2天的7点运行.
00 23,00-07 * * *
3.每小时的0分执行
0 * * * * /mysql_back.sh
4.每五分钟执行
*/5 * * * * /mysql_back.sh
5.每月的1,4,6日的2点整执行
0 2 1,4,6 * * /mysql_back.sh
6.每月5日到9日的两点整执行
0 2 5-9 * * /mysql_back.sh
7.每分钟执行
* * * * * /mysql_back.sh
8.每天两点整执行
0 2 * * * /mysql_back.sh
9.每月14号的2点整执行
0 2 14 * * /mysql_back.sh
10.2月14日2点整执行
0 2 14 2 * /mysql_back.sh
11.不写月日,仅周生效。每月的周五,两点执行
0 2 * * 5 /mysql_back.sh
- 6月2日的两点整执行,6月的周五两点整执行
0 2 2 6 5 /mysql_back.sh
13.每2分钟同步下系统的时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun &>/dev/null
14.每天定时备份/etc/到/backup/下面
tar czvf `date`.bak /etc
00 01 * * *
15.每个一分钟执行创建文件的计划任务
1.准备创建脚本文件
vim /root/1.sh
/usr/bin/touch /root/`date +%F-%H-%M-%S`.txt
chmod +x /root/1.sh
2.编写任务计划
crontab -e
* * * * * /root/1.sh
3.查看创建结果
ls -l /root/
16.计划任务的权限控制
cat /etc/cron.deny
如果这个文件存在,凡是写到这个文件里面的账户不允许执行crontab命令
cat /etc/cron.allow
如果这个文件存在,没有写到这个文件里面的账户不允许执行crontab命令
如果有allow文件,那不管deny是否存在,都是只允许allow文件里面的用户
4.使用变量
1.定时备份
dir=/server/scripts/
file=backup-etc.sh
time=`date +%F_%w`
tar zcf /backup/etc-$time.tar.gz /etc/
5.常见问题
1.不推荐:周几与日期一起写.
#分时日月周,在取第几周的时候,会不会由于互相冲突,日不符合周会不会乱
2.排障(排除法)
定时任务执行失败.
没有日志.(crond服务没有运行,rsyslog服务没有运行)
没有结果.(手动运行对应的命令或脚本)
调试脚本: sh -x 或bash -x 显示脚本执行过程 (有+的表述过程,没有+表述输出)
其他原因
3.系统级任务调度与用户级任务调度
系统级任务调度主要完成系统的一些维护操作(比如定时重启机器),用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行。
6.注意事项
1.命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到.
定时任务运行脚本的时候或命令的时候,只能识别/bin和/usr/bin目录下面的命令.其他的命令无法识别.
解决方案:
🅰 简单粗暴,遇到这种命令,直接写绝对路径.
/sbin/ip a s eth0
🅱 治本,在脚本开头 重新定义下PATH环境变量或重新加载下PATH环境变量.
export
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
hostname
ip a s eth0
source /etc/profile #重新加载PATH环境变量
hostname
ip a s eth0
定时任务识别的命令的路径:
PATH linux环境变量,存放命令的位置.
linux会在PATH路径中查找,如果有则执行.如果没有提示command not found/ no such file or directory
2.定时任务没有定向到空或追加到文件故障案例
现象:
邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root
邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因:
定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root.
解决:
定时任务中命令或脚本定向到空或追加到文件.
3.命令执行不全
例:* * * * * tar zcf /`data +%F`.tar.gz /etc &>/dev/null
发现命令只会执行到+就停止了
#在定时任务中,%相当于回车
#加\或者写脚本解决
4.通过uptime取出的cpu负载老是获取不到
update取值,取最后的1,5,15要倒着取,因为up的天数不稳定,刚启动有分钟,超过60分钟有小时和分钟,超过24小时有天。
7.实战案例
1.定时备份/etc/目录到/backup以ip地址命名的目录中
书写脚本+变量
取出ip存放变量 ✅
取出时间存放到变量 ✅
创建以ip命名目录 ✅
打包压缩存放到这个ip地址命名的目录中,压缩包加上时间 ✅
书写定时任务(每分钟)
书写定时任务(改为指定时间)
cat backup.sh
ip=`hostname -I |awk '{print $1}'`
time=`date +%F_%w`
#dir=/backup/$ip
#full_file=$dir/etc-$time.tar.gz
mkdir -p /backup/$ip
tar zcf /backup/$ip/etc-$time.tar.gz /etc/
2.定时系统巡检(定时输出系统基本信息)写入到/tmp/sys.log中
主机名信息(主机名)
ip地址
负载信息(0 0 0)
内存信息(内存多大,用了多少,剩余多少)
cpu信息(核心数)
磁盘信息(磁盘使用多少,剩余多少)
进程信息(一共多少进程,几个运行,几个挂起,几个僵尸)
#################################
主机名: xiaoyuedu ip地址: 10.0.0.200
#################################
负载信息
最近1分钟: 0
最近5分钟: 0
最近15分钟: 0
#################################
内存信息(单位kb)
总计内存: 2000000
内存使用了多少: 200000
内存使用率: 10%
#################################
swap信息
swap总大小: 200000
swap使用大小: 0
swap使用率: 0
#################################
磁盘信息
几块硬盘: 1
根分区大小: 20G
根分区使用率: 10%
################################
进程信息
进程总数: 100
运行中进程: 2
挂起进程数量: 0
僵尸进程数量: 0
################################
三、时间
1.date
date 功能描述:显示当前时间
date “+%Y” 功能描述:显示当前年份
date “+%m” 功能描述:显示当前月份
date “+%d” 功能描述:显示当前是哪一天
date “+%Y-%m-%d %H:%M:%S” 功能描述:显示当前年-月-日 时:分:秒
date +%w 周数
date +%F 完整的日期
date +%T time
2.修改系统时间 修改当前时间
date --set="20240613 00:00:00"
3.同步时间为北京时间
yum install -y ntp
systemctl restart ntpd
sed -i '/server 3.centos/aserver ntp1.aliyun iburst' /etc/ntp.conf
timedatectl set-timezone Asia/Shanghai
systemctl restart ntpd
date
4.date的参数
-d 根据说明修改时间
date -d '-1 day'
date -d '-1 day' +%F_%w_%H
-s 手动修改时间
date -s '20221111 11:11:11'
date -s '20221111'
5.ntpdate
date -s '20221111'
yum install -y ntpdate
ntpdate ntp1.aliyun
date
# 修改时区
timedatectl set-timezone Asia/Shanghai
# 查看时区
timedatectl status
# 进行时间同步
ntpdate ntp1.aliyun
6.面试题
创建带日期的文件案例
7.linux文件时间的分类
linux文件时间 | 说明 |
---|---|
mtime | modify 修改时间,最常用 |
atime | access 访问时间 |
ctime | change 文件属性的变化时间 |
8.查看文件信息
stat 查看文件的属性信息+文件名
十一、日志管理
一、日志介绍
1.常见日志
# tail -10 /var/log/messages //系统主日志文件
# tail -f /var/log/messages //常见的系统和服务错误信息
# tailf /var/log/secure //登陆的时候被记录。分析是否有恶意登陆情况.
# tail /var/log/yum.log //yum
# tail /var/log/maillog //跟邮件postfix相关
# tail /var/log/cron //crond、at进程产生的日志
# tail /var/log/dmesg //和系统启动相关
# tail /var/log/audit/audit.log //系统审计日志
# tail /var/log/mysqld.log //MySQL
# tail /var/log/xferlog //和访问FTP服务器相关
# tail /var/log/wtmp //该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看(命令:w)
# tail /var/log/btmp //记录Linux登陆失败的用户、时间以及远程IP地址(命令last)
# tail /var/log/lastlog //所有用户的登录情况(命令lastlog )
# tail /var/log/boot.log //系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息
2.rsyslog
# 默认已安装
systemctl start rsyslog.service
rpm -qc rsyslog
/etc/rsyslog.conf rsyslogd的主配置文件(关键)告诉rsyslogd进程什么日志,应该存到哪里。
/etc/sysconfig/rsyslog rsyslogd相关文件,定义级别(了解一下)
/etc/logrotate.d/syslog 和日志轮转(切割)相关(任务二)
# 主配置文件
告诉rsyslogd进程什么日志,应该存到哪里。
vim /etc/rsyslog.conf
RULES:即规则,是一套生成日志,以及存储日志的策略。
RULES由FACILITY+LEVEL+FILE组成。(由设备+级别+存放位置)
二、logrotate
为了节省空间和整理方便,日志文件经常需要按!时间或!大小等维度分成多份,删除时间久远的日志文件。
# 按照配置进行轮转
# 主配置文件:/etc/logrotate.conf
=========全局设置==========
weekly //轮转的周期,一周轮转
rotate 4 //保留4份
create //轮转后创建新文件
dateext //使用日期作为后缀
#compress //是否压缩
include /etc/logrotate.d //包含该目录下的子配置文件
=========单独的日志设置==========
/var/log/wtmp { //对某日志文件设置轮转的方法
monthly //一月轮转一次
minsize 1M //最小达到1M才轮转,monthly and minsize(同时达到两个条件)
create 0664 root utmp //轮转后创建新文件,并设置权限
rotate 1 //保留一份
}
/var/log/btmp {
missingok //丢失不提示
monthly //每月轮转一次
create 0600 root utmp //轮转后创建新文件,并设置权限
rotate 1 //保留一份
}
# 配置轮转规则
missingok //对应文件如果不存在,他不会报错
maxsize 30k //达到30k轮转, daily or size
yearly //或者一年一轮转
daily //缩小周期到1天
rotate 3 //轮转切割3次,意思是保留3天的,超过3天的就删了
compress //压缩
delaycompress //隔一天再压缩
notifempty //如果文件空的就不管
create 640 nginx nginx //切割之后的文件权限
# 强制轮转
logrotate -s /var/log/logrotate/logrotate.status /etc/logrotate.conf
# 默认调用
logrotate 每天会根据配置文件进行调用
三、看报错
1.抓哪些日志的核心
failed, failure,error
/var/log/secure中 查看,Failed password
十二、网络管理
一、网络设备
1.交换机
- 在一个交换机的端口上所连接的所有终端设备,均在一个网段(局域网 LAN)上
- 产生广播消耗设备CPU资源
- 企业级交换机会有一些基本的安全功能,这种交换机叫网管功能的交换机
- 了解:广播域的隔离(创建VLAN 虚拟局域网)
- 了解:交换机可以隔离冲突域,每一个端口就是一个冲突域
2.路由器
- 路由协议的转发(路由选路,指路)
- 数据转发,会维护一个路由表(相当于一个地图)
- 路由器会作为网关(数据的出入口,类似于大楼的大门),一般会在网络出口的位置摆放一台路由器
- 路由器用于连接广域网(公网)
3.通用网站网络架构
- 核心层接入,使用三层路由:ER3260G2
- 核心层使用三层交换机分发
- 汇聚层使用一般交换机进行vlan的划分
- 接入层扩展网口使用傻瓜交换机即可
二、OSI七层模型
1.什么是OSI七层模型
用于规定数据在发送,传输,阅读的流程.
2.哪七层
应用层 应用程序/原始数据/ #大部分软件运行在这一层
表示层 格式/压缩/加密 #负责格式/压缩/加密
会话层 会话/全双工/半双工 #负责会话管理,维护
传输层 分段/重组/端口号 #负责数据传输方式
网络层 IP地址/寻址/路由 #主要负责路由与寻址
数据链路层 MAC地址/局域网/ #将分组数据封装成帧
物理层 传输介质/比特流 #将数据转换成2进制形式,通过线缆传输
五六层不用管干啥的
3.应用层
大部分软件,服务运行在应用层中.
暴露很多接口,提供给其他服务软件使用.主要就是提供应用程序可以接入网络的接口,并根据程序的不同对应不同的接口协议.
接口: 别人定义好的规范.usb接口一样,这里的接口指的是软件的接口,用于软件之间,服务之间相互使用.
比如http,https,smtp(25,465),dns(53)
4.传输层
负责建立端到端的连接和断开,保证报文在端到端之间的传输
协议有tcp和udp
5.网络层
负责将数据从源地址传输到目的地址
主要负责: 主要作用就是路由(指路)和寻址(根据ip地址找人)
- 提供ip地址(DHCP).
- 进行路由(问路,指路)(路由表)
6.数据链路层
把上层数据进行转换转换为帧(对数据进行处理与加工).
这一层加工数据的时候,增加了MAC地址.
负责数据可以在局域网传输(精确传输). 局域网传输的时候使用的是mac地址
7.查看路由表
ip ro
route -n
8.物理层
通过设备的网卡把上面的数据转换为网络介质中可以传输的信号.
把数据转换为0101010内容,通过传输介质传递给对方.
9.传输过程
数据从应用层发出,传输层添加一层tcp报头(源端口和目标端口),网络层添加ip报头(源ip和目标ip),数据链路层加帧头(源mac地址和目标mac地址),物理层转换成比特流。传输过去之后,对方就会解包。整个过程就是封包和解包的过程
10.wireshark的使用
1.上方搜索框搜索http协议,可以过滤
2.随便点开一个带路径的包,就有七层模型的信息了
3.其他协议抓包,比如ssh
4.tcp.port==9999 过滤指定端口
11.TCP/IP模型
应用层
传输层
网络层
网络接口层
12.目前开发书写代码的模板
java: springboot,springcloud
python: Django, Flask
Php: Thinkphp
三、三次握手和四次断开
1.重点
与服务的端口建立连接的流程
tcp三次握手的目标:与端口建立连接
udp没有3此握手建立连接的过程,直接连接
2.三次握手核心
有个确认流程:保证数据不会丢,如果丢失重新发送
3.文字描述3次握手流程
1.客户端发出建立连接请求: SYN建立连接请求 . 发出seq的随机数(seq=100).
2.服务端收到客户端请求: ACK(确认),SYN(与客户端建立连接) , 发ack=seq+1(101),seq=随机(666)
3.客户端收到服务端请求与确认: 发出ACK确认建立连接 , 发出 ack=seq+1(667),seq=ack(101)
4.到此,连接建立,开始传输数据
#ack就是确认的意思
4.四次挥手目的
4次挥手目的是断开连接
5.4次挥手流程
1.客户端: 发出断开连接请求: (FIN) 断开连接请求,seq=1000 ack=668
2.服务端: 收到客户端请求,确认: (ACK) ,确认断开, seq=668 ack=seq+1(1001)
3.服务端: 向客户端发出断开连接请求,(FIN)断开连接请求, seq=668 ack=seq+1(1001)
4.客户端: 确认收到请求,断开连接, (ACK)确认收到请求, seq=1001 ack=seq+1(669)
5.连接断开
#未来大多数是服务端发出的4次回收
6.三次握手抓包分析
#wireshark+nc
nc -lvvp 9999
nc -lu 9999 #建立udp的端口
抓包之后呢,筛选出9999端口
1.SYN的第一个数据包,写的SYN=0,是方便给人观看的,实际数据进入数据包,起始行有源端口和目标端口Seq:0,seq的原始的值(raw)。但是此时ack原始的值就是0。Flags是标记,意思是要干嘛。这里就是SYN的标记。
2.SYN,ACK的数据包,写的seq=0,Ack=1.进入数据包查看,端口反过来了,Seq:0,ack:1。
seq的值和它的原始值。ack的值(wireshark帮我们整的一个相对值1)和原始的值,就是上一个seq+1。Flags标记SYN,ACK
3.ACK的数据包。写的Seq=1,Ack=1。进入数据包查看,端口又反转了。Seq的值和原始值,Ack的值和原始值,Flags标记SYN,ACK
4.带PSH标志的,就是传输数据
7.四次断开抓包
#其实还是沿用的上一个抓包数据
1.FIN,ACK: Seq:1,Ack:16
2.ACK: Seq:16,Ack:2
3.FIN,ACK: Seq:16,Ack:2
4.ACK: Seq:2,Ack:17
8.常见的TCP中的标记位
TCP标记位 | |
---|---|
SYN | sync,同步请求,与服务器端口建立连接 |
ACK | ack, 确认.(回复:收到.) |
FIN | finnish/final 结束,断开连接 |
PSH | 表示传输数据 |
ack与seq | |
---|---|
seq | sequence 序列号,随机 |
ack | ack,确认号 |
9.什么样的使用tcp,什么样的使用udp
#tcp
web浏览器,电子邮件,文件传输协议
#udp
视频,域名系统,ip语音
10.为什么UDP就是不安全的
数据包的结构导致的
TCP:数据,端口,seq,ack,标记
UDP:数据,端口
11.三次握手实时抓包
#1.
Transmission Control Protocol, Src Port: 58470, Dst Port: 9999, Seq: 0, Len: 0
Source Port: 58470
Destination Port: 9999
Sequence Number: 0 (relative sequence number)
Sequence Number (raw): 336279127
Acknowledgment Number: 0
Acknowledgment number (raw): 0
Flags: 0x002 (SYN)
#2.
Transmission Control Protocol, Src Port: 9999, Dst Port: 58470, Seq: 0, Ack: 1, Len: 0
Source Port: 9999
Destination Port: 58470
Sequence Number: 0 (relative sequence number)
Sequence Number (raw): 3119721423
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 336279128
Flags: 0x012 (SYN, ACK)
#3.
Transmission Control Protocol, Src Port: 58470, Dst Port: 9999, Seq: 1, Ack: 1, Len: 0
Source Port: 58470
Destination Port: 9999
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 336279128
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 3119721424
Flags: 0x010 (ACK)
12.四次握手实时抓包
#1.
Transmission Control Protocol, Src Port: 9999, Dst Port: 58472, Seq: 1, Ack: 1, Len: 0
Source Port: 9999
Destination Port: 58472
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 3049096138
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 463559273
Flags: 0x011 (FIN, ACK)
#2.
Transmission Control Protocol, Src Port: 58472, Dst Port: 9999, Seq: 1, Ack: 2, Len: 0
Source Port: 58472
Destination Port: 9999
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 463559273
Acknowledgment Number: 2 (relative ack number)
Acknowledgment number (raw): 3049096139
Flags: 0x011 (FIN, ACK)
#3.
Transmission Control Protocol, Src Port: 9999, Dst Port: 58472, Seq: 2, Ack: 2, Len: 0
Source Port: 9999
Destination Port: 58472
Sequence Number: 2 (relative sequence number)
Sequence Number (raw): 3049096139
Acknowledgment Number: 2 (relative ack number)
Acknowledgment number (raw): 463559274
Flags: 0x010 (ACK)
#这是系统强制断开
四、TCP11种状态
1.所有状态
#核心必会
CLOSED,ESTABLISHED,LISTEN,TIME_WAIT,CLOSE_WAIT
#逐渐掌握
FIN_WAIT1,FIN_WAIT2,CLOSING,SYN_SENT,SYN_RECV,LAST_ACK
2.CLOSING状态表示:
客户端发了FIN,但FIN_WAIT1状态时没有收到服务器的ACK确认字段,却收到了服务器的FIN字段,这种情况发生在服务器发送的ACK
丢包的时候,因为网络传输有时会有意外。
3.三次握手状态变化
01.首先,建立连接之前服务器和客户端的状态都为CLOSED。
02.服务器创建socket后开始监听((服务端启动后)启动服务),变为LISTEN状态。
03.客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT。
04.服务器收到客户端的报文后向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD(收到了客户端发送的SYN请求)。
05.然后,客户端收到ACK、SYN,就向服务器发送ACK,客户端状态变为ESTABLISHED
06.服务器收到客户端的ACK后也变为ESTABLISHED。
4.四次挥手变化
01.客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1。
02.服务器收到FIN后向客户端发送ACK,服务器状态变为CLOSE_WAIT。
03.客户端收到ACK后就进入FIN_WAIT2状态。此时连接已经断开了一半了。如果服务器还有数据要发送给客户端,就会继续发送。
04.直到发完了,就发送FIN报文,此时服务器进入LAST_ACK状态。
05.客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态,再过了2秒长的时间后进入CLOSED状态。
06.服务器收到客户端的ACK就进入CLOSED状态。
#谁先主动谁承担客户端的角色
5.哪种状态会比较多
1.ESTAB,生产环境这个多
2.TIME_WAIT, CLOSE_WAIT,等待断开的状态也会比较多,一般来说这些状态会比ESTAB高,但是高的异常的话,就是开发代码有问题了。
五、常见网络协议
1.DNS
1.DNS解析流程
1.查询hosts文件
2.查询本地DNS缓存
3.询问本机DNS地址(网卡配置的)
4.本地DNS直接询问根域名解析服务
5.根域名解析服务:不知道,去问cn服务器吧
6.询问CN服务器知否知道域名对应的ip
7.CN服务器指向二级域名
8.二级域名询问三级域名
9.三级域名先把ip告诉了本地DNS,然后再告诉本地的主机,如果是windows系统顺便还做缓存
#根只记顶级域名,顶级只记二级,二级只记三级
#一般不会去访问顶级域名,在本地DNS就解决了,比如阿里的DNS。
2.域名结构
根域名 . 域名的开头 13个根
顶级域名
二级域名 jd centos
三级域名 www.jd m.jd
3.显示windows的dns缓存
ipconfig /displaydns
#清空
ipconfig /flushdns
4.windows hosts文件
C:\Windows\System32\drivers\etc\hosts
5.解析ip地址
dig www.baidu
#强制从根找ip地址
dig +trace www.baidu
a.root-servers.
#指定DNS服务器
dig @223.6.6.6 www.baidu
6.linux无法上网的故障
#通过域名访问: ping域名 dig解析域名 报错. yum安装软件失败
#ping 公网ip可以访问的.
#提示Name or service not known
直接添加域名服务器
2.ARP协议
ARP协议是三层协议,进行mac地址解析,但是工作在2层
1.解析流程
1.发出arp请求,发送广播找人 谁知道10.0.0.2的mac地址,请告诉10.0.0.200
2.单播:所有局域网的设备都收到广播,只有10.0.0.2这个机器进行响应(回复): 我是10.0.0.2 我的mac地址是xx:xx:xxxxxxxx
3.缓存mac地址
2.查看arp解析
arp
arp -n #-n是不要解析部分ip成域名
3.删除arp缓存
arp -d 10.0.0.12
3.ICMP: Internet控制报文协议
1.ping之后为什么没有回应
1.对方丢弃了数据包
2.对方挂了
3.防火墙等安全工具的拦截
4.DHCP
#自行研究
六、网卡配置
1.网卡命名
1.命名规则
ens33
eth0
2.修改网卡名的方法
方法01:安装系统的时候修改 net.ifnames=0 biosdevname=0
#install centos7的时候按个tab键
方法02:安装完成系统
3.在系统中如何修改网卡名字
#1.修改配置文件
vim /boot/grub2/grub.cfg
搜索linux16的行,在这行结尾加上
net.ifnames=0 biosdevname=0
#如果是两行,那么两行都改
#2.修改网卡名字
mv ifcfg-ens33 ifcfg-eth0
#3.修改网卡名字里面的内容
sed -i 's#ens33#eth0#g' /etc/sysconfig/network-scripts/ifcfg-eth0
##一般就是DEVICE和NAME
#4.重启linux系统
2.网卡配置文件
TYPE="Ethernet"
BOOTPROTO="static" ##网卡固定ip还是自动获取ip,分DHCP或者static,none
UUID= #设备的唯一标识符,默认可以删除,删除之后会自动分配
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes" #开机自启
IPADDR="10.0.0.11"
NETMASK="255.255.255.0"
GATEWAY="10.0.0.2" #看具体路由器设置,一般都是1 或者254
DNS1="10.0.0.2"
PREFIX=24 #与NETMASK一样
3.DNS配置文件
- 网卡配置文件DNS1,DNS2 优先
- /etc/resolv.conf 实时生效,重启网卡则被网卡配置文件覆盖
4.访问网站的流程
1.DNS解析过程:域名--> IP
2.与对应服务器的端口(80或443)建立连接: 3次握手
3.数据的请求与响应(http协议,传输数据)(第2个阶段展开)
4.断开连接:4次挥手.
5.局域网上网原理
1.本机ip访问公网目标ip,但是在路由表中没有公网ip的地址,于是把数据包交给了默认网关。
2.默认网关拿到数据包之后,会把数据包经过地址转换,转换成公网ip地址之后,继续寻找目标ip地址的路由表,如果没有继续交给上级路由器
3.经过层层寻找之后,找到了目标ip
4.在数据返回的时候,会按原路返回,找到发送请求的局域网ip地址
#改ip的功能,在网络上被称为NAT功能,网络地址转换
#如果是虚拟机,那么就相当于多了一层NAT
6.虚拟机上网原理
1.安装vmware后创建虚拟网卡,在windows下面(vmnet8)
2.设定vmware虚拟交换的网段(虚拟网络编辑器里面设置的)
- 2.1网段范围:圈定主机能使用的内网ip地址
- 2.2掩码:在这个网段内能使用的主机有多少个:
3.windows vmnet8虚拟网卡会自动获取1个局域网ip: 10.0.0.1
4.安装Linux服务器,选择网络模式为NAT,设定ip地址:10.0.0.200
5.使用windows xshell远程工具连接Linux服务器
- 5.1向10.0.0.200发送建立连接请求:
- 5.2查询系统中去往10.0.0.0/24最近路线-- >vmnet8;(问路与指路)
- 5.3请求会通过vmnet8发送出去;
- 5.4 vmnet8将请求转发给了虚拟交换机;
- 5.5发起广播,谁是10.0.0.200;
- 5.6 10.0.0.200响应,数据报文被接受收
- 5.7 10.0.0.200构建响应报文,回传给10.0.0.1;
7.网卡管理命令
1.常见网络管理的命令
nmcli
nmtui
2.修改主机名
# 1.临时修改
hostnamectl set-hostname qianfeng.example
# 2.永久修改
vim /etc/hostname
3.查看ip地址
# 单独查看eth0
ifconfig eth0
ip a s eth0
4.配置ip
ifconfig eth0 10.0.0.2/24 # 会覆盖旧的ip
ifconfig eth0:0 10.0.0.2/24 #子网掩码可以不写
ip addr add 10.0.0.2/24 dev eth0
# a添加 d删除
ip a a 10.0.0.2/24 dev eth0
ip a d 10.0.0.2/24 dev enp0s25
5.启动关闭网卡
ifconfig eth0 up
ifup eth0
ifconfig eth0 down
ifdown eth0
七、网络管理命令
1.检查端口是否开启
1.软件包
yum install -y net-tools lsof nethogs iftop telnet nc nmap
2.检查端口–是否存在22端口
ss -lntup |grep 22
netstat -lntup |grep -w 22
# -l显示的更全一些
# -n 不要把ip反向解析为主机名、域名。
# -t 显示tcp
# -u 显示udp
# -p 显示服务,甚至显示pid
lsof -i :22
lsof -nPi :22
# -P 不要把端口解析为对应的服务。
#最好使用ss,如果访问量巨大,netstat可能会卡
3.检查是否可以访问22端口
#1.telnet
telnet 10.0.0.200 22 #命令行中推荐使用,检查是否有connected 标记。
#2.nc
nc -v 10.0.0.200 22
nc -v www.baidu 80 #这个一般用于shell脚本中检查端口是否开启.输出少
#3.nmap
nmap -p22 10.0.0.200
4.nmap进阶使用
nmap -p1-1024 10.0.0.200
nmap -p22 10.0.0.0/24 jd taobao
2.检查tcp连接状态
1.查看连接数
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c
#如果是80或443端口呢
ss -ant | awk 'NR>1 && $4~/:80$/ {print $1}' | sort | uniq -c
2.压力测试
ab -n 90000000 -c 3 http://10.0.0.200/
#压测的时候 TIME_WAIT巨多
3.网络速度
1.总体速度
iftop #2s 10s 40s数据传输平均速度
iftop -n #ip反向解析为域名/主机名
iftop -i #指定网卡. 默认eth0 第1个网卡.
iftop -P #显示端口
iftop -N #不要把端口解析为服务名字
#最终使用
iftop -nNP -i eth0 #显示端口号,不要把ip解析为域名,不要把端口解析为服务, 监视指定网卡eth0
2.进程流量
查看进程的流量情况.
方法01: iftop,ss,ps 一起使用
iftop找出端口.
ss找出端口对应的进程号(pid)
ps根据pid过滤进程名字.
方法02: nethogs
nethogs
#如果网卡名不是eth0,则需要指定ens33
4.DNS解析
1.dig
2.host re.xiaoyulinux
3.nslookup www.baidu
5.追踪命令
#1.ping
#2.tracert(windows)
traceroute -nI www.baidu #默认使用udp协议,-I使用icmp协议.
#3.traceroute (linux )
八、抓包
1.为什么要抓包
未来一些网络的问题,数据传输的问题,很难直观的看出来,需要使用抓包软件查看数据传输背后发生了什么
2.常见抓包工具
wireshark 可视化抓包工具. win/mac/linux
fiddler 代理,所有流量走fiddler,然后出去.
科来
tcpdump linux自带,yum安装.
burpsuite 抓包,修改数据包.安全去使用.
3.wireshark过滤器规则
#1.抓指定协议
icmp #ping 数据包
tcp
udp
http
arp
过滤https数据包: tls
#2.抓住指定端口
tcp.port == 80 #过滤出源端口或目标端口是80的数据包.
如果是udp数据包
udp.port == 53
tcp.srcport == 80 #过滤出源端口80
tcp.dstport == 80 #过滤目标端口80
udp.srcport == 53
udp.dstport == 53
#3.抓出指定ip的数据包
ip.addr == 10.0.0.200 #过滤出源ip或目标ip是 10.0.0.200 数据包
ip.src == 10.0.0.200 #过滤出源ip10.0.0.200 数据包
ip.dst == 10.0.0.200 #过滤出目标ip10.0.0.200 数据包
#4.不固定内容的过滤-比较大小
过滤出端口小于等于1024的数据包.
tcp.dstport <= 1024
等于 ==
小于等于 <=
小于 <
大于等于 >=
大于 >
不等于 !=
#5.grep过滤,包含,正则
wire中不是所有的指标都支持正则,过滤.
需要字段的内容是字符串,才能使用正则过滤.
过滤出http协议中包含baidu数据包
http ~ "baidu"
http.host ~ "[0-9]+(|)"
http.host用户请求的域名中包含xxxx
matches 或 ~
#6.与或非-
#过滤端口号大于等于20 小于等于1024
tcp.port >=20 && tcp.port <=1024
tcp.port >=20 and tcp.port <=1024
#组合 过滤出 端口是80 并且 ip地址是10.0.0.200
and #并且 &&
or #或者 ||
! #取反
tcp.port == 80 && ip.addr == 10.0.0.200 #并且
tcp.port == 80 || ip.addr == 10.0.0.200 #或者
#tcpdump最高只支持4层
4.tcpdump抓包与wireshark对比
过滤条件 | wireshark | tcpdump |
---|---|---|
抓出指定协议 | icmp/tcp/http | icmp/tcp/udp |
抓出指定端口 | tcp.port == 80 | port 80 |
过滤出源端口 | tcp.srcport == 80 | src port 80 |
过滤出目标端口 | tcp.dstport == 80 | dst port 80 |
抓出指定ip的数据包 | ip.addr == 10.0.0.200 | host 10.0.0.200 |
过滤出源ip | ip.src == 10.0.0.200 | src host 10.0.0.200 |
过滤出目标ip | ip.dst == 10.0.0.200 | dst host 10.0.0.200 |
正则 | 字段(指标)字符串 ~或matches 匹配正则,“正则” | 无 |
与 | && 或 and | and |
或 | 或 or | or |
非 | ! | ! |
选项 | 无 | -w保存数据包 -i指定网卡 -vvv -nnn |
5.tcpdump具体使用方法
#1.过滤协议
tcpdump icmp
tcpdump -vvv -nnn icmp
#2.过滤指定端口号 80端口
tcpdump -nnn port 80
tcpdump -nnn src port 80
tcpdump -nnn dst port 80
#3.抓住指定主机
tcpdump -nnn host 10.0.0.200
#4.抓取指定ip和端口的数据包
tcpdump -nnn src host 10.0.0.200 and port 80
tcpdump -nnn dst host 10.0.0.200 and port 80
#
tcpdump -i ens33
#组合 过滤出 端口是80 并且 ip地址是10.0.0.200
and #并且
or #或者
! #取反
tcpdump无法过滤出7层的数据包 http 需要指定端口号过滤并保存,然后通过wireshark查看.
6.案例tcpdump + wireshark抓包流程
tcpdump 抓包的时候 通过-w保存
下载windows,通过wireshark分析即可
tcpdump -vvv -nn -i eth0 port 80 or port 53 -w http-des.pcap
九、IP地址
1.格式与分类
点分十进制ip(ipv4) 32位
ipv6,128位
ip地址组成:网络位(居住的校区),主机位(楼房间)
根据网络位不同划分ip地址分类.
2.子网掩码
子网掩码: 用来绝对局域网(网段中)最多有多少台机器.
PREFIX=24
NETMASK=255.255.255.0
3.公有ip地址
A类(1~126)
B类(128~191)
C类(192~223)
D类(224~239)组播
E类(240~255)科研
4.私有ip地址
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
十三、其它业务
一、邮箱
-
邮件
- 最简单的一种发送方式
-
配置发件人:163
- 获取:授权码(用户密码)
- linux配置/etc/mail.rc
- 完成
-
收件人:qq
-
通过命令发送
-
配置发件人
- 获取授权码
- vlxkwimwbqfgcbba
1.配置linux mail.rc 配置发件人信息
yum install -y mailx
vim /etc/mail.rc #写到最后
#未加密的发送方式通过25端口,可能会被公有云封掉.
cat >>/etc/mail.rc <<EOF
set from=112885471@qq
set smtp=smtp.qq
set smtp-auth-user=xiaoyu001@163
set smtp-auth-password=BGRCTL CZXIT
set smtp-auth=login
EOF
#加密的方式465端口
cat >>/etc/mail.rc <<EOF
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=lida996@163
set smtp=smtps://smtp.163:465
set smtp-auth-user=lido996@163
set smtp-auth-password=aaaa
set smtp-auth=login
EOF
set from=xiaoyu001@163 #配置发件人
set smtp=smtp.163 #配置使用163发送邮件 如果是加密smtps://smtp.163:465
set smtp-auth-user=xiaoyu001@163 #用户名:邮箱名字
set smtp-auth-password=BGRCTLKQDU IT #授权码
set smtp-auth=login #认证形式login
#下面3行用于配置加密方式进行传输
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
cat >>/etc/mail.rc <<EOF
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=112885471@qq
set smtp=smtps://smtp.qq:465
set smtp-auth-user=112885471@qq
set smtp-auth-password=vlxkwimwbqfgcbba
set smtp-auth=login
EOF
mail -s "网站挂了" 275649210@qq </etc/passwd
2.配置加密方式发送邮件错误
Error in certificate: Peer’s certificate issuer is not recognized
解决方法:
echo -n | openssl s_client -connect smtp.qq:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >/etc/pki/nssdb/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/qq.crt
certutil -L -d /etc/pki/nssdb/
cd /etc/pki/nssdb/
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
3.发送邮件
cat /backup/result.log |mail -s "今日巡检的结果" youjiu_linux@qq
mail -s '巡检' youjiu_linux@qq </backup/result.log
4.发送邮件带上附件
echo "巡检信息在附件" |mail -s "巡检结果" -a /etc/passwd 275649210@qq
一、系统使用介绍
一、操作系统
1.当前的主流linux
#1.红帽系列
RHEL
Centos
Oracle linux
Rocky
#2.debian系列
debian
ubuntu
#3.国产系列
中标麒麟
欧拉
龙蜥
#4.其它
suse
2.centos的替代品
1.RHEL
https://developers.redhat/
#yum安装需要注册才行
2.Alma linux发行版
https://mirrors.almalinux/
#重点推荐,与RHEL1:1二进制兼容,社区开源免费,有资金和其它赞助商支持.所以稳定性和后续的支持会比较友好,有技术保证和安全保证。发行速度快,基本上与redhat同步发布
3.rocky linux
https://rockylinux/zh-CN
#永久免费,社区兼容,也是与RHEL1:1兼容的。发布稍微慢一些,资金支持也差一些。但是用起来差不多。
3.麒麟系统的特点
1.第一次开机需要手动接受许可证
2.9090端口有个自带的监控。有系统,日志,存储,网络,账户,等等信息
4.ubuntu的特点
1.ubuntu默认不能root登陆,只能用别的用户名登陆
2.每次启动完之后,登录页面会加载一些其他的东西
二、系统操作
1.快捷键
光标移动到行首 ctrl a
光标移动到行尾 ctrl e
把光标所在位置到行首的内容剪切(删除) ctrl u
把光标所在位置到行尾的内容剪切(删除) ctrl k
关机 shutdown -h now halt poweroff init 0
重启 shutdown -r now reboot init 6
退出当前用户 ctrl d
锁屏 ctrl + s
解锁 ctrl + q
让当前命令挂起 ctrl + z
2.服务器安装的标准步骤
开机.
配置远程控制卡.
配置raid(raid卡实现) 系统raid 1 剩余raid 5 .
安装系统(U盘安装) 如果大量服务器装机,可以通过cobbler批量装机.
正常安装系统即可.
根据要求部署服务.
关闭.
物理服务器上架.(物理服务器放在机柜上过程)
3.shell是什么
shell的本意是“壳”的意思,其实已经很形象地说明了shell在Linux系统中的作用。shell就是围绕在Linux内核之外的一个“壳”程序,用户在操作系统上完成的所有任务都是通过shell与Linux系统内核的交互来实现的。
shell--OS--内核
4.查看内核信息
uname
uname -a
uname -r
5.安装系统时修改网卡信息
net.ifnames=0 biosdevname=0 #填写在安装系统之前
centos7开始网卡名字变了,ens33 xxxx
网卡名字统一,如果不统一未来服务软件,命令则可能无法使用
一般统一为eth0 eth1形式
vim /boot/grub2/grub.cfg 文件里有两个linux16
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8
改为
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap net.ifnames=0 biosdevname=0 rhgb quiet LANG=zh_CN.UTF-8
如果安装系统之前修改,那么改完就可以了,如果安装系统之后才改,那么也要修改网卡配置文件
二、文件管理
一、目录结构与配置文件
1.linux目录结构
bin 普通用户使用的命令 /bin/ls, /bin/date
sbin 管理员使用的命令 /sbin/service
dev 设备文件 /dev/sda,/dev/sda1
root root用户的家目录
home 普通用户家目录
tmp 临时文件(全局可写:进程产生的临时文件)
var 存放的是一些变化文件,比如数据库,日志,邮件....
media 移动设备默认的挂载点
mnt 手工挂载设备的挂载点
etc 配置文件(系统相关如网络/etc/sysconfig/network
proc 虚拟的文件系统,反映出来的是内核,进程信息或实时状态 ,硬件的状态
usr 系统文件,相当于C:\Windows
usr/local 软件安装的目录,相当于C:\Program
boot 存放的系统启动相关的文件,例如kernel,grub(引导装载程序)
lib 库文件Glibc
lib64 库文件Glibc
2.proc目录介绍
#proc这个目录存放的是系统的各种内存中的进程信息,linux内核配置,系统信息
/proc/cpuinfo # cpu信息 cpu壳数,核心数
/proc/meminfo # 内存信息
/proc/loadavg # 负载信息
/proc/mounts # 挂载信息
/proc/cmdline # 内核
# 这是个虚拟目录,不会占用磁盘空间
# 当运行程序时,自动在proc目录下生成此pid的文件夹,并在此pid结束时消失
3.查看cpu信息
一般用lscpu查看
socket:cpu颗数
二、文件管理基本命令
1.文件,文件夹的基本使用
1.创建文件夹
mkdir
#-p 创建目录,当没有上一级时,自动创建
#-v 显示创建目录的过程
2.复制
cp -r #复制目录及其内容
cp -d #可以复制软连接
cp -p #复制的时候保持属性不变
cp -a #复制所有,相当于drp
3.删除
rm
r --强制递归
f --无需询问
4.查看文件/文件夹
ls -l
ls -t 按照修改时间排序.
ls -r 逆序排序,一般-rt 一起用.
ls -h 以人类可读形式显示大小
5.显示文件内容及行号
cat -n
6.进入目录的命令
cd - #返回上次所在目录
cd ..#进入上层目录
cd ~ #进入家目录
cd . #当前目录,一般与复制移动一起用
7.移动的命令
#/xiaoyu 与 /xiaoyu/ 目前大部分情况下是没有区别的。
mv file ...... dir
8.统计文件夹的大小
du -sh /etc
du -h /etc
-s 不要显示目录中所有的子目录了,只显示汇总信息,不显示所有查看指定目录所占的空间.(block)
2.vim编辑器
1.操作快捷键
#页首
gg
#页尾
G
#行首
^ 0
#行尾
$
#复制
yy
#粘贴
p
#删除
dd
#撤销
u
#从下往上搜索
?
#向上翻页
page up
# 回到最顶端
home
# 跳转到第10行
10gg,10G,:10
#上下左右
h上
j右
k左
l下
2.文件操作
#另存为
w 1.txt
# 行号
set nu
set nonu
3.vim的模式
1.刚进入是命令模式,比如dd gg G
2.编辑模式
3.底行模式,输入:,用于替换,搜索,保存退出
4.可视化模块:批量编辑
4.批量操作行
shift + v
案例01 批量删除文件开头的#
按ctrl + v,进入批量操作模式
选择要操作的区域
然后按d,删除.
案例02 批量给文件开头增加内容 #xiaoyu
按ctrl + v,进入批量操作模式
选择要操作的区域
选完后,按shift + i (I),进入编辑模式
写入内容
按esc等待.
5.搜索
/
6.替换
1,5 s///
% s///
7.vim与vi的区别
最大的区别是vi没有颜色
还一个就是vi只能批量删除,不能批量添加
8.vim中每个插入的区别
i当前位置前插入
I行首插入
a当前位置后追加
A行尾追加
o在当前行之下新开一行
O在当前行之上新开一行
9.vim生成了swp文件怎么办
#1.删除临时文件
#2.恢复未保存数据
vim -r xiaoyu.txt
rm -f .xiaoyu.txt.swp
#重新打开文件即修复了.
#一般用不到,正常都是写好之后发送过去文件,因为这种恢复不一定能完全恢复
三、文件类型
1.常见文件类型
-普通文件
d目录文件
b存储设备文件
c终端设备文件
l链接文件
s套接字文件socket文件
p管道文件
2.查看文件的属性信息
stat /etc/passwd
3.查看文件的类型
file
file /etc/hostname /var/log/wtmp /bin/ls
有普通文件,数据文件,二进制文件
4.etc下常用的文件
hostname 存放主机名
hosts 主机名与ip的对应关系
sysconfig/network-scripts/ifcfg-ens33 网卡配置文件
/etc/rc.local 开机自启动的文件
/etc/fstab 开机自动挂载
/etc/motd 文件内容会在用户登陆的系统后显示
/etc/issue 用户登陆系统前显示
5.ls -l详解
-rw-r--r--. 1 root root 16 6月 15 16:49 adjtime
第1位: 文件类型
第2-10位: 基本权限
第11位: selinux相关
第12位:
第12,13位:用户用户组
第14位: 文件的大小
第一列:文件类型,基本权限,selinux相关
第二列:硬链接数,即多少个文件指向同一个索引节点
第三列:用户
第四列:用户组
第五列:文件大小
第六七八列:月、日、时、分格式。如果更久,会显示年、月、日
最后一列:文件名
#第五列如果是文件夹,通常只显示文件系统默认block的大小。因为这是因为目录本质上是一个文件,存储了该目录中文件和子目录的列表的inode号。大小可以随着目录中内容的增多而增加,但这与实际文件内容大小无关。
6.ls -il详解
#在上一个基础上,第一列添加了inode号
7.selinux
#应用访问控制系统
在linux操作系统中,SELinux提供了一个安全精细化的策略规则,这个类似于网络中的ACL规则,用于对文件进行访问控制。
四、查看文件
1.head
head -n5
head -n 5
head -5
2.tail
tail -n5
tail -5
tail -f
3.less
q 退出
空格或f 下一页
b 上一页
G 最后一行
g 第一行
99g 第99行
/内容 搜索, n向下搜索,N向上搜索
# 选项
less -N 显示行号
4.more
功能不如less多
5.为什么要用这些命令
如果使用cat查看,会刷屏根本停不下来.
如果使用vi/vim查看,从磁盘中加载到内存,占用系统内存,很容易导致系统内存不足.
五、特殊符号
1.管道符号
1.进程管道的意义是什么
指令1的标准输出,作为指令2的标准输入
2.tee管道是什么意思
# 三通管道,即交给另一个程序处理。又保存一份副本
cat /etc/passwd |tee 88.txt | tail -1
# 如果tee 后不带文件,则将结果输入到终端
tee 默认是清空, -a 是追加
3.参数传递 Xargs的作用
# cp rm一些特殊命令就是不服其他程序。
touch /home/file{1..5}
cat >files.txt << EOF
/home/file1
/home/file3
/home/file5
EOF
cat files.txt |rm -rvf
#失败
cat files.txt |xargs rm -rvf
#成功链接rm命令
# xargs其作用是将查找内容一列变为1行
4.|&的使用场景
# 有的输出会被管道符认为是错误输出,所以传递不过去,需要加&
比如curl
2.重定向
1.正确输出
1>等价于 >
1>> 等价于>>
2.错误输出
2>
2>>
3.正确与错误一起输出
ls /home/ /aaaaaaaaa &>list.txt
ls /home/ /aaaa 1>yes.txt 2>no.txt
ls /home/ /aaaa >file 2>&1
4.输入重定向
< 等价 0<
# 输入重定向发送邮件
mail -s "test01" alice < word.txt
# 原理:利用输入重定向,把文件内容代替人为的输入。
六、链接文件
1.如何创建软链接,软连接的特点是什么样的
touch 111.txt
ln -s 111.txt 1.ttt
# 总结
软连接像快捷方式,可以对文件和目录做软连接。
软连接记录的只是源文件的路径。
软连接失去源文件不可用。
2.硬链接的特点
1 创建同分区硬链接成功,创建不同分区硬链接失败。
2 硬链接删除源文件,依然可以用
3 不允许将硬链接指向目录
4 inode号相同
3.软连接实际作用
未来可以设计基于软连接的升级与回滚流程
- 升级:删除旧的软连接,创建软连接指向新的版本即可.
- 回滚:删除旧的软连接,创建软连接指向旧的可用的版本即可.
4.如果源文件被删除或改名或移动走,软连接会如何?
红色闪烁
七、打包及压缩
1.tar的参数与常用命令
-z gzip
-j bzip
-J xzip
-f 文件,指定压缩包,f选项放在这几个选项的最后
-v 显示过程
-c 创建压缩文件
-x 解压缩
-C 重定向到
-t 查看
tar -czvf data-20240208.tar.gz /data/
tar -tf data-20240208.tar.gz /data/
2.gzip
# 一般配合其它命令使用
touch xiaoyu001.txt
gzip xiaoyu001.txt
ll xiaoyu001.txt.gz
# 解压
gzip -d xiaoyu001.txt.gz
#只能对文件进行压缩,不能压缩目录
3.zip、unzip
zip -r etc.zip /etc/
-r用于压缩目录
upzip etc.zip
4.tar命令的安全保护机制是怎么样的,怎么解决
tar: Removing leading `/' from member names
因为我们打包的目标目录或者文件是绝对路径,为防止压缩包中保留绝对路径,解压的时候可能发生覆盖,导致数据,配置丢失。
# 避免提示:使用相对路径打包
tar zcf /tmp/etc.tar.gz etc/
三、用户管理
一、用户管理
1.passwd目录结构
用户名,密码占位符,uid,gid,描述,家目录,登录shell
2.创建用户useradd的参数有哪些
#指定uid
-u
#指定默认组
-g
#指定附加组
-G
#指定家目录
-d
#登录shell
-s
#指定到期时间
-e 2010-03-01
#不创建家目录
-M
3.删除用户
#连同家目录一起删除
userdel -r
4.修改用户选项
usermod -s /sbin/nologin user02
5.shadow文件
1.用户名
2.加密之后的密码
3.过期时间等等信息
#用户影子文件,由于/etc/passwd文件是所有用户都可读的,这样就导致了用户的密码容易出现泄露,因此,linux将用户的密码信息从/etc/passwd中分离出来,单独的放到了一个文件中,这个文件就是/etc/shadow,该文件只有root用户拥有读权限。
6./etc/login.defs文件
用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。
7./etc/default/useradd
定义了新建用户的一些默认属性,比如用户的主目录、使用的shell等等,通过更改此文件,可以改变创建新用户的默认属性值。
8./etc/skel文件
目录定义了新建用户在主目录下默认的配置文件,更改/etc/skel目录下的内容就可以改变新建用户默认主目录的配置文件信息。
二、用户组管理
1.组成员管理
# 将用户追加到组
usermod -aG 组名 用户名
# 将用户覆盖到组
usermod -G 组名 用户名
# 将用户移除组
gpasswd -d 用户名 组名
2.用户组
# 创建组指定gid
groupadd hr -g 1007
# 删除组
groupdel hr
3.group组文件
1.用户组的名字
2.密码
3.gid
4.默认是空,这个组有什么额外的用户
三、su与sudo
1.sudo
1.如何配置
visudo == vim /etc/sudoers
#visudo的好处是这个工具会替你检查你写的语法,填写错误给提示
2.sudoers格式
#who where whom command
xiaoyu ALL=(ALL) /bin/cat, /bin/head, /bin/tail, /bin/less,/bin/more, /bin/grep
#xiaoyu 用户
#ALL 表示从任何的主机上都可以执行,也可以这样 192.168.100.0/24
#(ALL) 是以谁的身份来执行,ALL就代表root可以任何人的身份来执行命令
#ALL 表示任何命令。
3.查看权限
grep xiaoyu /etc/sudoers
sudo -l
4.授权所有命令不需要输入密码
xiaoyu001996 ALL=(ALL) NOPASSWD:ALL
grep xiaoyu001996 /etc/sudoers
5.sudo参数
sudo -u sshd touch /tmp/mysshd #-u指定用户
6.sudo组
%wheel ALL=(ALL) ALL
#意思是wheel组
7.取反的写法
www ALL=(root) NOPASSWD:ALL,!/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root,!/bin/su
#允许www用户执行所有命令,除了passwd后加任意字符、passwd root和su这三类操作。
8.ubuntu是怎么提权的
visudo
通过将用户加入到带sudo权限的用户组实现sudo功能的
然后给用户组授权
2.su
1.su与su -
su命令中的-是su命令的选项,-,-l,--login
意思是更新用户的配置与环境变量
四、故障案例
1.命令行:-bash-4.2$
原因:用户家目录没有,用户家目录下面的配置文件没了 ~/.bashrc ~/.bash_profile
解决:通过/etc/skel/.bash* 复制并解决 这是所有新用户的家目录的模板
四、用户权限
一、基本权限
1.增加执行权限
chmod u+x file1
chmod 755 file1
chmod u+rw,g+r,o+r xiaoyu.txt
2.更改属主属组(冒号还是点)
#1.改变属主属组
chown alice.hr file1
#2.只改属主
chown alice file1
#3.只改属组
chown .hr file1
chgrp it file1
#4.针对目录中的所有文件
-R
二、ACL权限
1.用处
设置不同用户,不同的基本权限(r、w、x)。对象数量不同。
2.设置基本权限
命令 设置 用户或组:用户名:权限 文件对象
setfacl -m u:alice:rw /home/test.txt
3.查看基本权限
getfacl /home/test.txt
4.删除基本权限
#删除组hr的acl权限
setfacl -x g:hr /home/test.txt
#删除所有acl权限
setfacl -b /home/test.txt
三、特殊权限
1.suid
# suid谁在执行这个程序时,将临时获得root权限对应数字4
比如passwd
chmod u+s /usr/bin/cat
2.sgid
#命令的g位置上有一个s或者S,对应的权限数字是2,运行这个命令时相当于这个命令的用户组的权限。
/bin/ssh-agent
3.sticky
对于包含sticky权限的目录,每个用户都可以在目录下面创建内容,但是每个用户只能管理自己的文件.对应数字1
chmod o+t /tmp/
chmod 1777 /tmp/
4.特殊权限授权
chmod 4755 1.txt
4代表suid,2是sgid,1是sticky
四、文件属性chattr(了解)
1.查看默认权限
lsattr file100
2.加上不能删除的属性。
chattr +i file100
3.删除chattr属性
chattr -i file100
# 也可以使用递归
-R
4.都有哪些文件属性
a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。
# 一般是给安全用
五、进程掩码umask
1.查看umask值
umask
#默认
文件夹755 文件644
2.计算
减去umask的值,文件umask如果某一位是奇数,需要减去umask后这一位上+1
3.修改shell umask值(临时)
umask 000
六、权限之间的关系
1.权限配合
1.文件的写权限需要读权限的配合,否则只能追加文件
如果文件只有w只能通过追加方式写入,如果vi/vim写入会清空文件内容只留最新的(:wq!)。
2.x权限需要有r配合
3.目录的r权限查看目录下内容,如果只有r目录下文件的属性信息无法查看提示"?",目录的r权限需要x权限配合.、
4.对于目录x权限表示是否能够进入目录权限,是否能够查看与修改目录下文件的 属性信息 权限。
5.没有w权限无法删除
6.目录的w权限表示在目录下面创建,删除,重命名文件,只有w还不够,需要x配合
2.日常操作与需要的权限
日常操作 | 需要的权限 |
---|---|
查看文件的内容 | 文件要有r权限 |
编辑或修改文件内容 | rw |
执行脚本/命令 | rx |
查看目录内容 | rx |
创建文件,删除文件 | 文件所在目录要有rwx权限 |
重命名 | 文件所在目录要有rwx权限 |
3.用户与用户组的关系
一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。
一对多:即一个用户可以存在多个用户组中。那么此用户具有多个组的共同权限。
多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限。
多对多:多个用户可以存在多个组中。其实就是上面三个对应关系的扩展。
五、进程管理
一、进程介绍
1.僵尸进程
1.什么是僵尸进程,怎么产生的
僵尸进程:由于各种原因导致某个进程挂掉了,但是进程本身仍然存在,还占用着系统资源,这种异常进程僵尸进程。
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
2.怎么查找僵尸进程
ps aux | grep Z
或者top
3.遇到僵尸进程如何解决
1.找出僵尸进程上级进程,结束即可
2.如果上级进程是主进程(pid为1进程),则需要重启linux系统
3.少量不影响,可以不重启,但是多了就会影响服务器性能
4.pstree的使用
#一般用于查看进程间关系
pstree
pstree -p #显示树形结构并输出pid
ps auxf #也可以显示部分所属关系,但是并不直观
#pstree属于psmisc软件包,yum安装psmisc即可.
2.孤儿进程
1.什么是孤儿进程
孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。
孤儿进程会被系统直接接管.(systemd进程)
3.进程的分类
1.系统进程
可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
2.用户进程
通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
3.交互进程
由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
4.批处理进程
该进程是一个进程集合,负责按顺序启动其他的进程。
5.守护进程
守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。
二、基本命令
1.ps
1.ps的参数介绍
#输入字段的含义
ps a 显示所有与终端会话的进程,包括其他用户的进程
ps u 显示指定用户的进程
ps x 显示没有控制终端的进程
2.ps aux参数的含义
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存
RSS: 占用实际内存
TTY: 进程运行的终端
STAT: 进程状态
START: 进程的启动时间
TIME: 进程占用CPU的总时间
COMMAND: 进程文件,进程名
3.ps -ef字段介绍
UID 进程属于的用户
PID 进程id号,大部分都是随机.
PPID 父进程的id号, pstree -p查看详细关系
CMD 进程名字
TTY 哪个终端
4.常见的进程状态
R+ 前台运行中进程 **
R 后台运行进程
S 睡眠,可中断进程(大部分进程)
T 后台挂起的进程(说完挂起命令就懂了)
D 不可中断进程(进程正在进行IO读写) **
Ss 可中断进程(普通)管理进程
S< 可中断的高优先级进程
Ssl可中断的多线程的管理进程 **
Z 僵尸进程 **
X 死掉的进程
5.STAT状态+符号
STAT状态+符号(附加状态)了解 | 描述 |
---|---|
s | 进程是控制进程, Ss进程的领导者,父进程/主进程 |
< | 进程运行在高优先级上,S<优先级较高的进程 |
N | 进程运行在低优先级上,SN优先级较低的进程 |
+ | 当前进程运行在前台,R+该表示进程在前台运行 |
l(小写L) | 进程是多线程的,Sl表示进程是以线程方式运行(与程序) 使用多线程可以让服务或软件支持更改的访问,但是需要软件支持。 |
6.ps进行负载的排序
#1.以cpu升序
ps aux --sort %cpu
#2.以cpu降序
ps aux --sort -%cpu
#-表示逆序
#3.通用sort
ps -no-heading aux |sort -rnk4
7.自定义ps字段
ps axo user,pid,ppid,%mem,command |head -3
8.不输出每一列的标题
ps aux |awk 'NR>1{print $1,$3}'
ps -no-heading axo user,%cpu,stat
9.完全使用ps命令查看去掉标题,指定字段pid,cpu,mem,command的crond进程
ps --no-heading -o pid,%cpu,%mem,command -C crond
# s不输出每一列的标题
# -C 过滤 注意不能跟ax,否则报错
# -o 指定输出列
2.top的使用
1.非交互式
top | awk 'NR==2' #发现不行
top -bn1 | awk 'NR==2'
-b 非交互模式
-n 只输出一次结果
2.定制top的参数
# 每1秒刷新
top -d 1
# 查看指定进程的动态信息
top -d 1 -p 10126
# 查看10126和1号进程
top -d 1 -p 10126,1
3.top命令内部都包含了哪些信息
第一行:w/uptime
第二行:进程汇总信息
第三行:CPU使用率
第四行:内存使用情况
第五行:swap使用情况
4.top命令内部重点掌握哪些
1.第一行的cpu负载
2.第二行的僵尸进程
3.第三行的系统cpu占用和磁盘io等待
#磁盘io等待的意思是,磁盘数据处理不过来了,正在排队的一个指标
4.第五行的已用swap和剩余swap
5.top命令的具体参数与含义
top - 11:45:08 up 18:54, 4 users, load average: 0.05, 0.05, 0.05
程序名--系统时间-运行时间-----登录用户----cpu负载 1-----5----15分钟
Tasks: 176 total, 1 running, 175 sleeping, 0 stopped, 0 zombie
总进程数-------------运行数1-----睡眠数175---------停止数0-------僵死数0
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
cpu使用占比us用户----sy系统----ni优先级-id空闲-----wa等待---hi硬件----si软件----st虚拟机
KiB Mem : 3865520 total, 1100000 free, 580268 used, 2185252 buff/cache
物理内存总数-----------------free空闲1G-------userd使用500M----------缓存占用2G
KiB Swap: 4063228 total, 4063228 free, 0 used. 2917828 avail Mem
交换分区-----总数------------空闲-------------------已使用---可用
6.top的快捷键
q 退出
默认3秒刷新1次,空格立刻刷新
P 默认按照CPU使用率
M 按照内存使用率
# 进阶用法
top输入z进入颜色模式 按 x 标记出当前是按照哪列排序.
shift + > 向右
shift + < 向左
7.htop
支持鼠标操作 进度条显示使用的百分比,是top的升级版,有进度条
3.kill的使用
1.各种kill信号的介绍
给进程发送信号(kill -l列出所有支持的信号)
[root@localhost ~]# kill -l
编号 信号名
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断Ctrl+C
3) SIGQUIT 键盘退出Ctrl+\,类似SIGINT
9) SIGKILL 强制终止,无条件
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 暂停
20)SIGTSTP 键盘暂停Ctrl+Z
# 一般使用9和15
kill -15 1234 正常终止
kill -9 4321 非法杀死
2.kill的三剑客
命令 | 说明 |
---|---|
kill | kill + 进程pid进行结束进程,常用. |
pkill | pkill + 进程名字, 取你狗命(你和狗),模糊查找. |
killall | killall + 进程名字,精确 |
3.标准用法
kill pid #默认发送结束信号
kill -9 pid #发送强制结束信号
#pkill 后面跟的是模糊匹配的名字
#killall 后面跟的是进程的名字,可以终止一组进程。
killall -9 java
4.nice值
1.手动启动不同nice
nice -n -5 sleep 6000 &
nice -n -10 sleep 7000 &
2.手动更改nice值
sleep 7000 &
renice -20 2669
5.lsof(重点掌握)
lsof -p PID:PID是进程号,通过进程号显示程序打开的所有文件及相关进程
lsof -i 通过监听指定的协议、端口、主机等信息,显示符合条件的进程信息。
lsof常用组合:
lsof -c sshd
lsof -g 4918
lsof -i :80
lsof -i tcp:25
lsof -ni :22
lsof -nPi :22
lsof -n 不要把ip反向解析为主机名、域名。
lsof -P 不要把端口解析为对应的服务。
lsof |grep passwd
ps -ef |grep tail
每一列 | 说明 |
---|---|
1 | 命令或服务名字 |
2 | pid |
3 | 用户 |
7 | 文件大小(字节) |
8 | 文件inode号码 |
最后一列 | 文件名 |
6.pgrep
#利用pgrep查询进程ID
pgrep是通过程序的名字来查询进程pid的工具,它通过检查程序在系统中活动的进程,输出进程属性匹配命令行上指定条件的进程的ID
查看sshd进程对应的所有ID,可执行如下命令:
pgrep -f sshd
三、负载、
1.概念
- 负载 load average 平均负载: 最近1分钟 5分钟 15分钟系统平均负载.
- 负载:衡量系统繁忙程度指标.
- 衡量是否繁忙: 数值越接近cpu核心总数,系统的负载越高 .
- 预警: 建议负载达到cpu核心总数的70-80%。
2.负载原理
那到底如何理解平均负载:平均负载是指单位时间内,系统处于可运行状态(R,S)和不可中断状态(D)的平均进程数,也就是平均活跃进程数
负载是衡量正在运行的进程的平均数(可以中断进程和不可中断进程).
系统负载显示出什么信息:
负载主要衡量的是可运行状态(R,S 占用CPU)和不可中断 (io)
3.负载高的排查流程
1.通过监控软件发现系统负载高(w/uptime/top)
2.判断cpu还是io导致的负载高
- cpu高:top中us(user 用户占用的cpu) sy(system占用的cpu)
- io高:top中wa(iowait)磁盘io导致的负载高
3.处理
- 🅰️如果是cpu导致的,排查出哪个进程导致的ps aux过滤出占用cpu较高的进程
- 🅱️如果是IO导致的,排查初级哪个进程导致的,通过iotop -o命令排查
4.分析工具
strace(显示过程)、ltrace(调用)跟踪进程、命令执行过程
perf cpu分析
5.iotop -o 只显示正在读写的进程
四、作业控制jobs
1.前后台调用
1.运行后台程序
sleep 3000 &
2.查看后台进程。
jobs
[1]+ Running sleep 3000 &
#+,-代表,使用fg时,默认调动至前台的进程。先是+,后是-
3.调动后台程序至前台。
fg 1
4.消灭后台进程
kill %1
5.前台调到后台
ctrl+z
1.拿到前台运行
2.杀死
3.继续后台运行
bg 5
2.一些常见的后台运行的办法
1.使用&符号
slepp 300 &
2.nohup 命令&方法
# 案例02 让ping baidu命令后台运行并记录输出
nohup ping -c20 baidu &
tail -f nohup.out
3.nohup指定输出其他文件
#可以保留输出到指定文件中。默认是nohup.out文件中。其他方面与&符号一致。
#nohup 命令 >新的文件 &即可
nohup ping baidu >xiaoyu001-new.txt &
4.screen的优势
一般我们使用&,nohup方法让命令,服务进入后台运行,但是可能不稳定。
这时候可以通过screen命令较为稳定的后台运行一些指令。
5.screen的使用
#1. 安装screen
yum install -y screen
#2. 运行screen
screen
进入screen虚拟窗口
#3. 执行命令
输入命令 ping baidu
#4. 退出screen窗口
退出窗口(异常推荐,正常退出)
ctrl + a 然后 d
#5. 查看screen窗口
screen -ls
#6. 恢复
screen -r tab键选择名字
彻底结束
ctrl + d
6.screen的原理
简易原理:创建screen空间,screen命令维持,在里面运行的命令只要空间在,里面的命令就不会断(后台运行)。
7.各命令对比
& #大部分时候使用这个
nohup #想输出记录
ctrlz #一般用于ctrl+c无法杀死进程的时候用
screen #稳定性好
# 公有云如果长时间不操作会断开连接,所以用screen更稳定一些
六、存储管理
一、硬件介绍
1.磁盘介绍
#SATA
一般家用,一般用于机械硬盘,也有固态硬盘,容量大,价格较低 sda
#SAS
给企业环境使用,一般用于机械硬盘,也有固态硬盘
#PCI-E
企业级使用,固态硬盘用
#U.2
企业级固态硬盘使用。PCI-E类似。
2.磁盘关于参数方面
1.企业级环境磁盘选型
磁盘选型 | 应用建议 |
---|---|
一般情况下,数据备份 | SATA硬盘,10k rpm 4tb,8tb存放备份. |
网站服务器使用 | SAS接口 15k rpm 300G 600G 900G |
高并发网站服务器 | 可以选择固态硬盘PCI-E,SAS,SATA |
4.mbr和gpt如何选择
分区表 | 支持的硬盘容量和主分区个数 | 对应的命令 |
---|---|---|
mbr | 支持2tb以内的硬盘,大于2tb则只识别2tb. 区别主分区,扩展分区,逻辑分区。 | fdisk /parted |
gpt | 支持2tb以上硬盘,主分区无限使用(128个). | gdisk /parted |
二、磁盘管理
1.mbr磁盘基本管理
1.磁盘分区
fdisk /dev/sdb
-d:删除一个分区
-l:查看指定分区的分区表信息
-m:显示fdisk每个交互命令的详细含义
-n:增加一个新的分区
-p:显示分区信息
-q:退出交互操作,不保存操作的内容
-t:改变分区类型
-w:写分区表信息到硬盘,保存操作退出
2.刷新分区表
partprobe /dev/sdb
fdisk -l /dev/sdb
3.格式化
mkfs.ext4 /dev/sdb1
mkfs.xfs
4.挂载
mount -t ext4 /dev/sdb1 /mnt/disk1
# 此处ext4可以省略,系统可以自我识别
5.卸载
umount /dev/sdb4
6.立刻使用挂载命令
mount -a
# 挂载命令只会在重启或者mount -a后执行
7.开机自动挂载
# fstab永久挂载,但是有一定风险
设备名字 挂载点 文件系统类型 默认选项 是否备份 是否检查
/dev/sdb1 /mnt/disk1 ext4 defaults 0 0
# 写入自启动文件 rc.local
vim /etc/rc.d/rc.local
2.gpt磁盘基本管理
1.查看硬盘分区信息
parted /dev/sdb print
2.编辑/dev/sdc
parted /dev/sdc
3.创建分区表gpt格式
mktable gpt 或者mklabel gpt 一样 #注意mbr叫做msdos类型
4.创建分区10mb
mkpart primary 0 10
mkpart primary 10 20
5.创建新分区命令。
#使用格式为:mkpart PART-TYPE [FS-TYPE] START END
#其中,PART-TYPE,表示分区类型,主要有primary(主分区),extended(扩展分区),logical(逻辑区),其中,扩展分区和逻辑分区只针对msdos分区表。
#fs-type,表示文件系统类型,主要有fat32,NTFS,ext2,ext3等,可不填写。
#start,表示分区的起始位置。
#end,表示分区的结束位置。
6.删除分区
rm 1
# 命令格式 rm number 。
7.退出编辑
q 或quit
8.查看信息
print(输出分区信息,可简写为p。该功能有3个选项:)
free,显示该盘的所有信息,并显示磁盘剩余空间。
number, 显示指定的分区的信息。
all或list, 显示所有磁盘信息。
9.select 选择设备。
当输入parted命令后直接回车进入交互模式时,默认设置的是系统的第一块硬盘,如果系统有多块硬盘,需要用select命令选择要操作的硬盘。
例如:select /dev/sdb
3.管理磁盘其它命令
1.查看磁盘
ll /dev/sd*
lsblk
fdisk -l /dev/sdb
df -Th
2.创建一个固定大小的文件
dd if=/dev/zero of=/mnt/disk4/1.txt bs=1M count=1000
4.查看磁盘空间和挂载情况
df -h 人性化显示磁盘占用空间
df -hT 查看磁盘空间并展示文件系统类型
df -hi 查看磁盘分区Inode占用情况
#参数后面可以接路径 ,比如/
4.文件系统
1.常见的文件系统介绍
1.ext4
EXT4是第四代扩展文件系统(英语:Fourth extended filesystem)用于CentOS 6.x ubuntu或公有云使用。
2.xfs
XFS一种高性能的日志文件系统,CentOS 7默认的文件系统类型。
3.ext3
centos 5.x 默认的文件系统
#系统限制
Ext3: 文件系统最大16TB
Ext4: 文件系统最大16TB
XFS : 文件系统最大100TB.
2.线上业务系统选择文件系统标准
Linux下常见的有DOS文件系统类型msdos,windows下的FAT系列(fat16和FAT32)和NTFS文件系统,光盘文件系统ISO-9660,单一文件系统ext2和日志文件系统ext3、ext4、xfs,集群文件系统gfs(Red Hat Global File System)、ocfs2(oracle cluster File System)、虚拟文件系统(比如 /proc),网络文件系统(NFS)。
3.选择合适的文件系统
#ext2
没有日志记录功能,这样就节省了很多磁盘性能。例如linux系统下的/tmp分区就可以采用ext2文件系统。
#ext3
目录结构是线型的,当一个目录下文件较多时,ext3的性能就下降比较多.适合对性能要求不高、数据安全要求不高的业务。属于比较中间的类型
#ext4
延迟分配、多块分配和盘区功能,非常适合大量小文件的操作,如果业务环境是对文件要进行大量的创建和删除操作的话,ext4是更高效的文件系统.例如网站应用,邮件系统等.
#xfs
性能和安全性方面综合考虑的话,xfs文件系统是比较好的选择.一些大数据文件操作,同时,应用本身需要大量日志写操作。但是兼容性就差一些
5.inode与block
1.什么是inode
索引节点
记录文件的属性,大小,权限,属主,属组,连接数,块数量,块的编号
一个文件占用一个inode,同时记录此文件数据所在的block numbber。
inode大小 为 128 bytes
2.什么是block
存储文件的实际数据。
实际存储文件的内容,若文件较大,会占用多个block。
block大小 为默认为4K
3.indeo与block的特点
inode索引节点,存放文件属性信息,block位置。
每创建1个非空文件至少占用1个inode,1个block,一般文件都要有1个inode
1个block默认是4k
inode,block数量是在格式化的时候创建的
正常情况下block的使用会更快
创建小文件不足4k,1个block还有剩余空间,无法给其他文件使用
创建文件大于4k,占用多个block
4.superblock
block 与 inode 的总量;
未使用与已使用的 inode / block 数量;
5.块组
block group
6.查看inode
ll -i #查看文件的inode信息
df -i #所有的inode
7.查看block
df -hT
8.inode与block的关系
inode决定了文件系统中文件的数量。
block决定了文件存储的空间。
9.当分区空间大小消耗完毕,还能否新增文件?
#当block满了之后,就不能再添加新数据了
#当inode满了之后,不能新建文件,但是可以追加进旧文件
三、交换分区
1.交换分区介绍
1.什么是swap交换分区,它存在的意义是什么
从磁盘中开辟出一块空间,临时给内存使用,它是利用磁盘空间虚拟出的一块逻辑内存
内存不足的时候临时充当内存,防止OOM(Out Of Memory)
2.服务器运行java程序,大量占用内存,以至于开始占用swap如何解决?
第一步保证网站正常,增加swap空间.
联合开发一起排查.
1.创建指定大小的文件1g的文件.
2.把文件转换为swap.
3.激活这个swap,把它加入到linux中.
4.记得配置永久挂载.
3.swap的大小
设置交换分区大小为内存的1.5-2倍
生产环境推荐
大于 4GB 而小于 16GB 内存的系统,最小需要 4GB 交换空间;
大于 16GB 而小于 64GB 内存的系统,最小需要 8GB 交换空间;
大于 64GB 而小于 256GB 内存的系统,最小需要 16GB 交换空间。
#补充:公有云可以不配置, 如果是java建议配置一些.
4.什么样的数据会被存储到交换分区
linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存。
linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存。
5.什么情况下,会因为swap分区导致linux死机或服务异常
交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题。
2.交换分区的创建与使用
1.创建指定大小的文件1g的文件.
dd if=/dev/zero of=/tmp/1g bs=1M count=1000
if === input file 输入文件/dev/zero不断输出空.
of === ouput file 输出文件
bs === block size 每次读取多少
count === 读取次数
2.查看格式
#前后做个对比
file /tmp/1g
3.把文件转换为swap(格式化).
mkswap /tmp/1g
4.激活这个swap,把它加入到linux中.
chmod 600 /tmp/1g
swapon /tmp/1g
free -h
5.永久挂载
方法01 : swapon /tmp/1g写入到rc.local
方法02: 写入/etc/fstab
/tmp/1g swap swap defaults 0 0
6.也可以通过fdisk的方式
fdisk /dev/sde
# 可选:划分分区后,将类型设置为82(按t!!!老铁)
partprobe /dev/sde
ll /dev/sde*
# 然后进行格式化
mkswap /dev/sde1
# 挂载
swapon /dev/sde1
# 验证
free -m
7.swap的优化
swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下:
cat /proc/sys/vm/swappiness
也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。
操作系统层面,要尽可能使用内存,对该参数进行调整。
临时调整的方法如下,调成10:
sysctl vm.swappiness=10
要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:
cat /etc/sysctl.conf
vm.swappiness=10
四、实战管理
1.分区容量
1.规划
分区 | 容量 |
---|---|
/data | 最大 |
/boot/efi | 200M |
/boot | 1G |
/ | 10G |
/usr | 10G |
/var | 10G |
2.好处
如果有创建数据分区,那么在重装系统时,就可以重新引用之前的分区,数据分区就不会受影响
2.如何扩容
fdisk 删根分区,然后重创
注意还是原来的序列号,不移除该签名N
根如果不在最后一个分区就麻烦了,或者磁盘没有剩余空间
此时需要移动大目录,然后通过软连接
注意大文件转移要用rsync,因为mv一旦中断将导致数据损坏
五、LVM(逻辑卷管理)
1.LVM创建的流程
1.将磁盘转换成物理券
2.将物理卷加入卷组
3.从卷组中开辟出空间给逻辑卷
2.LVM的创建与管理
1.命令大全
功能 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
scan 扫描 | pvscan | vgscan | lvscan |
craete 建立 | pvcreate | vgcreate | lvcreate |
display 显示 | pvdisplay | vgdisplay | lvdisplay |
remove 删除 | pvremove | vgremove | lvremove |
extend 扩展 | vgextend | lvextend | |
reduce 减少 | vgreduce | lvreduce |
2.将物理磁盘,转换成物理卷-PV
pvcreate /dev/sdc
# 查看PV信息
pvscan
pvs
pvdisplay
3.创建卷组-VG
vgcreate vg1 /dev/sdc
# 查看VG信息
vgs
vgscan
vgdisplay
4.创建逻辑卷LV
lvcreate -L 200M -n lv1 vg1
-L大小 -n卷名 vg1组名(容量的来源)
# 查看lv
lvscan
5.创建文件系统并挂载
mkfs.ext4 /dev/vg1/lv1
mkdir /mnt/lv1
mount /dev/vg1/lv1 /mnt/lv1
6.实用性怎么样
#一般不推荐使用lvm,因为性能低,后期维护性很差,恢复数据比较困难推荐使用标准分区
7.VG扩容
pvcreate /dev/sdd
vgextend vg1 /dev/sdd
8.扩容LV
lvextend -L +200M /dev/vg1/lv1
#先观察文件系统当前容量。
df -Th
resize2fs /dev/vg1/lv1
#再看刷新后的容量
9.xfs格式的如何刷新
xfs_growfs
六、磁盘性能指标
磁盘性能指标 | 说明 |
---|---|
吞吐量(读写速度) | 一般值的是磁盘读写速度 |
iops | 每秒可以进行的io数量(io per second),每秒可以进行读写次数 |
延迟 | 进行读写的时候操作延时 |
故障间的平均时间 | 固态硬盘 基本都是百万小时 |
- 连续读写: dd命令测试
- 随机读写:fio测试
- fio可以测试这些指标
(https://help.aliyun/document_detail/147897.htm)
七、使用extundelete恢复误删除的文件
1.反删除工具有哪些
比较常用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,只是extundelete功能更加强大。
ext3grep仅支持ext3文件系统的恢复,恢复速度较慢,而extundelete可以恢复ext3/ext4文件系统的数据,并且恢复速度很快。
extundelete官网:http://extundelete.sourceforge/
2.恢复原理
extundelete首先会通过文件系统的inode信息(根目录的inode一般为2)来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件。
3.extundelete的安装与使用
tar jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4
./configure
make
make install
#成功安装extundelete后,会在系统中生成一个extundelete可执行文件
extundelete常用选项:
--restore-inode ino[,ino,...],恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。
--restore-file 'path',恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。
--restore-files 'path' ,恢复命令参数,表示将恢复在路径中已列出的所有文件。
--restore-all,恢复命令参数,表示将尝试恢复所有目录和文件。
八、缓存区与缓冲区
1.查看缓存与缓冲
total used free shared buff/cache available
Mem: 2027892 199940 1364984 9804 462968 1630104
Swap: 2097148 0 2097148
# 从内核的角度来查看内存的状态
就是free 1364984
# 从应用层的角度来看系统内存的使用状态
1364984+462968=1827952
available,加上buffer与cache才是真实可用内存
# 对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高文件读取的性能,当应用程序需要用到内存的时候,buffers/cached会很快地被回收,以供应用程序使用。
2.buffers与cached的异同
Buffer(缓冲区)主要用于解决数据传输速度不匹配的问题,它通过临时存储数据来协调不同速度的设备之间的数据交换。例如,在从内存向硬盘写入数据时,数据会先被缓冲到一定大小后再写入硬盘,这样可以减少对硬盘的频繁访问,从而提高效率。Buffer的数据丢失可能会影响数据的完整性,因为这些数据尚未被永久写入存储介质。
Cache(缓存)则是为了提高数据的访问速度,通过存储最近使用或高频使用的数据来减少直接访问较慢存储的需求。例如,将硬盘中的数据读取出来放在内存的缓存区中,这样以后再次访问同一个资源时,速度会快很多。Cache的数据丢失不会影响数据的完整性,但会影响性能,因为缓存中的数据是已经读取但尚未写入硬盘的数据。
在实际应用中,Buffer和Cache都存在于内存中,数据都是临时的,一旦关机数据都会丢失。Buffer主要用于写入操作,而Cache主要用于读取操作。Buffer的大小对性能影响较小,够用即可,而Cache的大小对性能有较大影响,越大性能越好。
3.手动释放缓存cache
释放page cache:
echo 1 > /proc/sys/vm/drop_caches
释放文件节点(inodes)缓存和目录项缓存(dentries),大部分缓存数据都是用的page cache
echo 2 > /proc/sys/vm/drop_caches
释放page cache、dentries和inodes缓存:
echo 3 > /proc/sys/vm/drop_caches
在手动释放内存前,需要使用sync指令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
九、RAID:廉价磁盘冗余阵列
1.概念
最少 | 安全冗余 | 可用容量 | 性能 | 使用场景 | 举例 | |
---|---|---|---|---|---|---|
raid0 | 1 | 最低 | n | 读写最快 | 不要求安全,只要求速度 | 数据库从库,存储从库,web服务器 |
raid1 | =2 | 100% | 1/2 | 写入慢,读OK | 只追求安全 | 系统盘/监控服务器 |
raid5 | 3 | 最多坏1块 | n-1/n | 写入慢,读OK | 对速度安全,对速度要求不高 | 普遍数据库,存储访问量不高 |
raid10 | 4 | 可以坏1半 | 1/2 | 读写很快 | 安全性能都要 | 高并发或高访问量数据库主库,存储 |
1.RAID6
RAID6 是在raid5的基础上,进一步加强数据保护而设计的。它除了每个硬盘上有同级数据的校验带之外,还增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法。意思是,每个数据块有了两个校验保护屏障,即使两块磁盘同时失效也不会影响数据的使用,因此RAID 6的数据冗余性能相当好。
用的XOR异或的校验方式
2.RAID10
两个raid1组成的raid0
# 为什么不是两个raid0组成raid1呢?
假设4块硬盘,两种组合方式只有在同时损失两块硬盘的时候才有区别,同有C42,6中组合方式
其中RAID10容错率在2/3,RAID01容错率在1/3
# 只是理论上这样,但实际操作直接放4块硬盘,选择raid10即可
2.软RAID示例
1.准备4块硬盘
ll /dev/sd*
2.创建RAID
mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd{d,e,f,g}
-C 创建RAID
/dev/md0 第一个RAID设备
-l5 RAID5
-n RAID成员的数量
-x 热备磁盘的数量
可用空间2G
3.格式化,挂载
mkfs.ext4 /dev/md0
mkdir /mnt/raid5
mount /dev/md0 /mnt/raid5
cp -rf /etc /mnt/raid5/etc1
4.查看RAID信息
mdadm -D /dev/md0 //-D 查看详细信息
5.实时观察
watch -n 0.5 'mdadm -D /dev/md0 | tail' //watch持续查看
6.模拟一块硬盘损坏,并移除
mdadm /dev/md0 -f /dev/sde -r /dev/sde
-f --fail
-r --remove
七、文件查找
一、命令查找
1.which
# which ls //从PATH环境变量
2.whereis
# whereis ls //从PATH环境变量
二、locate查找
#1.locate查找文件hosts文件
locate hosts
#2.更新locate数据库
updatedb
三、find
1.基本查找
1.语法
find [path...] [options] [expression] [action]
命令 路径 选项 表达式 动作
2.类型
name
size
maxdepth
type
perm
time
3.按文件查找
# i忽略大小写
find /etc -iname "hos*"
4.按大小
# 文件>5M 文件=5M 文件<5M
find /etc -size 5M
`b' for 512-byte blocks
`c' for bytes
`k' for Kilobytes (units of 1024 bytes)
`M' for Megabytes (units of 1048576 bytes)
`G' for Gigabytes (units of 1073741824 bytes)
5.指定查找的目录深度:maxdepth
# -a and
find / -maxdepth 4 -a -name "ifcfg-en*"
6.按文件属主、属组
find /home -user jack
find /home -group hr
7.按文件类型:f普通文件 b块设备文件 d目录 p管道 l连接
find /tmp -type f
find /dev -type b
8.按文件权限
find . -perm 644 -ls
find . -perm /+x
9.按时间
atime, access time:文件被读取或者执行的时间
ctime, change time:文件属性改变时间
mtime, modify time:文件内容被修改的时间
find /data -mtime +30 -name “.log":查找30天以前的log文件
find /data -amin -30 -name ".log”:查找30min以内被访问的log文件
find /data -cmin 30 -name ".log”:查找第30min改变的log文件
stat /etc/passwd #查看状态
2.找到之后的动作
1.如果不指定,默认就是显示
find . -perm 715 -print #文件名
find . -perm 715 -ls #文件属性
2.找到后删除
find /test -type f -name "test*.txt"|xargs rm
find /test -type f -name "test*.txt" -exec rm -rf {} \;
find /test -type f -name "test*.txt" -delete
rm -f `find /test/ -type f -name "*.txt"`
3.找到后复制
find /test -type f -name "test*.txt" |xargs -i cp {} /test01/
find /test -type f -name "test*.txt" |xargs cp -t /test01/
find /test -type f -name "test*.txt" -exec cp -a {} /test01 \;
4.找到后移动
find /test -type f -name "test*.txt" |xargs -i mv {} /test01/
find /test -type f -name "test*.txt" |xargs mv -t /test01/
find /test -type f -name "test*.txt" -exec mv {} /test01 \;
5.找到后查看
find /test -type f -name "test*.txt" |xargs ls -lh
find /test -type f -name "test*.txt" -exec ls-lh {} \;
6.为什么直接传递的时候,xargs失效
默认管道是无法把数据变化为命令的参数,导致传递失败,find命令找出的内容相当于被丢弃了,就相当于执行ls -lh命令,显示当前目录下内容并详细信息。
前面的命令通过管道传递给后面命令,传递的是 字符串
这个命令(ls)中传递文字符号就不行,传递 参数
通过|xargs把前面命令传递过来的字符串转换为后面命令可以识别参数
7.总结:三种查找文件后的执行方式
优先执行
xarg xarg -i
exec
3.进阶使用
1.find找出/xiaoyu/find/ 以.txt结尾的文件放在/tmp/find.tar.gz
find /xiaoyu/find/ -type f -name '*.txt'|xargs tar zcf /tmp/etc-xargs.tar.gz
find /xiaoyu/find/ -type f -name '*.txt' -exec tar zcf /tmp/find-exec.tar.gz {} \;
#有坑,因为-exec \;执行方式 1个文件1个文件的压缩.
find /xiaoyu/find/ -type f -name '*.txt' -exec tar zcf /tmp/find-exec.tar.gz {} +
# -exec就是将参数,传递到{}中,找到一个,就传递一个,所以后面接不了tar
将\;改成+的意思就是,先执行完查找,然后再批量执行后面的命令
2.为什么要用-t参数
#xrags实际是让参数放到最后,但是很多命令的参数不在最后,所以需要用到-t
cp -t /tmp/ cp -t 目标 源 文件 目录
3.如何执行多条件查找
通过-a连接条件
4.找出/etc/中以.conf结尾大于10kb修改时间是7天之前的文件
find /etc -name "*.conf" -a -size +10k -a -mtime +7
5.取反符号
find / -name "*.conf" ! -name "nginx.conf"
八、软件管理
一、rpm
1.认识rpm包的结构
# 认识rpm包
wget-1.14-15.el7.x86_64.rpm
软件包名-版本号-发布版本-系统平台
#每个RPM文件中包含了已经编译好的二进制可执行文件,其实就是将软件源码文件进行编译安装,然后进行封装,就成了RPM文件。
2.rpm的使用
1.基本命令
-i 安装
-v 可视
-h 百分比
-e 卸载
-U 升级
-q 查询
-qi 软件描述信息
-ql 软件安装路径
-qa 查询软件的名称,判断是否安装
-qf 属于哪个rpm
rpm -q wget
--nodeps 卸载时不检查依赖关系
--force 安装时强制安装
2.ubuntu检查安装软件
#检查是否安装
dpkg -l
#安装
dpkg -i
#检查软件包内容
dpkg -L
#删除
dpkg -r
二、yum
1.yum仓库
1.配置本地仓库
#1.备份移除官方YUM库
mv /etc/yum.repos.d/* /tmp
tar -cfv 1.tar *
#2.编写本地YUM库配置文件
vim /etc/yum.repos.d/dvd.repo
[dvd]
name=dvd
baseurl=file:///mnt/cdrom
gpgcheck=0
#3.挂载安装光盘
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom/
mount -a
ls /mnt/cdrom
2.centos默认的源格式
[base]
name=CentOS-$releasever - Base - mirrors.aliyun
failovermethod=priority
baseurl=
gpgcheck=1
gpgkey=http://mirrors.aliyun/centos/RPM-GPG-KEY-CentOS-7
$releasever 什么系统
$basearch 系统的架构
2.yum基本命令
1.yum常用命令
yum reinstall 重新安装
yum update 升级
yum repolist 查看yum源
yum list httpd 查看软件是否已安装
yum list all 列出仓库中的所有软件包
yum info 软件包名称
yum remove 卸载
yum provides 查询对应的软件名
yum search all 查询对应的软件名
yum clean all 清除所有的缓存
yum groupinstall 安装软件包组
yum localinstall 本地安装
yum deplist 检查软件的依赖关系
yum install --downloadonly --downloaddir=/usr/local/rpms/vim vim
仅下载不安装
#如果执行yum remove,那么系统会提示其它应用也依赖此依赖。
2.ubuntu系统软件包管理
apt源
apt/apt-get > yum
dpkg >rpm
vim /etc/apt/sources.list
deb https://mirrors.aliyun/ubuntu/focal main restricted universe multiverse
deb-src https://mirrors.aliyun/ubuntu//focal main restricted universe multiverse
#会改阿里云就行,直接把配置文件复制过去就行
# 编辑完成之后一定运行apt update命令,用于生成本地缓存,如果不运行,那么就无法安装软件
3.yum配置文件
1./etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever #缓存目录
keepcache=1 #是否保留缓存, 0表示不保留缓存, 1表示保留缓存
logfile=/var/log/yum.log
测试
yum reinstall -y tree cowsay
2.安装清华源
https://mirrors.tuna.tsinghua.edu/help/centos-vault/
sed 's#http://mirrors.aliyun#https://mirrors.tuna.tsinghua.edu#g' /etc/yum.repos.d/CentOS-Base.repo
三、源码
1.源码包的安装过程
#source code 需要经过GCC,C++编译环境编译才能运行
# 编译安装三部曲
1.配置 ./configure
2.编译 make
3.安装 make install
4.测试效果
5.清理掉软件包,解压目录
2.尝试编译安装tengine
1.下载源码包
wget http://tengine.taobao/download/tengine-2.2.0.tar.gz
2.准备编译环境如编译器
yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel
3.解压
useradd www
tar xzvf tengine-2.2.0.tar.gz
cd tengine-2.2.0
4.配置
#“./configure”进行软件安装的环境测试,如果提示缺少某些安装包,就需要进行安装,直到测试通过。
./configure --user=www --group=www --prefix=/usr/local/nginx
5.编译
make
#它最主要的功能就是通过makefile文件来实现的,make过程比较消耗时间,也是源码安装最关键的一个步骤。
6.安装
make install
#此阶段就是将编译好的文件拷贝到安装目录下,瞬间就完成了。
# 如果没有依赖,在make的时候会报错,这时候根据提示,复制缺少的依赖,通过yum search all或yum provides来查询缺少的依赖
# 一般会搜出来很多rpm包,这时优先选择devel的包,ubuntu找dev的
# 报错提示一般是no such file /direcorty
3.源码包的优缺点
(1)、源码安装优点:
源码安装的好处是可以使用最新版本,用户可以自己定制软件功能,安装需要的模块,不需要的功能可以不用安装,此外,用户还可以自己选择安装路径,方便管理,卸载软件也很方便,只需删除对应的安装目录即可。
(2)、源码安装缺点:
由于源码安装非常灵活,可定制软件功能模块,所以对于新手来说,可能会无从下手,找不到方向。另外,源码安装会依赖很多其他软件或库文件,这些依赖软件需要查阅官方文档才知道。
四、dnf
1.dnf基本用法
dnf install net-tools
dnf install psmisc
dnf install vim
dnf install traceroute
2.dnf与yum对比
1.DNF使用libsolv来解析依赖关系,这使其在解决依赖关系时更为高效。相比之下YUM使用公开的API来解析依赖关系,这在处理复杂依赖关系时可能会显得稍逊一筹。
2.DNF是Fedora系统中的默认包管理器,并且在CentOS 8及更高版本中取代了YUM作为默认包管理工具。对于旧版本的系统,仍然可以使用YUM命令进行软件包管理。YUM则是旧版本Fedora和CentOS系统中的默认包管理器
3.DNF支持并行操作,可以同时下载多个软件包,而YUM则相对较为简洁,输出信息较少
3.dnf与yum的关系
dnf安装是yum的升级版,在centos8以上的版本,yum是软连接到dnf的
yum/dnf安装的本质还是rpm文件安装,只不过rpm文件是yum自动通过互联网下载下来的。
五、其它
1.删除软件
一般不推荐使用yum remove,会删除依赖,一般使用rpm -e
九、服务管理
一、systemctl的使用
1.基本用法
1.systemctl参数
1.查看服务运行情况
systemctl list-utils
2.服务开机自启动情况
systemctl list-utils-files
2.如果无法实现systemctl
1.将服务启动命令写入到/etc/rc.local/
2.手写systemctl配置
3.使用systemctl查看启动文件
systemctl cat iptables.service
2.linux运行级别
1.级别介绍
运行级别 | C7 | C6 |
---|---|---|
0 | 关机 | 关机 |
1 | 救援模式 secure,单用户模式,root权限,用于系统维护,禁止远程登录 | 单用户模式,找回root密码. |
2 | 多用户模式,没有NFS和网络 | 无网络的多用户模式. |
3 | 完整的多用户文本模式 | 命令行模式,文本模式,工作默认模式. |
4 | 未使用,默认也是多用户模式 | 未使用,待开发待使用。 |
5 | 图形化界面模式,桌面模式 | 图形化界面模式,桌面模式. X11 |
6 | 重启 | 重启 |
2.查看运行级别
ll /usr/lib/systemd/system/runlevel*.target
lrwxrwxrwx. 1 root root 15 6月 15 16:48 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 6月 15 16:48 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 6月 15 16:48 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月 15 16:48 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月 15 16:48 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 6月 15 16:48 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 6月 15 16:48 /usr/lib/systemd/system/runlevel6.target -> reboot.target
3.修改运行级别
systemctl set-default graphical.target #multi-user.target
4.查看运行级别
systemctl get-default
5.临时切换运行级别
init 6 #重启
init 0 #关机
二、systemd服务脚本编写与管理
1.systemd的基本介绍
1.背景
在CentOS6以及之前版本中,写服务脚本,需要放在/etc/init.d/目录下,这些脚本都是bash脚本,且脚本编写较复杂。而在CentOS7/RHEL7以及以后版本中,采用了一种叫unit的配置文件来管理服务,写服务脚本只需要按照标准格式编写即可。通过systemd命令集可以方便的对这些Unit进行管理。
2.简介
systemd是Linux上系统守护进程管理工具,字幕d(daemon)是守护进程的缩写,所以,systemd的意思就是守护整个系统。systemd可以管理Linux系统中的所有资源,不同的资源统称为Unit,常见的unit有:
Service unit:文件扩展名为.Service,用于定义系统服务
Target unit、文件名扩展为.target,用于模拟实现“运行级别”
Mount unit:文件名扩展为.mount 定义文件系统挂载点。
Systemd是内核启动后的第一个用户进程,PID为1,是所有其它用户进程的父进程。
3.认识service的unit文件
扩展名:.service
service文件存放路径:
/etc/systemd/system/* ―――― 系统管理员手动软件安装包或脚本放置于此,优先级更高
/run/systemd/system/* ―――― 运行时配置文件,这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
/usr/lib/systemd/system/* ―――― 该目录中包含的是软件包安装的单元,也就是说通过yum、dnf、rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下。
/lib/systemd/system: 指向/usr/lib/systemd/system。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在这个目录。
#我们在做的时候,可以直接把配置文件写到/etc/systemd/system下
2.systemd文件编写
1.systemd语法
start:启动指定的unit systemctl start nginx
stop:关闭指定的unit systemctl stop nginx
restart:重启指定unit systemctl restart nginx
reload:重载指定unit systemctl reload nginx
enable:系统开机时自动启动指定unit,前提是配置文件中有相关配置 systemctl enable nginx
disable:开机时不自动运行指定unit systemctl disable nginx
status:查看指定unit当前运行状态 systemctl status nginx
2.service unit文件的例子
#下面/usr/lib/systemd/system/postfix.service文件,它描述的是postfix服务的管理方式:
#记录unit文件的通用信息。
[Unit]
Description=Postfix Mail Transport Agent
#Before, After:定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx之后启动。
After=syslog.target network.target
#记录Service的信息
[Service]
#Type:service的种类
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
#环境配置文件
EnvironmentFile=-/etc/sysconfig/network
#启动服务之前需要启动的程序
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
#安装信息。
[Install]
#何种情况下,服务被启用。
WantedBy=multi-user.target #(多用户环境下启用)
3.type的种类
simple 默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出,那么一切都退出。
forking 标准的启动方式。服务包含父进程和子进程,启动程序后,会调用 fork() 函数,通过父进程生成子进程。
oneshot:这种服务类型就是启动完成,进程就没了。属于一次性启动。
notify:跟simple 类似,但是notify会在当前服务启动完毕,发送一个信号通知Systemd。
4.文件详解
(1)、 [Unit]部分
Description:对本service的描述
Before, After:定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx之后启动。
(2)、 [Service]部分
ExecStart:服务启动时执行的命令,此命令就是服务的主体。
ExecStartPre:ExecStart执行前所调用的命令。
ExecStartPost:ExecStart执行后所调用的命令。
ExecStop:定义停止当前服务时执行的命令。
EnvironmentFile:环境配置文件
PIDFile:指向当前服务 PID file 的绝对路径
注意:启动、重启、停止命令全部要求使用绝对路径
(3)、 [Install]部分
WantedBy:何种情况下,服务被启用。
例如:WantedBy=multi-user.target(多用户环境下启用)
5.开机自启
其实就是把/usr/lib/systemd/system/下的文件软连接到了/etc/systemd/system/下面
十、计划任务
一、at
1.语法
at <TIMESPEC>
任务
ctrl+D
2.时间节点
now +5min
teatime tomorrow (teatime is 16:00)
noon +4 days
5pm august 3 2020
4:00 2019-11-27
3.查询任务
atq
二、crond
1.基本认识
1.定时任务软件包名字和服务名字分别是什么
定时任务软件包名字:cronie , 服务名字(进程)crond
rpm -qa cronie
rpm -ql cronie
2.目录结构
/var/spool/cron #用户的定时任务的配置文件的目录
/var/log/cron #定时任务日志
# 了解
/etc/crontab #不推荐使用,定时任务的配置文件
/etc/cron.hourly/ #系统定时任务,每小时运行
/etc/cron.daily/ #系统定时任务,每小时运行
/etc/cron.weekly/ #系统定时任务,每小时运行
/etc/cron.monthly/ #系统定时任务,每小时运行
3.操作语法
crontab [-u user] [file]
crontab [-u user] [-e|-l|-r |-i]
选项含义如下:
-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
4.基本操作
# 基本操作
创建当前用户计划 crontab -e == vi /var/spool/cron/root #当前用户的名字
查询当前用户计划 crontab -l
删除当前用户计划 crontab -r
2.实际使用
1.文件内容详解
00 02 * * * ls
每天2:00整
00 02 1 * * ls
每月1号2:00整
00 02 14 2 * ls
每年2月14号2:00整
00 02 * * 7 ls
每周日2:00整
00 02 * 6 5 ls
每年6月的周五2:00整 (特殊)
00 02 14 * 7 ls
每月14号2:00整
每周日2:00整
这两个时间都执行
00 02 14 2 7 ls
每年2月14号2:00整
2月每周日2:00整
这两个时间都执行
2.特殊符号
特殊符号 | 说明 | 案例 |
---|---|---|
/ | 每隔多少时间 | ʺ2 * * * * 每2分钟 00 */2 * * * 每2个小时 |
- | 表示范围 | 00 08-22 * * * 08-22点的每个小时运行 00 08-22/3 * * * 08-22点的每3小时运行 |
, | 表示独立时间(没规律) | 00 08,11,14,17,20 * * * |
* | 每,全部/所有(没说具体时间) | *在分钟的位置上表示00-59,每分钟的意思 |
3.注意事项
1.命令使用绝对路径
2.书写的命令或脚本定向到空或追加到文件
3.书写定时任务的时候,尽量添加上一个注释.
4.定时任务未来避免一些故障,推荐使用脚本.
# 书写流程
1.分析要求需要什么样的命令并调试
2.书写脚本(命令较多,功能复杂)与调试
3.书写定时任务的配置文件(绝对路径,定向到空)
4.调试
3.一些案例
1.每天的上午7点到晚上11点 每二个小时运行CMD命令
* 07-23/2 * * * CMD
2.定时任务每天23点到第2天的7点运行.
00 23,00-07 * * *
3.每小时的0分执行
0 * * * * /mysql_back.sh
4.每五分钟执行
*/5 * * * * /mysql_back.sh
5.每月的1,4,6日的2点整执行
0 2 1,4,6 * * /mysql_back.sh
6.每月5日到9日的两点整执行
0 2 5-9 * * /mysql_back.sh
7.每分钟执行
* * * * * /mysql_back.sh
8.每天两点整执行
0 2 * * * /mysql_back.sh
9.每月14号的2点整执行
0 2 14 * * /mysql_back.sh
10.2月14日2点整执行
0 2 14 2 * /mysql_back.sh
11.不写月日,仅周生效。每月的周五,两点执行
0 2 * * 5 /mysql_back.sh
- 6月2日的两点整执行,6月的周五两点整执行
0 2 2 6 5 /mysql_back.sh
13.每2分钟同步下系统的时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun &>/dev/null
14.每天定时备份/etc/到/backup/下面
tar czvf `date`.bak /etc
00 01 * * *
15.每个一分钟执行创建文件的计划任务
1.准备创建脚本文件
vim /root/1.sh
/usr/bin/touch /root/`date +%F-%H-%M-%S`.txt
chmod +x /root/1.sh
2.编写任务计划
crontab -e
* * * * * /root/1.sh
3.查看创建结果
ls -l /root/
16.计划任务的权限控制
cat /etc/cron.deny
如果这个文件存在,凡是写到这个文件里面的账户不允许执行crontab命令
cat /etc/cron.allow
如果这个文件存在,没有写到这个文件里面的账户不允许执行crontab命令
如果有allow文件,那不管deny是否存在,都是只允许allow文件里面的用户
4.使用变量
1.定时备份
dir=/server/scripts/
file=backup-etc.sh
time=`date +%F_%w`
tar zcf /backup/etc-$time.tar.gz /etc/
5.常见问题
1.不推荐:周几与日期一起写.
#分时日月周,在取第几周的时候,会不会由于互相冲突,日不符合周会不会乱
2.排障(排除法)
定时任务执行失败.
没有日志.(crond服务没有运行,rsyslog服务没有运行)
没有结果.(手动运行对应的命令或脚本)
调试脚本: sh -x 或bash -x 显示脚本执行过程 (有+的表述过程,没有+表述输出)
其他原因
3.系统级任务调度与用户级任务调度
系统级任务调度主要完成系统的一些维护操作(比如定时重启机器),用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行。
6.注意事项
1.命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到.
定时任务运行脚本的时候或命令的时候,只能识别/bin和/usr/bin目录下面的命令.其他的命令无法识别.
解决方案:
🅰 简单粗暴,遇到这种命令,直接写绝对路径.
/sbin/ip a s eth0
🅱 治本,在脚本开头 重新定义下PATH环境变量或重新加载下PATH环境变量.
export
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
hostname
ip a s eth0
source /etc/profile #重新加载PATH环境变量
hostname
ip a s eth0
定时任务识别的命令的路径:
PATH linux环境变量,存放命令的位置.
linux会在PATH路径中查找,如果有则执行.如果没有提示command not found/ no such file or directory
2.定时任务没有定向到空或追加到文件故障案例
现象:
邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root
邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因:
定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root.
解决:
定时任务中命令或脚本定向到空或追加到文件.
3.命令执行不全
例:* * * * * tar zcf /`data +%F`.tar.gz /etc &>/dev/null
发现命令只会执行到+就停止了
#在定时任务中,%相当于回车
#加\或者写脚本解决
4.通过uptime取出的cpu负载老是获取不到
update取值,取最后的1,5,15要倒着取,因为up的天数不稳定,刚启动有分钟,超过60分钟有小时和分钟,超过24小时有天。
7.实战案例
1.定时备份/etc/目录到/backup以ip地址命名的目录中
书写脚本+变量
取出ip存放变量 ✅
取出时间存放到变量 ✅
创建以ip命名目录 ✅
打包压缩存放到这个ip地址命名的目录中,压缩包加上时间 ✅
书写定时任务(每分钟)
书写定时任务(改为指定时间)
cat backup.sh
ip=`hostname -I |awk '{print $1}'`
time=`date +%F_%w`
#dir=/backup/$ip
#full_file=$dir/etc-$time.tar.gz
mkdir -p /backup/$ip
tar zcf /backup/$ip/etc-$time.tar.gz /etc/
2.定时系统巡检(定时输出系统基本信息)写入到/tmp/sys.log中
主机名信息(主机名)
ip地址
负载信息(0 0 0)
内存信息(内存多大,用了多少,剩余多少)
cpu信息(核心数)
磁盘信息(磁盘使用多少,剩余多少)
进程信息(一共多少进程,几个运行,几个挂起,几个僵尸)
#################################
主机名: xiaoyuedu ip地址: 10.0.0.200
#################################
负载信息
最近1分钟: 0
最近5分钟: 0
最近15分钟: 0
#################################
内存信息(单位kb)
总计内存: 2000000
内存使用了多少: 200000
内存使用率: 10%
#################################
swap信息
swap总大小: 200000
swap使用大小: 0
swap使用率: 0
#################################
磁盘信息
几块硬盘: 1
根分区大小: 20G
根分区使用率: 10%
################################
进程信息
进程总数: 100
运行中进程: 2
挂起进程数量: 0
僵尸进程数量: 0
################################
三、时间
1.date
date 功能描述:显示当前时间
date “+%Y” 功能描述:显示当前年份
date “+%m” 功能描述:显示当前月份
date “+%d” 功能描述:显示当前是哪一天
date “+%Y-%m-%d %H:%M:%S” 功能描述:显示当前年-月-日 时:分:秒
date +%w 周数
date +%F 完整的日期
date +%T time
2.修改系统时间 修改当前时间
date --set="20240613 00:00:00"
3.同步时间为北京时间
yum install -y ntp
systemctl restart ntpd
sed -i '/server 3.centos/aserver ntp1.aliyun iburst' /etc/ntp.conf
timedatectl set-timezone Asia/Shanghai
systemctl restart ntpd
date
4.date的参数
-d 根据说明修改时间
date -d '-1 day'
date -d '-1 day' +%F_%w_%H
-s 手动修改时间
date -s '20221111 11:11:11'
date -s '20221111'
5.ntpdate
date -s '20221111'
yum install -y ntpdate
ntpdate ntp1.aliyun
date
# 修改时区
timedatectl set-timezone Asia/Shanghai
# 查看时区
timedatectl status
# 进行时间同步
ntpdate ntp1.aliyun
6.面试题
创建带日期的文件案例
7.linux文件时间的分类
linux文件时间 | 说明 |
---|---|
mtime | modify 修改时间,最常用 |
atime | access 访问时间 |
ctime | change 文件属性的变化时间 |
8.查看文件信息
stat 查看文件的属性信息+文件名
十一、日志管理
一、日志介绍
1.常见日志
# tail -10 /var/log/messages //系统主日志文件
# tail -f /var/log/messages //常见的系统和服务错误信息
# tailf /var/log/secure //登陆的时候被记录。分析是否有恶意登陆情况.
# tail /var/log/yum.log //yum
# tail /var/log/maillog //跟邮件postfix相关
# tail /var/log/cron //crond、at进程产生的日志
# tail /var/log/dmesg //和系统启动相关
# tail /var/log/audit/audit.log //系统审计日志
# tail /var/log/mysqld.log //MySQL
# tail /var/log/xferlog //和访问FTP服务器相关
# tail /var/log/wtmp //该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看(命令:w)
# tail /var/log/btmp //记录Linux登陆失败的用户、时间以及远程IP地址(命令last)
# tail /var/log/lastlog //所有用户的登录情况(命令lastlog )
# tail /var/log/boot.log //系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息
2.rsyslog
# 默认已安装
systemctl start rsyslog.service
rpm -qc rsyslog
/etc/rsyslog.conf rsyslogd的主配置文件(关键)告诉rsyslogd进程什么日志,应该存到哪里。
/etc/sysconfig/rsyslog rsyslogd相关文件,定义级别(了解一下)
/etc/logrotate.d/syslog 和日志轮转(切割)相关(任务二)
# 主配置文件
告诉rsyslogd进程什么日志,应该存到哪里。
vim /etc/rsyslog.conf
RULES:即规则,是一套生成日志,以及存储日志的策略。
RULES由FACILITY+LEVEL+FILE组成。(由设备+级别+存放位置)
二、logrotate
为了节省空间和整理方便,日志文件经常需要按!时间或!大小等维度分成多份,删除时间久远的日志文件。
# 按照配置进行轮转
# 主配置文件:/etc/logrotate.conf
=========全局设置==========
weekly //轮转的周期,一周轮转
rotate 4 //保留4份
create //轮转后创建新文件
dateext //使用日期作为后缀
#compress //是否压缩
include /etc/logrotate.d //包含该目录下的子配置文件
=========单独的日志设置==========
/var/log/wtmp { //对某日志文件设置轮转的方法
monthly //一月轮转一次
minsize 1M //最小达到1M才轮转,monthly and minsize(同时达到两个条件)
create 0664 root utmp //轮转后创建新文件,并设置权限
rotate 1 //保留一份
}
/var/log/btmp {
missingok //丢失不提示
monthly //每月轮转一次
create 0600 root utmp //轮转后创建新文件,并设置权限
rotate 1 //保留一份
}
# 配置轮转规则
missingok //对应文件如果不存在,他不会报错
maxsize 30k //达到30k轮转, daily or size
yearly //或者一年一轮转
daily //缩小周期到1天
rotate 3 //轮转切割3次,意思是保留3天的,超过3天的就删了
compress //压缩
delaycompress //隔一天再压缩
notifempty //如果文件空的就不管
create 640 nginx nginx //切割之后的文件权限
# 强制轮转
logrotate -s /var/log/logrotate/logrotate.status /etc/logrotate.conf
# 默认调用
logrotate 每天会根据配置文件进行调用
三、看报错
1.抓哪些日志的核心
failed, failure,error
/var/log/secure中 查看,Failed password
十二、网络管理
一、网络设备
1.交换机
- 在一个交换机的端口上所连接的所有终端设备,均在一个网段(局域网 LAN)上
- 产生广播消耗设备CPU资源
- 企业级交换机会有一些基本的安全功能,这种交换机叫网管功能的交换机
- 了解:广播域的隔离(创建VLAN 虚拟局域网)
- 了解:交换机可以隔离冲突域,每一个端口就是一个冲突域
2.路由器
- 路由协议的转发(路由选路,指路)
- 数据转发,会维护一个路由表(相当于一个地图)
- 路由器会作为网关(数据的出入口,类似于大楼的大门),一般会在网络出口的位置摆放一台路由器
- 路由器用于连接广域网(公网)
3.通用网站网络架构
- 核心层接入,使用三层路由:ER3260G2
- 核心层使用三层交换机分发
- 汇聚层使用一般交换机进行vlan的划分
- 接入层扩展网口使用傻瓜交换机即可
二、OSI七层模型
1.什么是OSI七层模型
用于规定数据在发送,传输,阅读的流程.
2.哪七层
应用层 应用程序/原始数据/ #大部分软件运行在这一层
表示层 格式/压缩/加密 #负责格式/压缩/加密
会话层 会话/全双工/半双工 #负责会话管理,维护
传输层 分段/重组/端口号 #负责数据传输方式
网络层 IP地址/寻址/路由 #主要负责路由与寻址
数据链路层 MAC地址/局域网/ #将分组数据封装成帧
物理层 传输介质/比特流 #将数据转换成2进制形式,通过线缆传输
五六层不用管干啥的
3.应用层
大部分软件,服务运行在应用层中.
暴露很多接口,提供给其他服务软件使用.主要就是提供应用程序可以接入网络的接口,并根据程序的不同对应不同的接口协议.
接口: 别人定义好的规范.usb接口一样,这里的接口指的是软件的接口,用于软件之间,服务之间相互使用.
比如http,https,smtp(25,465),dns(53)
4.传输层
负责建立端到端的连接和断开,保证报文在端到端之间的传输
协议有tcp和udp
5.网络层
负责将数据从源地址传输到目的地址
主要负责: 主要作用就是路由(指路)和寻址(根据ip地址找人)
- 提供ip地址(DHCP).
- 进行路由(问路,指路)(路由表)
6.数据链路层
把上层数据进行转换转换为帧(对数据进行处理与加工).
这一层加工数据的时候,增加了MAC地址.
负责数据可以在局域网传输(精确传输). 局域网传输的时候使用的是mac地址
7.查看路由表
ip ro
route -n
8.物理层
通过设备的网卡把上面的数据转换为网络介质中可以传输的信号.
把数据转换为0101010内容,通过传输介质传递给对方.
9.传输过程
数据从应用层发出,传输层添加一层tcp报头(源端口和目标端口),网络层添加ip报头(源ip和目标ip),数据链路层加帧头(源mac地址和目标mac地址),物理层转换成比特流。传输过去之后,对方就会解包。整个过程就是封包和解包的过程
10.wireshark的使用
1.上方搜索框搜索http协议,可以过滤
2.随便点开一个带路径的包,就有七层模型的信息了
3.其他协议抓包,比如ssh
4.tcp.port==9999 过滤指定端口
11.TCP/IP模型
应用层
传输层
网络层
网络接口层
12.目前开发书写代码的模板
java: springboot,springcloud
python: Django, Flask
Php: Thinkphp
三、三次握手和四次断开
1.重点
与服务的端口建立连接的流程
tcp三次握手的目标:与端口建立连接
udp没有3此握手建立连接的过程,直接连接
2.三次握手核心
有个确认流程:保证数据不会丢,如果丢失重新发送
3.文字描述3次握手流程
1.客户端发出建立连接请求: SYN建立连接请求 . 发出seq的随机数(seq=100).
2.服务端收到客户端请求: ACK(确认),SYN(与客户端建立连接) , 发ack=seq+1(101),seq=随机(666)
3.客户端收到服务端请求与确认: 发出ACK确认建立连接 , 发出 ack=seq+1(667),seq=ack(101)
4.到此,连接建立,开始传输数据
#ack就是确认的意思
4.四次挥手目的
4次挥手目的是断开连接
5.4次挥手流程
1.客户端: 发出断开连接请求: (FIN) 断开连接请求,seq=1000 ack=668
2.服务端: 收到客户端请求,确认: (ACK) ,确认断开, seq=668 ack=seq+1(1001)
3.服务端: 向客户端发出断开连接请求,(FIN)断开连接请求, seq=668 ack=seq+1(1001)
4.客户端: 确认收到请求,断开连接, (ACK)确认收到请求, seq=1001 ack=seq+1(669)
5.连接断开
#未来大多数是服务端发出的4次回收
6.三次握手抓包分析
#wireshark+nc
nc -lvvp 9999
nc -lu 9999 #建立udp的端口
抓包之后呢,筛选出9999端口
1.SYN的第一个数据包,写的SYN=0,是方便给人观看的,实际数据进入数据包,起始行有源端口和目标端口Seq:0,seq的原始的值(raw)。但是此时ack原始的值就是0。Flags是标记,意思是要干嘛。这里就是SYN的标记。
2.SYN,ACK的数据包,写的seq=0,Ack=1.进入数据包查看,端口反过来了,Seq:0,ack:1。
seq的值和它的原始值。ack的值(wireshark帮我们整的一个相对值1)和原始的值,就是上一个seq+1。Flags标记SYN,ACK
3.ACK的数据包。写的Seq=1,Ack=1。进入数据包查看,端口又反转了。Seq的值和原始值,Ack的值和原始值,Flags标记SYN,ACK
4.带PSH标志的,就是传输数据
7.四次断开抓包
#其实还是沿用的上一个抓包数据
1.FIN,ACK: Seq:1,Ack:16
2.ACK: Seq:16,Ack:2
3.FIN,ACK: Seq:16,Ack:2
4.ACK: Seq:2,Ack:17
8.常见的TCP中的标记位
TCP标记位 | |
---|---|
SYN | sync,同步请求,与服务器端口建立连接 |
ACK | ack, 确认.(回复:收到.) |
FIN | finnish/final 结束,断开连接 |
PSH | 表示传输数据 |
ack与seq | |
---|---|
seq | sequence 序列号,随机 |
ack | ack,确认号 |
9.什么样的使用tcp,什么样的使用udp
#tcp
web浏览器,电子邮件,文件传输协议
#udp
视频,域名系统,ip语音
10.为什么UDP就是不安全的
数据包的结构导致的
TCP:数据,端口,seq,ack,标记
UDP:数据,端口
11.三次握手实时抓包
#1.
Transmission Control Protocol, Src Port: 58470, Dst Port: 9999, Seq: 0, Len: 0
Source Port: 58470
Destination Port: 9999
Sequence Number: 0 (relative sequence number)
Sequence Number (raw): 336279127
Acknowledgment Number: 0
Acknowledgment number (raw): 0
Flags: 0x002 (SYN)
#2.
Transmission Control Protocol, Src Port: 9999, Dst Port: 58470, Seq: 0, Ack: 1, Len: 0
Source Port: 9999
Destination Port: 58470
Sequence Number: 0 (relative sequence number)
Sequence Number (raw): 3119721423
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 336279128
Flags: 0x012 (SYN, ACK)
#3.
Transmission Control Protocol, Src Port: 58470, Dst Port: 9999, Seq: 1, Ack: 1, Len: 0
Source Port: 58470
Destination Port: 9999
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 336279128
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 3119721424
Flags: 0x010 (ACK)
12.四次握手实时抓包
#1.
Transmission Control Protocol, Src Port: 9999, Dst Port: 58472, Seq: 1, Ack: 1, Len: 0
Source Port: 9999
Destination Port: 58472
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 3049096138
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 463559273
Flags: 0x011 (FIN, ACK)
#2.
Transmission Control Protocol, Src Port: 58472, Dst Port: 9999, Seq: 1, Ack: 2, Len: 0
Source Port: 58472
Destination Port: 9999
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 463559273
Acknowledgment Number: 2 (relative ack number)
Acknowledgment number (raw): 3049096139
Flags: 0x011 (FIN, ACK)
#3.
Transmission Control Protocol, Src Port: 9999, Dst Port: 58472, Seq: 2, Ack: 2, Len: 0
Source Port: 9999
Destination Port: 58472
Sequence Number: 2 (relative sequence number)
Sequence Number (raw): 3049096139
Acknowledgment Number: 2 (relative ack number)
Acknowledgment number (raw): 463559274
Flags: 0x010 (ACK)
#这是系统强制断开
四、TCP11种状态
1.所有状态
#核心必会
CLOSED,ESTABLISHED,LISTEN,TIME_WAIT,CLOSE_WAIT
#逐渐掌握
FIN_WAIT1,FIN_WAIT2,CLOSING,SYN_SENT,SYN_RECV,LAST_ACK
2.CLOSING状态表示:
客户端发了FIN,但FIN_WAIT1状态时没有收到服务器的ACK确认字段,却收到了服务器的FIN字段,这种情况发生在服务器发送的ACK
丢包的时候,因为网络传输有时会有意外。
3.三次握手状态变化
01.首先,建立连接之前服务器和客户端的状态都为CLOSED。
02.服务器创建socket后开始监听((服务端启动后)启动服务),变为LISTEN状态。
03.客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT。
04.服务器收到客户端的报文后向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD(收到了客户端发送的SYN请求)。
05.然后,客户端收到ACK、SYN,就向服务器发送ACK,客户端状态变为ESTABLISHED
06.服务器收到客户端的ACK后也变为ESTABLISHED。
4.四次挥手变化
01.客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1。
02.服务器收到FIN后向客户端发送ACK,服务器状态变为CLOSE_WAIT。
03.客户端收到ACK后就进入FIN_WAIT2状态。此时连接已经断开了一半了。如果服务器还有数据要发送给客户端,就会继续发送。
04.直到发完了,就发送FIN报文,此时服务器进入LAST_ACK状态。
05.客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态,再过了2秒长的时间后进入CLOSED状态。
06.服务器收到客户端的ACK就进入CLOSED状态。
#谁先主动谁承担客户端的角色
5.哪种状态会比较多
1.ESTAB,生产环境这个多
2.TIME_WAIT, CLOSE_WAIT,等待断开的状态也会比较多,一般来说这些状态会比ESTAB高,但是高的异常的话,就是开发代码有问题了。
五、常见网络协议
1.DNS
1.DNS解析流程
1.查询hosts文件
2.查询本地DNS缓存
3.询问本机DNS地址(网卡配置的)
4.本地DNS直接询问根域名解析服务
5.根域名解析服务:不知道,去问cn服务器吧
6.询问CN服务器知否知道域名对应的ip
7.CN服务器指向二级域名
8.二级域名询问三级域名
9.三级域名先把ip告诉了本地DNS,然后再告诉本地的主机,如果是windows系统顺便还做缓存
#根只记顶级域名,顶级只记二级,二级只记三级
#一般不会去访问顶级域名,在本地DNS就解决了,比如阿里的DNS。
2.域名结构
根域名 . 域名的开头 13个根
顶级域名
二级域名 jd centos
三级域名 www.jd m.jd
3.显示windows的dns缓存
ipconfig /displaydns
#清空
ipconfig /flushdns
4.windows hosts文件
C:\Windows\System32\drivers\etc\hosts
5.解析ip地址
dig www.baidu
#强制从根找ip地址
dig +trace www.baidu
a.root-servers.
#指定DNS服务器
dig @223.6.6.6 www.baidu
6.linux无法上网的故障
#通过域名访问: ping域名 dig解析域名 报错. yum安装软件失败
#ping 公网ip可以访问的.
#提示Name or service not known
直接添加域名服务器
2.ARP协议
ARP协议是三层协议,进行mac地址解析,但是工作在2层
1.解析流程
1.发出arp请求,发送广播找人 谁知道10.0.0.2的mac地址,请告诉10.0.0.200
2.单播:所有局域网的设备都收到广播,只有10.0.0.2这个机器进行响应(回复): 我是10.0.0.2 我的mac地址是xx:xx:xxxxxxxx
3.缓存mac地址
2.查看arp解析
arp
arp -n #-n是不要解析部分ip成域名
3.删除arp缓存
arp -d 10.0.0.12
3.ICMP: Internet控制报文协议
1.ping之后为什么没有回应
1.对方丢弃了数据包
2.对方挂了
3.防火墙等安全工具的拦截
4.DHCP
#自行研究
六、网卡配置
1.网卡命名
1.命名规则
ens33
eth0
2.修改网卡名的方法
方法01:安装系统的时候修改 net.ifnames=0 biosdevname=0
#install centos7的时候按个tab键
方法02:安装完成系统
3.在系统中如何修改网卡名字
#1.修改配置文件
vim /boot/grub2/grub.cfg
搜索linux16的行,在这行结尾加上
net.ifnames=0 biosdevname=0
#如果是两行,那么两行都改
#2.修改网卡名字
mv ifcfg-ens33 ifcfg-eth0
#3.修改网卡名字里面的内容
sed -i 's#ens33#eth0#g' /etc/sysconfig/network-scripts/ifcfg-eth0
##一般就是DEVICE和NAME
#4.重启linux系统
2.网卡配置文件
TYPE="Ethernet"
BOOTPROTO="static" ##网卡固定ip还是自动获取ip,分DHCP或者static,none
UUID= #设备的唯一标识符,默认可以删除,删除之后会自动分配
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes" #开机自启
IPADDR="10.0.0.11"
NETMASK="255.255.255.0"
GATEWAY="10.0.0.2" #看具体路由器设置,一般都是1 或者254
DNS1="10.0.0.2"
PREFIX=24 #与NETMASK一样
3.DNS配置文件
- 网卡配置文件DNS1,DNS2 优先
- /etc/resolv.conf 实时生效,重启网卡则被网卡配置文件覆盖
4.访问网站的流程
1.DNS解析过程:域名--> IP
2.与对应服务器的端口(80或443)建立连接: 3次握手
3.数据的请求与响应(http协议,传输数据)(第2个阶段展开)
4.断开连接:4次挥手.
5.局域网上网原理
1.本机ip访问公网目标ip,但是在路由表中没有公网ip的地址,于是把数据包交给了默认网关。
2.默认网关拿到数据包之后,会把数据包经过地址转换,转换成公网ip地址之后,继续寻找目标ip地址的路由表,如果没有继续交给上级路由器
3.经过层层寻找之后,找到了目标ip
4.在数据返回的时候,会按原路返回,找到发送请求的局域网ip地址
#改ip的功能,在网络上被称为NAT功能,网络地址转换
#如果是虚拟机,那么就相当于多了一层NAT
6.虚拟机上网原理
1.安装vmware后创建虚拟网卡,在windows下面(vmnet8)
2.设定vmware虚拟交换的网段(虚拟网络编辑器里面设置的)
- 2.1网段范围:圈定主机能使用的内网ip地址
- 2.2掩码:在这个网段内能使用的主机有多少个:
3.windows vmnet8虚拟网卡会自动获取1个局域网ip: 10.0.0.1
4.安装Linux服务器,选择网络模式为NAT,设定ip地址:10.0.0.200
5.使用windows xshell远程工具连接Linux服务器
- 5.1向10.0.0.200发送建立连接请求:
- 5.2查询系统中去往10.0.0.0/24最近路线-- >vmnet8;(问路与指路)
- 5.3请求会通过vmnet8发送出去;
- 5.4 vmnet8将请求转发给了虚拟交换机;
- 5.5发起广播,谁是10.0.0.200;
- 5.6 10.0.0.200响应,数据报文被接受收
- 5.7 10.0.0.200构建响应报文,回传给10.0.0.1;
7.网卡管理命令
1.常见网络管理的命令
nmcli
nmtui
2.修改主机名
# 1.临时修改
hostnamectl set-hostname qianfeng.example
# 2.永久修改
vim /etc/hostname
3.查看ip地址
# 单独查看eth0
ifconfig eth0
ip a s eth0
4.配置ip
ifconfig eth0 10.0.0.2/24 # 会覆盖旧的ip
ifconfig eth0:0 10.0.0.2/24 #子网掩码可以不写
ip addr add 10.0.0.2/24 dev eth0
# a添加 d删除
ip a a 10.0.0.2/24 dev eth0
ip a d 10.0.0.2/24 dev enp0s25
5.启动关闭网卡
ifconfig eth0 up
ifup eth0
ifconfig eth0 down
ifdown eth0
七、网络管理命令
1.检查端口是否开启
1.软件包
yum install -y net-tools lsof nethogs iftop telnet nc nmap
2.检查端口–是否存在22端口
ss -lntup |grep 22
netstat -lntup |grep -w 22
# -l显示的更全一些
# -n 不要把ip反向解析为主机名、域名。
# -t 显示tcp
# -u 显示udp
# -p 显示服务,甚至显示pid
lsof -i :22
lsof -nPi :22
# -P 不要把端口解析为对应的服务。
#最好使用ss,如果访问量巨大,netstat可能会卡
3.检查是否可以访问22端口
#1.telnet
telnet 10.0.0.200 22 #命令行中推荐使用,检查是否有connected 标记。
#2.nc
nc -v 10.0.0.200 22
nc -v www.baidu 80 #这个一般用于shell脚本中检查端口是否开启.输出少
#3.nmap
nmap -p22 10.0.0.200
4.nmap进阶使用
nmap -p1-1024 10.0.0.200
nmap -p22 10.0.0.0/24 jd taobao
2.检查tcp连接状态
1.查看连接数
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c
#如果是80或443端口呢
ss -ant | awk 'NR>1 && $4~/:80$/ {print $1}' | sort | uniq -c
2.压力测试
ab -n 90000000 -c 3 http://10.0.0.200/
#压测的时候 TIME_WAIT巨多
3.网络速度
1.总体速度
iftop #2s 10s 40s数据传输平均速度
iftop -n #ip反向解析为域名/主机名
iftop -i #指定网卡. 默认eth0 第1个网卡.
iftop -P #显示端口
iftop -N #不要把端口解析为服务名字
#最终使用
iftop -nNP -i eth0 #显示端口号,不要把ip解析为域名,不要把端口解析为服务, 监视指定网卡eth0
2.进程流量
查看进程的流量情况.
方法01: iftop,ss,ps 一起使用
iftop找出端口.
ss找出端口对应的进程号(pid)
ps根据pid过滤进程名字.
方法02: nethogs
nethogs
#如果网卡名不是eth0,则需要指定ens33
4.DNS解析
1.dig
2.host re.xiaoyulinux
3.nslookup www.baidu
5.追踪命令
#1.ping
#2.tracert(windows)
traceroute -nI www.baidu #默认使用udp协议,-I使用icmp协议.
#3.traceroute (linux )
八、抓包
1.为什么要抓包
未来一些网络的问题,数据传输的问题,很难直观的看出来,需要使用抓包软件查看数据传输背后发生了什么
2.常见抓包工具
wireshark 可视化抓包工具. win/mac/linux
fiddler 代理,所有流量走fiddler,然后出去.
科来
tcpdump linux自带,yum安装.
burpsuite 抓包,修改数据包.安全去使用.
3.wireshark过滤器规则
#1.抓指定协议
icmp #ping 数据包
tcp
udp
http
arp
过滤https数据包: tls
#2.抓住指定端口
tcp.port == 80 #过滤出源端口或目标端口是80的数据包.
如果是udp数据包
udp.port == 53
tcp.srcport == 80 #过滤出源端口80
tcp.dstport == 80 #过滤目标端口80
udp.srcport == 53
udp.dstport == 53
#3.抓出指定ip的数据包
ip.addr == 10.0.0.200 #过滤出源ip或目标ip是 10.0.0.200 数据包
ip.src == 10.0.0.200 #过滤出源ip10.0.0.200 数据包
ip.dst == 10.0.0.200 #过滤出目标ip10.0.0.200 数据包
#4.不固定内容的过滤-比较大小
过滤出端口小于等于1024的数据包.
tcp.dstport <= 1024
等于 ==
小于等于 <=
小于 <
大于等于 >=
大于 >
不等于 !=
#5.grep过滤,包含,正则
wire中不是所有的指标都支持正则,过滤.
需要字段的内容是字符串,才能使用正则过滤.
过滤出http协议中包含baidu数据包
http ~ "baidu"
http.host ~ "[0-9]+(|)"
http.host用户请求的域名中包含xxxx
matches 或 ~
#6.与或非-
#过滤端口号大于等于20 小于等于1024
tcp.port >=20 && tcp.port <=1024
tcp.port >=20 and tcp.port <=1024
#组合 过滤出 端口是80 并且 ip地址是10.0.0.200
and #并且 &&
or #或者 ||
! #取反
tcp.port == 80 && ip.addr == 10.0.0.200 #并且
tcp.port == 80 || ip.addr == 10.0.0.200 #或者
#tcpdump最高只支持4层
4.tcpdump抓包与wireshark对比
过滤条件 | wireshark | tcpdump |
---|---|---|
抓出指定协议 | icmp/tcp/http | icmp/tcp/udp |
抓出指定端口 | tcp.port == 80 | port 80 |
过滤出源端口 | tcp.srcport == 80 | src port 80 |
过滤出目标端口 | tcp.dstport == 80 | dst port 80 |
抓出指定ip的数据包 | ip.addr == 10.0.0.200 | host 10.0.0.200 |
过滤出源ip | ip.src == 10.0.0.200 | src host 10.0.0.200 |
过滤出目标ip | ip.dst == 10.0.0.200 | dst host 10.0.0.200 |
正则 | 字段(指标)字符串 ~或matches 匹配正则,“正则” | 无 |
与 | && 或 and | and |
或 | 或 or | or |
非 | ! | ! |
选项 | 无 | -w保存数据包 -i指定网卡 -vvv -nnn |
5.tcpdump具体使用方法
#1.过滤协议
tcpdump icmp
tcpdump -vvv -nnn icmp
#2.过滤指定端口号 80端口
tcpdump -nnn port 80
tcpdump -nnn src port 80
tcpdump -nnn dst port 80
#3.抓住指定主机
tcpdump -nnn host 10.0.0.200
#4.抓取指定ip和端口的数据包
tcpdump -nnn src host 10.0.0.200 and port 80
tcpdump -nnn dst host 10.0.0.200 and port 80
#
tcpdump -i ens33
#组合 过滤出 端口是80 并且 ip地址是10.0.0.200
and #并且
or #或者
! #取反
tcpdump无法过滤出7层的数据包 http 需要指定端口号过滤并保存,然后通过wireshark查看.
6.案例tcpdump + wireshark抓包流程
tcpdump 抓包的时候 通过-w保存
下载windows,通过wireshark分析即可
tcpdump -vvv -nn -i eth0 port 80 or port 53 -w http-des.pcap
九、IP地址
1.格式与分类
点分十进制ip(ipv4) 32位
ipv6,128位
ip地址组成:网络位(居住的校区),主机位(楼房间)
根据网络位不同划分ip地址分类.
2.子网掩码
子网掩码: 用来绝对局域网(网段中)最多有多少台机器.
PREFIX=24
NETMASK=255.255.255.0
3.公有ip地址
A类(1~126)
B类(128~191)
C类(192~223)
D类(224~239)组播
E类(240~255)科研
4.私有ip地址
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
十三、其它业务
一、邮箱
-
邮件
- 最简单的一种发送方式
-
配置发件人:163
- 获取:授权码(用户密码)
- linux配置/etc/mail.rc
- 完成
-
收件人:qq
-
通过命令发送
-
配置发件人
- 获取授权码
- vlxkwimwbqfgcbba
1.配置linux mail.rc 配置发件人信息
yum install -y mailx
vim /etc/mail.rc #写到最后
#未加密的发送方式通过25端口,可能会被公有云封掉.
cat >>/etc/mail.rc <<EOF
set from=112885471@qq
set smtp=smtp.qq
set smtp-auth-user=xiaoyu001@163
set smtp-auth-password=BGRCTL CZXIT
set smtp-auth=login
EOF
#加密的方式465端口
cat >>/etc/mail.rc <<EOF
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=lida996@163
set smtp=smtps://smtp.163:465
set smtp-auth-user=lido996@163
set smtp-auth-password=aaaa
set smtp-auth=login
EOF
set from=xiaoyu001@163 #配置发件人
set smtp=smtp.163 #配置使用163发送邮件 如果是加密smtps://smtp.163:465
set smtp-auth-user=xiaoyu001@163 #用户名:邮箱名字
set smtp-auth-password=BGRCTLKQDU IT #授权码
set smtp-auth=login #认证形式login
#下面3行用于配置加密方式进行传输
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
cat >>/etc/mail.rc <<EOF
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=112885471@qq
set smtp=smtps://smtp.qq:465
set smtp-auth-user=112885471@qq
set smtp-auth-password=vlxkwimwbqfgcbba
set smtp-auth=login
EOF
mail -s "网站挂了" 275649210@qq </etc/passwd
2.配置加密方式发送邮件错误
Error in certificate: Peer’s certificate issuer is not recognized
解决方法:
echo -n | openssl s_client -connect smtp.qq:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >/etc/pki/nssdb/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/qq.crt
certutil -L -d /etc/pki/nssdb/
cd /etc/pki/nssdb/
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
3.发送邮件
cat /backup/result.log |mail -s "今日巡检的结果" youjiu_linux@qq
mail -s '巡检' youjiu_linux@qq </backup/result.log
4.发送邮件带上附件
echo "巡检信息在附件" |mail -s "巡检结果" -a /etc/passwd 275649210@qq