原本對這個東西只知道是一個虛擬機器 可以安裝很多個 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