虛擬機技術 - 把Linux安裝在一個文件中(用dd生成虛擬塊設備文件)
第一個問題是:什么是虛擬塊設備文件?虛擬塊設備文件是本人杜撰的一個名稱,該類文件在主機操作系統上是普通文件,在虛擬機中作為一個虛擬塊設備,也就是虛擬機中的硬盤。在虛擬機中對虛擬塊設備的讀寫,實際都是對主機上該文件的操作。
虛擬塊設備文件更通用的名稱是硬盤鏡像文件(Hard Disk Image),但不是所有的硬盤鏡像文件都是虛擬塊設備文件,例如,目前Ghost的GHO格式的鏡像文件就不能成為虛擬機中的硬盤。
LInux的dd命令,可以用于生成虛擬塊設備文件。既可以用于創建空鏡像文件,也可以用于創建物理硬盤的鏡像。先看一個實際例子:
# dd if=/dev/hda of=/mnt/nebula/hda_dd.image4757130+0 records in4757130+0 records out
上面這個命令將IDE設備/dev/hda的內容復制到/mnt/nebula/hda_dd.image文件。參數if告訴dd從哪個文件讀取數據,參數 of告訴dd讀出的數據寫入哪個文件中。注意,對于dd來說,輸入和輸出都是文件,dd做的只是文件拷貝工作,這得益于Unix/Linux下面將設備也抽象為特殊的文件。
一般來說設備文件有兩種,一種是塊設備,一種是字符設備。塊設備的特點是可以隨機讀寫(Random Access),比如內存、硬盤等。字符設備的特點是順序讀寫(Sequential Access),比如鼠標,鍵盤,麥克風等。
前面說了如何生成物理硬盤的鏡像,如果想生成空鏡像文件(本文的主要目的),還需要一個特殊的設備。/dev/zero是Linux提供的一個特殊的字符設備,它的特點是可以永遠讀該文件,每次讀取的結果都是二進制0。下面的命令可以生成一個100M的空鏡像文件:IXPUB技術博客
dd if=/dev/zero of=100M.img bs=1M count=100
Y#x L![v#Z+r7{0 100+0 records inIXPUB技術博客 w7vOf{7M#l
100+0 records outIXPUB技術博客 ^R1A8rr"L!`'s]
104857600 bytes (105 MB) copied, 0.18719 seconds, 560 MB/s
除了前面已經解釋的of和if參數,這次又出現了bs和count參數。bs=1M表示每一次讀寫1M數據,count=100表示讀寫 100次,這樣就指定了生成文件的大小為100M。bs參數還可以進一步細分為ibs和obs兩種,為讀操作與寫操作分別指定不同的Buffer大小。
這樣就生成100M的空鏡像文件,問題是,如果要生成1G的虛擬塊設備文件,就得占用1G的硬盤空間,而這個鏡像文件完全是空的,是不是有一點浪費?好在Linux支持Sparse(稀疏)文件。請看下面的例子
# dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0
0+0 records in
0+0 records out
0 0 bytes (0 B) copied, 3.3e-05 seconds, 0.0 kB/s
# ls -l 1G.img
-rw-r-r- 1 root root 1048576000 Mar 25 15:32 1G.img
# du -m 1G.img
這里用了一個新的命令seek,表示略過1000個Block不寫(這里Block按照bs的定義是1M),count=0表示寫入0個Block。用ls命令看新生成的文件,大小可以看出是1000M。但是再用du一看,實際占用硬盤大小只有1M。
新聞熱點
疑難解答