面试题(3)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
张贺,多年互联网行业工作经验,担任过网络工程师、系统集成工程师、LINUX系统运维工程师
个人网站:www.zhanghehe.cn
笔者微信:zhanghe15069028807,现居济南历下区
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
基础类
打包压缩
写出常见的打包工具和解压缩工具
- gzip FILE----->gzip -d FILE.gz
- bzip2 FILE---->bzip2 -d FILE.bz2
- xz FILE---->unxz FILE.xz
- zip dir.zip dir----->unzip dir.zip
- tar -zcf DIR.tar.gz DIR--------tar -zxf DIR.tar.gz
//打包/etc/passwd文件和/etc/issue文件,并以当前时间命名,保存到/tmp目录
tar -zcf /tmp/$(date +%Y-%m-%d-%H-%M-%S).tar.gz /etc/passwd /etc/issue
vim
vim的三种模式:编辑模式(进入时的默认模式)、插入模式、末行模式
vim的替换如何做,例如把txt,替换成sh:%s@txt@sh@g
FIND
// 把/etc/中大于50k小于200k的普通文件,复制到/tmp目录下面(四种方法)
cp -arp `find /etc/ -size +50k -a -size -200k` /tmp
find /etc -size +50k -a -size -200k -exec cp -arp {} /tmp \;
find /etc/ -size +50k -a -size -200k | xargs cp -t /tmp
find /etc/ -size +50k -a -size -200k | xargs -i cp -arp {} /tmp
//在/tmp目录下查看七天前创建的文件删除之
find $Path -type f -mtime +7 | xargs rm -f
三剑客
添加用户
用一条命令添加zhanghe01,zhanghe02,zhanghe03,zhanghe04,zhanghe05,使用固定密码cba-123,不允许用循环。
第一步:生成用户
[root@centos7 ~]# echo zhanghe{01..05}
zhanghe01 zhanghe02 zhanghe03 zhanghe04 zhanghe05
[root@centos7 ~]# echo zhanghe{01..05} | tr ' ' '\n'
zhanghe01
zhanghe02
zhanghe03
zhanghe04
zhanghe05
[root@centos7 ~]# echo zhanghe{01..05} | xargs -n1
zhanghe01
zhanghe02
zhanghe03
zhanghe04
zhanghe05
第二步:生成命令
[root@centos7 ~]# echo zhanghe{01..05} | xargs -n1 | sed -r 's@(.*)@useradd \1;@g'
useradd zhanghe01;
useradd zhanghe02;
useradd zhanghe03;
useradd zhanghe04;
useradd zhanghe05;
[root@centos7 ~]# echo zhanghe{01..05} | xargs -n1 | sed -r 's@(.*)@useradd &;@g'
useradd zhanghe01;
useradd zhanghe02;
useradd zhanghe03;
useradd zhanghe04;
useradd zhanghe05;
[root@centos7 ~]# echo zhanghe{01..05} | xargs -n1 | sed 's#.*#useradd &;#g'
useradd zhanghe01;
useradd zhanghe02;
useradd zhanghe03;
useradd zhanghe04;
[root@centos7 ~]# echo zhanghe{01..05} | xargs -n1 | sed 's#.*#useradd &;echo cba-123 | passwd --stdin &#g'
useradd zhanghe01;echo cba-123 | passwd --stdin zhanghe01
useradd zhanghe02;echo cba-123 | passwd --stdin zhanghe02
useradd zhanghe03;echo cba-123 | passwd --stdin zhanghe03
useradd zhanghe04;echo cba-123 | passwd --stdin zhanghe04
useradd zhanghe05;echo cba-123 | passwd --stdin zhanghe05
第三步:交给bash
[root@centos7 ~]# echo zhanghe{01..05} | xargs -n1 | sed 's#.*#useradd &;echo cba-123 | passwd --stdin &#g' | bash
更改用户 zhanghe01 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zhanghe02 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zhanghe03 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 zhanghe04 的密码 。
这个题只是一个例子,重点还要掌握其思路,通过echo加序列的方式打开出所有的用户,然后再通过sed取出所有的用户,再然后通过sed 替换强行将取出的值塞入命令当中,最后交给bash,同样的,删除这些用户也是同样的思路,如下所示:
echo zhanghe{01..09} | xargs -n 1 | sed -r 's@(.*)@userdel -r \1@g' | bash
过滤身份证
请从test.txt文件当中过滤出正确的的身份证号码
[root@localhost test.dir]# cat test.txt
赵 370831199405162458
钱 370831199305162kjl
孙 37083119920516245X
李 37083110516245887k
张 37083KKKKKKK990516
在LINUX当中,我们要过滤文本时,我们一定要搞清楚,要过滤的文本有什么特征,那么问题来了,身份证号有什么特征?
- 身份证号都是18位的
- 有的身份证号全都是数字,有的身份证号前17位是数字,最后一位是大写的X
好,那事情就简单了!
我们先来满足第一个要求,即身份证号都是18位,18位!如何用正则表达式表示呢?其实无法用基本的正则表达式表达18位数字,需要用到扩展的正则表达式,即:{18};第二个要求就有点麻烦了,最后一位是什么不确定,最后一位要么是数字要么是大写的X,“或”的关系,或的关系用扩展的正则表达式如何表达呢?要用到"|"这个符号,前面的17位数字倒是容易了,数字通过[0-9]就可以表示了。
好,注意了,来了啊!两种方法都可以:
[root@localhost test.dir]# egrep '[0-9]{18}|[0-9]{17}X' test.txt
赵 370831199405162458
孙 37083119920516245X
#查找有18位数字的或者前17位是数字最后一位是X的行,把完全是数字的号码与数字X混杂的号码分开考虑
[root@localhost test.dir]# egrep '[0-9]{17}[0-9X]{1}' test.txt
赵 370831199405162458
孙 37083119920516245X
#查找前17位是数字后面跟一位数字或大写的X的行,把完全是数字的号码与数字X混杂的号码放在一起考虑
好,现在增加难度!现在文件变成这样了:
[root@localhost test.dir]# cat test.txt
赵 370831199405162458
钱 370831199305162kjl
孙 39083119920516245X
陈 37083119920516245X377
李 37083110516245887k
张 37083KKKKKKK990516
[root@localhost test.dir]# egrep '[0-9]{18}|[0-9]{17}X' test.txt
赵 370831199405162458
孙 39083119920516245X
陈 37083119920516245X377 #出现了这个,不符合我们的需求 #为什么不符合要求呢?因为这这一行明显是超过了18位的要求
[root@localhost test.dir]# egrep '[0-9]{17}[0-9X]{1}' test.txt
赵 370831199405162458
孙 39083119920516245X
陈 37083119920516245X377 #出现了这个,不符合我们的需求
怎么办呢?我们怎样才能只过滤出18位的呢?可以这样,如下所示:
//对egrep使用-w选项,-w精确匹配
[root@localhost test.dir]# egrep '[0-9]{18}|[0-9]{17}X' test.txt -w
赵 370831199405162458
孙 39083119920516245X
[root@localhost test.dir]# egrep '[0-9]{17}[0-9X]{1}' test.txt -w
赵 370831199405162458
孙 39083119920516245X
-w是什么意思呢?即锚定连续的字符,即锚定单词,精确匹配单词,仔细体会一下!
[root@n9 ~]# cat test2.txt
23
2423
7235
423
zh230.
[root@n9 ~]# egrep 23 test2.txt
23
2423
7235
423
zh230.
[root@n9 ~]# egrep -w 23 test2.txt
23
取IP
//切的思路,awk实现最快
[root@n9 ~]# ifconfig eth0 | awk 'NR==2{print $2}'
192.168.80.59
//替换的思路
ifconfig eth0 | sed -n 2p | sed -r 's@[[:space:]]+inet (.*) netmask.*@\1@g'
//过滤的思路
ifconfig eth0 | sed -n 2p | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | head -1
192.168.80.59
存储相关
cache和buffer
缓冲和缓存在计算机的很多领域都有用到,我们可以将其从IT领域内部抽离出来,用我们生活的例子来说。
我喜欢吃瓜子,一个个的吃不爽,我先忍住不吃,剥开之后都放到一个瓶子里面,等到这个瓶子装满之后,我一口气将所有的瓜子吃光,对我来说,这个瓶子就是缓存。
剥下来的瓜子皮我不想一个个的扔,因为我住在七楼,我把所有的瓜子皮都放在一个小垃圾桶里面了,等到这个小垃圾桶满了之后我再去扔,对我来说,这个小垃圾桶就是缓冲。
软硬链接
软链接和硬链接的理解要建立在文件系统的理解之上,这里就不再赘述了。
硬链接:
硬链接是通往同一个inode块的不同的名字而已,就像是超市有多个入口,堵上一个入口还可以从别的入口进去,硬链接可以用来备份。
硬链接不能对目录使用,也不能跨越分区,只能在同一个分区内对文件系统使用。
硬链接为什么不能对目录使用呢?网上有很多人对这个机制有各种猜测,我则认为这没有什么意义!系统可以自己在目录下面对目录本身创建硬链接,但是不允许用户创建,就当这是一个硬性的规定,不用多去深研究。
对于硬链接不能跨文件系统这一点很好理解,不同的文件系统内部的结构不同的,比如这一个分区的inode块是66,而另一个分区可能根本没有66号inode块,比如FAT文件系统,里面根本没有inode块!
软链接:
软链接就是一个文件,文件的内容不是文件的内容而是文件的路径。
软链接可以对目录使用,也可以跨越分区。
数据丢失
前两年,支付宝停止服务半小时,这对大型互联网公司来说是非常严重的。像支付宝的的备份、容灾做的是非常好的(我猜应该是两地三中心),但是当他们的光缆被施工队给挖坏了之后,他们并没有立马进行切换到异地的数据中心,而是等待光缆抢修恢复,这是为什么呢?即使做了异地的容灾为什么不用?当我们做了异地的容灾,本地出了意外,我们就要立刻马上恢复数据吗?
我们首先要考虑的是什么?业务!成本!后果!风险!
我们先说一下如果支付宝不切换数据中心的话,后果是什么?直接的损失就是用户的体验,半个小时之内不能用支付宝了,用户的钱还老老实实的存放在本地的数据中心里面,而且运营商会赔偿一部分的给支付宝的;如果支付宝切换数据中心的话,后果是什么?后果是很有可能造成数据不一致的问题,因为用户的实时数据都在本地机房,把外网线给挖断了,可能有一部分数据没有实时同步到异地的数据中心,这时如果切换数据中心,很有可能造成数据的不一致问题,这种问题就大了,假设用户账户里面一共只有100万,当天消费了90万,还有10万,这个记录是存放在本地的数据中心,还没有同步到异地,切换了数据中心之后,该用户再次查看发现账户上竟然还有100万!如果用户趁这个机会,把这100给花了,这笔账应该算到谁的头上?
支付宝的运维团队权衡利弊之后,权衡的什么?用户体验和用户的资金,考虑之后还是决定等待光缆抢修恢复,这样用户虽然暂时不能用支付宝,用户体验有所损失,但是用户的钱不会出现意外,涉及到金钱的问题,安全和稳定压倒一切。
同样的问题,如果是快手和抖音这样的公司遇到呢?他们会不会切换数据中心呢?这个就不一定了,抖音和快手的用户就算是暂时丢失一部分数据,其实也没什么大不了的,又不是什么关键数据,我想快手和抖音的运维团队就很有可能会进行数据中心的切换。
所以结论就是具体业务、具体问题,具体分析,技术要和业务挂钩才能更有价值。
RAID
raid 0 :空间叠加,无冗余,几块盘 都可以做,性能提升
reid 1 ;镜像卷,空间损失一半,有冗余,性能提升
raid 5 :起码三块盘,""加数+被加数=和"的关系,有冗余,性能提升。
定时任务
例0:每天凌晨3点做一次备份,备份/etc/目录到/backup下面
将备份命令写入到一个脚本中,每天备份文件名要求格式:当前时时间_文件名_tar.gz,不输出任何信息,存放的备份内容只存放三天的数据
[root@nginx scripts]# vim backup.sh
#!/bin/bash
tar -czf /backup/$(date +%F)_etc_tar.gz /etc/ &>/dev/null
find /backup -name *.tar.gz -mtime +3 | xargs rm -f
[root@nginx ~]# chmod +x /server/scripts/backup.sh
[root@nginx ~]# crontab -e
0 3 * * * /bin/bash /backup/backup.sh
例2:每20秒打印hello!
***** for i in {0,1,2};do /bin/echo “hello!”; sleep 20 ;done
这就代表每分钟,一分钟到了之后i就等于0,然后就运行echo hello!运行完成之后就睡20秒,20秒睡完了,i又等于1了,然后再打印,然后再睡20秒,然后i等于3,再打印,再睡着.............从而实现每隔20秒打印一次的效果。
网络相关
tcp有限机状态机
三次握手、四次挥手
以及实时的变化状态
icmp状态码
8:请求
0:响应
子网掩码划分
将192.168.80/24划分成四个子网。
答:掩码变成26位,即192.168.80.0/26
第一个子网范围:00
第二个子网范围:01
第三个子网范围:10
第四个子网范围:11
常用ping参数
-c :count指定个数
-I(大I)interface指定网卡
-s:size指定包的大小,常用于分析
568B线序列
橙白 | 橙 | 绿白 | 蓝 |蓝 白 | 绿 |棕 白| 棕
常用VPN
SSL VPN
IPSEC VPN
L2TP VPN
MPLS VPN
修改网络配置
//修改IP
ifconfig eth0 192.168.80.8/24
ip addr add 192.168.80.99/24 dev eth0
//默认IP配置文件常用参数
[root@n9 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
NAME="eth0"
BOOTPROTO="static"
DEVICE="eth0"
ONBOOT="yes"
IPADDR=192.168.80.59
GATEWAY=192.168.80.1
PREFIX=24
DNS1=223.6.6.6
DNS2=8.8.8.8
//路由相关操作
route add default gw 192.168.80.1 eth0
route add -net 192.168.70.0/24 gw 192.168.80.1 eth0
route del -net 192.168.70.0/24
//修改DNS
[root@n9 ~]# cat /etc/resolv.conf
nameserver 192.168.80.1
nameserver 223.6.6.6
nameserver 8.8.8.8
二层和三层交换机
二层交换机没有路由功能,而三层交换机有路由功能。
OSI七层参考模型
物理层、链路层、网络层、传输层、会话层、表示层、应用层。
IPv4地址分类
A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。
C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。
D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1] 。
在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255
dhcp的原理
dhcp是动态地址分配协议。
当主机启动之后会广播发送discover包,dhcp服务器收到单播offer包,客户再广播request,dhcp服务器再单播ack包。
递归和迭代
递归:
老板问我哪一家川菜馆好吃?我从来没去过川菜馆,我是不知道的,但我一个同学的女朋友是四川人,于是我找到我的同学,我的同学又问了他女朋友,他女朋友将答案告诉了他,他又将答案告诉了我,我又将答案告诉了老板,这个过程对于老板来说就是递归。
迭代:
老板问我哪一个洗脚城有那种服务?我从业没去过洗脚城,我是不知道的,我让老板问问公关部的李经理,老板找到李经理,李经理对老板说让他问问销售部小孙,老板于是又找到小孙,小孙将答案告诉了老板,这个过程对老板来说就是迭代。
什么是DDOS
假如说一家饭店只能接待100位客人,有一群流氓进入饭店,也不吃饭就那里坐着,而且把坐位都坐满了,结果正常的客户也无法进去吃饭,就这样耗着,这就是DDOS。
DNS解释过程
在运维笔试的时候,回答DNS解析的过程,不能写一大堆,一是不美观,二是浪费时间,应该怎么写呢?我觉得这样写比较好。
1、客户端:chche----hosts
2、DNS服务器:cache---递归---将递归回来的结果缓存一份并发送一份到客户端。
3、客户端:客户端缓存并使用
DNS什么时候用udp、什么用tcp,为什么这么设计
客户端解析的时候用udp,而区域传送时使用tcp
大多数情况下,DNS解析请求和响应都很小,使用UDP协议更加高效,虽然没有TCP可靠,但是速度快,消耗的系统资源更少,非常适合少量数据包的传输。
一些DNS事务,比如区域传输或其他附加查询,可能会产生大于512字节的数据包,因此使用TCP更加可靠,使用TCP会减少丢包和重新发包的情况,因此更加可靠与高效。
递归和迭代的区别
正向区域和反向区域
正向区域就是我们平常使用的将域名解析成ip地址
反向区域常用于邮件领域,做反垃圾邮件时使用,将IP地址解析成域名。
NAT
最早接触NAT是在做网络工程师的时候,NAT是做网络工程师必需会的知识点和技能,后来在面试运维的时候也经常被用到,在运维的某些知识点当中也会被引用到,如iptables当中,LVS当中。
为什么需要NAT(网络地址转换)?因为IPV4时代公网IP地址缺,所以公司内部通常用的就是私网地址,公司内网的数据想要在互联网上传播就要将私网的地址转换为公网的地址,NAT技术就要用来做这个事情的,所谓的转换其实就将私网地址替换成公网地址,就是这么简单。
网络地址转换分为源地址转换和目的地址转换。源地址转换就是将源地址转换一下,如何转换呢?就是将私网的源IP替换成公网接口的IP,替换的时候会有替换对应的记录,在路由器会体现为一张表。那为什么会用到这张表呢?内网有很多电脑,都使用一个公网IP地址向公网发送数据包,那么当数据包回来的时候路由器怎么知道要将回包发送给哪一个私网电脑,所以路由器在进行源地址转换的时候就需要生成一张对应表,这张对应表的作用就是当数据包回来的时候,路由器可以根据这张表知道将数据转发给哪一个私网电脑。以上就是源NAT转换的基本原理,源NAT转换的根本目的是节省IPV4的公网地址。
此外还有一个目的地址转换,那么目的地址转换用在什么地方呢?目的地址转换用在内网DMZ区有服务器使用私网地址将服务发布到公网的场景中,客户端访问公网IP时,路由器就将公网IP替换成私网IP转换给私网DMZ区的服务器。
那么NAT地址用在什么地方呢?之前都是用在路由器上,但现在中低端的的路由器和防火墙逐渐有了整合的趋势,所以NAT也常见部署于网络出口防火墙上。
此外LVS里面的模式也有用到LVS的,原理差不多, 这里就不仔细说了。
如果笔试的时候如果问到这个问题,让我们阐述NAT的原理?如何用最简单、直白的方式说明呢?不能长篇大论吧,写的多了即影响美观又浪费时间,最好的方式就是画图了,所以我们去面试的时候最好是带着文具盒去,准备铅笔和橡皮,最好准备几张白纸,机会总是留给有准备的人。
DNS/CDN
-
DNS解析原理
-
递归和迭代的区别
-
什么是CDN?
-
常见的CDN厂商:阿里云CDN、腾讯云CDN、360CDN、又拍云CDN、七牛云CDN。
-
如何购买CDN?
-
CDN的原理?
redis
redis是什么?
侦听哪个端口?6379
redis和memcache的区别?
redis持久化的两种类型(RDB、AOF)
主从复制基于哪种持久化类型?
解决一下RDB和手工和自动两种模式?
AOF有些类似于binlog日志,非常精细。
redis的数据类型?(字符、字典、列表、集合、有序集合)
redis和mysql是如何解决数据一致性问题?
解释一下哨兵机制(sentinel)?
如何做主从复制?
memcache
是什么?两个作用?与redis有什么区别?
端口11211
memcache的读写流程?
Memcached服务特点及是什么? (c/s、键值存储、异步IO模型、非持久化、可设置过期时间)
memcach的内存管理机制?
删除机制?
分布式机制?
监控哪些指标:端口、命中率,反应时间
lvs
lvs的原理?
lvs、nginx、haproxy最本质的区别?
会话保持的三种方法?(调度到同一台服务器、会话复制、会话服务器)
怎样实现调度到同一台服务器?(ip/cookie/url/)
解释一下lvs的四种模型?NAT的缺点。
说出常用的LVS算法?
lvs+firewall mark是为什么解决什么问题?以及如何解决这种问题的?
lvs有描述哪三种方式可以实现持久连接?(port/sh、firewall-mark、每客户端持久)
三种健康检查方式?
ldirectord 的作用是什么?与keepaalived有什么不一样?
keepalived
为什么需要keepalived
keepalived与lvs的关系?
keepalived的两种功能?
keepalived的原理?相当于vrrp的原理
为什么会有脑裂问题?如何解决?