Linux技术面试题

1.查看当前系统每个ip的连接数

netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn

2.awk取eth0的ip

ifconfig eth0 |grep 'inet'|awk {'print $2'}
ifconfig eth0|awk  'NR==2{print $2}'

3.简述DNS 进行域名解析的过程。

(1)检查DNS 服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;

(2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;

(3)若没有查到,则将请求发给根域DNS 服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS 服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。

(4)若没有找到,则返回错误信息。

4.TCP 和UDP 区别是什么?

TCP:传输控制协议,提供的是面向连接、可靠的字节流服务,

当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,

之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,

流量控制等功能,保证数据能从一端传到另一端。

UDP:用户数据协议,是一个简单的面向数据报的传输层协议。

UDP不提供可靠性,它只是把应用程序传给IP层的数据报发出去,

但是并不能保证他们能够到达目的地。由于UDP在传输数据报前不用

在客户和服务器之间建立一个连接,且没有超时重发机制,故而传输速度很快。

5.tcp三次握手和四次挥手

第一次握手:
客户机向服务器发送一个syn的数据包,进入SYN_SEND状态;

第二次握手:
服务器收到包,确认之后,向客户机返回一个ack(和一个syn,此时的服务器处于SYN_RECV状态);

第三次握手:
客户端收到了服务器返回的syn+ack之后,再向服务器发送一个ack,这时候服务器和客户机的连接状态是ESTABLISHED。

四次挥手
1.客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
2.服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
3.服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4.客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

6.当文件系统受到破坏时,如何检查和修复系统?

成功修复文件系统的前提是要有两个以上的主文件系统,
并保证在修复之前首先卸载将被修复的文件系统。

使用命令fsck 对受到破坏的文件系统进行修复。
fsck 检查文件系统分为5 步,每一步检查系统不同部分的连接特性并对上一步进行验证和修改。
在执行 fsck 命令时,检查首先从超级块开始,然后是分配的磁盘块、
路径名、目录的连接性、链接数目以及空闲块链表、i-node。

7.现在给你三百台服务器,你怎么对他们进行管理?

管理3百台服务器的方式:

1)设定跳板机,使用统一账号登录,便于安全与登录的考量。

2)使用salt、ansiable、puppet进行系统的统一调度与配置的统一管理。

3)建立简单的服务器的系统、配置、应用的cmdb信息管理。便于查阅每台服务器上的各种信息记录。

8.LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

LVS: 是基于四层的转发

HAproxy: 是基于四层和七层的转发,是专业的代理服务器

Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做七层的转发

区别:

LVS由于是基于四层的转发所以只能做端口的转发

而基于URL的、基于目录的这种转发LVS就做不了

工作选择:

HAproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做

在很大并发量的时候我们就要选择LVS,像中小型公司的话并发量没那么大

选择HAproxy或者Nginx足已,由于HAproxy由是专业的代理服务器

配置简单,所以中小型企业推荐使用HAproxy

9.什么是中间件?什么是jdk?

中间件介绍:

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯

是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口

但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递

通过中间件,应用程序可以工作于多平台或OS环境。

jdk:jdk是Java的开发工具包

它是一种用于构建在 Java 平台上发布的应用程序、applet 和组件的开发环境

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

cat access.log | awk '{print $1}' | uniq -c | sort -rn | head -10

11.Linux系统中病毒怎么解决

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

2)要查的话就是找到病毒文件然后删除

      中毒之后一般机器cpu、内存使用率会比较高

      机器向外发包等异常情况,排查方法简单介绍下

top 命令找到cpu使用率最高的进程

一般病毒文件命名都比较乱,可以用 ps aux 找到病毒文件位置

rm -f  命令删除病毒文件

检查计划任务、开机启动项和病毒文件目录有无其他可以文件等

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

12.发现一个病毒文件你删了他又自动创建怎么解决


公司的内网某台linux服务器流量莫名其妙的剧增,用iftop查看有连接外网的情况

针对这种情况一般重点查看netstat连接的外网ip和端口。

用lsof -p pid可以查看到具体是那些进程,哪些文件

经查勘发现/root下有相关的配置conf.n hhe两个可疑文件,rm -rf后不到一分钟就自动生成了

由此推断是某个母进程产生的这些文件。所以找到母进程就是找到罪魁祸首

查杀病毒最好断掉外网访问,还好是内网服务器,可以通过内网访问

断了内网,病毒就失去外联的能力,杀掉它就容易的多

怎么找到呢,找了半天也没有看到蛛丝马迹,没办法只有ps axu一个个排查

方法是查看可以的用户和和系统相似而又不是的冒牌货,果然,看到了如下进程可疑

看不到图片就是/usr/bin/.sshd

于是我杀掉所有.sshd相关的进程,然后直接删掉.sshd这个可执行文件

然后才删掉了文章开头提到的自动复活的文件

总结一下,遇到这种问题,如果不是太严重,尽量不要重装系统

一般就是先断外网,然后利用iftop,ps,netstat,chattr,lsof,pstree这些工具顺藤摸瓜

一般都能找到元凶。但是如果遇到诸如此类的问题

/boot/efi/EFI/redhat/grub.efi: Heuristics.Broken.Executable FOUND,个人觉得就要重装系统了

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

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

还有ulimit -n 查看linux系统打开最大的文件描述符,这里默认1024

不修改这里web服务器修改再大也没用,若要用就修改很几个办法,这里说其中一个:

修改/etc/security/limits.conf

* soft nofile 10240

* hard nofile 10240

重启后生效

14.用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | 
awk -F"." '{print $1"."$2"."$3"."$4}'| sort | uniq -c | sort -nr |head -20

15.如何禁 ping

[root@node0 ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all  //这个时候,别人是可以 ping 通自己的
[root@node1 ~]# ping 192.168.6.6
PING 192.168.6.6 (192.168.6.6) 56(84) bytes of data.
64 bytes from 192.168.6.6: icmp_seq=1 ttl=64 time=1.79 ms
64 bytes from 192.168.6.6: icmp_seq=2 ttl=64 time=0.597 ms
[root@node0 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@node1 ~]# ping 192.168.6.6    //ping 不能了
PING 192.168.6.6 (192.168.6.6) 56(84) bytes of data.
--- 192.168.6.6 ping statistics ---
93 packets transmitted, 0 received, 100% packet loss, time 92168ms

16.Linux中用过哪些中间件?

TomCAT
Nginx
WebLogic
WebSphere
Apache
ES
JBOSS
Jetty
wget
yum
ping

17.MySQL的左右链接?

https://www.cnblogs.com/wzh313/p/9077247.html

#SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同

内连接:           
只连接匹配的行

左外连接:        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行)
以及右边表中全部匹配的行,a.order_id = b.order_id(+)

右外连接:        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行)
以及左边表中全部匹配的行,a.order_id(+) = b.order_id

全外连接: 
包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

18.MySQL做过备份吗?用过哪些方法?具体说明.

冷备份:业务停止或数据库关闭,进行备份,业务影响最大
热备份:不锁表备份,只能针对事务型引擎的表(例如:InnoDB),业务的影响最小.
温备: 锁表备份,只读备份,阻塞所有的变更操作,只能读。

备份工具:
mysqldump
    逻辑备份
    备份出来的都是SQL语句
    可读性较强,压缩比高
    便于二次处理
    是自带的工具
    
    劣势就是比较慢
    —从磁盘调数据 --->内存 --->转换成SQL --->xxx.sql
    
    
XBK(Xtrabackup)
    物理备份工具, 备份的数据文件(类似cp),可读性比较差,不便于处理
    备份速度快
    支持热备
    自带了增量备份功能
    
    劣势就是需要另外安装,可读性不友好,不便处理,压缩比较低
    
一些备份策略:
    全备:全库备份,备份所有数据
    增量:备份变化的数据
    逻辑备份: mysqldump+binlog
    物理备份: xtrabackup_full+binlog
    
备份的周期:
    根据数据量设计备份周期
    周日进行一次全备,或周1-周6进行增量备份

19.如果某个服务down掉了,要先从哪方面排查故障?

查看应用服务端口是否存活;
查看应用服务的日志;
查看系统负载情况;
查看内存剩余情况;
查看服务的配置文件是否有书写错误;
查看是否出现网络故障;
查看是否出现安全问题,是否被攻击
查看请求是否过大
查看数据库

20.如何发布和回滚,用jenkins又是怎么实现?

发布:jenkins配置好代码路径(SVN或GIT),然后拉代码,打tag。
需要编译就编译,编译之后推送到发布服务器(jenkins里面可以调脚本),
然后从分发服务器往下分发到业务服务器上。

回滚:按照版本号到发布服务器找到对应的版本推送

21.zabbix监控怎么实现的?

现在公司的业务都跑在阿里云上,我们首选的监控就是用阿里云监控,
阿里云监控自带了ECS、RDS等服务的监控模板,可结合自定义报警规则来触发监控项。
上家公司的业务是托管在IDC,用的是zabbix监控方案,zabbix图形界面丰富,
也自带很多监控模板,特别是多个分区、多个网卡等自动发现并进行监控做得非常不错,
不过需要在每台客户机(被监控端)安装zabbix agent。

22.假如有人反应,调取后端接口时特别慢,你会如何排查?

问清楚反应的人哪个服务应用或者页面调取哪个接口慢,叫他把页面或相关的URL发给你,
首先,最直观的分析就是用浏览器按F12,看下是哪一块的内容过慢
(DNS解析、网络加载、大图片、还是某个文件内容等),
如果有,就对症下药去解决(图片慢就优化图片、网络慢就查看内网情况等)。
其次,看后端服务的日志,其实大多数的问题看相关日志是最有效分析,
最好用tail -f 跟踪一下日志,当然你也要点击测试来访问接口日志才会打出来。
最后,排除sql,,找到sql去mysql执行一下,看看时间是否很久,
如果很久,就要优化SQL问题了,expain一下SQL看看索引情况啥的,针对性优化。
数据量太大的能分表就分表,能分库就分库。如果SQL没啥问题,那可能就是写的逻辑代码的问题了,一行行审代码,
找到耗时的地方改造,优化逻辑。

23.mysql数据库用的是主从读写分离,主库写,从库读,假如从库无法读取了、或者从库读取特别慢,你会如何解决?

以解决问题为前提条件,先添加从库数量,临时把问题给解决,然后抓取slow log ,
分析sql语句,该优化就优化处理。慢要不就是硬件跟不上,需要升级;
要不就是软件需要调试优化,等问题解决在细化。

24.给你一套环境,你会如何设计高可用、高并发的架构?

如果这套环境是部署在云端(比如阿里云),你就不用去考虑硬件设计的问题。
可直接上阿里云的SLB+ECS+RDS这套标准的高可用、高并发的架构。
对外服务直接上SLB负载均衡技术,由阿里的SLB分发到后端的ECS主机;
ECS主机部署多台,应用拆分在不同的ECS主机上,
尽量细分服务。数据库用RDS高可用版本(一主一备的经典高可用架构)、
或者用RDS金融版(一主两备的三节点架构)。
在结合阿里其它的服务就完全OK,业务量上来了,主机不够用了,直横向扩容ECS主机搞定。

如果这套环境托管在IDC,那么你就要从硬件、软件(应用服务)双面去考虑了。
硬件要达到高可用、高并发公司必须买多套网络硬件设备
(比如负载设备F5、防火墙、核心层交换、接入层交换)
都必须要冗余,由其是在网络设计上,设备之间都必须有双线连接。
设备如果都是跑的单机,其中一个设备挂了,你整个网络都瘫痪了,
就谈不上高可用、高并发了。其次在是考虑应用服务了,
对外服务我会采用成熟的开源方案LVS+Keepalived或者Nginx+Keepalived,
缓存层可以考虑redis集群及Mongodb集群,中间件等其它服务可以用kafka、zookeeper,
图片存储可以用fastDFS或MFS,如果数据量大、又非常多,那么可采用hadoop这一套方案。
后端数据库可采用 “主从+MHA”。这样一套环境下来是绝对满足高可用、高并发的架构。

25.磁盘阵列的概念

磁盘阵列使用场景:提高磁盘的读写数据速度。
磁盘阵列组成部分:由最少两块以上的磁盘组成的。
磁盘阵列的模式:常用的模式raid0、raid1和raid5。

raid0:一份数据在多个磁盘存储相同的数据,读取数据速度快。

raid0是用来提高读取数据速度的,其用两块以上的磁盘组成,是将数据同时记录在这几个磁盘中,在使用时,
几块磁盘各读取一部分数据。这种磁盘组因为需要存入的数据完全相同,
所以容量和一块磁盘的容量大小相同,但是读取速度会变快。

raid1:一份数据拆分多份存储在多个磁盘中,写入数据速度快。

raid1是用来提高写入数据速度的,是在写入数据时将数据分成磁盘的份数分别存在几块磁盘中的,
每个磁盘当中都是不完整的数据,所以这种磁盘组的容量将会翻倍,写入数据的速度也会变快。

raid5:集成了raid0和raid1的优点,读写都很快,但单方面不及raid0和raid5。

raid5本质上就是raid0和raid1的结合,
使得读取数据和写入数据速度都提高,但是加速的结果不如raid0或者raid1高。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容