原本對這個東西只知道是一個虛擬機器 可以安裝很多個 OS 但沒有去想過 要怎麼做出這樣的檔案呢? 就因為這樣所以把自己所做的東西研究了一下 做一下紀錄.  ( 我是 based on EeePC 1.7 的 build 做測試的 ).


- PART 1 -


首先要先到 VmWare 官網 下載試用版的 Vmware WorkStation, 我是裝 Linux 版的 VMware-Workstation-6.5.3-185404.i386.bundle.


# bash -x ./VMware-Workstation-6.5.3-185404.i386.bundle


如果順利的話 應該可以很順利的裝起來. 中途如果有錯誤 可能就要請教 GOOGLE 大神了.

再繼續說明前,首先我們要先分析一下 EeePC 1.7 build 裡面檔案的組成. 在這一個檔案中它包含了兩個重要的東西

一個是 BOOT.IMG 另一個是 SYS_SQ.IMG. 我們分別對它 file 一下.


# file BOOT.IMG

 BOOT.IMG: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94; partition 1: ID=0x83, starthead 1, startsector 63, 16002 sectors


# file SYS_SQ.IMG

SYS_SQ.IMG: Squashfs filesystem, little endian, version 3.1, 1291521586 bytes, 96932 inodes, blocksize: 131072 bytes, created: Thu Aug  6 18:04:22 2009

其實做法有很多種 我下面的作法只是其中之一而已:


# dd if=/dev/zero of=disk.img bs=8M count=512 ( 先產生一個 4G 的 disk image )

# dd if=BOOT.IMG of=disk.img


到此為止我們在這 disk image 裡只有一個 sda1 的 partition. 接下來我們要來將其它的分割區完成.


# sudo su

# losetup /dev/loop0 disk.img

# fdisk /dev/loop0 


 /*

將剩餘的空間分割為 延伸分割區,然後 based on Logical Partition 割出 可容納 SYS_SQ.IMG (1.3GB) 的大小.

將所有剩餘空間全分配給 USER partition.

*/


割完的 Partition Layout 如下:


     /dev/sda1  --  BOOT.IMG         (ext2)

     /dev/sda2  --  Extented

     /dev/sda5  --  SYS_SQ.IMG    (squashfs)

     /dev/sda6  --  USER partition. (ext3)


接下來我們要把 /dev/sda5 和 /dev/sda6 的 partition mount 到 loopback device

這個也是有兩個方法 我們先用 手動 的方式,因為這是在disk.img 當中所以要 mount partition 我們要先用fdisk -ul /dev/loop0 來查看各各partition 的 Start Sector, 如此我們才可以成功的將它 mount 起來.


# fdisk -ul /dev/loop0 ( -u 是以 sectors 來表示 )        

/* -u When listing partition tables, give sizes in sectors instead of cylinders. */


# fdisk -ul /dev/loop1

Disk /dev/loop1: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders, total 8388608 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x00000000

Device Boot          Start             End             Blocks           Id       System
/dev/loop1p1         63                16064         8001              83      Linux
/dev/loop1p2         16065         8385929     4184932+     5        Extended
/dev/loop1p5         16128         2570399     1277136       83      Linux
/dev/loop1p6         2570463     8385929     2907733+    83      Linux


# losetup -o $((16128*512))    /dev/loop1  disk.img

# losetup -o $((2570463*512))   /dev/loop2  disk.img


所以接下來我們就可以


# dd if=SYS_SQ.IMG   of=/dev/loop1   bs=8M

# mkfs.ext3 /dev/loop2


不過 因為我們是在Vmware啟動 所以會有一個問題就是 VGA driver, 我們必需將 /etc/X11/xorg.conf 裡的 driver 換成 vmware or 是換成通用 driver - vesa 這樣一來大致上就沒有問題了.


# mkdir p6

# mount /dev/loop2 p6

# vim p6/etc/X11/xorg.conf


(因為EeePC 是使用 aufs , 所以將這個目錄結構從 SYS_IMG partition copy and paste 再做修改就可以了)

 

# umount p6


# losetup -d /dev/loop1

# losetup -d /dev/loop2


最後將這個disk.img 透過qemu-img 轉成 vmdk 就可以使用了.

# qemu-img convert disk.img -O vmdk chris.vmdk

 

- PART 2 -

 

不過到此我們還少了一個東西就是 vmx, 這個東西是用來引導和告知 vmware 如何去分配資源 和如何 載入 vmdk 這個 file, 這個檔案要如何產生呢? 其實我只知道最笨的方法,就是拿一張 eeepc 1.7版的 disk 然後用 VMware WorkStation 裝起來 就會有了. 不過要注意的是, 他的硬碟只能選 IDE 不然你怎麼裝他都會找不到硬碟.

步驟如下貼圖..



 

 

 

 

 

 

 

 

 

 

主要是這一步要選IDE喔 不然會裝不起來

 

 

這邊我是填4GB

 

 


這樣就完成了...

這樣裝完後就會有一個 vmx 檔 你就可以把這個檔保留起來 下次就不用再這樣裝了...

 

- PART 3 -

 

如果你想要在 VmWare 使用網路, 就需要 PCNET32 這一隻 driver,它在 kernel source tree 的


-> Device Drivers

   -> Network device support

      -> Ethernet ( 10 or 100Mbit )

         -> EISA, VLB, PCI and on board controllers

            <M> AMD PCnet32 PCI support

 

- PART 4-

 

這邊附上一個轉換的 script file, 參考看看.



#!/bin/bash -x


set -e


LC_ALL=C
unset LANG
unset LANGUAGE
unset LOCPATH


DEBDIR=/usr/share/vmware-convert


[ -z "$1" ] && echo $0 source.iso extradebdir && exit 1
[ ! -f "$1" ] && echo "Parameter 1 does not exist." && exit 1


WORK=`mktemp -d`


TMPMOUNT=`mktemp -d`
mount -oloop $1 $TMPMOUNT


# Create a 4G disk image
dd if=/dev/zero of=$WORK/disk.img bs=8M count=512


# Write the boot partition
dd conv=notrunc if=$TMPMOUNT/BOOT.IMG of=$WORK/disk.img


SYSBLOCKS=`du $TMPMOUNT/SYS_SQ.IMG | cut -f1`
SYSCYLS=$(((SYSBLOCKS * 1024 + 8225279) / 8225280))
let SYSCYLS++
let SYSCYLS++       # 因為在 ubuntu 上
util-linux 2.14-1ubuntu2的 +cylinders有問題 所以改成這樣


LOOP=`losetup -s -f $WORK/disk.img`


# Extended Partition
echo -e -n "n\ne\n2\n\n\n" > $WORK/fdisk.dat


# System/Squash partition
echo -e -n "n\nl\n\n$SYSCYLS\n" >> $WORK/fdisk.dat


# User partition
echo -e -n "n\nl\n\n\n" >> $WORK/fdisk.dat


# Write/Quit
echo -e -n "w\n" >> $WORK/fdisk.dat


fdisk $LOOP < $WORK/fdisk.dat || true


kpartx -a $LOOP


dd if=$TMPMOUNT/SYS_SQ.IMG of=/dev/mapper/`basename $LOOP`p5 bs=8M


umount $TMPMOUNT
rm -fr $TMPMOUNT


mkfs.ext3 -q -m 0 -L USER /dev/mapper/`basename $LOOP`p6
tune2fs -c 0 -i 0 /dev/mapper/`basename $LOOP`p6


IMAGE=`mktemp -d`
mount /dev/mapper/`basename $LOOP`p6 $IMAGE


umount $IMAGE
rm -fr $IMAGE


kpartx -d $LOOP
losetup -d $LOOP


# Convert the image
[ -z "$IMGFILE" ] && IMGFILE=/tmp/chris.vmdk
qemu-img convert $WORK/disk.img -O vmdk $IMGFILE


rm -fr $WORK

文章標籤
全站熱搜
創作者介紹
創作者 sakbk 的頭像
sakbk

sakbk

sakbk 發表在 痞客邦 留言(0) 人氣(968)