学习记录-关于Linux系统(运维方面)-春节复习系列

前情提要:

因为要准备春节过后的面试,发现自己很长时间没有看过linux的一些操作的详细处置场景,故通过之前的面试录音+公司学习的案例+毕业老登的故事,整理了一些知识点,存在偏见+不全面+不完整的情况,会慢慢修正,佬友们如果看到了也可以直接在后面回复,也可以私聊我,我会做一些修改(但是如果还在忙面试可能得等到后面了),本帖主要是希望能够从业务需求/运维实际需要的角度,讲解一些linux的常见命令,和调用的顺序等问题

还有一个事情是,目前会整理的很散,基本一个回复都是一个独立的内容,等后续会统一整理成长篇

(1)行换行符

当前计算机比较常见的换行符有:

1.CR 表现为 \r 这个在WORD下有换行效果

2.CR+LF 这个主要是Windows记事本的换行格式 表现为 \r\n

3.LF 这个主要用于Linux下的系统 表现为 \n

备注:有些时候在写shell脚本的时候,如果ide默认的行换行符 不是 LF 可能会涉及到在linux环境下的运行失败问题,总结来说,具体的错误表现为:

在windows环境下可以运行shell脚本,用于启动服务
但是在linux环境下会出现无法正常启动shell脚本的问题(因为换行符的不一致导致的语法错误),需要留意

29 个赞

(2)vim

一个可靠的文本编辑器,同时需有程序编辑能力,即可以主动以文字颜色分别语法正确性,同时支持快捷键操作

很多时候也会用与创建文件,当使用 vim [需要创建的文件名.对应的文件后缀] 例如: vim test.txt 就会在当前目录下创建一个文件 test.txt文件

需要了解的常见命令有(vim界面)

i – 切换到输入模式,也可以看作是编辑模式,
x – 删除当前光标所在处的字符
:-- 输入命令模式
比如说 :wq 和 :q 还有 :!q
a – 进入插入模式,在光标的下一个位置开始输入文本
dd – 剪切当前行
yy – 复制当前行
p(小写)-- 粘贴剪贴板内容到光标下方
P(大写)-- 粘贴剪贴板内容到光标上方
u – 撤销上次操作
Ctrl + r – 重新做上一个撤销的操作
:w – 保存文件
:q – 退出vim 编辑器
:wq --保存并且退出
:q!–强制退出切不保存
esc – 返回普通模式

vim 基本上可以说在编辑运维的yaml文件,shell脚本,等领域有着非常广泛的作用,可以看作是linux下的记事本,但是本身可用于编程

8 个赞

(3)mkdir/rmdir 创建目录/删除目录

1.支持 并排书写
mkdir a b c
会在当前路径下创建 a b c 多个目录

2.支持递归创建目录
mkdir -p /data/app/test
这里如果父目录不存在则会从头开始创建 如 data app test
的顺序创建目录,如果父目录已存在,也会继续创建目录,所以更加通用

备注:有时候会问,当我们使用shell脚本在自动部署项目的时候,为什么会使用 -p 的mkdir 来用于创建目录结构

其实就是因为 这个时候 不同意报错,因为刚开始的环境根目录可能是空的,导致会遇到 目录不存在 出现重复执行报错/保证幂等的问题

3.mkdir -m 创建目录的同时设置权限

mkdir -m 755 /data/test

在创建该目录的同时,设置权限为755 但是会收到umask的影响

备注:有时候 mkdir -m 777 后权限不是777
是因为umask会屏蔽权限位
最终的权限 = 设置内容 & ~umask
比如说 设置的 777
umask = 022
那么最后实际的权限 是 755

在linux的终端中输入 umask可以看到设置的值

umask即 user file-creation mode mask
中文是 新建文件/目录要被强制去掉的权限位掩码
相当于是要被取消的权限

umask的结构式 3位 8进制
第一位:owner
第二位:group
第三位:others
0:不屏蔽权限
2:屏蔽写的权限
7:屏蔽读写执行权限 r w x

所以一个目录/文件的权限 是和 你自己设置的值与umask的相互作用的结果

备注:不同服务的创建权限不一致,实际是因为umask是进程级的,shell里设置的umask只会影响它和它的子进程,所以不同的服务可能有各自的umask

  1. mkdir -v 显示创建过程 (主要用于在测试脚本的时候,确保构造流程的正确性)

mkdir -pv /data/test

5.如果文件名前缀有- 则需要特殊写法

mkdir – -test

6.删除空目录、

rmdir test
如果里面有文件就会失败

7.递归删除空的父目录

rmdir -p /data/test/app

只有当app变空删除后,test是空的才会删除test

适合用于清理层级目录

8.显示删除过程

rmdir -pv /data/app

一些问题:

a. mkdir 和 rmdir 以及 rm -r

mkdir:创建目录
rmdir:删除空目录
rm -r:递归删除目录(不是空的也可以删除)

b. 为什么rmdir必须要是空的

因为目录中如果还有目录项即除了.和.. 的目录项,会破坏路径解析和一致性,所以内核要求必须要空目录才能删除

2 个赞

关于 vim,佬我大概纠正和补充一下:
i 和 a 其实都是从 normal 模式进入 insert 模式
:q! 是强制退出,但是 :!q是执行外部命令 q
dd 删除的内容默认是放在 “” 和 "1 寄存器
yy 复制的内容是放在 "0 和 “” 寄存器
p 和 P 都是 put “” 寄存器里面的内容
系统剪切板是关联于 "+ 和 "* 这两个寄存器(实际上这两个还有点区别)

所以这两个命令默认的效果可能和佬想的不一样,比如想粘贴剪切板里面的内容却粘贴了别的
更多的,佬可以看相关的书籍和教程,我就不继续卖弄了

6 个赞

mkdir还有些高级玩法

root@hcss-ecs-58d9:~/linux.do# ll
total 8
drwxr-xr-x  2 root root 4096 Feb 12 19:13 ./
drwx------ 11 root root 4096 Feb 12 19:12 ../
root@hcss-ecs-58d9:~/linux.do# mkdir {0..9}
root@hcss-ecs-58d9:~/linux.do# ll
total 48
drwxr-xr-x 12 root root 4096 Feb 12 19:13 ./
drwx------ 11 root root 4096 Feb 12 19:12 ../
drwxr-xr-x  2 root root 4096 Feb 12 19:13 0/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 1/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 2/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 3/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 4/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 5/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 6/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 7/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 8/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 9/
root@hcss-ecs-58d9:~/linux.do# mkdir {a..g}
root@hcss-ecs-58d9:~/linux.do# ll
total 76
drwxr-xr-x 19 root root 4096 Feb 12 19:14 ./
drwx------ 11 root root 4096 Feb 12 19:12 ../
drwxr-xr-x  2 root root 4096 Feb 12 19:13 0/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 1/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 2/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 3/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 4/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 5/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 6/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 7/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 8/
drwxr-xr-x  2 root root 4096 Feb 12 19:13 9/
drwxr-xr-x  2 root root 4096 Feb 12 19:14 a/
drwxr-xr-x  2 root root 4096 Feb 12 19:14 b/
drwxr-xr-x  2 root root 4096 Feb 12 19:14 c/
drwxr-xr-x  2 root root 4096 Feb 12 19:14 d/
drwxr-xr-x  2 root root 4096 Feb 12 19:14 e/
drwxr-xr-x  2 root root 4096 Feb 12 19:14 f/
drwxr-xr-x  2 root root 4096 Feb 12 19:14 g/
6 个赞

(4)关于系统资源浏览的一些命令总结

1.查询内核版本和架构:

uname -a

如果有怀疑问题在于内核/驱动 的时候 需要使用这个命令来确认线上服务的内核/驱动版本

2.判断主机身份,系统

hostnamectl

3.查询 运行时间

uptime

这里输出很关键的有一个就是 load average 1/5/15
后面每一排就是 1分钟 5分钟 15分钟的可运行队列长度

这里的load的包含范围是:CPU排队+不可中断的IO等待(D状态)

如果这里的load 约等于 CPU核心数 基本就是处于满载了
如果load 远大于 CPU核心数 那么就是存在明显的阻塞

4.查询CPU/内存/进程排行榜

top

关于 CPU的部分有

us/sy/wa/si/st

us高:用户态计算高 即 业务、死循环、热点高
sy高:内核态高 即 系统调用/网络/中断 高
wa高:IO等待高 即 磁盘/网络存储 问题
st高:虚拟化和主机占用问题

这里如果你继续按 p 就会按照CPU排序
如果你继续按 M 那么就会按照内存排序

5.free -h 查看内存结构

free -h 用于查看 内存结构

备注:重点要看 available,这里的是真正可用内存,因为linux会使用 缓存文件,所以会导致used avaliable存在差异性

  1. vmstat 1 (待补充)

  2. 查询每一个CPU是否都是在跑(是否是均衡的)

mpstat -P ALL 1

用于查看是否是单线程瓶颈,CPU绑核,中断绑核 的问题

2 个赞

感谢佬友的补充,我也是把之前面试遇到的一些问题从录音提取出来,很多细节还没来得及修复,如果有问题,可以留言给我,我去做一些修改 :smiling_face_with_three_hearts:

Linux的命令 语法 很多时候都是存在很多惊喜,可以探究出很多有意思的玩法 :heart_eyes:

1 个赞

这些我好像曾经学过,然后很久不用最后全忘了。之后我学会了问ai​:smiling_face_with_tear:

2 个赞

一些实践案例
(1)接口超时,报警说 CPU 99% 但是实际问题是 IO wait的情况

第一步:使用uptime
看到load很高,这里可以看出是系统拥塞

第二步:使用top
发现wa的值很高 ,即IO wait 指标很高

第三步:使用 vmstat 1
发现阻塞持续大于0,wa高
确认是IO阻塞导致的load高

第第四步:定位
查看磁盘的 await/util (这里使用 iostat -x 1 查看)确认是否是磁盘/存储本身太慢
这里的util的意思是磁盘繁忙率,也就是磁盘忙于io的时间百分比
await是io平均等待时间,是单个io发起到完成的总时间(排队+服务)
一般来说是小于 5ms,10-20ms可以看作有点慢,如果大于50ms 可以看作磁盘在卡顿
这个会导致b列(阻塞进程)标高
然后找到具体哪几个进程在做读写(pidstat -d 1)你就可以看到 pid 服务 和对应的 读写
这里列举一些常见的io阻塞服务:
mysql(慢查询、大量写入、刷脏页)
日志程序(正在疯狂打日志,这里一般运维会说这个服务正在疯狂在服务器存储上拉屎:poop:,很多时候是因为开发设置的日志有点大病)
批量任务(涉及到导入导出、备份、日志收集的时候)
中间件(待补充)

如果是网络存储(也就是你用的不是本地磁盘,而是类似于NFS,NAS,或者说分布式存储、云存储这些)则需要去 sar -n DEV (判断方式是 util和await都很大,但是你实际查看进程的时候发现读写量不是很大)这个命令可以看到:
rxkb/s txkb/s 网络进出贷款
ifutil:网口利用率

iowait的一些解决办法:
加缓存,少从硬盘读
SQL优化,减少随机的io
异步写、批量写
更换HDD到SSD 因为iops差距很大(这个一般是热数据和冷数据做分层的时候作用很大)

如果出现了磁盘显示的数据很正常,但是存在Mysql/ES等进程的io很高的情况呢(也就是util不太高,但是await很高,同时iotop发现数据库/中间件的读写打满了)

慢SQL加上索引
减少大查询和全表扫描的使用
调整刷盘策略、缓冲区
读写分离

网络存储打满的情况:
升级网卡/带宽
检查交换机、链路,查看是否是因为网络延迟高
NFS的参数优化(待补充)
避免在网络存储上做随机读写

1 个赞

这里很多时候,也是我之前面试被问到,或者看书看到的,也有一些是在公司中真实遇到的问题,所以觉得有记下来的必要,现在很多时候开发,都可以依靠AI进行,人主要是运用经验排除错误以及指导架构,但是在运维的突发情况下,还是依赖于人的一个判断,所以这些还是多少要了解一些,至少做到运维的时候 及时止损,剥离问题,关闭,重启恢复,还有就是一些场景的快速保存等,感觉要学的还有好多 :heart_eyes:

1 个赞

有道理,看来之前学了忘还是缺乏实用场景啊……

1 个赞

一些案例:
(1)服务频繁重启(怀疑方向时内存泄漏OOM)

第一步:top/free -h
查看一下内存的可用大小,如果可用非常小,同时swap used 增长或接近于 0 可用

第二步: vmstat 1
看到 si/so 持续非0 即 在换页
说明内存压力导致出现频繁的swap,延迟肯定在上升

第三步: dmesg -T | tail
查看OOM killer日志
如果存在大量的kill进程 那么代表不是应用主动退出的,可以佐证内存爆了

第四步: sar -r
看看是否是 逐步上涨,还是突然峰值

是的很多小技巧,比如说
!t
代表执行最近一次以t开头的shell命令,比如说上一次执行的命令是top,那!t就是top,最近一次执行的是tail /var/log/message,那!t就是tail /var/log/message

2 个赞

mark了,学习学习

小技巧,在折腾Linux时候记忆更深刻

可以装一个双系统玩玩

2 个赞

学到了,不过感觉 Ctrl r 更方便 :smiling_face_with_three_hearts:

嗯嗯,ctrl + r可以找的更方便

一些案例
(1)CPU不高 但是load很高
现象表述为:报警load高,但是top的结果看CPU的us/sy不高

第一步:uptime
发现load远大于CPU核心数

第二步:top
发现CPU 的 us/sy 都很低

第三步:vmstat 1
发现b很高,即存在大量的D状态阻塞

判断:load是因为IO阻塞堆起来了,而不是因为CPU的问题

第四步:sar -n DEV
如果磁盘表现不明显,则还要查看是否是网络波动导致的

这里其实就是一个知识点实践 即 load指标和CPU指标存在关联和差异性

2 个赞

还有2个小技巧,给佬们分享下:
1、cd
cd #后边什么都不加直接回车,就会返回到当前用户的家目录
cd - #后边加个减号就会退回到当前目录的前一个目录
2、esc
esc . #这个可以瞬间复制上一次shell命令的最后一个参数,善用可以提高效率。尤其是命令参数超长的时候