Linux基础面试题

初级Linux运维面试题


系统基础

1、简述Linux启动流程?

1
2
3
4
5
6
7
8
9
1):首先是BOIS硬件自检,按照配置顺序查找可启动设备,读取磁盘第一个扇区或EFI分区中的引导程序;

2):其次是Boot Loader引导加载程序,加载所选内核镜像和初始化内存盘;将控制权交给内核;

3):接着是内核初始化,解压并加载内核,检测并初始化CPU、内存、等硬件设备,根据启动参数挂载根文件系统,启动第一个用户空间进程;

4):然后是系统初始化,以systemd作为init进程,按依赖关系并行启动系统服务,运行启动脚本;

5):最后显示登陆页面,用户输入用户名和密码进入系统后加载用户配置和环境。

2、Linux常见的发行版有哪些?各有什么特点?*

1
2
3
#常见发型版本
基于 Debian 的发行版 Ubuntu,特点:强大社区支持、友好的用户界面、丰富的软件仓库;
基于 RHEL 的发行版 RockyLinux,特点 :适合企业服务器环境、免费、完全兼容RHEL

3、简述Linux目录结构和常见目录的作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#目录结构
Linux采用FHS文件系统层次结构标准,以 / 作为整个文件系统的起点,包含所有目录以及文件

#常见目录及作用
etc:存放系统配置文件
dev:存放设备文件
bin:存放系统基本命令
sbin:存放需要root权限才能执行的系统管理命令
boot:存放内核、引导、启动相关文件
home:存放用户家目录
proc:存放虚拟文件系统
run:存放系统启动后的临时文件
mnt:临时挂载点
opt:存放第三方软件
var:存放日志文件
tmp:存放临时文件

4、如何查看系统信息?

1
2
3
4
5
6
7
8
9
10
11
#查看内核版本
uname -a

#查看发行版信息
cat /etc/os-release

#查看主机名
hostnamectl

#查看当前用户
whoami

常用命令

1、ls常用选项以及ls -l 参数简述

作用:查看

1
2
3
4
5
6
7
8
9
#常用选项
-l:以列表形式展示
-a:显示隐藏文件
-lh:以人类可读格式展示大小,KB\MB\GB
-lS:降序排序
-lt:时间排序

#ls -l 参数简述
从左往右依次是:文件类别、权限、属组属主、大小、时间、名称

2、cp命令常用选项

作用:拷贝

1
2
3
4
5
6
7
8
9
-r:递归拷贝
-p:保留原文件属性
-a:保留所有属性并递归复制
-i:覆盖前询问
-n:不覆盖已存在的文件
-b:覆盖前创建简单备份
-L:拷贝链接指向的源文件
-s:只拷贝链接
-v:显示过程

3、mv命令常用选项

作用:移动

1
2
3
4
5
-i:覆盖前询问
-n:不覆盖
-b:覆盖前创建简单备份
-v:显示过程
-f:强制

4、find命令常用选项

作用:查找

1
2
3
4
5
6
-type:按类型查找,f 代表文件、d 代表目录、l 代表链接
-size:按大小大小
-user:按属主查找
-a:与
-o:或
!:非

5、chmod命令

作用:设置权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#字母表示
r:可读
w:可写
x:可执行
u:属主
g:属组
o:其它组
a:所有组

#数字表示
6:可读
2:可写
1:可执行

#操作符
+:赋与权限
-:取消权限
=:精确权限

#常用选项
-R:递归修改目录及子目录权限
-v:显示修改后信息

6、chown命令

作用:修改文件或目录属组和属主

1
2
3
4
5
6
#语法格式
chown 选项 属组:属主 文件或目录

#常用选项
-R:递归处理
-v:显示详细处理信息

7、chrgp命令

作用:修改文件或目录属组

1
2
3
4
5
6
#语法格式
chgrp 选项 属组 文件或目录

#常用选项
-R:递归
-v:显示修改详细信息

8、chmod、chown、chgrp三个命令的区别

1
2
3
chmod是修改权限;
chown是修改属组和属主;
chgrp是修改属组

9、ps命令

作用:查看进程状态

1
2
3
4
#常用选项
-aux:查看所有进程详细信息
-ef:以完成格式查看进程列表
-u:查看指定用户进程

10、top命令

作用:实时查看进程信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#常用交互指令
q:退出
h:帮助
空格:立即刷新
1:显示所有CPU核心单独使用率
k:杀死进程
M:按内存占用排序
P:按CUP使用率排序
T:按运行时间排序
u:只显示某个用户的进程

#常用选项
-d:设置刷新时间
-p:只监控指定PID进程
-u:只显示指定用户进程

11、kill命令和killall命令

作用:终止进程

1
2
3
4
5
6
7
#常用选项
-9:强制终止
-15:默认终止,进程可以清理资源后退出

#区别
kill只会终止指定进程
killall会终止本进程和子进程

12、nice命令renice命令

作用:调整进程优先级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#优先级别
-20:最高优先级,仅root可设置
0:默认优先级
19:最低优先级

#启动新进程时设置优先级
nice -n 值 命令 #nice -n 1 touch yy.lop

#renice常用选项
-n:设置新nice值
-p:目标进程PID
-u:目标用户的所有进程

#查看优先级
top:PR参数
ps -l -p PID

## 三剑客

三剑客之grep

作用:根据条件查找匹配内容

1、如何查找包含”error”但不包含”warning”的日志行?

1
2
#使用 -v 选项取反
grep 'error' file | grep -v 'warning'

2、如何显示匹配行及其后3行内容?

1
2
#使用 -A , -B显示前行,-C显示上下行
grep -A 3 '关键字' file

3、如何统计文件中匹配模式的行数?

1
2
#使用-c
grep -c '关键字' file

4、如何递归搜索目录下所有文件中的关键字?

1
2
#使用-r递归
grep -r '关键字' /../../..

5、如何显示匹配行的行号?

1
2
#使用-n
grep -r '关键字' file

三剑客之sed

作用:用于删除、替换文本内容

1、如何替换文件中所有”foo”为”bar”?

1
2
#使用 s///g
sed 's/foo/bar/g' file

2、如何删除文件中的空行?

1
2
#使用^$
sed '/^$/d' file

3、如何只替换每行中第二次出现的匹配?

1
2
#使用s///2
sed 's///2' file

4、如何删除文件的第10行?

1
sed '10d' file	

5、如何显示文件的第5到第10行?

1
2
#使用-n加p指令
sed -n '5,10p' file

6、如何在第5行后添加一行

1
2
#使用a指令
sed '5a 添加的内容' file

7、如何在第5行前添加一行

1
2
#使用i指令
sed '5i 添加的内容' file

8、如果将第6行替换成================

1
2
#使用c指令
sed '6c ====================' file

三剑客之awk

作用:字段提取、统计

1、如何打印文件的第2列?

1
awk '{print $2}' file

2、如何统计文件的行数?

1
awk '{print }'

3、如何统计文件列数?

1
awk ‘{print NF}’ file

4、如何按IP统计访问日志中的访问次数?

1
awk '{ip[$1]++} END {for (i in ip) print ip[i],i}' file | sort -nr

5、如何打印文件中长度超过80个字符的行?

1
awk 'length($0) > 80' file

用户与用户组

1、/etc/passwd文件的字段含义是什么?

1
2
3
从左往右依次是=用户名:密码:UID:GID:描述信息:家目录:登录shell

#密码 x 表示密码在shadow文件中

2、/etc/shadow文件的字段含义?

1
从左往右依次是=加密密码:最后修改时间:最小天数:最大天数:警告天数:不活动天数:失效天数:保留字段

3、简述UID和GID的范围规则

1
2
3
0:表示root用户
1~999:表示系统用户
1000+:表示普通用户

4、如何创建新用户并指定家目录和登录shell?

1
2
3
4
5
6
useradd -m -p 家目录路径 -s /bin/bash

#解释
-m:如果家目录不存在自动创建
-p:指定家目录路径
-s:指定shell路径

5、如何修改用户密码

1
passwd 用户名

6、如何锁定和解锁用户

1
2
3
4
5
#锁定
passwd -l 用户名

#解锁
passwd -u 用户名

7、如何修改用户UID和主组?

1
usermod -u 新UID -g 新组

8、如何删除用户并同时删除家目录?

1
userdel -r 用户名

9、如何将用户添加到附加组?

1
usermod -aG 组名 用户名

10、怎么查看用户所属组

1
id 用户名

11、如何创建新用户组并指定GID?

1
groupadd -g GID 组名

12、如何删除用户组?

1
groupdel 组名

sudo

作用:授权A用户以B用户的身份执行操作

主配置文件:/etc/sudoers

附加配置文件:/etc/sudoers.d

常用配置项

1
2
3
4
5
6
7
8
#允许用户执行所有命令
用户名 ALL=(ALL) ALL

#允许组内成员执行所有命令
组名 ALL=(ALL) ALL

#允许用户指定指定目录下命令
用户名 ALL=(ALL) 目录路径

磁盘管理

1、简述常见文件系统类型及特点

1
2
3
4
5
6
7
#ext4优缺点
优点:Linux默认文件系统,稳定、日志保证数据一致性,向后兼容ext2、ext3
缺点:最大支持1EB文件系统、单个16TB文件,高并发环境不如xfs

#xfs优缺点
优:高性能、高并发、超大文件支持,单个文件8EB,8EB文件系统,在线扩展不支持缩小;
缺点:不适合小文件,不支持缩小,如果日志文件损坏恢复较慢

2、添加一块新硬盘后,如何使用fidsk命令操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#查看
fdisk -l

#进入分区交互模式
fdisk /dev/sd?

n:添加新分区
p/e:p主分区/e逻辑分区,二选一
分区号默认
起始位置默认
终止位置:想分多少就+跟上数字和单位即可
w:保存退出

#格式化文件系统
mkfs -t 文件系统类型 分区路径

#临时挂载
mount 分区路径 挂载目录路径

#查看挂载情况
df -h

#查看分区文件类型和UID
lsblk -f

#永久挂载
vim /etc/fstab

分区路径 挂载目录路径 文件系统类型 defaluts 0 0

3、添加一块新硬盘后,如何使用parted命令操作

1
2
3
4
5
6
7
8
9
10
11
12
13
#查看
parted -l

#分区
parted /dev/sdb
mklabel gpt:将磁盘格式化为gpt
mkpart primary 0GB 5GB:创建主分区,指定文件系统类型以及容量
print:查看创建结果

#格式化分区为指定文件系统
mkfs -t /dev/sdb1

#临时挂载、永久挂载和fdisk方式一样

4、操作raid磁盘阵列的常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#常用参数
-C:创建
-l:指定级别
-n:指定磁盘数量
-f:标记为故障盘
-a:添加磁盘
-r:移除

#创建
mdadm -C /dev/名称 -l 级别 -n 磁盘数量 所用的磁盘

#查看
mdadm -D 阵列名称

#挂载
mount /dev/名称 目录路径

#添加
mdadm /dev/名称 -a 要添加的磁盘

#卸载
umont /dev/名称

#停用
mdadm --stop /dev/名称

#删除
mdadm --zero-superblock 磁盘列表

5、简述LVM逻辑卷

LVM是Linux系统中用于灵活管理磁盘空间的一种技术,通过将物理磁盘抽象为逻辑卷,实现存储空间的动态调整。

PV:物理卷真实的物理磁盘或分区

VG:卷组,多个PV组成的资源池

LV:逻辑卷从VG中划分出来的逻辑磁盘,可以像普通磁盘一样挂载使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#创建PV物理卷
pvcreate 磁盘路径
#查看PV状态
pvdisplay


#创建VG资源池
vgcreate 名称 已初始化为pv卷磁盘路径(多个)
#查看VG资源池
vgdisplay vg资源池名称


#创建LV逻辑卷
lvcreate -L 大小 -n 逻辑卷名称 VG资源池名称
#查看LV逻辑卷
lvdisplay LV逻辑卷名称


#格式化逻辑卷
mfks -t 文件类型 /dev/VG名称/LV名称
#挂载
mount /dev/VG名称/LV名称 目标路径



# 扩容
#如果VG空间不足需要先将物理卷添加进资源池
vgextend VG名称 PV路径
#在原容量加
lvextend -L +大小 /dev/VG名称/LV名称
#直接设定成指定大小
lvextend -L 大小 /dev/VG名称/LV名称



# 缩减
#先缩减文件系统
umont /挂载点
e2fsck -f /dev/vg01/lv01
resize2fs /dev/VG名称/LV名称 大小
#再缩减LV逻辑卷
lvreduce -L 大小 /dev/VG名称/LV名称
#重新挂载
mount /挂载点



#缩减VG资源池
#先移动PV上的数据到其它PV
pvmove /dev/sd?
#VG移除PV
vgreduce VG名称 /dev/sd?
#删除PV
pvremove /dev/sd?

网络管理

1、OSI七层模型和TCP/IP四层模型的区别是什么?请详细说明每一层的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#OSI七层
物理层:负责比特流在物理介质上的传输,如网卡
数据链路层:提供节点到节点的可靠传输,如交换机
网络层:提供主机到主机的通信服务,如路由器
传输层:提供端口到端口的可靠数据传输,如TCP/UDP协议
会话层:负责建立、管理和终止会话,如RPC协议
表示层:负责数据格式加密和转换,如SSL协议
应用层:为应用程序提供网络服务接口。如HTTP协议

#TCP/IP
网络接口层:等同于 物理层+数据链路层,物理介质传输,MAC寻址
网络层:IP寻址、路由转发
传输层:提供端到端通信,如TCP
应用层:等同于 会话层+表示层+应用层,会话管理、提供各种网络应用服务

#不同点
OSI严格七层,TCP/IP将会话层、表示层、并入了应用层,将物理层和数据链路层并入了网络接口层
OSI是理论模型,强调通用性,TCP/IP是实用模型,源于实际协议
OSI由标准化组织制定,TCP/IP通过实践发展而来

2、TCP的三次握手和四次挥手

1
2
3
4
5
6
7
8
9
10
#三次握手建立链接
第一次握手:客户端发送一个SYN请求报文,并附带初始化序列号,表示希望请求建立链接,进入请求等待状态
第二次握手:服务器收到请求后,回复一个SYN同步和ACK确认报文,ACK字段确认客户端的序列号,同时生成服务器自己的序列号,进入同步收到状态;
第三次握手:客户都安收到服务器的确认后,再发一个ACK确认报文,确认服务区的响应,进入建立连接状态,连接完成。

#四次挥手
第一次挥手:客户端发送一个带有FIN标志的报文,表示客户端不再发送数据,但还可以接收数据,进入结束等待_1状态
第二次挥手:服务器收到客户端FIN报文后,发送一个ACK报文确认,确认序列号为收到的序列号加1,进入关闭等待状态,客户端收到ACK后进入结束等待_2状态
第三次挥手:服务器完成数据发送后,向客户端发送一个FIN报文,表示服务器不再发送数据,进入最后_确认状态
第四次挥手:客户端收到FIN报文后,发送ACK报文确认,服务器收到ACK后立即进入关闭状态

3、TCP和UDP协议的主要区别是什么?各自适用于什么场景?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#TCP
可靠性机制,例如数据校验
流量控制,例如动态调整发送速率
拥塞控制,例如慢启动、快速恢复
#应用场景
文件传输、网页浏览、电子邮件、数据库访问

#UCP
无需建立连接即可发送数据
固定8字节头部
无确认、无顺序控制、无流量控制
#应用场景
游戏通信、DNS查询、DHCP、物联网通信


4、如何在Linux系统中查看网络接口信息?如何启用/禁用某个网络接口?

1
2
3
4
5
6
7
8
9
10
11
12
13
#查看
ip addr

#ip命令禁用和启用
ip link set 网卡名称 down
ip link set 网卡名称 up

#使用nmcli命令禁用和启用
nmcil c down 网卡名称
nmcil c uo 网卡名称

#永久性操作
进入对应网卡配置文件修改 ONBOOT=yes/no

5、如何永久修改Linux系统的IP地址、子网掩码和默认网关?

1
2
3
4
#进入对应配置文件修改 /etc/NetworkManager/system-connections/
address=IP/子网位数
gateway=网关
dns=dns地址

6、Linux系统中/etc/hosts和/etc/resolv.conf文件的作用是什么?

1
2
3
4
5
#/etc/hosts
作用:本地主机名和IP地址映射表

#/etc/resolv.conf
作用:配置DNS解析,指定系统使用的DNS服务器和搜索域

7‘、简述ping命令的作用及使用

1
2
3
4
5
6
7
8
9
10
11
#作用
网络诊断、测试主机之间的网络连通性

#语法
ping 选项 目标主机

#常用选项
-c:指定此时
-i:指定发送间隔,秒
-s:指定大小,字节
-W:指定等待回复超时时间

8、简述traceroute命令的作用及使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#作用
网络诊断
#原理
发送一系列UDP数据包,利用IP协议的TTL字段实现

#语法
traceroute 选项 目标主机

#常用选项
-n:不解析IP为域名
-I:使用ICMP请求,类似ping
-T:使用TCP
-U:使用UDP
-p:指定目标端口
-f:指定起始跳数
-m:指定最大 跳数
-q:指定数据包数量
-w:指定超市时间

9、简述tcpdump的作用及使用

1
2
3
4
5
6
7
8
9
10
11
12
13
#作用
命令行抓包工具

#语法
tcpdump 选项 网卡名称

#常用选项
-i:指定网卡名称
-D:查看可用接口
-w:结果保存为 .pcap 文件
-r:读取.pcap文件



10、怎么通过SSH禁止root远程登陆

1
2
3
4
5
6
7
8
9
10
11
#进入sshd配置文件修改
vim /etc/ssh/sshd_config

#修改
PermitRootLogin no

#限制登陆用户,设置白名单
AllowUsers 用户名

# 禁用密码登录,仅允许密钥登录(更安全)
PasswordAuthentication no

11、密钥认证配置流程

1
2
3
4
5
#生成密钥
ssh-keygen -t rsa -b 4096 -C "注释"

#上传至服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@ip

包管理器

1、搜索软件包

1
dnf search 软件包名

2、安装软件包

1
dnf -y install 软件包名

3、更新所有软件包

1
dnf -y upgrade

4、更新指定软件包

1
dnf -y upgrade 软件包名

5、删除软件包

1
dnf -y remove 软件包名

6、列出已安装的软件包

1
dnf list installed

7、查看软件包信息

1
dnf info 软件包名

8、自动删除无用依赖

1
dnf autoremove

9、列出所有可用软件包

1
dnf list

10、列出所有启用的软件仓库

1
dnf repolist

服务管理

1、简述systemd的作用及使用

作用:初始化系统和管理服务,智能处理服务之间的依赖

注意点:journalctl日志存在内存中,重启、关机即失效!!!

启动服务

1
systemctl start 服务名称

查看服务状态

1
systemctl status 服务名称

停止服务

1
systemctl stop 服务名称

重启服务

1
systemctl restart 服务名称

设置开机自启

1
systemctl enable 服务名称

禁止开机自启

1
systemct disable 服务名称

重新加载服务

1
systemctl reload 服务名称

查看是否开机自启

1
systemctl is-enabled 服务名称

2、简述journalctl的作用及使用

作用:systemd下的日志管理工具,用于查看和分析系统以及服务的日志。

查看全部日志

1
journalctl

查看最新日志

1
journalctl -e

查看内核日志

1
journalctl -k

查看指定服务名日志

1
journalctl -u 服务名称

查看最新20条日志

1
journalctl -n 20

实时追踪日志

1
journalctl -f

按优先级筛选

1
2
3
#0-7,0最简单,7最详细
#3代表 err 普通错误,4代表 warning 警告,6代表 info 服务成功、操作记录的信息
journalctl -p 等级

3、如何配置日志切割

使用logrotate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#需要配置某个服务的日志切割时,在logrotate指定目录下创建定制规则即可
cd /etc/logrotate.d/

#常用参数
daily:每天切割一次
weekly:每周切割一次
monthly:每月切割一次
rotate <数字>:指定保留几份历史日志
compress:启用日志压缩,gzip格式
delaycompress:延迟压缩,下一次切割时在压缩
missingok:如果日志文件丢失则不报错
notifempty:如果日志文件为空,则不切割
postrotate....endscript:在日志切割后执行的命令或脚本
dateext:使用日志为后缀

#检查
logrotate -d /etc/logrotate.d/文件名

#强制切割
logrotate -f /etc/logrotate.d/文件名

Shell脚本

1、解释 #!/bin/bash 的作用

1
用于指定该脚本的解释器路径,当该脚本被执行会根据指定的解释器来解析和运行脚本

2、如何在 Shell 中定义和使用变量?

1
2
3
4
5
6
7
8
#定义
变量名=值

#使用
$变量名

#撤销
unset 变量名

3、简述shell的位置变量

1
2
3
4
5
6
7
8
$0:代表名称本身
$1-9:代表1-9的参数,9以上需要 {} 包裹
$@:代表所有参数,分别看待每一个参数
$*:代表所有参数,看作一个整体
$#:代表参数总个数
$?:返回上次的执行结果,0成功,非0失败
$$:代表当前shell的进程号
$_:获取上次命令的最后一个参数

4、编写一个脚本,计算 1 到 100 的整数和

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

sum=0

for(( k=0;k<=100 ))
do
sum=$[$sum+k]
done

echo $sum

5、如何检查一个文件是否存在?

1
2
3
4
5
6
#!/bin/bash

if [ -f /文件路径 ]
then
echo '存在'
fi

6、shell如何从文件中逐行读取内容?

1
2
3
4
5
while IFS= read -r line;do
echo $line
done < /文件路径

#IFS=:防止行首 / 行尾的空格被删除

7、简述shell判断和循环的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#if判断,结果满足条件才会执行
if [ 条件表达式 ]
then
fi

#数值常用比较符,字符串用 =
-lt:小于
-le:小于等于
-eq:等于
-gt:大于
-ge:大于等于
-ne:不等于

#循环,满足条件就会一直执行
while [ 条件表达式 ]
do
done

for 初始变量 in 参数列表
do
done

for (( 初始变量;条件;自增 ))
do
done

8、简述shell数组的作用以及使用

作用:存储多个值的数据结构,按索引来访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#定义数组
数组名=(值1,值2,...)

#访问数组全部数据
${数组名[@]}

#访问指定索引数据
${数组名[索引]}

#for循环遍历数组
for ((i=0;i<${数组名[@]});i++)
do
echo ${数组名[i]}
done

9、shell怎么获取用户输入的内容

1
read -t 等待时间 -p '提示内容' 变量

10、如何编写一个函数,并传递参数?

1
2
3
4
5
6
7
#!/bin/bash
sum=0
函数名(){
sum=$[$1+$2]
}

函数名 参数1 参数2

11、如何调试 Shell 脚本?

1
2
3
4
5
6
#第一种方式
bash -x 脚本文件

#第二种在脚本文件中指定开始和结束位置
开始位置:set -x
结束位置:set +x

安全基础

1、简述firewalld防火墙的使用

作用:管理防火墙

原理:将流量绑定到zone上,如网段流量、网卡流量,在zone内设定规则,不同流量访问不同的zone,在指定zone内没有匹配到就去默认zone内匹配。

启动、查看、停止

1
2
3
4
5
6
7
8
9
10
11
systemctl start friewalld 

systemctl status friewalld

systemctl stop friewalld

systemctl restart friewalld

systemctl enable friewalld

systemctl disable friewalld

操作zone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#查看默认zone
firewall-cmd --get-default-zone

#设置默认zone
firewall-cmd --set-default-zone=zone名称

#将网段关联到zone
firewall-cmd --permanent --add-source=IP网段/子网位数 --zone=zone名称

#将网段切换到其它zone
firewall-cmd --permanent --change-source=IP网段/子网位数 --zone=zone名称

#查看指定zone信息
firewall-cmd --list-all --zone=zone名称

#将网段移除zone内
firewall-cmd --permanent --remove-source=IP网段/子网位数 --zone=zone名称

#将网卡关联到zone
firewall-cmd --permanent --add-interface=网卡名称 --zone=zone名称

#删除、修改等操作和网段大同小异,关键字不同,source/interface

操作zone内规则

1
2
3
4
5
6
7
#以端口/协议方式
firewall-cmd --permanent --add-port=端口/协议 --zone=zone名称
firewall-cmd --permanent --remove-port=端口/协议 --zone=zone名称

#以服务形式
firewall-cmd --permanent --add-service=服务名称 --zone=zone名称
firewall-cmd --permanent --remove-service=服务名称 --zone=zone名称

性能监控

1、怎么查看CUP使用情况

1
2
3
4
5
6
7
8
9
10
#使用top命令
top

#常用指令
u:输入用户名后只显示该用户的进程
k:终止进程
M:按内存使用率排序
P:按CPU使用率排序
T:按使用CPU时长排序
1:显示每个CPU核心的使用情况

2、怎么查看内存使用情况

1
2
3
4
5
6
#使用free命令
free -h

#常用选项
-h:以人类可读展示
-s:指定多少秒刷新一次

3、怎么查看磁盘使用情况

1
2
3
4
5
6
#使用df命令
df -h

#常用选项
-h:以人类可读展示
-T:显示文件类型

4、简述vmstat命令的作用和使用

作用:监控系统资源

1
2
3
4
5
6
7
8
#语法格式
vmstat 选项 间隔时间 刷新次数

#常用选项
-s:显示内存统计摘要
-d:显示磁盘统计信息
-p:显示分区统计信息
-t:显示时间戳

故障排查

1、系统运行很慢处理流程

1
2
3
4
5
#第一步:使用top命令查看是不是某个进程使用CPU过载
#第二步:使用free命令查看内存情况,是否某个进程使用内存过载
#第三步:使用instat工具查看磁盘读写速率,iotop查看实时进程I/O占用
#第四步:使用网络宽带工具查看流量统计
#第五步:查看服务,是否由僵死进程,某个服务因为资源不足频繁重启或异常

2、磁盘空间不足的处理流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#第一步:先查看整体磁盘使用情况,看哪些分区使用率是否超过了%80甚至90
df -h

#第二步:使用ncdu工具定位大文件,根据第一步的结果进入该分区内查找大文件
ncdu [目录名称]
#常用指令
↑/↓:上下选择
回车键:进入选定目录
←:返回上级目录
d:删除所选文件或目录
s:按大小排序
t:按修改时间排序
q:退出

#第三步:清理日志和缓存临时文件
清理日志时:保留在写日志和最新备份
清理缓存临时文件时:需要确认无程序在使用

#如果不行就添加物理磁盘

4、服务无法启动的排查步骤

1
2
3
4
#使用systemd查看服务专题
#使用journactl日志工具查看分析报错信息
#检查服务配置文件是否有语法错误
#检查是否有端口冲突

5、忘记root密码处理流程

1、在开机动画页面按e

2、找到以linux16开头的段落,在末尾的UTF-8后面加上init=/bin/sh,再按ctrl+x键进入单用户模式

3、进入单用户名模式后输入,mount -o remount,rw / 回车

4、再次输入passwd后回车,输入第一次新密码后回车,再次输入新密码确定

5、再次输入touch /.autorelabel回车

6、最后输入exec /sbin/init回车,系统重启输入新密码即可


Ansible

1、什么是 Ansible?

1
它是有py开发的一款自动化运维工具,基于SSH协议一台管理节点控制多台子节点,实现任务分发到各子节点执行,此外还支持YAML格式编写playbook剧本。

2、简述 Ansible 的架构和工作原理

1
2
3
4
5
6
7
8
9
10
11
12
#架构
采用客户端的C/S架构,其核心组件:
Inventory:主机清单文件,定义管理的目标节点和主机
PlayBook:YAML格式的任务剧本
Module:执行具体任务的模块
Role:角色,可复用任务合集
Ad-Hoc:以命令形式将任务分发到子节点

#工作原理
阶段一:任务编排,解析PlayBook,根据Inventory主机清单筛选目标主机
阶段二:任务执行,将每个任务转换为py脚本,并通过SSH协议送到目标主机
阶段三:目标子节点将执行结果响应给管理节点

3、如何创建一个自定义的 Ansible Inventory 文件?动态 Inventory 是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#定义格式
#以IP定义
IP

#主机别名和IP
xxxx=IP

#定义组
[xxx]
IP

#定义子组
[xxxx:children]
组名
...

#为组定义全局变量
[组名:vars]
变量名=值
...


#使用时需要加 -i 参数指定

#动态Inventroy
动态从外部系统获取,如云平台,灵活实用

**4、编写一个简单的 Playbook 来在多个服务器上安装和启动 Nginx 服务。**
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#创建 files/index.html文件
Hello PitViper

#编辑templates模板
events {
worker_connections {{ number }};
}

#编辑vars变量
---
number: 1050
...

#编辑tasks任务
---
- name: install nginx
dnf: name=nginx state=present
- name: copy index.html
copy: src=index.html dest=/usr/share/nginx/html/index.html
- name: template nginx.conf.j2
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: start nginx
systemd: name=nginx state=started

...

#编辑handlers触发
---
- name: restart nginx
systemd: name=nginx state=restarted
...

#site.yaml剧本
---
- hosts: viper
roles:
- nginx
...

#测试运行
ansible-playbook -i /root/inventory.ini site.yaml -C

5、如何在 Ansible Playbook 中使用条件语句?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#使用registe来定义变量,使用when判断结果,0表示已运行
name: shell test
shell: |
ll /hemo
register: yy

name: shell 22
shell
ll /opt
when: yy.rc == 0

#使用loop来定义循环,item代表循环里的元素
vars:
userlist: ['Tom','Cat']
tasks:
user:
name: "{item}"
state: present
loop: "{{ userlist }}"


6、Ansible常用模块有哪些?

1
2
3
4
5
6
7
8
9
10
copy模块
shell模块
user模块
gruop模块
systemd模块
file模块
script模块
软件包模块
cron定时模块
template模块

7、简述Tags属性

作用:指定运行哪些任务,没被Tags属性标记的则不会运行。

特殊标签:always:总是运行 / never:从不运行

1
2
3
4
5
6
7
8
9
#使用时
tags: 标签名称

#tags作用域
可以标记整个play
可以标记多个任务,标签名称相同就行
可以标记单个任务

使用 --tage 选项跟上 "标签名称" 即可运行指定标签任务

8、简述Handlers属性

作用:Handlers是一种特殊任务,它只会在playbook中指定任务发生了变化才会执行,如重启操作

1
2
3
4
5
6
7
#使用notify定义触发装置
notify:自定义名称

#触发后使用handlers来执行对应操作
handlers:
- name: notify定义的名称
操作

9、简述Role角色

作用:模块化、复用和组织任务,将playbook拆分称可复用组件

1
2
3
4
5
6
7
8
9
10
11
12
13
#目录结构
├── role_name
│ ├── file
│ │ └── index.html
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ │ └── xxx.j2
│ └── vars
│ └── main.yaml
└── site.yaml

10、简述ansible中的templates模板

作用:动态生成配置文件,让配置文件里的参数不再是写死一个数据,而是灵活替换,以模板文件以.j2为后缀


Docker

1、什么是Docker,Docker容器和虚拟机的区别

1
2
3
4
5
6
7
8
#什么是Docker
Docker是由Go语言开发的一款开源、容器管理平台,核心作用为将项目和项目所有依赖全部打包成镜像,解决在自己电脑上能运行,在其他电脑不行的问题

#区别
隔离角度:Docker是进程级,虚拟机是硬件级
启动速度:Docker是秒级,虚拟机是分钟级
资源占用:Docker直接使用宿主机内核,虚拟机需要完成OS内核
镜像大小:Docker是M级,虚拟是G级

2、Docker 的核心组件有哪些?

1
2
3
4
5
DockerD:后台服务,管理容器生命周期
Docker Cilent:Docker命令行交互工具
Docker Images:Docker镜像,用来创建容器
Docker 容器:正在运行中的镜像
Docker 镜像仓库:存放镜像

3、Docker 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#镜像命令
docker images #查看所有镜像
docekr inspect 镜像id或名称 #查看镜像元数据
docker search 镜像名称 #搜索镜像
docker pull 镜像名称:版本号 #拉取镜像,不加版本号默认最新
docker rmi 镜像ID或名称 #删除镜像
docker rmi $(docker images -aq)

#容器命令
docker run 选项 镜像id或名称 #启动镜像
#常用选项[--name:指定容器名称][-d:后台运行][-it:交互模式运行,exit:停止并退出容器,Ctrl+p+q:不停止容器退出容器][-p:指定真机和容器端口][-P:随机指定端口]

docker ps #查看容器,加-a查看所有容器
docker rm 容器id或名称 #删除容器,需要先停止容器
docker rm $(docker ps -aq) #删全部停止的容器
docker start 容器id或名称 #启动容器
docker restart 容器id或名称 #重启容器
docker stop 容器id或名称 #停止容器
docker kill 容器id或名称 #强行停止
docker logs 容器id #查看容器日志,加-f实时追踪容器日志

5、如何进入一个正在运行的容器?

1
docker exec -it 容器id或名称 /bin/bash

7、什么是Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DockerFile是构建镜像的文本文件,包含了一些列指令,Docker引擎会根据DockerFile里的指令分层次构建镜像
#常用指令
FROM:指定基础镜像
RUN:执行命令,想让它干点啥
COPY:复制本地文件到镜像
ADD:类似COPY,额外支持解压和URL下载
WORKDIR:指定工作目录,进入容器后所在的目录
ENV:设置环境变量
EXPOSE:指定容器运行时监听的端口
USER:指定运行容器的用户
VOLUME:指定数据卷挂载点
CMD:容器启动时执行的命令
ENTRYPOINT:类似CMD

#COPY和ADD的区别
COPY:仅把文件复制到镜像
ADD:在COPY的基础上额外支持解压、URL下载

#CMD和ENTRYPOINT的区别
CMD:定义的命令,会被docker run所覆盖
ENTRYPOINT:不会被覆盖,而追加执行

#构建命令
docker build -f dockerfile文件 -t 自定义名称:版本 .

#查看构建过程
docker history 镜像名称:版本

8、Docker 有哪些网络模式?

1
2
3
bridge:桥接,利用docker0作为桥实现通信
host:容器直接使用宿主机网络,无隔离,高性能
none:无网络,仅lo回环接口

Docker网络常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#创建
docker network create --subnet 网段/子网位数 --gateway 网关 网络名称

#使用
在docker run启动容器的时间加上 --net 网络名称 即可将容器添加进网络

#查看所有网络
docker network ls

#查看网络详细
docker network inspect 网络名称

#将容器附加到其它网络,实现不同网络容器之间的通信,一个容器多个IP
docker network connect 网络名称 容器名称

#端口容器与网络的连接
docker network disconnect 网络名称 容器名称

#删除
docekr network rm 网络名称

10、Docker 的数据持久化方式有哪些?

1
2
3
4
5
6
第一种:直接使用 -v 挂载到宿主机
-v 宿主机路径:容器路径

第二种:使用数据卷
docker volume create 数据卷名称
docker run -v 数据卷名称:/容器名称/路径

11、如何以非 root 用户运行容器?

1
2
3
4
5
6
7
#第一种,在dockerfile中创建并指定用户
RUN useradd -m appuser && \
chown -R appuser:appuser /app
USER appuser

#第二种
在docker run时使用--user指定用户id和组id

12、如何限制容器的使用资源?

1
2
3
4
5
6
7
8
9
#限制内存
docker run时加上 --memory="数值?"指定内存资源,?表示单位单位m、g
--memory-swap="数值?" #显示内存和交换分区

#以权重限制CPU,默认1024
--cpu-shares=数值

#以核心限制CPU
--cpus="数值"

DockerCompose

1、什么是DockerCompse,用来解决什么问题?

1
2
DockerCompose是用来定义和运行多个Docker容器的工具,通过docker-compose.yaml文件配置服务、网络、存储等操作;
解决了繁琐使用docker run命令,简化多容器的管理,实现一键启动、停止、重建整个应用。

2、docker-compose.ymlDockerfile 的区别?

1
docker-compose.yaml定义的是多个容器的编排,DockerFile定义的是单个容器的构建步骤;

3、Docker Compose 的核心命令有哪些?

1
2
3
4
5
6
7
8
9
10
11
12
#启动
docker compose up
#停止并删除
docker compose down
#查看运行中的容器
docker compose ps
#查看日志
docker compose logs -f
#重构镜像
docker compose build
#进入容器
docker compose exec

4、DockerCompose的顶级元素有哪些

1
2
3
4
5
6
version:compose文件版本,v2版本可以不写
name:定义应用名称
volumes:定义数据卷
networks:定义网络
services:定义服务集合
environment:定义全局变量

5、如何设置容器启动顺序?

1
使用depends_on指定哪些服务在本服务之前启动

6、如何管理环境变量?

1
2
3
4
5
6
将变量统一放在一个隐藏文件内,使用env_file指定文件路径,compose会根据路径去读取变量;
也可以使用${}形式管理变量,在.env文件里定义使用${变量名}获取
定义:PASSWORD=000000
获取:
environment:
PASSWORD: ${PASSWORD}

7、如何调试 Docker Compose 启动失败的问题?

1
2
3
4
5
6
7
#第一步查看日志
docker compose logs 服务名称
#第二步进入容器检查
docker compose exec 服务名称 /bin/bash
#第三步检查依赖程序是否就绪,如数据库链接
#第四步验证配置文件语法
doucker compose config

8、docker compose up命令和docker compose start命令有啥区别

1
2
up:会创建新的容器
start:是启动已有容器

9、如何更新运行中的服务配置?

1
2
#使用-d参数,compose会智能更新
docker compose up -d

10、如何限制容器的 CPU/内存?

1
2
3
4
5
#使用resources配置项指定资源
resources:
limits:
cpus: "数值" #几核
memory: 数值和单位 #M/G