Virtualizacija - Windowsi pod Ubuntujem
Kaj torej storiti, če nujno potrebujemo nek program, ki teče samo v okolju Windows? Rešitev je uporaba virtualizacije. Z virtualizacijo znotraj računalnika ustvarimonov, navidezni računalnik, kamor lahko namestimo operacijski sistem. Nov računalnik v obastoječem sistemu vidimo kot posebno okno. Najbolj znan program za virtualizacijo je VMWare, ki je sicer zelo zmogljiv, ni pa brezplačen. A v svetu Linuxa obstaja tudi brezplačna rešitev. Imenuje se qemu.
Qemu je tekstovno orodje, ki je razmeroma neprijazno do uporabnika, poleg tega pa ga je potrebno prevesti in namestiti ročno. A če boste sledili spodnjim navodilom, težav skorajda ne bo.
OPOMBA: Uporabljam Kubuntu (vendar je to vseeno, dela tudi v Ubuntuju), spodaj pa so navodila za Ubuntu Hoary in Breezy preview release!
Gremo v konzolo in začnemo.
mkdir qemu
cd qemu
OPOMBA: Predpostavka je, da uporabljamo trenutno najnovejšo verzijo qemuja, torej 0.7.1!
wget -N http://fabrice.bellard.free.fr/qemu/qemu-0.7.1.tar.gz
wget -N http://fabrice.bellard.free.fr/qemu/kqemu-0.6.2-1.tar.gz
tar zxvf qemu-0.7.1.tar.gz
cd qemu-0.7.1
tar zxvf ../kqemu-0.6.2-1.tar.gz
sudo apt-get install libsdl1.2debian zlib1g libx11-dev libsdl1.2-dev texi2html sharutils libgpmg1-dev vgabios bochsbios
HOARY:
sudo apt-get install linux-headers-2.6.10-5-386
BREEZY PREVIEW:
sudo apt-get install linux-headers-2.6.10-5-386
sudo apt-get install build-essential
HOARY:
./configure --prefix= /usr --enable-slirp \ --target-list="i386-user i386 i386-softmmu arm-user sparc-user sparc-softmmu ppc-user ppc-softmmu"
BREEZY PREVIEW:
- potrebno je uporabiti isto verzijo prevajalnika kot je bila uporabljena za prevajanje jedra -
sudo apt-get install gcc-3.4
sudo rm /usr/bin/cpp
sudo ln -s /usr/bin/cpp-3.4 /usr/bin/cpp
sudo rm /usr/bin/g++
sudo ln -s /usr/bin/g++-4.0 /usr/bin/g++
sudo rm /usr/bin/gcc
sudo ln -s /usr/bin/gcc-3.4 /usr/bin/gcc
sudo rm /usr/bin/gcov
sudo ln -s /usr/bin/gcov-3.4 /usr/bin/gcov
sudo rm /usr/bin/gccbug
sudo ln -s /usr/bin/gccbug-3.4 /usr/bin/gccbug
sudo rm /usr/bin/i486-linux-gnu-g++
sudo ln -s /usr/bin/i486-linux-gnu-g++-3.4 /usr/bin/i486-linux-gnu-g++
sudo rm /usr/bin/i486-linux-gnu-gcc
sudo ln -s /usr/bin/i486-linux-gnu-gcc-3.4 /usr/bin/i486-linux-gnu-gcc
sudo rm /usr/bin/i486-linux-gnu-cpp
sudo ln -s /usr/bin/i486-linux-gnu-cpp-3.4 /usr/bin/i486-linux-gnu-cpp
./configure --prefix= /usr --enable-slirp \ --cc=gcc-3.4
(end of BREEZY PREVIEW)
Dobimo izpis, ki mora biti podoben:
SDL support yes (OBVEZNO YES)
SDL static link yes
mingw32 support no
Adlib support no
FMOD support no
kqemu support yes (OBVEZNO YES)
make
sudo make install
sudo modprobe kqemu
sudo modprobe loop
(Pogledamo, če sta modula naložena:
lsmod)
sudo kedit /etc/modules (ali gedit namesto kedit)
Na konec dodamo dve vrstici:
kqemu
loop
sudo kedit /etc/init.d/bootmisc.sh
pred ": exit 0" dodamo naslednji dve vrstici:
mknod /dev/kqemu c 250 0
chmod 666 /dev/kqemu
NAMESTITEV KONČANA.
mkdir images
qemu-img create -f raw /home/matej/qemu/images/win2k.img 2G
Sedaj v CD enoto vstavimo namestitveni CD za Windows 2000 in poženemo virtualni računalnik:
sudo umount /dev/shm
OPOMBA: virtualnemu računalniku bomo dali 256 RAM-a od zanj rezerviramo do 272 RAM-a (dinamično dodeljevanje)
sudo mount -t tmpfs -o size=272m none /dev/shm
qemu -dummy-net -m 256 -cdrom /dev/cdrom -boot d /home/matej/qemu/images/win2k.img
Primer zagona virtualnega računalnika brez disketne in CD enote, z 256 Mb RAM-a ter dostopom do interneta ter dostopom do virtualnega Windows omrežja na Linux računalniku (samba - seveda moramo imeti sambo nameščeno, v navedenem primeru delimo mapo /home/matej/windows_network):
qemu -user-net -m 256 -smb /home/matej/windows_network /home/matej/qemu/images/win2k.img
Okno virtualnega računalnika zapustimo s pritiskom na Ctrl-Alt, s Ctrl-Alt-f vstopimo v celozaslonski način.
Ctrl-Alt-2 (ne F2!), in znajdemo se v ukazni konzoli (nazaj v okno virtualnega računalnika pridemo z Ctrl-Alt-1). Če vpišemo "help", se izpišejo ukazi, ki jih lahko vtipkamo v konzolo.
Če vtipkamo "savevm /home/matej/qemu/virtual_machines/win2k.vm", se bo znotraj podimenika virtual_machines (podimenik moramo prej seveda še ustvariti!), shranila datoteka win2k.vm. S tem smo shranili "stanje" virtualnega računalnika (tim. snapshot). Le-tega sedaj lahko ugasnemo z ukazom q (quit). Ugašanje poteka v manj kot sekundi. Če ga želimo ponovno zagnati, moramo pri zagonu vnesti parameter "-loadvm . Na primer:
qemu -user-net -m 256 /home/matej/qemu/images/win2k.img -loadvm /home/matej/qemu/virtual_machines/win2k.vm
V tem primeru se virtualni računalnik naloži v prejšnje stanje RAM-a izredno hitro (v dveh sekundah ali še manj).
Have phun!
Qemu je tekstovno orodje, ki je razmeroma neprijazno do uporabnika, poleg tega pa ga je potrebno prevesti in namestiti ročno. A če boste sledili spodnjim navodilom, težav skorajda ne bo.
OPOMBA: Uporabljam Kubuntu (vendar je to vseeno, dela tudi v Ubuntuju), spodaj pa so navodila za Ubuntu Hoary in Breezy preview release!
Gremo v konzolo in začnemo.
mkdir qemu
cd qemu
OPOMBA: Predpostavka je, da uporabljamo trenutno najnovejšo verzijo qemuja, torej 0.7.1!
wget -N http://fabrice.bellard.free.fr/qemu/qemu-0.7.1.tar.gz
wget -N http://fabrice.bellard.free.fr/qemu/kqemu-0.6.2-1.tar.gz
tar zxvf qemu-0.7.1.tar.gz
cd qemu-0.7.1
tar zxvf ../kqemu-0.6.2-1.tar.gz
sudo apt-get install libsdl1.2debian zlib1g libx11-dev libsdl1.2-dev texi2html sharutils libgpmg1-dev vgabios bochsbios
HOARY:
sudo apt-get install linux-headers-2.6.10-5-386
BREEZY PREVIEW:
sudo apt-get install linux-headers-2.6.10-5-386
sudo apt-get install build-essential
HOARY:
./configure --prefix= /usr --enable-slirp \ --target-list="i386-user i386 i386-softmmu arm-user sparc-user sparc-softmmu ppc-user ppc-softmmu"
BREEZY PREVIEW:
- potrebno je uporabiti isto verzijo prevajalnika kot je bila uporabljena za prevajanje jedra -
sudo apt-get install gcc-3.4
sudo rm /usr/bin/cpp
sudo ln -s /usr/bin/cpp-3.4 /usr/bin/cpp
sudo rm /usr/bin/g++
sudo ln -s /usr/bin/g++-4.0 /usr/bin/g++
sudo rm /usr/bin/gcc
sudo ln -s /usr/bin/gcc-3.4 /usr/bin/gcc
sudo rm /usr/bin/gcov
sudo ln -s /usr/bin/gcov-3.4 /usr/bin/gcov
sudo rm /usr/bin/gccbug
sudo ln -s /usr/bin/gccbug-3.4 /usr/bin/gccbug
sudo rm /usr/bin/i486-linux-gnu-g++
sudo ln -s /usr/bin/i486-linux-gnu-g++-3.4 /usr/bin/i486-linux-gnu-g++
sudo rm /usr/bin/i486-linux-gnu-gcc
sudo ln -s /usr/bin/i486-linux-gnu-gcc-3.4 /usr/bin/i486-linux-gnu-gcc
sudo rm /usr/bin/i486-linux-gnu-cpp
sudo ln -s /usr/bin/i486-linux-gnu-cpp-3.4 /usr/bin/i486-linux-gnu-cpp
./configure --prefix= /usr --enable-slirp \ --cc=gcc-3.4
(end of BREEZY PREVIEW)
Dobimo izpis, ki mora biti podoben:
SDL support yes (OBVEZNO YES)
SDL static link yes
mingw32 support no
Adlib support no
FMOD support no
kqemu support yes (OBVEZNO YES)
make
sudo make install
sudo modprobe kqemu
sudo modprobe loop
(Pogledamo, če sta modula naložena:
lsmod)
sudo kedit /etc/modules (ali gedit namesto kedit)
Na konec dodamo dve vrstici:
kqemu
loop
sudo kedit /etc/init.d/bootmisc.sh
pred ": exit 0" dodamo naslednji dve vrstici:
mknod /dev/kqemu c 250 0
chmod 666 /dev/kqemu
NAMESTITEV KONČANA.
mkdir images
qemu-img create -f raw /home/matej/qemu/images/win2k.img 2G
Sedaj v CD enoto vstavimo namestitveni CD za Windows 2000 in poženemo virtualni računalnik:
sudo umount /dev/shm
OPOMBA: virtualnemu računalniku bomo dali 256 RAM-a od zanj rezerviramo do 272 RAM-a (dinamično dodeljevanje)
sudo mount -t tmpfs -o size=272m none /dev/shm
qemu -dummy-net -m 256 -cdrom /dev/cdrom -boot d /home/matej/qemu/images/win2k.img
Primer zagona virtualnega računalnika brez disketne in CD enote, z 256 Mb RAM-a ter dostopom do interneta ter dostopom do virtualnega Windows omrežja na Linux računalniku (samba - seveda moramo imeti sambo nameščeno, v navedenem primeru delimo mapo /home/matej/windows_network):
qemu -user-net -m 256 -smb /home/matej/windows_network /home/matej/qemu/images/win2k.img
Okno virtualnega računalnika zapustimo s pritiskom na Ctrl-Alt, s Ctrl-Alt-f vstopimo v celozaslonski način.
Ctrl-Alt-2 (ne F2!), in znajdemo se v ukazni konzoli (nazaj v okno virtualnega računalnika pridemo z Ctrl-Alt-1). Če vpišemo "help", se izpišejo ukazi, ki jih lahko vtipkamo v konzolo.
Če vtipkamo "savevm /home/matej/qemu/virtual_machines/win2k.vm", se bo znotraj podimenika virtual_machines (podimenik moramo prej seveda še ustvariti!), shranila datoteka win2k.vm. S tem smo shranili "stanje" virtualnega računalnika (tim. snapshot). Le-tega sedaj lahko ugasnemo z ukazom q (quit). Ugašanje poteka v manj kot sekundi. Če ga želimo ponovno zagnati, moramo pri zagonu vnesti parameter "-loadvm . Na primer:
qemu -user-net -m 256 /home/matej/qemu/images/win2k.img -loadvm /home/matej/qemu/virtual_machines/win2k.vm
V tem primeru se virtualni računalnik naloži v prejšnje stanje RAM-a izredno hitro (v dveh sekundah ali še manj).
Have phun!
Ta razprava je zaprta.
Komentarji
bom sprobal ...
Pa dj še kšn screenshot pripopaj. Pa vse pohvale za vodič
Sem v wiki dodal še en članek o šifriranju - uporabi GPG. :-)
pri koraku make men to vze vun:
h4ck@h4ck:~/qemu/qemu-0.7.1$ make
gcc -DQEMU_TOOL -Wall -O2 -g -fno-strict-aliasing -g -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -o qemu-img qemu-img.c block.c block-cow.c block-qcow.c aes.c block-vmdk.c block-cloop.c block-dmg.c block-bochs.c block-vpc.c block-vvfat.c -lz
block-qcow.c:26:18: zlib.h: No such file or directory
block-qcow.c: In function `decompress_buffer':
block-qcow.c:408: error: `z_stream' undeclared (first use in this function)
block-qcow.c:408: error: (Each undeclared identifier is reported only once
block-qcow.c:408: error: for each function it appears in.)
block-qcow.c:408: error: syntax error before "strm1"
block-qcow.c:411: error: `strm' undeclared (first use in this function)
block-qcow.c:418: warning: implicit declaration of function `inflateInit2'
block-qcow.c:419: error: `Z_OK' undeclared (first use in this function)
block-qcow.c:421: warning: implicit declaration of function `inflate'
block-qcow.c:421: error: `Z_FINISH' undeclared (first use in this function)
block-qcow.c:423: error: `Z_STREAM_END' undeclared (first use in this function)
block-qcow.c:423: error: `Z_BUF_ERROR' undeclared (first use in this function)
block-qcow.c:425: warning: implicit declaration of function `inflateEnd'
block-qcow.c: In function `qcow_compress_cluster':
block-qcow.c:620: error: `z_stream' undeclared (first use in this function)
block-qcow.c:620: error: syntax error before "strm"
block-qcow.c:633: error: `strm' undeclared (first use in this function)
block-qcow.c:634: warning: implicit declaration of function `deflateInit2'
block-qcow.c:634: error: `Z_DEFAULT_COMPRESSION' undeclared (first use in this function)
block-qcow.c:635: error: `Z_DEFLATED' undeclared (first use in this function)
block-qcow.c:636: error: `Z_DEFAULT_STRATEGY' undeclared (first use in this function)
block-qcow.c:647: warning: implicit declaration of function `deflate'
block-qcow.c:647: error: `Z_FINISH' undeclared (first use in this function)
block-qcow.c:648: error: `Z_STREAM_END' undeclared (first use in this function)
block-qcow.c:648: error: `Z_OK' undeclared (first use in this function)
block-qcow.c:650: warning: implicit declaration of function `deflateEnd'
block-cloop.c:26:18: zlib.h: No such file or directory
block-cloop.c:37: error: syntax error before "z_stream"
block-cloop.c:37: warning: no semicolon at end of struct or union
block-cloop.c:38: warning: type defaults to `int' in declaration of `BDRVCloopState'
block-cloop.c:38: warning: data definition has no type or storage class
block-cloop.c: In function `cloop_open':
block-cloop.c:55: error: `s' undeclared (first use in this function)
block-cloop.c:55: error: (Each undeclared identifier is reported only once
block-cloop.c:55: error: for each function it appears in.)
block-cloop.c:96: warning: implicit declaration of function `inflateInit'
block-cloop.c:96: error: `Z_OK' undeclared (first use in this function)
block-cloop.c: At top level:
block-cloop.c:105: error: syntax error before '*' token
block-cloop.c: In function `cloop_read_block':
block-cloop.c:107: error: `s' undeclared (first use in this function)
block-cloop.c:107: error: `block_num' undeclared (first use in this function)
block-cloop.c:120: warning: implicit declaration of function `inflateReset'
block-cloop.c:121: error: `Z_OK' undeclared (first use in this function)
block-cloop.c:123: warning: implicit declaration of function `inflate'
block-cloop.c:123: error: `Z_FINISH' undeclared (first use in this function)
block-cloop.c:124: error: `Z_STREAM_END' undeclared (first use in this function)block-cloop.c: In function `cloop_read':
block-cloop.c:135: error: `s' undeclared (first use in this function)
block-cloop.c: In function `cloop_close':
block-cloop.c:150: error: `s' undeclared (first use in this function)
block-cloop.c:156: warning: implicit declaration of function `inflateEnd'
block-dmg.c:27:18: zlib.h: No such file or directory
block-dmg.c:49: error: syntax error before "z_stream"
block-dmg.c:49: warning: no semicolon at end of struct or union
block-dmg.c:50: warning: type defaults to `int' in declaration of `BDRVDMGState'block-dmg.c:50: warning: data definition has no type or storage class
block-dmg.c: In function `dmg_open':
block-dmg.c:78: error: `s' undeclared (first use in this function)
block-dmg.c:78: error: (Each undeclared identifier is reported only once
block-dmg.c:78: error: for each function it appears in.)
block-dmg.c:166: warning: implicit declaration of function `inflateInit'
block-dmg.c:166: error: `Z_OK' undeclared (first use in this function)
block-dmg.c: At top level:
block-dmg.c:174: error: syntax error before '*' token
block-dmg.c: In function `is_sector_in_chunk':
block-dmg.c:177: error: `chunk_num' undeclared (first use in this function)
block-dmg.c:177: error: `s' undeclared (first use in this function)
block-dmg.c:177: error: `sector_num' undeclared (first use in this function)
block-dmg.c: At top level:
block-dmg.c:184: error: syntax error before '*' token
block-dmg.c: In function `search_chunk':
block-dmg.c:187: error: `s' undeclared (first use in this function)
block-dmg.c:190: error: `sector_num' undeclared (first use in this function)
block-dmg.c: At top level:
block-dmg.c:200: error: syntax error before '*' token
block-dmg.c: In function `dmg_read_chunk':
block-dmg.c:202: error: `s' undeclared (first use in this function)
block-dmg.c:202: error: `sector_num' undeclared (first use in this function)
block-dmg.c:235: warning: implicit declaration of function `inflateReset'
block-dmg.c:236: error: `Z_OK' undeclared (first use in this function)
block-dmg.c:238: warning: implicit declaration of function `inflate'
block-dmg.c:238: error: `Z_FINISH' undeclared (first use in this function)
block-dmg.c:239: error: `Z_STREAM_END' undeclared (first use in this function)
block-dmg.c: In function `dmg_read':
block-dmg.c:259: error: `s' undeclared (first use in this function)
block-dmg.c: In function `dmg_close':
block-dmg.c:274: error: `s' undeclared (first use in this function)
block-dmg.c:285: warning: imp
a ve kdo zakaj?
Drugače pa mislim da je to problem z kompajlerjem.
Vprašanja/Odgovori tukaj