close


原本對這個東西只知道是一個虛擬機器 可以安裝很多個 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 不然你怎麼裝他都會找不到硬碟.

步驟如下貼圖..


vmware-1.jpeg


vmware-2.jpeg  

 

vmware-3.jpeg

 

vmware-4.jpeg

 

vmware-5.jpeg

 

vmware-6.jpeg

 

vmware-7.jpeg

 

vmware-9.jpeg

 

vmware-10.jpeg

 

vmware-11.jpeg

 

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

 

vmware-12.jpeg

 

這邊我是填4GB

 

vmware-13.jpeg

 

vmware-14.jpeg


這樣就完成了...

這樣裝完後就會有一個 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

arrow
arrow
    全站熱搜

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