VirtualBox
**Virtualisointi** tarkoittaa tietotekniikassa tekniikkaa virtuaalisen laitteen suorittamiseksi erotettuna varsinaisesta fyysisestä laitteesta.
Virtuaalinen laite on abstraktio varsinaisesta laitteesta.
Virtualisoinnissa fyysisen resurssin tekniset piirteet piilotetaan muilta järjestelmiltä, sovelluksilta ja loppukäyttäjiltä, jotka käyttävät näitä resursseja. Täten yksi fyysinen resurssi (kuten palvelin, suoritin tai massamuisti) voi toimia monena loogisena resurssina, tai useat fyysiset resurssit (kuten tallennuslaitteet tai palvelimet) näkyvät yhtenä loogisena resurssina. Tätä uutta *virtuaalista* näkymää taustalla oleviin resursseihin ei rajoita niiden toteutus, maantieteellisen sijainti tai fyysinen konfigurointi. Useimmin virtualisoituja resursseja ovat laskenta- ja tallennuskapasiteetti.

Historia
--------

Virtualisointi on syntynyt 1960- ja 1970-luvuilla, jolloin määritelmällä viitattiin menetelmään jakaa suurtietokoneet loogisesti useiden sovellusten käyttöön samanaikaisesti. Termin merkitys on laajentunut siitä lähtien.

1960-luvulla IBM:n tutkimuskeskus kehitti CP/CMS:n, jossa CP oli *hypervisor*-komponentti ja CMS oli kevyt yhden käyttäjän käyttöjärjestelmä. CP/CMS kehittyi useiksi versioiksi 1960- ja 1970-lukujen vaihteessa. CP/CMS vaikutti VM/370:n kehitykseen (nykyisin z/VM), joka julkaistiin 2. elokuuta 1972.

Vuonna 1974 Gerald J. Popek ja Robert P. Goldberg julkaisivat artikkelin *Formal requirements for virtualizable third generation architectures*, jossa kuvattiin vaatimuksia virtualisointiin.
Popekin ja Goldbergin kriteerit viittaavat *klassisena virtualisointina* tai *täytenä virtualisointina* tunnettuun malliin, jossa suoritettavaa ohjelmaa ei tunneta etukäteen.

Virtualisointitapoja
--------------------

Virtualisointi on laaja termi, joka viittaa moniin eri tapoihin tehdä tietojenkäsittelyn resursseista abstrakteja. Alla on listattu joitakin yleisimpiä virtualisointitekniikoita.

### Sovellusten virtualisointi

Termiä virtuaalikone on käytetty Java-virtuaalikoneesta ja Microsoftin .NET-ympäristön Common Language Runtime-ympäristöstä, joissa ohjelma tehdään *abstraktille koneelle* ja käännetään kohdekoneelle ajonaikaisella kääntämisellä (tavukoodin tai välikielen kautta).

### Koneiden ja järjestelmien virtualisointi

*Hypervisor* (myös *virtual machine monitor*, VMM, *virtuaalikonemonitori*) on virtuaalikoneen suorittamiseen käytetty ohjelmistokerros. Nämä jaetaan kahteen tyyppiin: suoraan laitteistolla suoritettava (tyyppi 1) ja toisen käyttöjärjestelmän päällä suoritettava (tyyppi 2).
Tyyppi 1 suoritetaan suoraan tietokonelaitteistolla ja ne ovat tehokkaita sekä turvallisia koska mitään muuta ei suoriteta sen ja laitteiston välillä. Tyyppi 1 korvaa tietokoneen käyttöjärjestelmän ja soveltuu palvelinkäyttöön, mutta usein tarvitsee toisen koneen virtuaalikoneiden hallintaan. 
Tyyppi 2 suoritetaan sovellusohjelmana toisen käyttöjärjestelmän päällä ja usein käytössä henkilökohtaisella tietokoneella, jossa on tarve suorittaa useampia käyttöjärjestelmiä. Tyyppi 2 mahdollistaa nopean pääsyn toiseen käyttöjärjestelmään, joka tekee siitä soveltuvan loppukäyttäjälle, mutta se käyttää laitteistoa toisen käyttöjärjestelmän kautta, joka lisää viiveitä (latenssi) ja vaikuttaa suorituskykyyn.

Tietokoneen virtualisointi voidaan jakaa edelleen seuraavasti:

* täysi virtualisointi (muokkaamaton vieraskäyttöjärjestelmä)
* paravirtualisointi (muutoksia vieraskäyttöjärjestelmään)
* yhdistelmä (erikoistuneet laiteajurit)
* käyttöjärjestelmätason virtualisointi (säiliöinti)

Täysi virtualisointi sallii toisen käyttöjärjestelmän suorittamisen ilman muokkauksia eristettynä vieraskäyttöjärjestelmäksi. Täysi virtualisointi voi käyttää ohjelmistoapua tai laitteistoapua: ohjelmistoavusteinen tarkoittaa binäärin käännöstä ohjelmallisesti tiettyjen käskyjen käsittelyssä kun taas laitteistoavusteinen käyttää suorittimeen integroituja toimintoja näiden käskyjen suorittamiseen.

Käyttöjärjestelmän muuttamista virtualisoinnille kutsutaan **paravirtualisoinniksi**, jota tukevat muun muassa Xen ja User-mode Linux. Paravirtualisoinnissa vieraskäyttöjärjestelmä vaatii laajennuksia *hypervisorin* kutsumiseen.

Yhdistelmässä isäntäkäyttöjärjestelmä käyttää laitteistoavustusta täydelle virtualisoinnille ja vieraskäyttöjärjestelmä käyttää laiteajureita tietyille laitteille paravirtualisoinnin tapaan.
Laitteistopohjaisen tuen lisääntyessä suorittimien käskykantalaajennoksilla erot ovat hämärtyneet.

Eri *hypervisor*-ratkaisut voivat tukea käynnissä olevan virtuaalikoneen siirtoa isännältä toiselle (*live migration*) tai sisäkkäisiä virtuaalikoneita (*nested*). *Failover* ("puolenvaihto") tarkoittaa suorituksen siirtämistä yhdestä virtuaalikoneesta toiseen suunnitellusti tai vikatilanteessa.

x86-käskykanta ennen vuotta 2005 ei tue Popekin ja Goldbergin esittämiä vaatimuksia virtualisoinnille koska käskykannassa on joukko käskyjä, jotka eivät täytä virtualisointivaatimuksia. VMware esitti vuonna 1998 ohjelmistoratkaisun tiettyjen x86-käskyjen kohdalla, jolloin VMM:n toteutus tuli mahdolliseksi. Intel VT-x ja AMD-V (2005 ja 2006) lisäävät käskykantaan ominaisuudet, joilla laitteisto tukee Popekin ja Goldbergin esittämiä vaatimuksia virtualisoinnille. Eräät muut suoritinarkkitehtuurit täyttävät nämä vaatimukset (IBM S/370, Motorola 68010 ja uudemmat, PowerPC sekä eräät muut).

Säiliöinti on käyttöjärjestelmätason virtualisointi (kevyt prosessitason virtualisointi), jolla tehdään virtuaaliympäristöjä (engl. *virtual environment*, VE). Docker vaikutti merkittävästi tämän suosioon ja yleistymiseen.

Emulaattorit on suunniteltu suorittamaan eri suorittimelle tehtyjä ohjelmia toisella laitteistoalustalla, kun taas virtualisointi voi käyttää laitteen omaa käskykantaa ja laitteistoa. Emulaatio tulkitsee *vierasalustan* käskykannan mahdollistaen suorittamisen eri suorittimella.

### Laiteresurssien virtualisointi

Yksi tavallisimmista virtualisointikohteista käyttöjärjestelmissä on muisti, jota laajennetaan virtuaalimuistin avulla. Käyttöjärjestelmä osaa vapauttaa tai siirtää käyttämätöntä muistia RAM-muistista kiintolevylle.
Tallennuskapasiteetti voidaan virtualisoida muun muassa verkkolevyjärjestelmillä (hajautettu levyjärjestelmä, jaettu levyjärjestelmä) ja taltiohallinnalla.

Yhdistelemällä laiteresursseja suuremmiksi kokonaisuuksiksi voidaan muodostaa laajempia resursseja tai resurssipooleja. Esimerkiksi RAID-levyjärjestelmät ja loogisten taltioiden hallintajärjestelmät (LVM, *Logical Volume Management*) yhdistelevät useita levyjärjestelmiä yhdeksi suureksi loogiseksi levytilaksi. Verkkolaitteet voivat käyttää useita rinnakkaisia kanavia, ja antaa vaikutelman yhdestä laajempikaistaisesta yhteydestä. Pisimmälle vietynä tietokoneryppäät eli klusterit toteuttavat kaiken tämän.

### Verkon virtualisointi

Virtuaaliverkko on kyky luoda loogisia virtuaalisia verkkoja, jota ovat eriytetty verkkolaitteistosta.

### Työpöydän virtualisointi

Työpöydän virtualisoinnista puhutaan useiden etäkäyttöratkaisujen yhteydessä kuten: VNC, RDP, Linux Terminal Server Project ja X Window System.
Etäkäyttöön liittyy läheisesti hajautettu tietojenkäsittely.

Eräät yritykset tarjoavat palveluita ja ohjelmistoja työpöydän siirtämiseksi datakeskukseen (VDI).

Ohjelmia
--------

*Hypervisor*-pohjaisia virtualisointiohjelmia ovat muun muassa:

* Hyper-V
* Kernel-based Virtual Machine (KVM)
* QEMU
* VMware
* VirtualBox
* Xen

Data virtualisointi
-------------------

Data virtualisointi on lähestymistapa tietojen keräämiseksi yhdestä kerroksesta useista lähteistä niin, että sovellukset, raportointityökalut ja loppukäyttäjät voivat käyttää tietoja ilman alkuperäislähteen, sijainnin ja tietorakenteiden yksityiskohtia.

Katso myös
----------

* Säiliöinti
* Bochs
* Virtuaaliverkko

Lähteet
-------

1. 1 2  What is virtualization? *opensource.com*. Viitattu 6.3.2020. (englanniksi)
2. 1 2 3  What is virtualization? *ibm.com*. Viitattu 6.3.2020. (englanniksi)
3. 1 2  Graziano, Charles: A performance analysis of Xen and KVM hypervisors for hosting the Xen Worlds Project *dr.lib.iastate.edu*.  1.1.2011. doi:10.31274/etd-180810-2322.  Viitattu 9.10.2022. (englanniksi)
4. ↑  z/VM – A Brief Review of Its 40 Year History (PDF)  2012. IBM. Viitattu 17.8.2019. (englanniksi)
5. ↑  Virtual Machines *cis.temple.edu*. Viitattu 9.10.2022. (englanniksi)
6. ↑  Liam Proven: Before the PC: IBM invents virtualisation (sivu 2) *theregister.com*.  14.7.2011. Viitattu 31.8.2023. (englanniksi)
7. ↑  Gerald J. Popek & Robert P. Goldberg: Formal requirements for virtualizable third generation architectures *dl.acm.org*.  1.7.1974. doi:10.1145/361011.361073.  Viitattu 9.10.2022. (englanniksi)
8. ↑  Formal virtualization requirements for the ARM architecture *biblio.ugent.be*. Viitattu 9.10.2022. (englanniksi)
9. ↑  Amit Shah: Ten years of KVM *lwn.net*.  2.11.2016. Viitattu 5.3.2020. (englanniksi)
10. 1 2 3 4  Hypervisors *ibm.com*.  8.5.2019. Viitattu 11.9.2020. (englanniksi)
11. 1 2 3 4 5  Para virtualization vs Full virtualization vs Hardware assisted Virtualization *unixarena.com*.  11.12.2017. Viitattu 1.10.2020. (englanniksi)
12. 1 2  Irfan Habib: Virtualization with KVM *linuxjournal.com*.  1.2.2008. Viitattu 5.3.2020. (englanniksi)
13. ↑  Migration *linux-kvm.org*. Viitattu 15.10.2022. (englanniksi)
14. ↑  Orit Wasserman: Nested virtualization: shadow turtles (PDF) *linux-kvm.org*.  2013. Viitattu 15.10.2022. (englanniksi)
15. ↑  Michael Bose: VM Failover Guide *nakivo.com*.  23.7.2018. Viitattu 15.10.2022. (englanniksi)
16. ↑  John Scott Robin & Cynthia E. Irvine: Analysis of the Intel Pentium’s Ability to Support a Secure Virtual Machine Monitor (PDF) *usenix.org*.  elokuu 2000. Viitattu 10.10.2022. (englanniksi)
17. 1 2 3 4  Dave Eckhardt: Virtualization (PDF) *cs.cmu.edu*. Viitattu 10.10.2022. (englanniksi)
18. ↑  Luca Abeni: Virtual Machine Monitors (PDF) *retis.sssup.it*.  13.6.2019. Viitattu 10.10.2022. (englanniksi)
19. ↑  Rami Rosen: Linux Containers and the Future Cloud (PDF) *haifux.org*. Viitattu 4.3.2020. (englanniksi)
20. ↑  What is Docker and why is it so darn popular?  21.3.2018. ZDNet. Viitattu 6.3.2020. (englanniksi)
21. ↑  Docker 101: What it is and why it’s important  10.6.2014. NetworkWorld. Viitattu 6.3.2020. (englanniksi)
22. ↑  Chapter 1. Introduction to Bochs *bochs.sourceforge.net*. Viitattu 20.1.2020. (englanniksi)
23. 1 2  M. Tim Jones: Platform emulation with Bochs *ibm.com*.  25.1.2011. Viitattu 20.1.2020. (englanniksi)
24. ↑  What is Network Virtualization? - Definition *sdxcentral.com*.  26.8.2013. Viitattu 6.3.2020. (englanniksi)
25. ↑  HP VDI Moves to Center Stage *zdnet.com*.  19.8.2011. Viitattu 6.3.2020. (englanniksi)
26. ↑  What is Data Virtualization? *www.datawerks.com*.  Arkistoitu 10.4.2018. Viitattu 11.4.2018. (englanniksi)