操做系統與虛擬化計算機的發展計算機基礎CPUCPU總線類型I/OOS系統調優概述調優工具CPU優化CPU親和型調度策略中斷請求內存調優虛擬內存管理文件系統相關調優網絡相關調優IO磁盤調度器工具查看虛擬化技術CPU虛擬化:硬件虛擬化CPU半虛擬化 (para-virtulization)Memory虛擬化I/O虛擬化兩種實現方式虛擬化網絡:XenXen的工做模式Xen的使用方式:Xen Grub配置xen虛擬狀態:xm經常使用命令建立xen pv模式虛擬機xm的配置文件關聯loop設備文件移動安裝虛擬機Xen快速安裝Xen 總結:磁盤映像管理工具qemu-img鏡像格式libvirt磁盤和網絡熱插拔Xen實時遷移KVMqemu-kvm其餘經常使用選項KVM虛擬網絡模型qemu-imgCirrOS虛擬機遷移virtioLibvirtvirshvirt-installRHEL 虛擬化包組ESXI補充:css
12:26:50 13:10:30html
http://www.cnblogs.com/xkfz007/archive/2012/10/08/2715163.html前端
電子電路, 邏輯電路,數字電路柔和起來的芯片. 讓硬件工做起來是極其困難的. 軟件. 因而有了操做系統, 能夠提供通用接口跟硬件打交道.node
公共功能被抽取出來叫作庫, 這些向上的接口, application program interface. 只要是被開發爲應用程序, 不是在內核空間所運行的程序稱爲, 用戶態. 好比計算1+1=2的運算, 無需通過內核處理, 能夠直接在CPU上面執行.python
用戶態; 內核態linux
咱們須要一個用戶態的接口能夠通知而且與內核交互. 因而咱們有shell.ios
第一代:真空管,I/O穿孔卡片, 穿孔紙帶(耗電量驚人) 1945-1955nginx
第二代:晶體管,批處理系統, 在磁帶機上工做, 串行執行$$job1$$job2$$job
. 1955-1965git
Mainframe大型計算機web
Fortran:古老的編程語言(高級語言)
第三代:集成電路芯片,多道程序設計, 引入的監控程序, 在硬件上同時執行多個程序, 多個程序彼此之間互相隔離, 有個進程級的概念。(65年~80年)
進程是程序的副本, 從程序入口開始, 到程序運行結束, 期間調度都是經過監控程序來實現.
引入了監控程序,time-sharing, 分時設計系統。將CPU的運算分紅了時間片
第四代:PC機。
LSI:大規模集成電路。在每平方釐米的芯片上能夠繼承數千個晶體管. 目前,22nm技術。
CP/M: 微機上出現的第一個操做系統. 微型計算機的控制程序,control program for micro-computer (1974)
77年: digital research(數據研究所), 重寫的CP/M使得CP/M能夠運行在早期intel的8080芯片上.
IBM和比爾蓋茨的故事.
計算機五大部件
馮諾依曼
HD controller: 硬盤控制器. 並非直接鏈接到主機上. 通常經過控制機或者適配器鏈接到主機上.
I/O設備之間爲了彼此通訊, 要經過總線的方式鏈接在一塊兒.
若是使用星型模型, 設備之間的鏈接將會變得很是麻煩. CPU要給每設備提供一根線, 拓撲十分複雜.
總線的工做頻率一般比較高, 數據交換能力比較強. 早期的計算機架構中, 總線並非CPU使用的瓶頸.
至今國人沒法生產CPU, 指令集醜陋不堪
MMU: X86架構下內存管理單元,Memory Management Unit。主要做用是實現內存分頁
CPU執行的過程:取指,解碼,肯定其類型和操做樹並執行 (每一個時鐘週期). 必要時會取數據.
如此一來, 任何一個指令的執行都須要三個時鐘週期.
第一個時鐘週期取來數據, 從內存單元獲取數據的時候可能還比較慢. (理想狀態) .
爲了保證其流暢性, 使用多級流水線的方式來工做. 取指單元取完第一個指令以後, 就去取第二個指令.
取指單元-->解碼單元-->執行單元
取指單元-->
CPU訪問內存的時候會先發送請求指令給內存控制器, 發送請求地址進行定址. 內存控制器在內部, 經過虛擬電路, 使CPU和訪問內存地址創建起關聯關係.
FSB: 前段總線的速度稱爲CPU和內存之間的瓶頸. (10GB/s)
AMD研發的HT技術和Intel研發的QPI技術, 將CPU和內存直接相連. 速率提高在一倍以上
CPU內部都有一些保存臨時關鍵變量和臨時數據的存儲器, 這些存儲器叫作CPU的寄存器.
CPU的寄存器:程序計數器和堆棧指針,程序狀態字。
程序計數器記錄程序的指令, 並經過堆棧指針指向下一條指令
寄存器保持跟CPU時鐘同步的存儲單元, 在CPU內部總線上完成通訊.
上下文切換時,CPU要將寄存器中的內容保存至內存中, 保存現場. 現場保存到內存中.即寄存器會被清空.
task struct: 一種內核使用的數據結構, 記錄了當前進程的各類狀態信息,其中就包括上下文現場的信息
多核心,超線程均可以提升運算能力。
進程的CPU親原型, CPU affinity.
摩爾定律: CPU中晶體管的數量每二十四個月翻一番
超線程可使CPU在兩個線程之間進行切換,在cpu中引入一個獨特的相似於寄存器之類的設備來實現的.
任務管理器中看到的核心數是邏輯核心數.
3Ghz=3 * 1024^3
不論有多少顆核心, 一個進程在運行時只能使用一顆核心. 核心越多, 能夠分配給更多的進程使用. 爲了利用多核系統, 並行編程變得很是重要. 理想狀態, 好比將400條指令分配給4個核心, 每一個核心執行100條指令. 可是很容易出現的狀況就是一個執行流結束後要等待其餘執行流的執行結果. 若是一個線程正在打開一個文件, 而且另外一個線程也要打開此文件, 那麼另外一個線程只能處於等待狀態. 因爲線程之間是共享進程的文件描述符, 防止資源徵用, 通常都要施加以鎖機制.
資源證用的地方稱之爲臨界區
對於linux而言,內核調用線程的時候將其看做進程
一個CPU管理兩個隊列, 運行隊列沒有完成的操做會放到過時隊列中.
兩者能夠互置,減小了複製的操做.
內核rebalance 來從新優化Core的work load (每一秒鐘). rebalance可能致使緩存沒法命中.
將一個進程綁定在一個CPU核心上是爲了提升其緩存命中率的
SMP:對稱多處理器, 多CPU.(在多核心沒法知足橫向擴展的前提)
CPU Socket: CPU插槽
CPU經過總線與內存相連,用於存儲.
1600MHZ是目前內存主流頻率, 1866MHZ.
I/O橋. 南橋慢(ISA橋), 打印機鍵盤鼠標,北橋快(PCI橋)
一些高端的CPU已經直接使用專門的內存總線讓CPU和內存鏈接通訊.
程序局部性原理
空間局部性:程序是由指令+數據組成, 一個數據被訪問到, 離這個數據很近的數據也可能被訪問到.
時間局部性:一個指令執行完成以後, 很快還會再次被訪問到.
因爲局部性原理的存在, 不管是空間仍是時間上, 咱們都要對其作緩存.
引入內存, 是一種拿時間換空間的方式.
加上緩存, 是一種用空間換時間的方式.
而對於CPU自身而言, 他所能操做的存儲器只有寄存器. 本地存儲單元.
磁帶-->機械式硬盤-->固態硬盤-->內存-->三級緩存-->二級緩存-->一級緩存-->寄存器
緩存的n-way associate n路關聯
1ns-->2ns-->4ns-->8ns-->10ns-->1ms--->10ms
二八法則,百分之二十的緩存存放於上級存儲設備中
緩存的造價很是高,主頻,一二級緩存大小
一級二級緩存是各物理核心專用的, 三級緩存是各物理核心共享的.
多核心共享使用CPU和三級緩存會產生資源爭用的問題. 須要內存訪問仲裁控制器
NUMA: null uniformed memory access. 非一致性內存訪問。每顆CPU(Socket)都有獨立的外部內存空間
這樣一來不當緊, 若是程序從core1 複用到core3, 就會產生core3所對應的內存低智商上並無該程序的數據. 因而須要將數據從core1的內存空間複製一份到core3上.
這種機制對CPU綁定進程的方式更加迫切
緩存中的寫機制
write through: 通寫,從一級緩存到寫入內存,才釋放CPU資源
write back: 回寫,寫到一級緩存就通知CPU,寫完成
硬盤的緩存機制同理.
每一個IO設備一般有兩部分組成:
設備控制器(Controller):集成在主板上的一塊芯片或一組芯片。負責從操做系統得到命令並執行
設備自己
控制器是置於I/O設備自己的或者系統的主印製電路板(一般成爲主板)上的芯片組,而適配器則是一塊插在主板插槽上的卡。不管如何,它們的功能都是在I/O總線和I/O設備之間傳遞信息
對於操做系統而言, 在驅動程序之上, 全部的硬件操做都被抽象成文件的操做. 驅動程序控制控制器轉換命令操做.
真正的硬件操做是由驅動程序來完成的,而並非內核. 將操做系統的請求轉換成電氣信號.
驅動程序:一般應由設備生產商;位於內核中
每一個控制器都有少許的用於實現通訊的寄存器。直接集成在控制器內部
好比一個磁盤的控制器, 可能會有指定磁盤地址, 內存地址, 扇區計數, 方向(數據存儲方向)等相關的寄存器. 操做系統發起的請求經過驅動轉換成相應指令並放置於控制器的寄存器中, 才能完成操做.
I/O端口空間: 每一個寄存器表現爲一個I/O端口(由成百上千個控制器的寄存器組成)
全部的寄存器組合成設備的I/O地址空間
I/O端口空間,16bit, 65535. 或32bit
在開機時,向主機註冊申請,根據申請順序,依次給與IO端口
I/O請求須要CPU將數據放置到內存中給某程序處理, 進程未必處於運行狀態.
實現輸入輸出:
中斷控制器通常與CPU經過某個引腳直連, 在中斷到來時通知CPU. 得到通知後的CPU能夠直接根據IO端口, 並激活內核並作進程切換, 這種切換稱爲中斷切換(不一樣於進程切換). 內核將正在運行的進程切換出去, 並將kernel自己運行在CPU上, kernel指揮着到響應的I/O設備上獲取其中斷請求, 並斷定是否能完成其請求.
中斷處理一般分爲兩部分:
理論上每一個網卡報文到達網卡都會引發CPU中斷.
3 . DMA設備,Direct Memory Access.直接內存訪問。硬盤網卡都具備DMA設備。是I/O設備上自帶的一個具備智能型的控制芯片. CPU通知DMA設備, 能夠得到總線的使用權限. (此權限同一時間只能由一個設備具備), 並通知DMA設備可使用的內存地址空間(起始地址和結束地址), 負責將設備緩衝區的內容讀到內核緩衝區(完成中斷的上半部). 提供出一大段連續的內存空間用於存儲緩衝數據. DMA設備具備控制總線的權限, 經過CPU來協調使用. 當數據複製完成, DMA通知CPU中斷上半部完成.
網卡設備都有其緩衝區, 發送緩衝, 和接受緩衝. 網卡發起中斷, 通知CPU, CPU根據IO端口, 激活內核作中斷切換, 內核將數據從網卡緩衝區複製到內核緩衝區(內存中的讀緩衝區), 若是目標IP是本身則拆報文封裝. 並根據服務端口發送給用戶程序.
進程是資源分配的最小單元
CPU: 時間片,time slice. 不考慮優先級的狀況下, 每一個進程在分配時間片的時候是等長的.
Memory:
內存是編指的. 變量是命名的內存空間.
CPU有尋址/編指單元, CPU字長 32位/64位, 其實是地址總線的編指.
一般硬件(X8六、ARM這類架構的機器)中斷向量是放在高地址空間的,因此內核也就放在高地址空間。另外,一般狀況下,低地址空間0~64MB的範圍是不用的,爲了捕獲null異常。
OS在RAM中,處於高地址空間.
OS在ROM中,處於高地址空間. 好比Andord操做系統. 其中ROM的地址空間也會被編指
OS在RAM中,ROM存放驅動.
虛擬地址空間出現的緣由, 若是CPU有4G的編指能力, 可是實際的物理內存只有2G怎麼辦. 若是有多個進程同時運行, 也會產生內存地址的徵用.
虛擬地址空間:實現內存地址的使用
I/O: 抽象成文件
進程:資源集合
Page Frame:頁框,一般每4k爲一個單位。內存使用頁框做爲存儲單元.
地址空間: 低 ---> 高
代碼段-->數據段(靜態變量)-->堆(數據流 由malloc建立) -->映射的共享庫-->棧(變量)
一般CPU上有一個特殊的稱之爲堆指針的寄存器 (stack pointer) 。在程序初始化時,該指針指向棧頂,棧頂的地址最大。CPU有特殊的指令能夠將值Push到線程堆上,以及將值Pop出堆棧
Stack最經典的使用方式就是算數運算.
在現實生活中Queue的應用也很普遍,最普遍的就是排隊了,」先來後到」 First come first service ,以及Queue這個單詞就有排隊的意思。還有,好比咱們的播放器上的播放列表,咱們的數據流對象,異步的數據傳輸結構(文件IO,管道通信,套接字等)
進程通知CPU線性地址,CPU要查詢內核中的task struck的內存映射(Page Table)並找到物理地址。
Page Table: 頁表。多級映射(一級目錄,二級目錄,三級目錄,相似ext3),映射連續地址空間與物理地址空間. 使用目錄項來作映射. 每個對應關係稱爲一個頁表項, page table entry.
CPU中的MMU組件就是用來完成頁表映射的。上下文切換的時候MMU中的內容也要進行切換.
TLB: CPU與MMU之間存在緩存,CPU先查緩存,沒有結果再去查找MMU-
Translate Lookback Buffer,轉換後援緩存器,用於緩存頁表的查詢結果
64位地址的MMU轉換方式是相反的, 物理地址轉換成虛擬地址.
爲了實現虛擬化, 早先的地址映射都是由CPU映射到HOST的地址, 而後才能映射到真是的物理地址. 通過兩次映射. 如今的CPU都有兩個MMU, shadow page table, 影子頁表.
isolcpus=0,1隔離CPU
若是進行swap的時候, maps映射表將會發生變化. CPU會發生缺頁異常. swap回內存時, 會使用新的內存區域.
Major Exception: 大異常, 當內存數據找不到時, 須要從交換空間換回時, 咱們就稱之爲大異常.
Minor Exception: 小異常, 當發生缺頁異常的時候, 無需從硬盤上重新查找, 只須要在內存上重定向就能夠找到的場景. 好比共享庫.
內存常駐內存集: RSS, 只能在內存中存儲, 指令, 靜態變量. 數據,好比打開的文件能夠交換出內存.
乾淨頁面: 在內存中沒有被修改過的頁面. 修改過的頁面, 都會被同步到磁盤中, 叫作髒頁同步.
7200轉的硬盤, 每秒鐘一百次隨機I/O就已經很是不錯了, 固態硬盤是寫,300-400, 讀 500-600
因爲機械臂只有一個, 因此磁盤I/O必然是串行的. I/O數量過多, 會產生阻塞, 致使CPU產生等待.
PCI-E的特定設計過的固態硬盤, 每秒鐘能夠達到數十萬個.
cache: 讀取, 命中或者未命中
buffer: 寫, 如今內存中寫, 再寫入磁盤中
內核守護線程: ps指令加中括號的指令. 其優先級較高.
進程優先級: 1-99 數字越大優先級越高, 100-139. 一共一百四十個. 0-139.
實時進程: 內核中執行某些後臺的關鍵性的守護線程, 其優先級較高. 通常進程分到的時間片是5ms, 不論進程是否執行完成, 都要切到其餘進程中.然而, 實時進程不是這麼調度的. 實時進程在執行時, 只要其未執行完畢, 則不會進行進程切換, 除非有優先級更高的進程要執行.
普通進程都是按照時間片進行分配的.
內核進行動態優先級決策.
CPU的調度隊列: 每一個優先級都有一個隊列. 共有140個隊列. CPU時間片分配大體是這樣的, 按照隊列的優先級從高低依次掃描, 找到待執行進程並取出執行.
進程調度策略:
CFS: completely fair schedular 徹底公平調度器,
調度實時進程和調度用戶進程的調度方法是不同的, 實時進程是按照先進先出, 或者是輪流的方法(RR)
用戶進程使用的調度算法通常是CFS, 會對佔用CPU時長過多的進程進行懲罰.
網絡I/O. 使用特殊內存數據結構來維持每個鏈接.
後援隊列: 當進程註冊的內存的緩衝區滿了, 內核會在其內存空間將新的請求接進來, 等以後再決定如何處理.
tcp鏈接重用機制
sar, 淘寶tsar. htop, dstat, glances, vmstat, netperf, iftop
重量級: systemtap, oprofile, perf, valgrind(內存級別的性能分析公爵)(開發級別的工具)
systemtap: 是一個跟蹤和探測工具, 可讓用戶監控並分析操做系統活動(特別是內核活動)的細節, 它提供相似netstat, top, ps 和iostat等工具的輸出結果, 但包含爲所收集信息的額外過濾和分析選項.
CPU掩碼, 最高位對應最後一個邏輯CPU. 0x00000001表明處理器0, 0x00000003表明處理器0和1.
taskset -p mask pid taskset -c 0,5,7 -- program taskset -pc 2 2480 taskset -c 1,2 nginx
taskset能夠控制CPU的親原型, 可是在numa架構下, 也很難保證, CPU所訪問的數據是在其對應的內存空間的.
/sys/devices/system/cpu目錄中包含有關係統CPU是如何鏈接的信息.
/sys 目錄下通常保存跟硬件驅動相關的信息
/proc 內核運行屬性相關
numactl --show --hardware --membind 只從指定節點分配內存.
兩三萬的服務器都不支持numa體系結構, 多個物理CPU, 並有多個內存控制器
實時策略
SCHED_FIFO: 靜態優先級調度, 根據程序優先權順序掃描SCHED_FIFO線程列表. 這個線程會運行到它阻斷,推出或者被更高的線程槍戰準備運行的時候. 其優先級高於非實時線程
SCHED_RR:論調的調度. 有相同優先級的線程使用特定仲裁或者時間片以輪詢的方式進行調度.
chrt 修改實時優先級屬性, 默認是用RR
chrt [options] <policy> <priority> {<pid> | <command> [<arg> ...]} chrt -f 3 service nginx start
通常調度策略
SCHED_OTHER: 默認調度策略, 該策略使用徹底公平調度程序(CFS). CFS創建了動態優先權列表, 部分是根據每一個進程線程的niceness值.
SCHED_IDLE: 首先用於低優先權任務, 優先級很是低的任務.
SCHED_BATCH: 也是用於低優先權任務.
/proc/interrupts
IRQ是用於服務的請求, 在硬件層發出, 可以使用專用硬件線路或跨硬件總線的信息數據包(消息信號中斷, MSI)發出中斷.
啓用中斷後, 接受IRQ後會提示切換到中斷上下文. 內核中斷調度代碼會搜索IRQ號碼及其關聯的註冊中斷服務路由(ISR)列表, 並按順序調用ISR.
man 5 proc
中斷親原性
grep eth0 /proc/interrupts cat /proc/irq/19/smp_affinity 00000000,00000000,00000000,00000008
TLB: 轉義後援緩衝器, CPU緩存級別. 條目很是的少
MMU是分級的, 相似於目錄結構, 便於遍歷.
對於吃內存的進程, 一般使用大內存頁的方式. 超大頁面必須在引導時分配, 而且他們很難手動管理.
THP: 透明大頁面, 自動建立, 管理和使用超大頁面.
Varnish跟THP不兼容.
容量調節
位於/proc/sys/vm/
overcommit_memory: 規定決定是否接受超大內存的請求, 是否能夠超出物理內存的大小. OOM kill: Out Of Memory. 壞蛋評分, 內核決定. 優先kill壞蛋評分高的.
0 . 默認設置, 內核執行啓發式內存過量使用處理. 計算方式通常是, 物理內存加交換內存.
1 . 無內存過量使用處理. 使用這個設置會增大內存超載的可能性
2 . 內存拒絕等於或者大於總可用swap大小及overcommit_ratio指定的物理RAM比例的內存請求.
eg. 4G物理內存+4G交換內存. swap + memory* overcommit_ratio, 此處最多可使用6G內存
比較理想, 可是若是有4G物理內存, 8G交換內存. 則, 此處可使用8G內存, 顯然並非合理.
max_map_count: 規定某個進程可能使用的最大內存映射區域. 默認爲65530, 映射文件數. Mmap, 將磁盤的文件直接映射到內存地址空間, 像使用內存同樣使用磁盤上的數據.減小I/O, 從磁盤copy文件到內存的時間.
nr_hugepages: 規定在內核中配置的超大頁數. 默認爲0. 只有當系統中有足夠的連續可用頁時, 方可分配超大頁.
sysctl -w vm.nr_hugepages=20
MySQL的配置變量中能夠設置容許使用大內存頁.
清楚緩存和緩衝
清buffer sync 清cache echo 1 >/proc/sys/vm/drop_caches
容量相關可調參數, 位於/proc/sys/kernel/目錄中
msgmax: 以字節爲單位規定信息隊列中任意信息的最大容許大小. 這個值必定不能超過該隊列的大小(msgmnb), 默認爲65536
msgnmb: 信息隊列的最大值. 默認是65535
msgmni: 規定信息隊列識別符的最大數量. 64位 爲1985, 32位爲1736
shmall: 以字節爲單位規定一次在系統中可使用的共享內存總量. 64位 4294967296; 32位 268435456
shmmax: 以字節爲單位規定內核可容許的最大共享內存片斷. 64位68719476736, 32位4294967295
shmmi: 規定系統範圍內最大共享內存片斷. 默認爲4096
threads-max: 規定內核使用的最大線程. max_threads = mempages/(8*Thread_size/Page_Size)
文件系統相關參數, 位於/proc/sys/fs/目錄
aio-max-nr: 規定在全部活動異步I/O上下文中可容許的最多事件數.
file-max: 列出內核分配的文件句柄最大值. (mempages*(Page_size/1024))/10或者NR_FILE
Out-of-Memory Kill 可調參數:
若是將/proc/sys/vm/panic_on_oom參數設定爲0, 會讓內核在出現OOM時調用oom_killer功能.
oom_adj: 定義-16到15之間的一個數值以便幫助決定某個進程的oom_score. oom_score值越高, 被oom_killer殺死的進程數就會越多.
位於/proc/sys/vm/下
zoned buddy allocator: 防止內存外碎片, 將大量的離散內存合併成連續的內存.
/proc/buddyinfo
slab allocator: 小內存空間的分配. 有固定個數. 防止內存內碎片
/proc/slabinfo
16M DMA使用 --> 896M 內核使用 --> 預留區域
zoneDMA zoneNormal 大於1G的地址空間, 經過映射的方式訪問(zone high memory)
PAE: 物理地址擴展(Physical Address Extension) 多了四根線, 可尋址範圍爲64G
64位系統: DMA能夠尋址1G的空間, 剩餘空間爲normal段
swappiness: 控制系統swap的程序. 高數值可優先系統性能, 在進程不活躍時,主動將其轉出物理內存. 低數值可優先互動性儘可能避免將進程轉換出物理內存. 表明一種傾向性, 默認值爲60
dirty_ratio: 規定百分比值, 當髒數據組成達到系統內存總數的百分比值後開始寫髒數據(pdflush), 默認爲20(單個進程)
dirty_backgroud_ratio: 當髒數據組成達到系統內存總數的百分比後,開始在後端寫下髒數據(pdflush), 默認爲百分之10. (系統級別)
vm.dirty_expire_centisescs: pdflush守護進程被喚醒刷寫數據的時間
vm.dirty_writeback_centisecs: 一個數據成爲髒數據多久之後被刷寫到磁盤.
刷寫髒頁的方法
1 . sync
2 . fsync system call
3 . echo s > /proc/sysrq-trigger
drop_caches: 讓內存放棄各類緩存頁和slab緩存的各類組合
1 . 系統釋放全部頁緩衝內存. 能夠理解爲free指令中顯示的cache
2 . 系統全部未使用的slab緩衝內存. 能夠理解爲free指令中顯示的buffer
3 . 系統釋放全部也緩存和slab緩衝內存.
Barriers: 寫入barrier是保證在永久存儲中正確寫入並排列文件系統元數據的內核機制. 即便在存儲設備會常常斷電的狀況下也不例外. 只對非回寫的機制有意義.
掛載文件系統時, 可提高文件系統性能:
nobarrier: barrier一般只對write back機制有意義
noatime: noatime包含nodiratime
nodiratime:
EXT4: 支持到最大文件系統爲16TB, 單一最大文件爲16TB
XFS: 另外一種可伸縮性文件系統, 沒有文件大小的限制. 性能自己也很是不錯
Socket buffer: 1. tcp_rmem 2. tcp wmem
網絡接收器路徑圖表
NIC hardware buffer --> hard IRQ --> soft IRQ --> app socket queue <--- application
網絡優化參數:
net.ipv4.tcp_max_tw_buckets: timewait的數量, 默認爲8192
net.ip4.ip_local_port_range = 1024 65000: 容許系統打開的端口玩味, 前者爲下面, 後面的數字爲上限: 默認爲32768 61000; 此範圍決定了最後timewait狀態的鏈接的數量, 下面的兩項可有效下降tw狀態鏈接的數量. (前端代理服務器通常應該修改)
net.ipv4.tcp_tw_recycle = {0|1}: 是否啓用timewait快速回收, 注意, 開啓此功能在NAT環境下可能會出現嚴重的問題, 由於TCP有一種行爲, 它能夠緩存每一個鏈接最新的時間戳, 後續請求中若是時間戳小於緩存中的時間戳, 即被視爲無效並丟棄響應的請求報文.
net.ipv4.tcp_tw_reuse = {0|1}: 是否啓用tw重用, 便是否容許將TIME-WAIT sockets用戶新的TCP鏈接
net.ipv4.tcp_syncookies = {0|1}: 是否開啓SYN Cookies, 即當SYN等待隊列溢出時, 是否啓用cookies功能.
net.ipv4.tcp_timestamps = 0 tcp報文時間戳, 關閉時能夠避免序列號的卷繞. 緣由是當tcp_tw_recycle/tcp_timestamps都開啓的條件下, 60s(timewait)時間內, 同一源ip的主機socket connect請求中的timestamp必須是遞減的.
net.ipv4.tcp_max_syn_backlog = 262144: 保存的那些還沒有收到客戶端確認信息的鏈接請求的最大值: 默認爲128, 能夠增大此值.
net.ipv4.tcp_synack_retries = #: 爲了打開對端的鏈接, 內核須要發送一個SYN並附帶一個迴應前面一個SYN的ACK, 這也即所謂三次握手中的第二次; 這個設置決定了內核放棄鏈接以前SYN+ACK的數量, 繁忙的服務器上建議設置爲0或者1;
net.ipv4.tcp_syn_retries = #: 在內核放棄創建鏈接以前發送SYN包的數量, 繁忙的服務器應該設置爲0或1.
net.ipv4.tcp_max_orphans = 262144: 系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上, 若是超過這個數字, 孤兒鏈接將即刻被複位並打印出警告信息, 這個限制僅僅是爲了防止簡單的Dos攻擊, 不能過度依靠它或者認爲的減小這個值, 若是須要修改, 在確保有足弓內存可用的前提下, 應該增大此值.
net.ipv4.tcp_fin_timeout = 5: 若是套接字由本段要求關閉, 這個參數決定了它保持在FIN-WAIT-2狀態的時間, 缺省值爲60秒. 然而, 對端可能會出錯或者意外宕機並永遠不關閉鏈接. 即便你的機器是一個輕載的WEB服務器, 也有由於大量的死套接字而內存溢出的風險, FIN-WAIT-2的危險性比FIN-WAI-1要小, 由於每一個鏈接最多隻能消耗1.5k內存, 可是他們的生存期長些.
tcp.ipv4.tcp_keepalive_time = 30:當keepalive啓用的時候, TCP發送keepalive消息的額度, 默認爲2小時(7200).
net.core.rmem_max=8388608: 定義內核用於全部類型的鏈接的最大接受緩衝大小.
net.core.rmem_default=65536: 定義內核用於全部類型的鏈接的默認接收緩衝大小.
net.core.wmem_max=8388608: 定義內核用於全部類型的鏈接的最大發送緩衝大小
net.core.wmem_default=65536: 定義內核用於全部類型的鏈接的默認發送緩存大小
net.ipv4.tcp_mem='8388608 8388608 8388608' 定義TCP協議棧使用的內存空間, 分別爲最小值, 默認值和最大值
net.ipv4.tcp_rmem='4096 87380 8388608': 定義TCP協議棧用於接收換種的內存空間: 第一個值爲最小值, 即使當前主機內存空間吃緊, 也得保證TCP協議棧至少有此大小的空間可用, 第二個值爲默認值, 他會覆蓋net.core.rmem_default中爲全部協議定義的接收緩衝的大小, 第三值爲最大值, 即能用於TCP接收緩衝的最大內存空間.
net.ipv4.tcp_wmem='4096 65536 8388608'
CFQ嘗試根據啓動I/O的進程決定公平的I/O調度. 可提供三個不一樣的調度等級: 實時(RT), 最佳效果(BE)和閒置. 可使用ionice命令手動分配調度等級.
在最新的內核版本和發行版中,都選擇CFQ作爲默認的I/O調度器,對於通用的服務器也是最好的選擇.
CFQ賦予I/O請求一個優先級,而I/O優先級請求獨立於進程優先級,高優先級進程的讀寫不能自動地繼承高的I/O優先級.
CFQ爲每一個進程/線程單首創建一個隊列來管理該進程所產生的請求,也就是說每一個進程一個隊列,各隊列之間的調度使用時間片來調度,以此來保證每一個進程都能被很好的分配到I/O帶寬.I/O調度器每次執行一個進程的4次請求.
只有CFQ調度算法可使用ionice更改類型和優先級
有八個調度等級, 0表明最高優先級, 7表明最低優先級. 默認等級爲4.
eg. 採用cfg的實時調度, 優先級爲7
ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
採用缺省的磁盤I/O調度, 優先級爲3
ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
採用空閒的磁盤調度, 優先級爲0
ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
ionice的三種調度方法,實時調度最高,其次是缺省的I/O調度,最後是空閒的磁盤調度.
/sys/block/sda/queue/scheduler 調度器
noop: 電梯調度算法. NOOP實現了一個FIFO隊列,它像電梯的工做主法同樣對I/O請求進行組織,當有一個新的請求到來時,它將請求合併到最近的請求以後,以此來保證請求同一介質. NOOP傾向餓死讀而利於寫. 內核2.4以前的惟一算法
電梯算法餓死讀請求的解釋:由於寫請求比讀請求更容易.
寫請求經過文件系統cache,不須要等一次寫完成,就能夠開始下一次寫操做,寫請求經過合併,堆積到I/O隊列中.
讀請求須要等到它前面全部的讀操做完成,才能進行下一次讀操做.在讀操做之間有幾毫秒時間,而寫請求在這之間就到來,餓死了後面的讀請求.
deadline: 會優先響應到期的I/O請求, 讀的響應時間一般較短.
經過時間以及硬盤區域進行分類,這個分類和合並要求相似於noop的調度程序.
Deadline確保了在一個截止時間內服務請求,這個截止時間是可調整的,而默認讀期限短於寫期限.這樣就防止了寫操做由於不能被讀取而餓死的現象.
Deadline對數據庫環境(ORACLE RAC,MYSQL等)是最好的選擇.
RAID芯片也可能有本身的調度算法
永久修改I/O調度
修改內核引導參數,加入elevator=調度程序名
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
查看統計數據
ethtool -S ethx
dstat
iostat
sar
tsar
也能夠監測流量
iostat
iftop
監測流量
lsof
glances
能夠工做在C/S模式下
server端
glances -s -B 192.168.48.130
client端
glances -c 192.168.48.130
若是安裝了 python-jinja2
能夠glances -o HTML -f /var/www/html
可使用瀏覽器訪問: http://ip/glances.html
起始於上個世紀70年代的IBM公司.
PC機的出現, 使虛擬化技術變得不那麼重要.
CPU自己就是被抽象成時間片了, 這就是CPU虛擬化的基礎.
Host: 宿主機
Guest: 虛擬機
模擬實現
虛擬機CPU是軟件模擬,純軟件實現,特權指令是向host請求。
BT技術:Binary Translation 二進制翻譯技術。運行時翻譯,大大的提升了性能 (vmware)
BT技術的前提就是虛擬架構與底層物理架構相同. 使用這種方式的轉換時, 虛擬機的用戶空間運行在Ring3, 虛擬機的內核空間運行在Ring1, 宿主機的內核空間運行在Ring0
模擬:emulation,軟件模擬。模擬ring 0~3
虛擬:virtulization 架構要相同,僅僅須要模擬ring0
徹底虛擬化,宿主機徹底虛擬出來一個虛擬平臺,guest自己並不清楚本身是虛擬化出來的。
HVM: Hardware assistant Virtualization Machine
讓CPU具備了五個環,多了一個-1環。虛擬機運行在環-1,環-1是虛擬機的根環
ring -1是特權指令環。
Host運行在ring -1上,虛擬機的內核運行在ring 0上
ring -1 能夠捕獲ring 0上的指令。
這種虛擬化技術能夠達到硬件性能的百分之八十五以上
各guest的內核明確知道本身運行在虛擬化環境中, 他會向宿主機內核發起調用.
vm monitor = hypervisor 虛擬機監視器
hypervisor直接管理硬件(CPU和內存,通常不包括I/O),至關於內核
hyper call: 直接調用而非翻譯
虛擬機的內核要被修改,讓其內核知道此種調用機制。
這種虛擬化能夠達到硬件性能的百分之九十以上
兩次地址空間轉換, 第一次轉換成內核的虛擬拿到的連續的地址空間, 第二次從內核的虛擬空間轉換至實際的物理地址空間(第二次轉換是軟件模擬)
進程:線性地址空間
內核:物理地址空間
Hypervisor: 虛擬連續地址空間轉換成物理地址空間。Shadow page table, 影子列表的方式(一種模擬方式)。TLB難以命中,物理地址不重疊,爲防止混淆,每次guest切換時,將會清空TLB緩存。
因而乎:
虛擬MMU
Intel:EPT, extend page table 擴展的頁表技術
AMD: NTP, Nested Page Table 嵌套的頁表技術
GVA: 虛擬機的虛擬地址
GPA: 虛擬機的物理地址
HPA: 宿主機的物理地址
GVA經過MMU虛擬化直接向Hypervisor轉換成HPA, 須要硬件支持.
TLB 虛擬化
tagged TLB技術
打標籤GVA到HPA的標記內容
外存:硬盤,光盤,軟盤,u盤
網絡設備:網卡
顯示設備:VGA frame buffer機制
鍵盤鼠標:ps/2, usb
I/O虛擬化的方式:
IO Stack: 多個虛擬機將I/O排隊
鍵盤和鼠標都是使用焦點捕獲的方式, 將模擬設備和物理設備關聯的方式
IOMMU, IO內存管理單元. 硬件要支持IO透傳技術例如intel的VT-d
Intel: VT-d 基於北橋芯片的硬件輔助虛擬化技術,提升I/O可靠性,靈活性以及性能的。
DMA對傳統的x86架構而言是集中式的, 讓多個虛擬機直接使用某塊網卡時, 會產生混淆.
IO中斷: 可編程控制器, DMA.
DMA自己直接訪問虛擬機的連續內存空間(GPA), 中間也要通過屢次轉換. 而且要考慮緩衝的問題. 實現機制很是複雜
Type-II型:操做系統基礎上安裝虛擬化軟件再建立各類主機
Type-I型:基於Hypervisor
Xen,vmware ESX/ESXI 屬於Type-I型
VMware workstation/virtualbox/KVM 屬於Type-II型
Intel硬件輔助虛擬化
第一類:跟處理器相關:vt-x
第二類:跟芯片相關:vt-d
第三類:跟I/O相關,VMDq和SR-IOV
模擬器PearPC, Bochs, QEMU
徹底虛擬化:VMware Worksation, VMware Server, Parallels Desktop, KVM, Xen(HVM環境中)
半虛擬化:Hyper call ABI. 虛擬機的內核通過修改。xen, uml (user-mode linux)
OS級別的虛擬化:OpenVZ, lxc. Solaris Containers. FreeBSD jails
庫虛擬化:wine,
應用程序虛擬化:jvm
SDN:software defined network
Bridge方式:原物理網卡被作成交換機,而後模擬一個bridge設備出來。至關於兩臺交換機,一臺虛擬出來的. 網卡工做在混雜模式, 不管是否是本機的IP都進行轉發.
host-only: 僅主機模式,須要使用路由
NAT mode: 隱藏虛擬機.
TUN與TAP
在計算機網絡中, TUN與TAP是操做系統內核中的虛擬網絡設備, 不一樣於普通硬件網絡板卡實現的設備, 這些虛擬的網絡設備所有用軟件實現, 並向運行於操做系統的軟件提供與硬件的網絡設備徹底相同的功能.
TAP等同於一個以太網設備, 它操做第二層數據包如以太網數據幀. TUN模擬了網絡設備, 操做第三層數據包好比IP數據封包.
操做系統經過TUN/TAP設備向綁定改設備的用戶空間的程序發送數據, 反之, 用戶空間的程序也能夠像操做硬件網絡設備那樣, 經過TUN/TAP設備發送數據. 在後者狀況下, TUN/TAP設備向操做系統的網絡棧投遞數據包, 從而模擬從外部接受數據的過程.
通常虛擬機不提供橋接模式,須要本身配置
爲了作橋接模式的配置,應當關閉NetworkManager(network manager 不支持)
真正的橋功能是經過內核的TAP/TUN實現的. bridge-utils只是修改工具
yum install bridge-utils Device=br0 TYPE=Bridge NM_CONTROLLED=no
修改原eth0網卡
BRIDGE=br0
查看網橋狀態
brctl show
使用brctl的配置過程:
brctl addbr br0 brctl stp br0 on ifconfig eth0 0 up brctl addif br0 eth0 ifconfig br0 IP/NETMASK up route add default gw GW
Ian Pratt, Keir Fraser. 兩人研發.
Xen直接跑在硬件上. 須要預裝Xen Hypervisor
核心問題是如何驅動各類I/O設備
Xen Hypervisor 自己只能虛擬化CPU,MMU進行管理
Domain是Xen虛擬機單元, domain是從0開始編號.
Dom0是第一臺虛擬機,又稱特權域. 能夠直接使用硬件的驅動.
Dom0提供Xen console, 而且給DomU提供I/O各類驅動
DomU對於I/O設備的使用,僅僅是前端。
Dom0的內核必須作修改,能夠直接調用Hyper Call. DomU也須要直接調用Hyper Call. 進程管理和內存使用, 以及中斷部分都須要修改內核.
2.6.37以後的kernel代碼已經直接整合全部Dom0所須要的功能
2.6.24+: DomU的內核部分已經被直接整合進內核中
Linux 3.0+ 以後對Xen作了專門的優化
CPU/Memory/中斷經過Hypervisor, 可是對I/O的調用須要經過Dom0
4.2 以後版本使用XL
4.1 以前的版本使用XM,啓用xm工具必須啓動xend進程
目前Xen已經到4.4版本了
半虛擬化: grep -E ‘pae’ /proc/cpuinfo
全虛擬化: grep -E ‘svm|vmx’ /proc/cpuinfo
xen hypervisor
Xenserver:
citrix收購
使用XE/XAPI管理組件
XCP: Xen Cloud Platform
工具棧:xm/xend, xl, xapi/xe
通用工具棧:libvirt vrish/libvirtd, virtmanager(紅帽開發)
wiki.xenproject.org
GlusterFS
centos在xen4.2開始支持使用xen.
紅帽早在RHEL5就提供的xen的從新編譯的內核, 2008年紅帽收購了KVM. RHEL5.6 嘗試引入KVM, 5.8 的時候開始取代Xen. 從RHEL6開始, 再也不支持Xen. 此時的Redhat能夠運行在domU上.
安裝鏡像http://vault.centos.org/6.7/xen4/x86_64/
http://mirrors.163.com/centos/6.8/virt/x86_64/xen-44/
#boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (3.7.4-1.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin module /vmlinuz-3.7.4-1.el6xen.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet module /initramfs-3.7.4-1.el6xen.x86_64.img title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img
Avaya的dom0使用Xen 4.1
若是要使用xm,要確保xend服務啓動
xm info xl info
Dom0的ID永遠爲0
r: 運行狀態
b: I/O阻塞狀態
p: 暫停(暫停在內存中,資源不釋放)
s: 中止
c: 崩潰. crashed
d: dying,當前域開始關機
Time(s):佔據CPU並使用於運行時間的時長
Destory: 關閉電源
Delete:刪除虛擬機
create: 建立虛擬機 -c 表示打開控制檯
destory: 關閉虛擬機電源
new: 添加到xend domain
delete: 刪除
start: 開機一個域
shutdown: shutdown -h now
vcpu-list: 各虛擬機虛擬CPU狀態
前提
DOMU內核借用DOM0內核
磁盤建立
建立稀疏格式的磁盤
dd if=/dev/zero of=centos6.img bs=1M oflag=direct seek=1023 count=1 dd if=/dev/zero of=/xen/vm/test.img oflag=direct count=120000 bs=1M count=1 seek=119999
1023直接被跳過
mount -o loop centos6.img /mnt cd /mnt;mkdir -pv etc/{init,rc.d} bin sbin lib64 dev proc sys tmp var home root
Kernel:內核
ramdisk: initramfs或initrd文件
name: 域名稱
memory:內存大小
disk: 磁盤設備文件列表,格式disk = ["disk1","disk2",]。
每一個disk都由三個參數來定義
「Backend-dev": 有兩種類型,物理設備,虛擬磁盤映像文件,格式分別爲:
Frontend-dev: 定義其在DomU中的設備類型;虛擬磁盤映像文件對應的設備文件名一般爲xvd[a-z],tr一般只能模擬IDE插槽,並不能模擬scssi設備
mode: 訪問權限模型:r,w
vcpus: 虛擬CPU的個數,默認爲1
root: 根文件系統路徑, 指所在的設備
extra: 傳遞給內核的額外參數, selinux=0
on_reboot: 執行xm reboot命令時的操做,有destory和restart
on_crash: 有destory, restart,preserve(保存系統崩潰時的映像信息)
on_shutdown:
vif = ['ip=172.16.100.11',bridge=br0']
bootloader: 引導器文件的路徑,通常指PyGrub的路徑:
cpu: 指定在某顆物理CPU上啓動
cpus: 指定當前域的VCPU能夠在那些物理CPU上運行
research一下爲什麼沒法啓動此操做系統
kernel = "/tmp/vmlinuz" ramdisk = "/tmp/initramfs" memory = 512 name = "centos6_vm" vcpus = 2 disk = [ 'file:/xen/vm1/test.img,xvda,w' ] root = "/dev/xvda2 ro" extra = "3 selinux=0"
查找最小的未被使用的loop設備
losetup -f
使用鏡像文件跟loop設備作關聯
losetup /dev/loop0 /xen/vm1/test.img
而後就能夠對loop0進行分區
fdisk /dev/loop0 kpartx -av /xen/vm1/test.img
隨後磁盤映射文件會在/dev/mapper中顯示
光盤安裝使用的是isolinux下引導
將isolinux下的vmlinuz以及initrd.img文件cp出來
而後在虛擬機配置中設定kernel以及initrd
在安裝完成以後,將kernel以及initrd內容取消,而後添加bootloader = /usr/bin/pygrub
#ramdisk="/boot/initramfs-2.6.32-358.el6.x86_64.img" #kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64" name="linux" vcpus=1 memory=128 disk=['file:/xen/vm2/dom2.img,xvda,w',] bootloader="/usr/bin/pygrub" #root="/dev/xvda2 ro" #extra="selinux=0 init=/sbin/init" vif=[ 'bridge=br0' ] on_crash="destroy" on_reboot="restart"
安裝時要添加kernel 和 initrd
reset
重置窗口大小
yum install centos-release-xen -y yum install xen -y yum update -y
pv:
啓動一個虛擬機實例,內核和initramfs文件能夠放置在Dom0,也可由本身的文件系統提供
第一種:配置文件,由xm/xl等管理工具來提供的引導過程
kernel = ramdisk = root = extra =
第二種:須要一個bootloader,pygrub
bootloader =
xm基於某過程引導安裝過程:
isolinux:
vmlinuz
initrd.img
note:通常在半虛擬化的環境中,通常使用url方式來安裝
在PV模式中運行guest系統,須要知足幾個基本前提。
◇ 能運行於Xen DomU的(Xen-enabled)內核:Liunx 2.6.24及之後的內核已經添加了對Xen DomU的支持,所以,只要在內核編譯時啓用了相應的功能就能知足此要求,目前多數Linux發行版的內核都已經支持此特性;而此前的版本須要內核在編譯前手動打補丁方可;
◇ 根文件系統(Root Filesystem):包含了應用程序、系統組件及配置文件等運行DomU的各類所須要文件的文件系統,其不用非得包含內核及對應的ramdisk,後面的這些組件放在Dom0中便可;事實上,用於DomU的內核文件必需要可以容許Dom0訪問到,由於其運行時須要與Xen Hypervisor通訊,所以,這些內核組件能夠位於Dom0可以訪問到的任何文件系統上;然而,目前基於pygrub(可用於Dom0跟非特權域磁盤映像中的內核通訊),此內核文件也能夠直接放置於非特權域的磁盤映像中;
◇ DomU內核所須要的內核模塊:內核模塊是內核的重要組成部分,它們通常存儲於根文件系統;
◇ ramdisk或者ramfs:這個根據實際須要是個可選組件,若是在內核初始化過程當中不須要依賴於此來裝載額外的驅動程序以訪問根文件系統則也能夠不用提供;
◇ swap設備:交換分區可以讓Linux運行比僅有物理內存時更多的進程,所以,提供此組件是常見的作法;固然,它是可選的;
◇ DomU配置文件:集中在一塊兒指定前述各組件的配置信息,以及定義其它有關PV DomU的基本屬性的文件;其一般包含全部用於當前DomU屬性配置參數,包括爲其指定磁盤映像和內核文件的位置(或pygrub的位置)等,以及其它許多屬性如當前DomU能夠訪問的設備等,這些設備包括網絡設備、硬盤、顯卡及其它PCI設備;同時,配置文件中也能夠指定新建立的非特權域可使用的物理內存大小及虛擬CPU個數等等;
這裏須要提醒的是,若是計劃爲PV DomU編譯內核,須要以與傳統方式不一樣的方式放置內核及其模塊。前面也已經提到,內核通常會放在Dom0的某路徑下,而內核模塊則須要放在DomU的根文件系統上。
PV DomU的根文件系統能夠以多種不一樣的方式進行安置,好比:
◇ 虛擬磁盤映像文件
◇ Dom0沒有使用的額外物理磁盤分區
◇ Dom0沒有使用的邏輯卷
◇ 塊級別網絡文件系統,如iSCSI設備
◇ 網絡文件系統,如NFS
vfb:vnc或sd1,是一種c/s架構
安裝vnc server
yum install tigervnc-server
啓動vnc server
vncserver :1
VNC協議是明文的, 並不安全
vfb=[ 'vnc=1,vnclisten=0.0.0.0' ] 直接使用當前窗口打開另外一個窗口 vfb=[ 'vnc1,sdl=1']
幀緩衝:提供圖形化界面
查看某種format的格式選項
qemu-img create -f qcow2 -o ? /xen/vm/test.img qemu-img create -f qcow2 -o size=120G,preallocation=metadata /xen/vm/centos.qcow2
raw: the raw format is a plain binary image of the disc image, and is very portable.
追加磁盤大小
dd if=/dev/zero of=zeros.raw bs=1024k count=4096 cat foresight.img zeros.raw > new-foresight.img
cow: copy on write
qcow: 同cow都是歷史的棄嬰
qcow2: QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots.
性能接近raw, 支持快照, 支持AES加密, 支持zlib磁盤壓縮等
vmdk: vmware支持的虛擬化鏡像格式. OVF的同一封包. 性能和功能上來講vmdk都是目前比較出色的.
virsh
virt-viewer: python開發, 顯示工具
virt-manager: python開發, 圖形化配置文件
virt-install: 自動建立映像文件, 命令行工具
Redhat在RHEL6中有意的將libvirt對xen的支持的部分沒有編譯
service libvirt strat以後, 會自動建立一個virbr0的虛擬網橋
virt-install -n "centos6.7" -r 512 --vcpus=2 =l http://192.168.48.130/cobbler/ks_mirror/centos-6.7-x86_64 -disk path=/xem/vm/test.img --network bridge=br0 --force
xm block-attach centos6 file:/xen/vm1/test.qcow2 xvdb w
掛起虛擬機
xm save centos /tmp/centos.save
恢復虛擬機
xm restore /tmp/centos.save
暫停在內存中
xm pause/unpause
若是虛擬機被xend徹底管理, 則可使用suspend/resume
grep xend-relocation /etc/xen/xend-config.sxp |grep -v '#'
(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address '')
(xend-relocation-hosts-allow '')
xm migrate [domu]
KVM: Kernel-based Virutal Machine
Popek, Globerg.提出了經典虛擬化的三個條件
1 . 等價執行
2 . 性能良好
3 . 安全隔離
以色列Qumranet公司 2008年之後被Redhat收購
KVM僅僅是kernel上的一個模塊
相似寄存的方式, 將內核變成hypervisor.
I/O 經過qemu來模擬實現
note: KVM要求硬件必須支持HVM
加載KVM模塊
modprobe kvm modprobe kvm-intel
qemu-kvm 專用於結合kvm使用的管理工具
模式: 內核模式, 用戶模式, 來賓模式
來賓模式: guest mode, 虛擬機上的用戶空間.
vCPU是經過線程來模擬實現CPU
KVM組件:
核心組件: /dev/kvm. 管理虛擬機的設備節點. 用戶控件的程序可經過isctl()系統調用來對虛擬機的建立啓動等管理工做. 1. 爲虛擬機分配內存; 2 . 讀, 寫VCPU的寄存器. 3 .向vCPU注入中斷; 4 . 運行vCPU;
qemu組件: qemu進程, 工做於用戶空間的組件, 用於仿真PC機的I/O類硬件設備.
KVM必須使用HVM
egrep -i "vmx|svm" /proc/cpuinfo
qemu-kvm的標準選項涉及指定主機類型, CPU模式, NUMA, 軟驅設備, 光驅設備以及硬件設備
◇ -name name:設定虛擬機名稱; ◇ -M machine:指定要模擬的主機類型,如Standard PC、ISA-only PC或Intel-Mac等,可使用「qemu-kvm -M ?」獲取所支持的全部類型; ◇ -m megs:設定虛擬機的RAM大小; ◇ -cpu model:設定CPU模型,如coreduo、qemu64等,可使用「qemu-kvm -cpu ?」獲取所支持的全部模型; ◇ -smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:設定模擬的SMP架構中CPU的個數等、每一個CPU的核心數及CPU的socket數目等;PC機上最多能夠模擬255顆CPU;maxcpus用於指定熱插入的CPU個數上限; ◇ -numa opts:指定模擬多節點的numa設備; ◇ -fda file ◇ -fdb file:使用指定文件(file)做爲軟盤鏡像,file爲/dev/fd0表示使用物理軟驅; ◇ -hda file ◇ -hdb file ◇ -hdc file ◇ -hdd file:使用指定file做爲硬盤鏡像; ◇ -cdrom file:使用指定file做爲CD-ROM鏡像,須要注意的是-cdrom和-hdc不能同時使用;將file指定爲/dev/cdrom能夠直接使用物理光驅; ◇ -drive option[,option[,option[,...]]]:定義一個新的硬盤設備;可用子選項有不少。 file=/path/to/somefile:硬件映像文件路徑; if=interface:指定硬盤設備所鏈接的接口類型,即控制器類型,如ide、scsi、sd、mtd、floppy、pflash及virtio等; index=index:設定同一種控制器類型中不一樣設備的索引號,即標識號; media=media:定義介質類型爲硬盤(disk)仍是光盤(cdrom); snapshot=snapshot:指定當前硬盤設備是否支持快照功能:on或off; cache=cache:定義如何使用物理機緩存來訪問塊數據,其可用值有none、writeback、unsafe和writethrough四個; format=format:指定映像文件的格式,具體格式可參見qemu-img命令; ◇ -boot [order=drives][,once=drives][,menu=on|off]:定義啓動設備的引導次序,每種設備使用一個字符表示;不一樣的架構所支持的設備及其表示字符不盡相同,在x86 PC架構上,a、b表示軟驅、c表示第一塊硬盤,d表示第一個光驅設備,n-p表示網絡適配器;默認爲硬盤設備;
eg.
qemu-kvm -name "rhel5.8" -m 512 -smp 2 -boot d -drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 -drive file=/isos/rhel-5.8.iso,index=1,media=cdrom -net nic,model=virtio,macaddr=52:54:00:A5:41:1E -vga cirrus -balloon virtio
qemu-kvm -name "centos65" -m 512 -smp 2 -hda /images/vm/centos.qcow2 -cdrom CentOS-6.5-x86_64-bin-DVD1.iso -boot order=dc
動態遷移時用到的選項: -incoming tcp:0:PORT
讓qemu-kvm進程運行於後臺: -daemonize
開啓USB總線: -usb
GuestOS爲Windows時, -usb -usbdevice tablet, 用於實現鼠標定位
打開KVM的支持: -enable-kvm (qemu-kvm默認啓用此選項)
打開聲音設備: -soundhw
設定iscsi存儲設備: -iscsi 經過URL指定使用的iscsi設備 iscsi://<target_ip>/<target_iqn>/
user=USERNAME, password=PASSWORD, initiator-name=iqn
qemu-kvm -iscsi initiator-name= -drive file=iscsi://tgt.example.com/1qn.2014-05.com.example.com.tgt1/1
指定使用bios文件: -bios /path/to/some_bios_program
使用外部內核及ramdisk文件. -kernel -initrd -append 向內核傳遞的參數
NAT模型: 虛擬機實例的網卡都要虛擬成hypervisor上的虛擬網絡接口. -net, nic -net tap 指令hypervisor的對應關係. NAT模型中, 再在hypervisor建立一個虛擬橋, 並無綁定任何物理接口.
dnsmasq: 能夠提供dns服務器以及dhcp服務器.爲嵌入式平臺使用, 很是輕量級.
在虛擬網橋上建立SNAT規則
iptables -t nat -A POSTROUTING -s 192.168.21.0/24 -j SNAT --to-source 192.168.48.131
路由模型: 對虛擬網橋而言, 不作NAT轉換, 而是作路由功能.
隔離模型: hypervisor中的虛擬網橋並無綁定到任何一個接口上.
橋接模型: 將eth0(物理網卡做爲交換機來使用), 經過橋接的方式來鏈接虛擬機和物理機.
多路橋接模型:
/etc/qemu-ifup
#!/bin/bash switch=virbr0 if [ -n "$1" ];then ifconfig $1 up sleep 0.5 brctl addif $switch $1 exit 0 else echo "Error: no specified interface." exit 1 fi
開啓虛擬機網橋
qemu-kvm -name "rhel5" -m 512 -smp 2 -drive file=/images/vm/centos.qcow2,if=virtio,index=0 -boot order=c -net nic,model=virtio -net tap,ifname=vnet0,downscript=no
SDL: Simple DirectMedia Layer, C語言編寫的簡單的跨平臺的, 免費開源的多媒體程序庫. 操做系統硬件平臺的圖形,顯示, 聲音等.
VNC: Virtual Network Computing: 基於RFB
-vnc display的指定方式:
1 . host:N 172.16.100.7:1, 偵聽於5900+N的端口上
2 . unix: /path/to/socket_file
3 . none 不啓動桌面
option: password, 鏈接時須要驗證密碼, 設定密碼經過monitor接口使用change
reverse: 反向
change vnc password
-monitor stdio 在標準輸入輸出上顯示monitor界面, 至關於alt+ctrl+2
Ctrl-a, c: 在console和monitor之間切換
Ctrl-a, h: 顯示幫助信息
不作圖形顯示 -nographic
建立qcow2的磁盤鏡像文件
qemu-img create -f qcow2 -o size=20G,preallocation=metadata /images/vm2/test.qcow2
增長其大小
qemu-img resize /images/vm2/test.qcow2 40G
查看虛擬磁盤鏡像文件大小
qemu-img info /images/vm2/test.qcow2
鏡像文件類型進行轉換
qemu-img convert -f qcow2 -O vmdk -o adapter_type=lsilogic test.qcow2 test.vmdk
建立某一虛擬鏡像文件快照
qemu-img snapshot -c test-1.snmp test.qcow2
查看快照
qemu-img snapshot -l test.qcow2
應用快照
qemu-img snapshot -a test-1.snap test.qcow2
刪除快照
qemu-img snapshot -d test-1.snap test.qcow2
In a CirrOS image, the login account is cirros. The password is cubswin:)
qemu-kvm -name "cirros" -smp 2 -m 512 -drive file=/root/cirros-0.3.4-x86_64-disk.img,media=disk -net tap,ifname=vnet0,downscript=no -nographic
ctrl+a ^c
info cpus info status info tlb info vnc 使用info直接查看幫助文檔
保持CPU架構相同.
incoming的機制: 等待其餘虛擬機實例遷移過來
hb: qemu-kvm -incoming tcp:0:6767 (0表示容許任意主機)
ha: monitor: migrate tcp:hb:6767
-cpu host 能夠將宿主機的cpu類型直接給虛擬機
通用於各類虛擬化技術的半虛擬化技術. linux內核從2.6.25起直接支持了virtio.通用框架, 提升io性能.
建議建立網絡設備和磁盤設備的時候都使用virtio.
工具棧實現虛擬機管理
安裝系統: virt-manager, virt-install
virsh不能安裝, 能夠用於管理
yum -y install libvirt virt-manager virt-viewer python-virtinst
查看幫助
virsh help iface-bridge
添加網橋
virsh iface-bridge eth0 br0
virsh能夠運行在交互模式下
顯示子類的幫助, 好比只顯示虛擬機的管理子命令
vrish# help domain
分組
domain: 虛擬機域
使用pxe引導安裝虛擬機
virt-install -n "centos6" --vcpus 2 -r 512 -l http://192.168.48.130/cobbler/ks_mirror/centos-6.7-x86_64/ --disk /images/vm/centos6.qcow2,bus=virtio,size=120,sparse --network bridge=br0,model=virtio --nographics --force
dump已有的xml配置文件
virsh dumpxml centos >/etc/libvirt/qemu/cirros.xml
建立cirros利用鏡像文件
virsh create /etc/libvirt/qemu/cirros.xml --console
Virtualization: qemu-kvm, qemu-guest-agent, qemu-kvm-tools
Virtualization Client: python-virtinst, virt-manager, virt-viewer, virt-top
Virtualization Platform: libvirt, libvirt-client, virt-who, virt-what
Virtualization Tools: libguestfs
hypervisor自身包含一個dom0. 混合模式的I/O驅動模型.
各VMM對於I/O的驅動, 有三種模式:
1 . 自主VMM, VMM自行提供驅動 (幾乎不存在)
2 . 混合VMM, 藉助於OS提供驅動.
依賴於外部OS(xen)
自我提供特權域(ESXI)
3 . 寄宿式的VMM:
I/O虛擬化模型:
1 . 純模擬的方式實現
2 . 半虛擬化
3 . 透傳: 直接是用實際的物理設備.
IOV, SR-IOV: 將一個物理硬件輪流分給多個虛擬機實例.
QEMU: 實現CPU跨平臺模擬
VMM: VM monitor
VM management: 虛擬機管理器
[root@centos6 ~]# tail master_key Start Time: 1456729243 Timeout : 300 (sec) Verify return code: 19 (self signed certificate in certificate chain) --- <html><body><h1>It works!</h1></body></html> <<< TLS 1.2 Alert [length 0002], warning close_notify 01 00 closed >>> TLS 1.2 Alert [length 0002], warning close_notify 01 00