Linux运维工程师面试题 -- 精校版

2021-08-06 11:17:33 浏览数 (1)

本版面试题来源于网络,整合了各个版本的面试题,如有错误之处,请后台私信。

1、什么是运维?

1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络、系统、数据库、开发、安全、监控于一身的技术运维又包括很多种,有DBA运维、网站运维、虚拟化运维、监控运维、游戏运维等等。

2)游戏运维又有分工,分为开发运维、应用运维(业务运维)和系统运维。

开发运维:是给应用运维开发运维工具和运维平台的。

应用运维:是给业务上线、维护和做故障排除的,用开发运维开发出来的工具给业务上线、维护、做故障排查。

系统运维:是给应用运维提供业务上的基础设施,比如:系统、网络、监控、硬件等等。

总结:开发运维和系统运维给应用运维提供了“工具”和“基础设施”上的支撑,开发运维、应用运维和系统运维他们的工作是环环相扣的。

2、简述raid0 raid1 raid5 三种工作模式的工作原理及特点

RAID,可以把硬盘整合成一个大磁盘,还可以在大磁盘上再分区,放数据还有一个大功能,多块盘放在一起可以有冗余(备份)。

RAID整合方式有很多,常用的:0 1 5 10。

RAID 0:可以是一块盘和N个盘组合,其优点读写快,是RAID中最好的。缺点:没有冗余,一块坏了数据就全没有了,不能应用于数据安全性要求高的场合。

RAID 1:只能2块盘,盘的大小可以不一样,以小的为准,10G 10G只有10G,另一个做备份。它有100%的冗余,缺点:浪费资源,成本高。它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据,

不能提升写数据效率。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID1 可以提高读取性能,RAID 1 是磁盘阵列中单位成本最高的,镜像卷可用容量为总容量的1/2,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

RAID 5 :至少由3块硬盘组成,容量计算10*(n-1),损失一块盘。特点:读写性能一般,读还好一点,写不好。raid5可以实现数据冗余,确保数据的安全性,同时raid5也可以提升数据的读写性能。

冗余从好到坏:RAID1 RAID10 RAID 5 RAID0

性能从好到坏:RAID0 RAID10 RAID5 RAID1

成本从低到高:RAID0 RAID5 RAID1 RAID10

我们会根据数据的存储和访问的需求,去匹配对应的RAID级别:

单台服务器:很重要盘不多,系统盘,RAID1

数据库服务器:主库:RAID10 从库 RAID5RAID0(为了维护成本,RAID10)。

WEB服务器,如果没有太多的数据的话,RAID5,RAID0(单盘)。

有多台,监控、应用服务器,RAID0 RAID5

3、讲述一下Tomcat8005、8009、8080三个端口的含义?

8005 ==> 关闭时使用。

8009 ==> 为AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口。

8080 ==> 一般应用使用。

4、简述DNS进行域名解析的过程?

用户要访问www.baidu.com,会先找本机的host文件,再找本地设置的DNS服务器,如果也没有的话,就去网络中找根服务器,根服务器反馈结果,说只能提供一级域名服务器.cn,就去找一级域名服务器,一级域名服务器说只能提供二级域名服务器.com.cn,就去找二级域名服务器,二级域服务器只能提供三级域名服务器.baidu.com.cn,就去找三级域名服务器,三级域名服务器正好有这个网站www.baidu.com,然后发给请求的服务器,保存一份之后,再发给客户端。

5、RabbitMQ是什么东西?

RabbitMQ也就是消息队列中间件,消息中间件是在消息的传息过程中保存消息的容器,消息中间件再将消息从它的源中到它的目标中标时充当中间人的作用,队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用消息队列不会保留消息,直到可以成功地传递为止,当然,消息队列保存消息也是有期限的。

6、mysql如何减少主从复制延迟?

如果延迟比较大,就先确认以下几个因素:

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

slave负载一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作。另外,2个可以减少延迟的参数:

代码语言:javascript复制
–slave-net-timeout=seconds 单位为秒 默认设置为 3600秒
#参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据
–master-connect-retry=seconds 单位为秒 默认设置为 60秒
#参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试
通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟

MySQL数据库主从同步延迟解决方案

  • 最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。
  • 还有就是主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit= 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog。
  • innodb_flushlog也可以设置为0来提高sql的执行效率。
  • 另外就是使用比主库更好的硬件设备作为slave。

7、如何重置mysql root密码?

一、 在已知MYSQL数据库的ROOT用户密码的情况下,修改密码的方法:

1、 在SHELL环境下,使用mysqladmin命令设置:

代码语言:javascript复制
mysqladmin –u root –p password “新密码” 回车后要求输入旧密码

2、 在mysql>环境中,使用update命令,直接更新mysql库user表的数据:

代码语言:javascript复制
Update mysql.user set password=password(‘新密码’) where user=’root’;
flush privileges;
注意:mysql语句要以分号”;”结束

3、 在mysql>环境中,使用grant命令,修改root用户的授权权限。

代码语言:javascript复制
grant all on . to root@’localhost’ identified by ‘新密码’;

二、 如果忘记了mysql数据库的ROOT用户的密码,又如何做呢?方法如下:

1、 关闭当前运行的mysqld服务程序:service mysqld stop(要先将mysqld添加为系统服务)。

2、 使用mysqld_safe脚本以安全模式(不加载授权表)启动mysqld 服务:

代码语言:javascript复制
 /usr/local/mysql/bin/mysqld_safe  --skip-grant-table  &

3、 使用空密码的root用户登录数据库,重新设置ROOT用户的密码:

代码语言:javascript复制
#mysql  -u   root //空密码登录
Mysql> Update  mysql.user  set  password=password(‘新密码’)  where  user=’root’;
Mysql> flush   privileges;

8、简述几种mysql数据备份方式

mysqldump工具:mysqldump是mysql自带的备份工具,目录在bin目录下面:/usr/local/mysql/bin/mysqldump。支持基于innodb的热备份,但是由于是逻辑备份,所以速度不是很快,适合备份数据比较小的场景。Mysqldump完全备份 二进制日志可以实现基于时间点的恢复。

基于LVM快照备份:在物理备份中,有基于文件系统的物理备份(LVM的快照),也可以直接用tar之类的命令对整个数据库目录进行打包备份,但是这些只能进行冷备份,不同的存储引擎备份的也不一样,myisam自动备份到表级别,而innodb不开启独立表空间的话只能备份整个数据库。

tar包备份。

percona提供的xtrabackup工具:支持innodb的物理热备份,支持完全备份,增量备份,而且速度非常快,支持innodb存储引起的数据在不同数据库之间迁移,支持复制模式下的从机备份恢复备份恢复,为了让xtrabackup支持更多的功能扩展可以设立独立表空间,打开 innodb_file_per_table功能,启用之后可以支持单独的表备份。

9、统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip

代码语言:javascript复制
cat access.log | awk ‘{print $1}’ | uniq -c | sort -rn | head -10

10、使用tcpdump监听主机为192.168.1.1,tcp端口为80的数据,同时将输出结果保存输出到tcpdump.log

代码语言:javascript复制
tcpdump 'host 192.168.1.1 and port 80' > tcpdump.log

11、如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.2.1

代码语言:javascript复制
iptables -A PREROUTING -d 192.168.2.1 -p tcp -m tcp -dport 80 -j DNAT-to-destination 192.168.2.1:8080

12、实时抓取并显示当前系统中tcp 80端口的网络数据信息,请写出完整操作命令

代码语言:javascript复制
tcpdump -nn tcp port 80

13、服务器开不了机怎么解决一步步的排查

A、造成服务器故障的原因可能有以下几点:

B、如何排查服务器故障的处理步骤如下:

14、Linux系统疑似中病毒如何排查?

1)最简单有效的方法就是重装系统

2)要查的话就是找到病毒文件然后删除。中毒之后一般机器cpu、内存使用率会比较高,机器向外发包等异常情况,排查方法简单介绍下:

代码语言:javascript复制
1、首先top 命令找到cpu使用率最高的进程。
2、可以用 ps aux 找到病毒文件位置。
3、rm -f 命令删除病毒文件。
4、检查计划任务、开机启动项和病毒文件目录有无其他可以文件等

3)由于即使删除病毒文件不排除有潜伏病毒,所以最好是把机器备份数据之后重装一下。

15、说说TCP/IP的七层模型

应用层 (Application):网络服务与最终用户的一个接口。

协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层(Presentation Layer):数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层),格式有,JPEG、ASCll、DECOIC、加密格式等。

会话层(Session Layer):建立、管理、终止会话。(在五层模型里面已经合并到了应用层),对应主机进程,指本地主机与远程主机正在进行的会话。

传输层 (Transport):定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层。

网络层 (Network):进行逻辑地址寻址,实现不同网络之间的路径选择。协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP

数据链路层 (Link):建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议),将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

物理层(Physical Layer):是计算机网络OSI模型中最低的一层。物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。简单的说,物理层确保原始的数据可在各种物理媒体上传输。局域网与广域网皆属第1、2层物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境,如果您想要用尽量少的词来记住这个第一层,那就是“信号和介质”。

16、你常用的Nginx模块,用来做什么?

rewrite模块:实现重写功能。

access模块:来源控制。

ssl模块:安全加密。

ngx_http_gzip_module:网络传输压缩模块。

ngx_http_proxy_module:模块实现代理。

ngx_http_upstream_module:模块实现定义后端服务器列表。

ngx_cache_purge:实现缓存清除功能。

17、请列出你了解的web服务器负载架构?

Nginx、Haproxy、Keepalived、LVS

18、查看http的并发请求数与其TCP连接状态

代码语言:javascript复制
netstat -n | awk ‘/^tcp/ {  S[$NF]} END {for(a in S) print a, S[a]}’

还有ulimit -n 查看linux系统打开最大的文件描述符,这里默认1024。不修改这里web服务器修改再大也没用,若要用就修改很几个办法,这里说其中一个:

代码语言:javascript复制
vi /etc/security/limits.conf
soft nofile 10240
hard nofile 10240

重启会话后生效。

19、用tcpdump嗅探80端口的访问看看谁最高

代码语言:javascript复制
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." ‘{print $1"."$2"."$3"."$4}’| sort | uniq -c | sort -nr |head -20

20、写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线

代码语言:javascript复制
#!/bin/bash
for ip in `seq 1 255`
do
{
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip UP
else
echo 192.168.1.$ip DOWN
fi
}&
done
wait

21、已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近 7 天的访问日志!请问如何解决?

代码语言:javascript复制
#!/bin/bash
for n in `seq 14`
do        
date -s "11/0$n/14"
touch access_www_`(date  %F)`.log
done
解决方法:
# pwd/application/logs
find /application/logs/ -type f -mtime  7 -name "*.log"|xargs rm –f  
##也可以使用-exec rm -f {} ;进行删除

22、简述如何优化 Linux系统?

1.不用root,添加普通用户,通过sudo授权管理。

2.更改默认的远程连接SSH服务端口及禁止root用户远程连接

3.写脚本定时自动更新服务器时间。

4.配置国内yum源。

5.关闭selinux及iptables(iptables工作场景如果有外网IP一定要打开,高并发除外)。

6.调整文件描述符的数量。

7.精简开机启动服务(crond rsyslog network sshd)

8.内核参数优化(/etc/sysctl.conf)

9.更改字符集,支持中文,但建议还是用英文字符集,防止乱码。

10.锁定关键系统文件。

11.清空/etc/issue,去除系统及内核版本登录前的屏幕显示。

23、请用命令取出 linux 中 eth0 的 IP 地址

cut方法1:

代码语言:javascript复制
ifconfig eth0|sed -n '2p'|cut -d ":" -f2|cut -d " " -f1

awk方法2:

代码语言:javascript复制
ifconfig eth0|awk 'NR==2'|awk -F ":" '{print $2}'|awk '{print $1}'

awk多分隔符方法3:

代码语言:javascript复制
ifconfig eth0|awk 'NR==2'|awk -F "[: ] " '{print $4}'

sed方法4:

代码语言:javascript复制
ifconfig eth0|sed -n '/inet addr/p'|sed -r 's#^.*ddr:(.*)Bc.*$#1#g'

24、每天晚上 12 点,打包站点目录/var/www/html 备份到/data 目录下(最好每次备份按时间生成不同的备份包)

代码语言:javascript复制
vi back.sh 
#/bin/bash
cd /var/www/ && /bin/tar zcf /data/html-`date  %m-%d%H`.tar.gz html/
# crontab –e
00 00 * * * /bin/sh /root/back.sh

25、请写出下面 linux SecureCRT 命令行快捷键命令的功能?

Ctrl a —->光标移动到行首

Ctrl e —->光标移动到行尾

Ctrl c —->终止当前程序

Ctrl d —->如果光标前有字符则删除,没有则退出当前中断

Ctrl l —->清屏

Ctrl u —->剪切光标以前的字符

Ctrl k —->剪切光标以后的字符

Ctrl y —->复制u/k的内容

Ctrl r —->查找最近用过的命令

tab —->命令或路径补全

Ctrl shift c —->复制

Ctrl shift v —->粘贴

26、如何看当前Linux系统有几颗物理CPU和每颗CPU的核数?

代码语言:javascript复制
cat /proc/cpuinfo|grep -c 'physical id'
cat /proc/cpuinfo|grep -c 'processor'

27、查看系统负载有两个常用的命令,是哪两个?这三个数值表示什么含义呢?w和uptime

代码语言:javascript复制
# w
10:57:38 up 14 min,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.147.1    18:44    0.00s  0.10s  0.00s w
# uptime
10:57:47 up 14 min,  1 user,  load average: 0.00, 0.00, 0.00
其中load average即系统负载,三个数值分别表示一分钟、五分钟、十五分钟内系统的平均负载,即平均任务数。

28、简述vmstat 命令?

代码语言:javascript复制
[root@centos6]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 1783964  13172 106056    0    0    29     7   15   11  0  0 99  0  0
  • r即running,表示正在跑的任务数
  • b即blocked,表示被阻塞的任务数
  • si表示有多少数据从交换分区读入内存
  • so表示有多少数据从内存写入交换分区
  • bi表示有多少数据从磁盘读入内存
  • bo表示有多少数据从内存写入磁盘
  • i --input,进入内存
  • o --output,从内存出去
  • s --swap,交换分区
  • b --block,块设备,磁盘
  • 单位都是KB。

29、linux系统里,你知道buffer和cache如何区分吗?

buffer和cache都是内存中的一块区域,当CPU需要写数据到磁盘时,由于磁盘速度比较慢,所以CPU先把数据存进buffer,然后CPU去执行其他任务,buffer中的数据会定期写入磁盘;当CPU需要从磁盘读入数据时,由于磁盘速度比较慢,可以把即将用到的数据提前存入cache,CPU直接从cache中拿数据要快的多。

30、如何查看系统都开启了哪些端口?

netstat -lnp

查看网络连接状况:netstat -an

31、想修改ip,需要编辑哪个配置文件,修改完配置文件后,如何重启网卡,使配置生效?

使用vi或者vim编辑器编辑网卡配置文件/etc/sysconfig/network-scripts/ifcft-eth0(如果是eth1文件名为ifcft-eth1),内容如下:

代码语言:javascript复制
DEVICE=eth0
HWADDR=00:0C:29:06:37:BA
TYPE=Ethernet
UUID=0eea1820-1fe8-4a80-a6f0-39b3d314f8da
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.147.130
NETMASK=255.255.255.0
GATEWAY=192.168.147.2
DNS1=192.168.147.2
DNS2=8.8.8.8

修改网卡后,可以使用命令重启网卡:

代码语言:javascript复制
ifdown eth0
ifup eth0

也可以重启网络服务:service network restart

32、如何查看当前主机的主机名,如何修改主机名?要想重启后依旧生效,需要修改哪个配 置文件呢?

代码语言:javascript复制
查看主机名:hostname
修改主机名:hostname centos6.5-1
永久生效需要修改配置文件:
vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=centos6.5-1

33、设置DNS需要修改哪个配置文件?

(1)在文件 /etc/resolv.conf 中设置DNS。

(2)在文件 /etc/sysconfig/network-scripts/ifcfg-eth0 中设置DNS。

33、使用iptables 写一条规则:把来源IP为192.168.1.101访问本机80端口的包直接拒绝

代码语言:javascript复制
iptables -I INPUT -s 192.168.1.101 -p tcp --dport 80 -j REJECT

34、某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?

用户身份验证过程记录在/var/log/secure中,登录成功的信息记录在/var/log/wtmp。

35、把当前目录下所有后缀名为.txt的文件的权限修改为777

代码语言:javascript复制
find ./ -type f -name "*.txt" |xargs chmod 777
find ./ -type f -name "*.txt" -exec chmod 777 {} ;

36、在Linux系统下如何按照下面要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?

代码语言:javascript复制
tcpdump -nn -s0 host 192.168.0.111 and port 80 -c 1000 -w 1.cap

37、我们可以使用哪个命令查看系统的历史负载(比如说两天前的)?

代码语言:javascript复制
sar -q -f /var/log/sa/sa22  #查看22号的系统负载

38、文件权限修改用什么命令?格式是怎么样的?

文件权限修改:chmod

代码语言:javascript复制
$ chmod u x file 给 file 的属主增加执行权限
$ chmod 751 file 给 file 的属主分配读、写、执行(7)的权限,给 file 的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限
$ chmod u=rwx,g=rx,o=x file 上例的另一种形式
$ chmod =r file 为所有用户分配读权限
$ chmod 444 file 同上例
$ chmod a-wx,a r file同上例
$ chmod -R u r directory 递归地给 directory 目录下所有文件和子目录的属主分配读的权限

39、搜索文件用什么命令? 格式是怎么样的?

代码语言:javascript复制
whereis 加参数与文件名
locate 只加文件名
find <指定目录> <指定条件> <指定动作> //find 直接搜索磁盘,较慢
find / -name "string*"

40、查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?

查找自己所在的终端信息:who am i

查看当前谁在使用该主机:who

0 人点赞