上上周,有个大公司面试机会,但是吧,我没有准备好,就说我暂时不去了,等下轮消息,但是目前看来,电话也不打来了,应该是人招满了,虽然我还是没有足够的信心,感觉去了就是被虐,心里面还是空落落的。唉,感觉从事这个行业实在太累了,学的东西太多太杂,实际用到的是又不一定有多少,python这个也只是有点简单基础,真正开发那我肯定不行。就运维来说,也是让人头疼,永远解决的不了的问题,就是学的东西太难,领域太广,脑仁疼。所以我还是想从事openstack,毕竟实习公司给了我一个正确的方向,只需抓这几个领域就好了,我主动离开了,反正我肯定要吃到苦头才有感悟的。一搬真正云计算公司都是要求openstack开发的,运维很少,除了电商平台。我这毕业设计也是一脸蒙逼,不知道从何入手,烦死了都!
1、Zabbix监控为什么分为主动和被动?
答:在这里,主动和被动都是针对被监控端agent来说的。
被动:zabbix server向zabbix_agent讨要数据
主动:agent请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy
2、Saltstack中,Master与Minion是如何进行通信的?
答:分为两个阶段。Master与Minion进程通过ZeroMQ消息队列进行通信
(1)Master与Minion认证:minion第一次启动的时候,会生成密钥对,私钥放在本地,而公钥复制一份发送给Master,Master接收到公钥后,通过salt-key命令进行接受认证,这样认证通过就能对Minion发送指令了。
(2)Master与Minion的连接:Master启动后,会监听2个端口,4505端口负责消息发布,4506端口负责与Minion端进行ZeroMQ通信。
3、QEMU和KVM有什么联系吗?(真心记不住这些,我为啥就不敏感呢?!)
答:(1)KVM模块在运行时按需加载进入内核空间运行,KVM模块本身不进行任何设备的模拟,需要用户空间程序QEMU通过/dev/kvm接口设置一个虚拟客户机的地址空间,向它提供模拟的I/O设备,并将它的视频显示映射回宿主机的显示屏。
(2)虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM模块负责把虚拟机置于处理器的特殊模式运行。
4、KVM中,vCPU的工作模式有哪几种?
答:(1)用户模式:主要处理I/O的模拟和管理,由用户空间的应用程序QEMU的代码实现
(2)内核模式:执行一些安全的和高性能的特权指令,
(3)客户模式:执行大部分的非特权指令。当发出关机指令的时候会被Hypervisor截获并进行模拟
5、Openstack最简单的逻辑结构,在每个节点安装什么?
答:(1)控制节点:keystone提供身份认证服务、glance提供镜像资源服务、Nova-api计算资源管理服务、数据库服务MySQL、RabbitMQ消息队列服务,Memcached缓存token服务(可选)、Neturon服务
(2)计算节点:nova-compute、neutron插件、KVM虚拟化系统。
6、虚拟化和云计算有什么区别?(厉害了陈沙克,之前在这家公司实习过,听说过这个人,比较叼)
答:云计算是在虚拟化基础之上的
(1)API接口
(2)弹性扩展:横向是指自动增加和减少机器的数量、纵向是指自动增加和减少cpu和内存
(3)分布式技术
(4)自服务
(5)节点规模
参考文档:http://www.chenshake.com/chat-virtualization-and-cloud-computing/
7、简述/etc/ld.so.conf文件有何作用?
答:/etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so(share object)库的路径。
ldconfig命令把件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用
参考文档:http://www.cnblogs.com/chris-cp/p/3591306.html
8、简述ext4文件系统的特点。
答:(1)碎片整理
(2)与ext3系统兼容
(3)无限数量的子目录
(4)日志校验
(5)快速fsck文件系统修复
参考文档:http://evilv5.blog.51cto.com/76947/757619
9、fsck工作原理和使用场景?(这玩意听说过,但用的不多,一考到就懵逼了)
答:fsck检查文件系统时,首先判断出此文件系统是什么类型,然后检查superblock(超级块记录块大小、块个数、Inode节点数)的可用性,再然后扫描并初始化inode,最后检验并修复出现有错误的superblock、inode和block,最后做一个总结报告出哪些已经修复好的问题。
导致文件系统损坏的原因可能是因为中途有非法关机造成的,fsck不仅可以对文件系统进行扫描,还能修正文件系统的一些问题。
应用场景:值得注意的是fsck扫描文件系统时一定要在单用户模式、修复模式或把设备umount后进行。警告:如果扫描运行中的系统,会造成系统文件损坏!
参考文档:http://blog.chinaunix.net/uid-29209863-id-5756928.html
10、mysql备份?
答:(1)mysqldump全量备份,mysqlbinlog可以从指定时间和指定位置进行增量备份
(2)一主一从模式下延时一天同步,对从机器进行停掉SQL线程备份
(3)对于Myisam存储类型的表使用mysqlhoscopy进行热备,对使用Innodb类型的表用xtraBACKUP进行在线备份
11、当前路径下很多不同目录(如a、b、c)下面都有1个相同的文件名test.txt,但每个test.txt内容有可能不同,如何把所有test.txt里所有内容放入一个新的文件里1.txt(注:内容不能有重复行)?
答:cat */test.txt | sort -n| uniq >>1.txt
12、介绍下IO虚拟化?
答:(1)当客户机的设备驱动程序发起IO请求时,KVM中的IO操作会拦截这次IO,然后将本次IO请求的信息存放到共享页,并通知Hypervisor用户空间的QEMU。
(2)QEMU模拟程序获得IO操作信息之后,交由硬件模拟代码模拟出本次的IO操作。完成之后,将结果放回在共享页中,并通知KVM模块中的IO操作捕获代码
(3)最后KVM将信息返回给客户机。
由此可见,KVM IO是连接客户机和QEMU的中间件。IO又分为网络IO和磁盘IO
这样我们做个总结:
QEMU的优点是可以模拟出各种很老很金典的设备,而且不需要修改Guest Os。 缺点是每次IO操作的路径很长,需要多次上下文切换,性能较差
参考文档:http://blog.csdn.net/u012606764/article/details/37958609
13、对于Openstack,应该备份什么?
答:(1)mysql数据库备份,比如keystone/glance/nova/neutron/cinder
[root@controller ~]# mysqldump --opt --all-databases >all.sql ##一键备份所有数据库也行,厉害了,备份单个数据库把--all-databases换了就行
(2)对控制节点和计算节点的/etc/nova目录进行备份
(3)对glance镜像进行备份
(4)对云主机实例进行备份。
(5)对/var/lib/cinder块存储进行备份
14、VXLAN网络中VM间通信过程?(比较复杂,可以想象是一个三层网络设备将源VTEP和目的VTEP互联)
答:在VXLAN模式的网络环境中:源虚拟机发送出去的L2数据包(Inner Ethernet Header + Payload),由send VTEP使用VXLAN Header (由VNI标识所属的segment)将L2数据包封装,然后依次追加UDP Header + 标准IP Header + 标准MAC Header;发出后由L3协议通过标准IP Header转发;匹配VNI找到receives VTEP;最后receives VTEP解包,由L2数据包头找到目标虚拟机,交互Payload数据。
参考文档:http://www.aboutyun.com/thread-11189-1-1.html
15、KVM模块分为几部分?IO设备用KVM不能被虚拟化么?
答:KVM 分为了两个模块,一个是KVM Driver, 另一个是QEMU。前者负责CPU和内存的虚拟化,后者负责IO的虚拟化。用户空间的QEMU调用一系列的ioctl() 函数进入内核空间,然后内核空间再调用一系列函数进入Guest OS客户空间运行虚拟机。因为KVM是linux内核加载的一个模块,modprobe kvm执行之后呢,kernel马上就变成了Hypervisor。这里kvm能利用linux本身的系统调用,内存管理等进程管理的办法,提升了很大的效率,也很简便。
IO设备一般都是用QEMU来虚拟的,在不支持硬件虚拟化的机器上,QEMU也可以用来虚拟CPU,只是采用二进制动态翻译效率不是很好。远不及KVM。
参考文档:http://blog.csdn.net/u012606764/article/details/38558493
16、python如何实现两个字典合并?
答:>>> dict1 = {1:2,3:4}
>>> dict2 = {
5:6,
7:8
}
>>> dict1.update(dict2)
>>> dict1
{1: 2, 3: 4, 5: 6, 7: 8}
17、元组和列表有什么区别?元组和列表如何相互转换,举个例子。
答:(1)元组是不可变对象,一旦创建,值就不会发生变化。而列表中元素的值是可以发生改变的
(2)元组一般使用小括号,列表一般使用中括号
>>> a =(1,2,3)
>>> b=[1,2,3]
>>> a =list((a)) ##元组转为列表
>>> a
[1, 2, 3]
>>> b =tuple((b)) ##列表转为元组
>>> b
(1, 2, 3)
>>>
18、写一下冒泡排序。
def bubble_sort(lists):
count = len(lists)
for i in range(0, count):
for j in range(i + 1, count):
if lists[i] > lists[j]:
lists[i], lists[j] = lists[j], lists[i]
print(lists)
list1 =[5,2,4,6,9,1]
bubble_sort(list1)
19、python中 xrange()和range()的区别
答:(1)range是产生一个列表,xrange返回的是一个可迭代的对象。
(2)xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间
20、saltstack中pillar和granis有何区别?
答:(1)grains是用来探测出minion的一些变量,比如主机名,内存大小,IP地址,系统及版本号等。相对来说,grains存储的是不常变化的内容,客户端汇报你想要的数据到服务器。grains可以在master端定义,但是要同步到minion端,也可以在minion端进行定义
pillar用于给特定的minion定义任何你需要的数据(数据是动态的),这些数据可以被Salt的其他组件(如state)使用,一般是服务器主动要求收集minion端的信息
(2)grains和pillar的另一个区别就是grains是存储在minion本地,所以grains可以进行新增、变更、删除等操作(通过grains模块append、remove、setval、delval等方法); 而pillar是存储在master本地或者第三方平台上,minion只能查看自己的缓存,没有权限做新增、变更、删除操作
参考文档:http://732233048.blog.51cto.com/9323668/1640792
21、如何保证Mysql数据库的可靠性?(忘完了尼玛,不过看到还能想起,说不出来)
答:DRBD+Mysql+Heartbeat高可用方案
DRBD---Distributed Replicated Block Device 是一种基于Linux的软件组件, 它是由内核模块和相关程序而组成的,通过网络镜像促进共享存储系统的替换。也就是说:当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。
优点:安全性高、稳定性高、可用性高,出现故障自动切换。
缺点:只有一台服务器提供服务,成本相对较高,不方便扩展,可能会发生脑裂。
参考文档:http://www.cnblogs.com/gomysql/p/3674030.html
22、谈谈*args和**kwargs的用法?
答:都是用来传递多个变量作为参数的,*args将许多变量打包成列表的形式,而**kwargs把许多变量打包成字典键值对的形式进行传参。*args要在**kwargs之前
def test_kwargs(first, *args, **kwargs):
print 'Required argument: ', first
for v in args:
print 'Optional argument (*args): ', v
for k, v in kwargs.items():
print 'Optional argument %s (*kwargs): %s' % (k, v)
test_kwargs(1, 2, 3, 4, k1=5, k2=6)
# results:
# Required argument: 1
# Optional argument (*args): 2
# Optional argument (*args): 3
# Optional argument (*args): 4
# Optional argument k2 (*kwargs): 6
# Optional argument k1 (*kwargs): 5
参考文档:http://kodango.com/variable-arguments-in-python
23、python装饰器的用法?
答:为了减少大量雷同的代码,把一个函数也作为参数
def outer(func_var):
def inner():
print ("还没用调用func函数,这是第一步")
ret = func_var()
return ret+1
return inner ##可以返回内嵌函数名
def func():
print ("这是func函数,这是第二步")
return 1
##调用
decorated = outer(func)
decorated()
================== RESTART: F:\Python3.5\Scripts\suning.py ==================
还没用调用func函数,这是第一步
这是func函数,这是第二
24、创建虚拟机的流程?(搞不清楚创建和启动有啥区别)
答:1)用户携带证书或密码进行Keystone认证。
2)Keystone认证通过后返回Token,此Token带有角色限制。
3)通过Token向Keystone获取服务访问目录。
4)Keystone返回服务访问目录。
5)携带Token进行虚拟机创建,将指令传递给nova-api
6)Nova向Keystone验证Token。并把此创建虚拟机请求消息发送到消息队列中,nova scheduler调度到消息队列中的消息,决定从哪台计算节点创建云主机,
7)而后被选中的计算节点的nova compute服务携带Token访问Glance,glance也要向keystone验证该token是否可信
8)Glance返回镜像。
9)Nova携带Token,向Neutron请求虚拟机网卡VIF设置参数。
10)Neutron向Keystone验证Token
11)Nova携带Token验证VIF是否可以访问。
12)Neutron返回成功的信息给Nova
13)Nova返回创建成功的信息给用户。
14)虚拟机创建成功。
25、copy()与deepcopy()的区别
答:(1)浅拷贝就相当于给原有对象加了另一个标签,其实都是同一个东西。如果原有父对象发生改变,子对象也会跟着改变。
(2)深拷贝相当于又在内存开辟一片空间放入一个新的对象,只不过把父对象的元素值拷贝了过来,如果父对象发生了改变,子对象是不会变化的,因为压根不是一个东西了。
>>> import copy
>>> list1 = [1,2,[3,4]]
>>> list2 = copy.copy(list1)
>>> list3 = copy.deepcopy(list1)
>>> list2 == list3
True
>>> list2 is list3
False
>>> list1[2][0] = 100
>>> list2
[1, 2, [100, 4]]
>>> list3
[1, 2, [3, 4]]
>>>
参考文档:http://blog.csdn.net/qq_32907349/article/details/52190796
26、介绍下CPU虚拟化?
答:(1)CPU虚拟化技术把物理CPU抽象成虚拟CPU,任意时刻,一个物理CPU只能运行一个虚拟CPU的指令,每个客户机可以使用一个或多个虚拟CPU,在各个操作系统之间,虚拟CPU的运行相互隔离,互不影响。如果需要为多个客户机进行服务的话,需要把物理CPU时间分片。
(2)CPU虚拟化需要解决正确运行和调度两个关键问题。当guest OS发出非特权指令的时候,指令直接运行在宿主机的物理核心上,如果guestOS发出特权指令的时
候,先请求guest OS的内核调用,而后再次经过Hypervisor的KVM driver,Hypervisor决定此特权指令是否运行在物理核心上,最后把处理结果返回给guest OS。
(3)调度问题是指Hypervisor决定guest OS的哪个虚拟CPU在物理CPU上执行,要保证隔离性、公平性和性能。
27、虚拟机的动态迁移了解多少?
答:所谓动态迁移就是指虚拟机在短时间内暂停运行(不是关机),关闭源计算机点的实例,启动目的计算节点相同的实例,完成所谓的“迁移”。大概的工作原理是保证目的端要有相同的虚拟机的镜像,而后启动实例起来,这一点可以通过NFS共享存储来实现,最大的难度是实现内存的迁移,那么因为数据随时在改变,大概分为3个节点,push-stop and copy-pull,其次是网络资源迁移,在局域网内发送ARP重定向包,将虚拟机的IP地址与目的机器的MAC地址进行绑定,而后再发其他
包到目的机器上。最后是存储设备的迁移,应该是通过NAS进行文件传输共享数据。
LiveMigarationa的意义和作用是:(1)负载均衡,将负载较重的物理服务器上迁移一部分虚拟机到另一个物理服务器(2)先进行迁移,方便升级维护物理机
28、vxlan和vlan的区别?(vxlan这个东西如果要深入的话,可能会提数据包格式,没准备的话就完蛋了!)
答:(1)vlan ID有12比特位,共有2^12个vlan,vxlan ID共有24位,vxlan共有2^24个vlan
(2)vxlan主要用于虚拟化环境,vlan可以用于物理环境,也可以用于虚拟化环境。
(3)不同网段的vxlan通信依然需要三层网络设备,vxlan的原理远比vlan复杂,但他们都具有隔离广播域作用
(4)vxlan能够解决地址重叠问题,采用vlan技术的交换机所使用的MAC地址表空间有限,每次当有新的的主机发包的时候,就必须重新学习目的MAC地址,所以就会洪范,浪费网络带宽,以及CPU资源。
29、KVM为什么叫基于内核的虚拟机?
答:通过加载KVM模块,Linux内核就成为了一个Hypervisor,KVM就能够直接利用Linux系统本身的进程调度、内存管理、安全子系统、网络协议栈等功能,把内核当成KVM自己的东西,而KVM只负责虚拟化即可。/dev/kvm是内核空间的接口,可以直接用来跟KVM模块打交道,创建虚拟机的请求都要经过于此。
30、实现最大公约数和最小公倍数
答:
a = int(input("请输入一个数a:"))
b = int(input("请输入另一个数b:"))
temp = 0
if a < b: ##确保a比b大
temp = a
a = b
b = temp
def maxCommon(a, b):
while b: a,b = b, a%b ##把a换成b,b换成a除以b的余数,继续除,知道余数b为0终止while循环
return a
def minCommon(a, b):
c = a*b
while b: a,b = b, a%b
return c//a ##最小公倍数=两个数的乘积除以最大公约数
if __name__ == '__main__':
print(maxCommon(a,b))
print(minCommon(a,b))
31、什么操作Horzion不能做,只能用命令行做?
答:(1)批量迁移只能用命令行(单台虚拟机可以用horzion)
(2)部署完虚拟机以后的网卡添加只能用命令行,部署前可以用horzion添加网卡。
32、nova conductor的作用?
答:(1)由nova conductor与数据库交互,避免nova compute直接与数据库进行交互,为防止云主机实例被***后数据库暴露,在所以nova conductor在一定程度
上保证了安全。
(2)nova conductor一般部署在控制节点上,nova compute运行在计算节点上,方便对
参考文档:http://blog.csdn.net/lynn_kong/article/details/8606640