上上週,有個大公司面試機會,可是吧,我沒有準備好,就說我暫時不去了,等下輪消息,可是目前看來,電話也不打來了,應該是人招滿了,雖然我仍是沒有足夠的信心,感受去了就是被虐,內心面仍是空落落的。唉,感受從事這個行業實在太累了,學的東西太多太雜,實際用到的是又不必定有多少,python這個也只是有點簡單基礎,真正開發那我確定不行。就運維來講,也是讓人頭疼,永遠解決的不了的問題,就是學的東西太難,領域太廣,腦仁疼。因此我仍是想從事openstack,畢竟實習公司給了我一個正確的方向,只需抓這幾個領域就行了,我主動離開了,反正我確定要吃到苦頭纔有感悟的。一搬真正雲計算公司都是要求openstack開發的,運維不多,除了電商平臺。我這畢業設計也是一臉蒙逼,不知道從何入手,煩死了都!html
一、Zabbix監控爲何分爲主動和被動?node
答:在這裏,主動和被動都是針對被監控端agent來講的。python
被動:zabbix server向zabbix_agent討要數據mysql
主動:agent請求server獲取主動的監控項列表,並主動將監控項內須要檢測的數據提交給server/proxylinux
二、Saltstack中,Master與Minion是如何進行通訊的?面試
答:分爲兩個階段。Master與Minion進程經過ZeroMQ消息隊列進行通訊sql
(1)Master與Minion認證:minion第一次啓動的時候,會生成密鑰對,私鑰放在本地,而公鑰複製一份發送給Master,Master接收到公鑰後,經過salt-key命令進行接受認證,這樣認證經過就能對Minion發送指令了。數據庫
(2)Master與Minion的鏈接:Master啓動後,會監聽2個端口,4505端口負責消息發佈,4506端口負責與Minion端進行ZeroMQ通訊。api
三、QEMU和KVM有什麼聯繫嗎?(真心記不住這些,我爲啥就不敏感呢?!)緩存
答:(1)KVM模塊在運行時按需加載進入內核空間運行,KVM模塊自己不進行任何設備的模擬,須要用戶空間程序QEMU經過/dev/kvm接口設置一個虛擬客戶機的地址空間,向它提供模擬的I/O設備,並將它的視頻顯示映射回宿主機的顯示屏。
(2)虛擬機運行期間,QEMU會經過KVM模塊提供的系統調用進入內核,由KVM模塊負責把虛擬機置於處理器的特殊模式運行。
四、KVM中,vCPU的工做模式有哪幾種?
答:(1)用戶模式:主要處理I/O的模擬和管理,由用戶空間的應用程序QEMU的代碼實現
(2)內核模式:執行一些安全的和高性能的特權指令,
(3)客戶模式:執行大部分的非特權指令。當發出關機指令的時候會被Hypervisor截獲並進行模擬
五、Openstack最簡單的邏輯結構,在每一個節點安裝什麼?
答:(1)控制節點:keystone提供身份認證服務、glance提供鏡像資源服務、Nova-api計算資源管理服務、數據庫服務MySQL、RabbitMQ消息隊列服務,Memcached緩存token服務(可選)、Neturon服務
(2)計算節點:nova-compute、neutron插件、KVM虛擬化系統。
六、虛擬化和雲計算有什麼區別?(厲害了陳沙克,以前在這家公司實習過,據說過這我的,比較叼)
答:雲計算是在虛擬化基礎之上的
(1)API接口
(2)彈性擴展:橫向是指自動增長和減小機器的數量、縱向是指自動增長和減小cpu和內存
(3)分佈式技術
(4)自服務
(5)節點規模
參考文檔:http://www.chenshake.com/chat-virtualization-and-cloud-computing/
七、簡述/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
八、簡述ext4文件系統的特色。
答:(1)碎片整理
(2)與ext3系統兼容
(3)無限數量的子目錄
(4)日誌校驗
(5)快速fsck文件系統修復
參考文檔:http://evilv5.blog.51cto.com/76947/757619
九、fsck工做原理和使用場景?(這玩意據說過,但用的很少,一考到就懵逼了)
答:fsck檢查文件系統時,首先判斷出此文件系統是什麼類型,而後檢查superblock(超級塊記錄塊大小、塊個數、Inode節點數)的可用性,再而後掃描並初始化inode,最後檢驗並修復出現有錯誤的superblock、inode和block,最後作一個總結報告出哪些已經修復好的問題。
致使文件系統損壞的緣由多是由於中途有非法關機形成的,fsck不只能夠對文件系統進行掃描,還能修正文件系統的一些問題。
應用場景:值得注意的是fsck掃描文件系統時必定要在單用戶模式、修復模式或把設備umount後進行。警告:若是掃描運行中的系統,會形成系統文件損壞!
參考文檔:http://blog.chinaunix.net/uid-29209863-id-5756928.html
十、mysql備份?
答:(1)mysqldump全量備份,mysqlbinlog能夠從指定時間和指定位置進行增量備份
(2)一主一從模式下延時一天同步,對從機器進行停掉SQL線程備份
(3)對於Myisam存儲類型的表使用mysqlhoscopy進行熱備,對使用Innodb類型的表用xtraBACKUP進行在線備份
十一、當前路徑下不少不一樣目錄(如a、b、c)下面都有1個相同的文件名test.txt,但每一個test.txt內容有可能不一樣,如何把全部test.txt裏全部內容放入一個新的文件裏1.txt(注:內容不能有重複行)?
答:cat */test.txt | sort -n| uniq >>1.txt
十二、介紹下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
1三、對於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塊存儲進行備份
1四、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
1五、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
1六、python如何實現兩個字典合併?
答:>>> dict1 = {1:2,3:4}
>>> dict2 = {
5:6,
7:8
}
>>> dict1.update(dict2)
>>> dict1
{1: 2, 3: 4, 5: 6, 7: 8}
1七、元組和列表有什麼區別?元組和列表如何相互轉換,舉個例子。
答:(1)元組是不可變對象,一旦建立,值就不會發生變化。而列表中元素的值是能夠發生改變的
(2)元組通常使用小括號,列表通常使用中括號
>>> a =(1,2,3)
>>> b=[1,2,3]
>>> a =list((a)) ##元組轉爲列表
>>> a
[1, 2, 3]
>>> b =tuple((b)) ##列表轉爲元組
>>> b
(1, 2, 3)
>>>
1八、寫一下冒泡排序。
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)
1九、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
2一、如何保證Mysql數據庫的可靠性?(忘完了尼瑪,不過看到還能想起,說不出來)
答:DRBD+Mysql+Heartbeat高可用方案
DRBD---Distributed Replicated Block Device 是一種基於Linux的軟件組件, 它是由內核模塊和相關程序而組成的,經過網絡鏡像促進共享存儲系統的替換。也就是說:當你將數據寫入本地的DRBD設備上的文件系統時,數據會同時被髮送到網絡中的另一臺主機之上,並以徹底相同的形式記錄在一個文件系統中(實際上文件系統的建立也是由DRBD的同步來實現的)。本地節點(主機)與遠程節點(主機)的數據能夠保證明時的同步,並保證IO的一致性。因此當本地節點的主機出現故障時,遠程節點的主機上還會保留有一份徹底相同的數據,能夠繼續使用,以達到高可用的目的。
優勢:安全性高、穩定性高、可用性高,出現故障自動切換。
缺點:只有一臺服務器提供服務,成本相對較高,不方便擴展,可能會發生腦裂。
參考文檔:http://www.cnblogs.com/gomysql/p/3674030.html
2二、談談*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
2三、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函數,這是第二
2四、建立虛擬機的流程?(搞不清楚建立和啓動有啥區別)
答: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)虛擬機建立成功。
2五、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
2六、介紹下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上執行,要保證隔離性、公平性和性能。
2七、虛擬機的動態遷移瞭解多少?
答:所謂動態遷移就是指虛擬機在短期內暫停運行(不是關機),關閉源計算機點的實例,啓動目的計算節點相同的實例,完成所謂的「遷移」。大概的工做原理是保證目的端要有相同的虛擬機的鏡像,然後啓動實例起來,這一點能夠經過NFS共享存儲來實現,最大的難度是實現內存的遷移,那麼由於數據隨時在改變,大概分爲3個節點,push-stop and copy-pull,其次是網絡資源遷移,在局域網內發送ARP重定向包,將虛擬機的IP地址與目的機器的MAC地址進行綁定,然後再發其餘
包到目的機器上。最後是存儲設備的遷移,應該是經過NAS進行文件傳輸共享數據。
LiveMigarationa的意義和做用是:(1)負載均衡,將負載較重的物理服務器上遷移一部分虛擬機到另外一個物理服務器(2)先進行遷移,方便升級維護物理機
2八、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資源。
2九、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))
3一、什麼操做Horzion不能作,只能用命令行作?
答:(1)批量遷移只能用命令行(單臺虛擬機能夠用horzion)
(2)部署完虛擬機之後的網卡添加只能用命令行,部署前能夠用horzion添加網卡。
3二、nova conductor的做用?
答:(1)由nova conductor與數據庫交互,避免nova compute直接與數據庫進行交互,爲防止雲主機實例被***後數據庫暴露,在因此nova conductor在必定程度
上保證了安全。
(2)nova conductor通常部署在控制節點上,nova compute運行在計算節點上,方便對
參考文檔:http://blog.csdn.net/lynn_kong/article/details/8606640