为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
这里我们去卸载gcc
sudo yum remove lrzsz
3、yum的深度思考
上面我们知道yum怎么去查找软件包,安装和卸载软件,但是软件包又是从何处来的呢?
我们都知道在下载软件的时候都是联网的,也就说软件包并不是在本地,其实软件包是通过联网访问服务器。
那些服务器又是谁在维护,软件包又是怎么来的呢?
这就不得不说Liunx是个开源的操作系统,那么在一个操作系统中肯定要下载软件的,所以那么Liunx社区的大佬就会去维护服务器(当然不同的版本的操作系统,服务器可能不同),然后因为服务器是免费为大家提高的,所以自然会有些大佬乐于奉献去些软件包并上传到。
二、gcc的学习使用
前面我们在自己的服务器是安装的gcc,我们都知道vim仅仅只是个高级点的编辑器,他是不能完成对代码的编译链接的,这将要靠我们的gcc编译器去完成。
1、在Liunx下理解编译链接
下面我们简单回忆一下翻译的过程:
- 预处理:这过程中我们完成对头文件的展开,去注释,对代码中的宏进行替换,进行条件编译。
- 编译:把c语言代码转为汇编语言。
- 汇编:这里将汇编语言在转换为二进制(这里虽然生成了计算机可识别的二进制,但是由于没有进行链接,所以仍然是不可执行的)。
- 链接:将写好的代码和C标准库中的代码合起来。
下面我们在Linux操作系统下体会一下编译的过程
预处理
gcc -E test.c -o mytest.i
这句代码的意思是从现在开始翻译,当到预处理阶段的做完就停下来,其中的 -o是指明生成的临时文件名称。(如果我们不指向生成的文件名称为auto.c)
编译
gcc -S test.c -o mytest.s
这句代码表示,从现在开始程序的翻译 ,做完编译工作后就停下来。
汇编
gcc -c test.c -o mytest.o
这句代码表示,从现在开始程序的翻译 ,做完汇编工作,讲汇编语言转化为二进制语言后就停下来。
链接
gcc mytest.o -o mytest.c
这里就对二进制文件进行链接过程,生成可执行文件。
2、函数库
虽然我们从上面了解到对程序翻译过程,但是在链接过程中我们要讲到C标准的库函数和我们写的代码会 合并到一起。为了更好的理解,我们还需要知道库函数是分为动态库和静态库这二类的。
静态库和动态库
- 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”。
- 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,
那么我们在Linux下进行的链接是动态库还是静态库呢?
下面我们可以通过file命令来查找一下文件信息:
而在此系统的动态库的名称为libc.so.6。
如果我们要让文件链接静态库怎么做呢?
这里我们只要在链接阶段加上 -static就可以了,但是发现报错了是不能执行这个命令,这是因为我们可能没有安装静态库只要我们安装一下就可以了(sudo yum -install -y glibc-static)。
3、makefile和make
首先我们要明白makefile是一个文件,make是一个配合makefile使用的命令。
背景知识
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作。
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
为了更好的理解makfile和make,我们在Linux写个小项目:进度条。
process.h
#pragma once
#include<stdio.h>
#include<unistd.h>
#include<string.h>
//定义进度条的多种展示形式
const char style[] = {'#','$','>','-','*'};
#define N 2
process.c
#include"process.h"
int main()
{
int i = 0;
//给一个字符数组存放进度条
char bar[101];
//这里给一个进度条在直观跑的形态
const char* label = "|\\-/";
memset(bar, 0, sizeof(bar));
//展示进度条
while (i <= 100)
{
printf("[%-100s][%d%%][%c]\r", bar, i, *(label + (i % 4)));
//这里的是为刷新缓冲区
fflush(stdout);
bar[i++] = style[N];
usleep(100000);
}
printf("\n");
return 0;
}
这里我们写好了代码,正常情况下,我们只要用gcc编译器编译就好了,但为了实现项目的自动化构建,所以我们就要使用makefile和make。
那么我们要在makefile文件定义什么呢?
我们主要在文件中定义清楚,依赖关系和依赖方法。
下面我将以进度条小项目进行分析:
上面我们可以看到由于我们要生成的process是依赖于proccess.c生成的,所以我们在第1行定义了文件之间的依赖关系。而依赖的方式我们是通过gcc编译器生成的。
这里我们要清楚的在对依赖方法进行编写的是多样的:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
定义了文件之间的依赖关系。而依赖的方式我们是通过gcc编译器生成的。
这里我们要清楚的在对依赖方法进行编写的是多样的:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!