Virtualisointi

**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 *[[abstrakti kone|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ä (, 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