过往的一些笔试题面试题
By FreelyTomorrow profile image FreelyTomorrow
13 min read

过往的一些笔试题面试题

运维的笔试题和面试题,持续更新中...

1.如何显示已加载的内核模块?

lsmod

2. 如何查看linux kernel版本号?

[root@wordpress-187 /]#uname -a
Linux wordpress-187 4.18.0-193.14.2.el8_2.x86_64 #1 SMP Sun Jul 26 03:54:29 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

3.如何查看一个文件依赖的动态链接库?

objdump命令:

[root@wordpress-187 /]#objdump -x /usr/lib64/libc-2.28.so | grep NEEDED
  NEEDED               ld-linux-x86-64.so.2

readelf命令:

[root@wordpress-187 /]#readelf -a /usr/lib64/libc-2.28.so | grep Shared
  Type:                              DYN (Shared object file)
 0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]

ldd命令:

[root@wordpress-187 ~]#ldd /usr/lib64/libc-2.28.so
	/lib64/ld-linux-x86-64.so.2 (0x00007f9464be7000)
	linux-vdso.so.1 (0x00007ffde4f73000)

4.linux中在哪里可以配置dns

  • /etc/hosts:利用hosts自动解析域名到ip
  • /etc/resolv.conf:配置dns解析服务器地址
  • /etc/sysconfig/network-scripts/网卡名:网卡配置文件

5. 如何查看logfile最后100行内容

tail -100 ./access.log

6. 如何查看占用80端口的进程

netstat -tunlp | grep 80

7. linux中如何开启ip转发?

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

8. 如何查看一个目录占用磁盘空间大小?

du -h --max-depth=1

9. 如何设置系统最大文件打开数量限制为55555?

echo "fs.file-max = 55555" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

10. 说明下列Raid技术至少需要几块磁盘:

Raid0:两块,基于条带化技术将数据轮流写入两块磁盘
Raid1:两块,两块写入相同的数据,其中一块作为数据备份
Raid5:三块,每块数据都写入数据本身和奇偶校验值
Raid10:四块,先做成一组Raid1(两块存储,两块备份),再做Raid0

11. 简述raid0、1、5、10各自的优缺点

Raid 0

优点:读写性能高,磁盘利用率高
缺点:没有数据备份,安全性低

Raid 1

优点:一份数据一份备份,安全性高
缺点:写性能低(写两份)

Raid 5

优点:数据条带化存储在磁盘,读写性能好,磁盘利用率为(n-1)/n
缺点:只能允许坏掉一块盘。

Raid 10

优点:读写性能高,安全性高
缺点:磁盘利用率低,成本高

12.简述虚拟机硬盘扩容的步骤?

  1. 为虚拟机添加硬盘
  2. 重启或重新扫描SCSI总线发现新设备
  3. 根据磁盘大小将其转为MBR或GPT类型
  4. 进行分区操作(fdisk或gdisk)
  5. 格式化文件系统
  6. 配置挂载

13. linux中使用u盘与windows系统交换数据有什么注意点

  1. 需要注意将U盘格式化为能够同时让Windows和Linux识别的文件系统,比如FAT32,exFAT。
  2. Linux需要将U盘挂载后才能读取文件,和Windows不同。

14.简述磁盘无法写入可能得原因?

排除故障的话,可能是

  1. 挂载时使用了只读参数
  2. 磁盘被挂载在某个目录下,而当前操作的用户没有对这个目录的相关权限。

15.如何停止 PID 为 3836 的进程?停止不掉怎么办?再停不掉怎么办?

先kill 3836,默认使用-15信号正常终止进程。如果停不掉可以使用kill -9强制终止。
kill 9也杀不掉要考虑进程可能是僵尸进程,其本身占用的资源已经被释放,但父进程还存在,所以如果可以的话通过终止父进程来杀死这个僵尸进程;
最后一种情况则是进程运行在内核态,内核态忽略一切信号因此无法终止,只能通过重启服务器终止进程。

16.如何使用sed将文件file中所有///替换成aaa?

sed -i 's/\/\/\//aaa/g'

17. 如何添加一个环境变量,立即生效,且重启后生效。

在/etc/profile文件中添加

export PATH="/usr/local/nginx/sbin/:$PATH"

然后source /etc/profile。
如果是只为某个用户添加,可以加载.bashrc或者.bash_profile中。

18. 目录下有文件名为file1,file2,file3,...file10000的10000个文件,如何删除file1001到file2000这1000个文件?

for i in {1001..2000}
do
    rm -f file${i}
done

19. 有一个备份程序mybackup,需要在周一至周五下午1点和晚上8点各运行一次

0 13,16 1,5 * * mybackup

20. 分别写出命令:启动运行docker容器,停止容器,删除一个nginx容器,删除nginx镜像

docker run -d image_name 
docker stop container_id
docker rm container_id
docker rmi nginx:1.14

21. 如何在已经运行的容器里运行bash?

docker exec -it container_id bash

22. 使用vim编辑器将文件中AAA替换为BBB

:进入末行模式
:%s/AAA/BBB/g

23. 永久修改网卡地址

编辑网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0

24. 通过命令行给linux机器添加默认网关10.0.0.254

route add default gw 10.0.0.254

25. 在不unmount的情况下重新设置mount参数

在/etc/fstab写入挂载配置

mount -a

重新读取配置

26. mysql主从复制原理及配置主从大完整步骤

主从复制依靠三个线程来实现

主库:log dump线程,负责给slave从库的I/O线程输出binlog日志数据
从库:

  • I/O线程:负责请求主库的binlog。并将得到的binlog写入自己的中继日志中。
  • SQL线程:负责读取中继日志,解析为SQL命令并执行。

主从复制流程

  1. 从库执行start slave开启主从复制。从库的I/O线程连接主节点,并请求从指定日志的指定位置之后的日志内容。
  2. 主结点接收到从节点的I/O请求后,为每个请求的从节点创建一个log dump线程,并通过这个线程将请求的内容传输给从节点;返回的信息中包括数据本身和下一条记录的start position.
  3. 从节点的I/O线程接收到binlog日志数据后,将其写入到自己的中继日志的尾端,将binlog文件名和pos值保存到master_info文件中,并依据master_info中的记录提出下一次请求。
  4. 从节点的SQL线程在检测到中继日志更新后,会将新日志数据解析为SQL语句并执行,然后在relay_log中记录执行了的中继日志文件名和最新pos值。

27. mysql主从复制故障如何解决

取决于故障类型

主从数据不一致

可能是从库没有设置read_only=1,并且管理员在从库上做了错误的数据增减操作。
解决方法:通过反向操作将数据还原成同步状态,然后重启从库

从库日志丢失

误删除了从库的中继日志,导致还有事务没有同步完成,发生故障
解决方法:查看从库的日志,主要关注relay_master_log_file和exec_master_log_pos的值,这两个值是从库已处理的中继日志文件的位置对应的binlog文件和位置。然后根据这两个值通过CHANGE MASTER TO重新配置主从复制的master log pos.

通用处理方法 - 跳过错误事务

  1. 首先确定报错原因
  2. 如果确定错误可以忽略,在配置文件中忽略事务
    • 基于binlog: slave-skip-error:error_id
    • 基于GTID:在mysql中set gtid_next=指定的gtid,然后next_gtid为自动

28. mysql主从复制延迟

原因

  1. 从库硬件比主库差,导致复制延迟
  2. 主从复制单线程,如果主库写并发太大,来不及传送到从库就会导致延迟。更高版本的mysql可以支持多线程复制
  3. 慢SQL语句过多
  4. 网络延迟
  5. master负载 主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层
  6. slave负载

解决

  1. 读写分离,主库只负责写操作,设从库为只读。
  2. 两个优化参数
    • slave-net-timeout=seconds 单位为秒 默认设置为 3600秒
      参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据
    • master-connect-retry=seconds 单位为秒 默认设置为 60秒
      参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试
  3. slave因为是只读,所以不需要太高的数据安全性,可以将sync_binlog设置为0或者关闭binlog俩提升性能。
  4. 提升从库硬件水平

29. 用iptables写一条放行80端口的防火墙规则

iptables -t filter  -I INPUT -p tcp --dport 80 -j ACCEPT

30. 四层和七层负载均衡

31. 磁盘容量方面 inode怎么查看

查看inode使用情况

df -i

32. inode满了什么影响

磁盘分区Inode使用率达到100%会造成应用无法继续新建目录或者文件,但是一般此时通常系统内对应的磁盘空间还未用满。可以通过清除Inode占用高的文件或者目录、或者增加Inode数量来解决磁盘分区Inode使用率达到100%的问题。
可以通过df命令查看一些主要目录的inode占用百分比

df -i

解决方法

  1. 清除Inode占用高的文件或者目录
    执行以下命令,分析根目录下的每个二级目录下有多少个文件。
for i in /*; do echo $i; find $i | wc -l; done

逐层进入Inode占用最高的目录,继续执行上述命令,逐步定位占用过高空间的文件或目录,最后进行相应清理。
2. 增加Inode数量
如果不允许清理磁盘中的文件,或者清理完可清理的文件后Inode使用率仍然较高,则可以需要通过备份数据、重新格式化磁盘增加Inode数、拷回数据等步骤,完成数据的保留并增加文件系统Inode数量。
卸载文件系统

umount /占用inode数量多的目录

格式化文件系统

mkfs.xfs /dev/sdb -N 1638400
# 一般根据1:16kb的比例

查看新的inode数量

dumpe2fs -h /dev/xvdb | grep node

33. 怎么查看服务器网络连接情况

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

33. time_wait连接状态多,什么原因,怎么解决

原因

  1. 在高并发的场景下,会出现大量的 TIME_WAIT 连接。
  2. 大量的短连接存在

我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

解决

  1. 客户端,调整短链接为长链接,HTTP 请求的头部,connection 设置为 keep-alive,保持存活一段时间
  2. 服务器端允许 time_wait 状态的 socket 被重用缩减 time_wait 时间,设置为 1 MSL(即,2 mins)

34. 客户端向服务端发送syn包尝试建立连接,服务端发现该端口连接已经存在,回复客户端什么包

处于 establish 状态的服务端如果收到了客户端的 SYN 报文(注意此时的 SYN 报文其实是乱序的,因为 SYN 报文的初始化序列号其实是一个随机数),会回复一个携带了正确序列号和确认号的 ACK 报文,这个 ACK 被称之为 Challenge ACK。

接着,客户端收到这个 Challenge ACK,发现序列号并不是自己期望收到的,于是就会回 RST 报文,服务端收到后,就会释放掉该连接。

35. docker容器挂了怎么查看问题

可以通过docker inspect查看container状态,然后通过docker logs查看报错日志。

36. docker运行的服务器磁盘占用满了。怎么解决

Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加。
docker logs -f container_name噼里啪啦一大堆很占用空间,致使磁盘空间被占满。

docker system df #查看Docker占用分布 
docker stats #可以查看docker容器的内存占用

定时清理日志

logs=`find /var/lib/docker/containers/ -name *-json.log`
cat /dev/null > $log

控制日志的数量和文件大小

  1. 命令行启动的容器
#docker run时添加--log-opt max-size=500m --log-opt max-file=3参数,如创建并运行
docker run -name xxx -p 80:80 --log-opt max-size=500m  --log-opt max-file=3 xxx:v1 
  1. 通过docker-compose配置的容器
    通过配置容器docker-compose的max-size选项来实现
logging:
      driver: "json-file"
      options:
        max-size: "500m"      # 日志文件大小
        max-file: "6"		# 日志的数量

37. Redis内存数据满了,会宕机吗?

Redis有六种淘汰策略,用来在内存使用达到上限时淘汰以前的数据来保证新数据的写入,这六种分别是:

  • noeviction(默认策略):若是内存的大小达到域值,写操作会被阻塞,会返回Out Of Memory异常。
  • allkeys-lru:所有key都是使用LRU算法进行淘汰。
  • volatile-lru:所有设置了过期时间的key使用LRU算法进行淘汰。
  • allkeys-random:所有的key使用随机淘汰的方式进行淘汰。
  • volatile-random:所有设置了过期时间的key使用随机淘汰的方式进行淘汰。
  • volatile-ttl:所有设置了过期时间的key根据过期时间进行淘汰,越早过期就越快被淘汰。

要在Redis中设置淘汰策略,可以在redis.conf中加入配置

# maxmemory-policy 淘汰策略
maxmemory-policy allkeys-lru
By FreelyTomorrow profile image FreelyTomorrow
Updated on
运维技术