Asiaa voi ajatella silti niinkin, että eihän esimerkiksi Ubuntu lakkaa olemasta käyttöjärjestelmä vaikka siitä otettaisi Gnome pois. Ubuntu nimenä vain kertoo, minkälaisilla lisukkeilla Linux kyseisessä jakelupaketissa tulee.
Siis Linux ei lakkaa olemasta käyttöjärjestelmä vaikka Ubuntusta otetaan GNOME pois. Ubuntu on Canonicalin omistama tavaramerkki, brändi eli nimi, jonka idea on luoda käyttäjille mielikuvia ja tietoa Canonicalin tuotteistamisesta.
Ubuntu on Linuxin jakelupaketti eli tietyllä tavalla tuotteistettu ohjelmistojärjestelmä joka käyttää Linux-käyttöjärjestelmää. Ubuntu on säädetty tietyllä tavalla oletuksena, että se on helppo ottaa käyttöön. Eli tämä tarkoittaa että on laitettu tietty taustakuva työpöydälle, valikot on lajiteltu tietyllä tavalla, WWW-selaimeen on laitettu tietyt kirjanmerkit oletuksena (Ubuntu forums, Canonical jne mitä nyt mainostuloihinkin tarvitaan kuten Jamendo), GNOME:lle on laitettu tietty teema. GNOME on valittu oletustyöpöytäympäristöksi (tai ainoaksi) jne.
Eli tarkoittaa myös sitä että mitä ohjelmistoja on paketoitu asennuslevylle, mikä asennusohjelma on käytössä, kuinka ohjelmistot on jaettu paketteihin. Millä tavalla ohjelmistot on käännetty paketeiksi ja mitä pakettivarastoja lopulta siis voidaan käyttää (riippuen ohjelmistojen kääntötavasta) ja mistä ne voidaan ottaa käyttöön. Ja paljon kaikkea muuta kuin itse tekniikkaa. Jakelupaketti on melkein vain tuotteistamista tietyllä tavalla.
Sen vuoksi Linux-käyttöjärjestelmää käyttäviä ohjelmistojärjestelmiä alettiin kutsumaan jakelupaketeiksi (distributions) koska kuka tahansa pystyi paketoimaan avoimen lähdekoodin ohjelmistot omilla halutuilla säädöillä, niin että muut pystyivät vain lataamaan jakelupaketin (levykkeet siihen aikaan) ja asentamaan koko ohjelmistojärjestelmän. Säästääkseen aikaa ja vaivaa kootakseen koko ohjelmistojärjestelmän itse. Jos jakelupaketteja ei olisi, joutuisi jokainen Linuxia käyttävä kokoamaan ohjelmistojärjestelmän itse LFS (Linux From Scratch) menetelmällä. Se olisi viikkoja, jos ei kuukausia kestävä prosessi. Kuvitelkaa mikä työ kun jokainen ohjelmisto teidän täytyisi päivittää itse, ettekä voisi vain pakettihallinnasta ruksia päivityksiä ja klikata "Apply" tai ette voisi sitä kautta asentaa niitä.
Jakelupaketti vaikuttaa siis paljonkin siltä että mikä on pakettihallinnassa saatavilla. Sitä se pääasiassa onkin että jakelija huolehtii että ohjelmistot on valmiiksi käännettyjä paketteja palvelimilla ja käyttäjät voivat sitten vain asennella niitä helposti.
Siitä myös muodostuu Upstream <-> Downtream malli. Eli ohjelmistokehittäjät ovat Upstream, mistä jakelijat eli Downstream ottavat lähdekoodin ja paketoivat sen ja laittavat pakettivarastoihin (repositories) mistä jakelupakettien käyttäjät saavat ne itselleen.
Upstream <-> Downstream kuuluisi olla symbioosissa. Eli muutokset, parannusehdotukset ym kulkevat aina takaisin Upstreamiin missä tapahtuu kaikki kehitys.
Mutta tietyistä syistä huolimatta jotkut jakelijat (kuten Canonical) eivät halua edes auttaa yhteisöä, eivätkä palauta parannuksia upstreamiin. Tällöin kaikki parannusehdotukset ym jäävät Downstream <-> Käyttäjä välille. Käyttäjistä tuntuu että jakelija tekee hyvää työtä, mutta todellisuudessa koko avoimen lähdekoodin yhteisö kärsii asiasta.
Se on sallittua että tilanne olisi:
Upstream -> Downstream -> Käyttäjä
Mutta se ei ole oikein että tilanne on
Upstream -> Downstream <-> Käyttäjä
Kaikkein parasta on kun tilanne on
Upstream <-> Downstream <-> Käyttäjä.
Tai että se on peräti:
Upstream -> Downstream -> Käyttäjä -> Upstream (muodostuu siis lenkki).
Canonical on nyt nimenomaan "Upstream -> Downstream <-> Käyttäjä" -tilanteessa. Canonical edesauttaa vain itseään, ja Ubuntun käyttäjät edesuattavat vain itseään, mutta ei avoimen lähdekoodin yhteisöä.
Melkein pelkästään tuon takia Ubuntu on hyvin vahingollinen Linux-yhteisölle koska kun Ubuntu hankkii käyttäjiä, se sitoo ne itseensä markkinoinnillaan ja toteutuksillaan. Canonical jopa pyrkii kaiken heidän kehittämiin ohjelmistoihin (Bazaar jne) hankkimaan tekijänoikeudet, joka sallii Canonicalin sulkea lähdekoodi tulevaisuudessa. Tämän vuoksi FSF (Free Software Foundation) ei hyväksy Canonicalin kehitysmallia ja lisenssointia.
Asiaa voi ajatella myös niin että jos Ubuntusta karsitaan yksitellen osia pois, niin missä vaiheessa se lakkaa olemasta käyttöjärjestelmä? Itse sanoisin että tämä tapahtuu jo ennen kuin ollaan karsimassa itse Linux-ydintä.
Linux kernel ei lakkaisi olemasta käyttöjärjestelmä tuolloinkaan. Ainoastaan Ubuntu lakkaisi olemasta käyttökelpoinen tietyissä asioissa. Niin kauan kuin on käynnistyslataaja joka käynnistää käyttöjärjestelmän suorituksen niin käyttöjärjestelmä toimii. Tietenkin jotkut BIOS:it tai EFI:t osaavat etsiä suoraan käyttöjärjestelmän imagen ja käynnistää sen suoritusen ilman käynnistyslataajaa, mutta kaikki Linuxin jälkeen käynnistyvät prosessit ovat käyttöjärjestelmään kuulumattomia.
Linux-käyttöjärjestelmän ensimmäinen käyttöjärjestelmän ulkopuolinen prosessi joka käynnistyy on INIT. Joka sitten ottaa vastuulleen käynnistää muita järjestelmäsovelluksia kuten käynnistys-scripteissä on säädetty.
Kaikki muut prosessit kulkevat jatkuvasti INIT:in kautta.
Edelleenkin pelkästään Linux voidaan laittaa sulautettuun järjestelmään ja käyttöliittymänä toimii fyysiset ohjaimet ja joku valotaulu. Se on vain ohjelmoijasta kiinni haluaako hän helpottaa työskentelyään ja ottaa mukaan jotain muita ohjelmistoja eikä tehdä kaikkea suoraan käyttöjärjestelmään. Nimittäin ohjelmoimalla oman sovelluksen joka suorittaa asioita ja käyttää vain käyttöjärjestelmää on helpompaa kuin ohjelmoida käyttöjärjestelmään halutut toiminnot.
Kyse on ohjelmistopinosta ja mitä korkeammalle tasolle mennään niin sen helpompaa on kun voidaan käyttää alempien tasojen toimintoja, eikä itse tarvitse luoda kuin sellaisia mitä ei ole olemassakaan.
Onko bensa sitten auton osa, autolla kun ei tee mitään ilman bensaa???
GNU- ja nähtävästi monien Ubuntu-fanien (myös tuo >30%) mukaan niinhän se olisi.
Aivan kuten tietokoneella ei tee mitään ilman sähköä, joten sähkövoimala on osa tietokonetta.
Vaikka auto ei kulje ilman polttoainetta (bensiini, diesel, sähkö ym) niin ne eivät ole osa autoa. Auto on auto ilman niitäkin, vaikkakin toimimaton.
Vaikka tietokone ei toimi ilman sähköä niin sähkö ei ole osa tietokonetta. Tietokone on tietokone ilman sitäkin, vaikkakin toimimaton.
Vaikka puukiuas ei toimi ilman klapeja, niin klapit eivät ole osa puukiuasta. Puukiuas ei vain lämpene ilman klapeja.
Silti ilman autoa me voimme käyttää polttoainetta erilaisiin asioihin, kuten akrigaatin käyttämiseen että saamme sähköä.
Ilman tietokonetta voimme käyttää sähköä vaikka valaisemaan talon.
Ja ilman kiuastakin me voimme käyttää klapeja lämmmittämään talon.
En sanoisi että suorittaa, korkeintaan käynnistää.
Käynnistää suorituksen ja prosessori sitten laskee sovelluksen laskut. Käyttöjärjestelmä operoi kaikkia prosesseja että mikä prosessi saa kuinkakin monta kellojaksoa prosessorilta.
Ehkä joitakin auttaisi ymmärtämään käyttöjärjestelmä jos se kuvitellaan kuin vanhan ajan puhelinoperaattoriksi jotka istuivat puhelinkeskuksissa. Puhelinoperaattori vastasi puheluun, kuunteli että kenelle soittaja haluaa puhua ja sen jälkeen puhelinoperaattori kytki puhelun vastaanottajalle. Kun puhelu loppui, irroitettiin taas piuha.
Yksi operaattori kykeni käsittelemään vain hyvin rajallista määrää puheluita (prosesseja). Ja mitä useampaa oikeastaan piti operoida, niin sen hitaammaksi kävi vastata ja sulkea yhteyksiä.
Nykyäänhän noita tehtäviä hoitaa enään yrityksien puhelinkeskuksissa olevat henkilön joihin kannattaa soittaa jos ei tiedä kenelle pitäisi soittaa yrityksessä. Yhdysvalloissa vielä on kuitenkin puhelinoperaattoreita maalinjoillekin että jos antaa soida tarpeeksi kauan niin saa operaattorin langan päähän. On olemassa joitakin matkapuhelinvalmistajia jotka tarjoaa senioripuhelimia mitkä toimii siten että puhelimessa on vain yksi nappi ja sitä painamalla puhelin soittaa operaattorille jolle seniori voi kertoa että kenelle haluaa soittaa ja operaattori yhdistää. Ei joudu opettelemaan laitetta ja saa aina yhteyden. Joudutaan vain kertomaan operaattorille ne tietyt numerot ja henkilöt (poika, tytär jne).
Mutta käyttöjärjestelmä toimii juuri tuollaisena että se prosessoi kaikkia prosesseja että ne saavat suoritusaikaa prosessorilta. Se järjestelee että mille ytimelle mikäkin prosessi saa aikaa ja kauanko, mikä prosessi on seuraavaksi ja kauanko se saa jne. Minkä verran keskusmuistia prosessi saa ja missä se sijaitsee. Saako se lisää keskusmuistia ja kun prosessin suoritus loppuu niin keskusmuisti vapautetaan taas.
Käyttöjärjestelmä on myös vastuussa siitä että saako mikäkin prosessi kommunikoida millekkin prosessille. Eli jos sovellus haluaa ottaa yhteyden tiettyyn ohjelmistokirjastoon, täytyy käyttöjärjestelmän hyväksyä se ja avata "yhteys" niiden välille. Ja jälleen kerran käyttöjärjestelmän täytyy huolehtia että kirjasto ladataan tiedostojärjestelmästä keskusmuistiin ja se saa suoritusaikaa jne.
Eli ohjelmisto, joka välittää informaatiota vain toisten ohjelmistojen välillä (kuten kirjastot) ei kuulu käyttöjärjestelmään (tämän määritelmän mukaan).
Siis käyttöjärjestelmä huolehtii siitä että sovellus saa yhteyden toiseen sovellukseen tai kirjastoon. Ja kirjasto sisältää toimintoja joita sovellus itse voi hyödyntää.
Eli jos on ohjelmistokirjasto A joka osaa vaikka pakata ääntä tehokkaasti, niin ohjelmistokehittäjän ei tarvitse itse kirjoittaa sovellukseensa B1 äänenpakkauksen toimintoa tai omaa ohjelmistokirjastoa B2 joka sisältäisi tuon äänenpakkauksen, vaan ainoastaan kutsuu B1:sta tuota A:ta. Käyttöjärjestelmä varmistaa että toimintoon on aikaa (tai oikeus) ja käynnistää koko operaation ja vahtii sen toimintaa että muutkin prosessit toimivat.
Se että B1 tarvitsee A:n, ei tee A:sta mitenkään B1:n osaa tai käyttöjärjestelmän osaa.
Jos käyttäjärjestelmä on A, niin ohjelmistokirjastoja voisi olla B1, B2, B3. Ja sovellusohjelmistoja voisi olla C1, C2, C3, joista C2:lla ja C3:lla on omat ohjelmistokirjastot (C2a, C2b, C3a, C3b). Niin meillä olisi sitten sellainen kokonaisuus kuin
A+B1+B2+B3+C1+C2+C2a+C2b+C3+C3a+C3b
A on kaikkein välttämättömin kaikille. Se mahdollistaa B-C:n toiminnan.
Vaikka C2 vaatii toimiakseen A:n sekä B2:n ja B3:n niin B2 tai B3 eivät ole osa A:ta tai C2:sta.
Tuo A-C pino on ohjelmistojärjestelmä. Ja tuo ohjelmistojärjestelmä voisi olla saatavilla viideltä eri taholta. Jokainen tekisi omat säädöt että kuinka C1, C2 ja C3 toimivat oletuksena. Nuo viisi olisi tuolloin viisi eri jakelua. Ja kun jokainen jakelija on vapaa lisäämään ohjelmistokirjastoja tai sovellusohjelmia sekä säätämään niiden oletussäätöjä niin siinä tulee nopeasti hyvin erilaisia ohjelmistojärjestelmiä mitä erilaisimpiin tilanteisiin mihin ne olisi helposti asennettavissa jokaisen jakelijan mukaisesti. Tai sitten jokainen käyttäjä voisi itse ladata jokaisen (A, Bx, Cx jne) ohjelmiston itse ja kääntää ja virittää toimimaan.
Onko MS-DOS käyttöjärjestelmä? Onko UNIX käyttöjärjestelmä? Molempiin näihin kuuluu osia jotka tekevät muutakin kuin kommunikoivat laitteiden kanssa tai jakavat ohjelmille muistia.
Kukaan ei kiellä ohjelmoimasta käyttöjärjestelmään toimintoja jotka eivät käyttöjärjestelmän määritelmään kuulu. Mutta se on vain typerää lisätä jotain käyttöjärjestelmään mitä ei siinä tarvita. Se tuo vain ongelmia.
Tästä on erinomainen esimerkki Microsoftin tapa lisätä käyttöjärjestelmiinsä toimintoja joita kukaan muu ei koskaan olisi tehnyt.
Ja tämä on juuri se eräs ratkaiseva asia joka sai alunperin koko Server-Client arkkitehtuurin kehityksen käyntiin, nimittäin alunperin käyttöjärjestelmät olivat kaikki monoliittisia. Niiden koko pysyi hyvin hallittavana ja toiminta oli varmaa. Mutta kun laitteiston tarjoamat rajoitukset (keskusmuisti ja tallennustila) katosivat, lähti ns. mopo käsistä ja käyttöjärjestelmät alkoivat kasvamaan. Sen sijaan että käyttöjärjestelmä oli enää 32-64 tuhatta riviä koodia, ne sisälsivätkin miljoonia rivejä.
Yksi bugi saattoi kaataa koko käyttöjärjestelmän ja samalla koko ohjelmistojärjestelmä kaatui.
Syntyi idea että pilkotaan monoliittinen käyttöjärjestelmä osiin, yksinkertaiseen mikrokerneliin ja erillisiin servereihin.
Idea oli sama kuin laivoissa on erilliset osastot. Et sinä halua että kun kapteenin vessa hajoaa niin laiva uppoaa koska pohjaventtiilit ja kapteenin vessa on kytköksissä toisiinsa.
Erillinen mikrokerneli joka on hyvin yksinkertainen, vain muutamia tuhansia rivejä koodia. Ja sitten jokainen käyttöjärjestelmän toiminto (muistinhallinta, tiedostojärjestelmät, laiteajurit, I/O ym) tulivat omiksi palvelimiksi. Nuo palvelimet voitiin joko pitää kernel spacessa tai sitten siirtää user space puolelle muiden ohjelmistojen sekaan. Kuitenkin kaikki palvelimet suojattiin muilta palvelimilta ja muita prosesseilta että ne ajettiin supervisor moodissa ja ne olivat suojattuina prosesseina mikrokerneliin joka operoi niitä.
Sitten sovellukset itsessään käytti näitä palvelimien tarjoamia käyttöjärjestelmäpalveluja itse.
Mutta kukaan ei kieltänyt ohjelmoimasta vaikka WWW-selainta (tai sellaisen tarvitsemia kirjastoja) osaksi käyttöjärjestelmää omiksi palvelimiksi. Muut sovellukset sitten pystyivät mukamas helposti hyödyntämään näitä kirjastoja kun piti jotain HTML:ää parsia tai javascriptiä suorittaa.
Mutta heti kun löytyi haavoittuvuus tuollaisista toiminnoista, niin koodi suoritettiin käyttöjärjestelmän oikeuksin ja kaikki prosessit olivat vaarassa.
Kukaan ei kiellä työntämästä käyttöjärjestelmään muita toimintoja kuin vain prosessinhallinnan, muistinhallinnan jne. Mutta se ei ole millään tavoin järkevää.
Monoliittisen käyttöjärjestelmän kohdalla se on vain helpompaa pitää puhtaana ja ylläpitää käyttöjärjestelmän toimintoja. Server-Client arkkitehtuurissa taas se on hankalampaa jo saada mikrokernel toimimaan. Mutta teoriassa Server-Client on turvallisempi kuin monoliittinen, vaikkakin käytännössä eroa ei ole.
Vakauskin saadaan monoliittisessa käyttöjärjestelmässä sellaiseksi että yhden palvelun kaatuminen (esim tiedostojärjestelmä tai laiteajuri) ei kaada koko käyttöjärjestelmää. Tuohon auttaa jo paljon modulaarisuus mutta voidaan tehdä sisäisiä toimintoja jotka eristää kaatuvat palvelut muista monoliittisen käyttöjärjestelmän toiminnoista.
Server-Client arkkitehtuurin käyttöjärjestelmän yksi akilleen kantapäistä on ollut nopeus. Se ei salli yhtä nopeaa suoritusta kuin monoliittinen kun muodostuu ns. IPC overhead.
UNIXissa on erikseen käyttöjärjestelmän ydin, eli kerneli. Linux on ydin, eli kerneli, (katso vaikka kernel.org), mutta minkä ydin se on?
Unix (Unix koostuu monesta käyttöjärjestelmästä, se on vain tapa ja filosofia tehdä käyttöjärjestelmä, ei itse käyttöjärjestelmä. Linux on Unixin uusi tuleminen) on monoliittinen käyttöjärjestelmä.
Unix voidaan toteuttaa joko monoliittisen tai server-client arkkitehtuurin mukaisena käyttöjärjestelmänä. Unix on määritelmä järjestelmäkutsuja mitä täytyy käyttöjärjestelmän toteuttaa. Unix-yhteensopivuus voidaan tarjota monella muulla tavalla myös.
Esimerkiksi Microsoft lisäsi NT-käyttöjärjestelmään Unix-yhteensopivuuden, uskoen että voisi kaapata Unix-palvelimilta markkinat. Toisin vain kävi nimittäin se ei toiminut kunnolla. Ja Linux veikin markkinat Unix-yhteensopivuutensa vuoksi.
Linux on kyllä kernel mutta se ei ole mikrokernel. Ihmiset sekoittavat että käyttöjärjestelmä on aina kernel + X. Mutta eivät tiedä käyttöjärjestelmien historiaa eivätkä toimintatekniikkaa joten uskovat helposti aina että koska Linux on kernel niin se ei voi olla käyttöjärjestelmä. Koska eivät tiedä että monoliittinen kernel sisältää kaikki käyttöjärjestelmän toiminnot itsessään, kun taas Server-Client arkkitehtuurissa käyttöjärjestelmä koostuu mikrokernelistä ja palvelimista. Server-Client arkkitehtuurissa mikrokernel on "vain kernel" ja käyttöjärjestelmä on (mikro)kernel + X, missä X on palvelimet.
Ja tuolla mitä Fri13 lainaa on Andrew S.Tanenbaumin "Modern Operating Systems" kirjasta, joka on eräs yliopistojen peruskirja käyttöjärjestelmien kursseilla.
Käyttöjärjestelmät eivät ole mikään yksinkertainen aihe, eikä todellakaan sellainen mistä voidaan tehdä vain lyhyt ja kattava selostus. Faktan voi sanoa suoraan "Linux kernel on käyttöjärjestelmä ja Ubuntu on sen käyttöjärjestelmän jakelupaketti" ja "Ubuntu ei ole käyttöjärjestelmä vaan Linux kernel on käyttöjärjestelmä". Mutta kun monikaan ei ymmärrä miksi niin on niin se tuottaa paljon riitaa kun aletaan inttämään markkinoinnin luomilla mielikuvilla että Ubuntu on käyttöjärjestelmä tai että Linux on "vain kernel" ja käyttöjärjestelmä on jotain muuta.
Jos haluaa olla rehellinen ja kunnioittava koko avoimen lähdekoodin (etenkin Linuxin) yhteisöä kohtaan, niin silloin täytyy pyrkiä siihen että kaikki laiteajurit ja ohjelmistot tehdään Linuxille ja LSB-standardin mukaiseksi. Ubuntulle ei pidä tehdä yhtään mitään, eikä asia muutu vaikka olisi jokin toinen jakelupaketti kyseessä. Nimittäin se on kaikkien Linux käyttäjien oikeuksien riistämistä ja vapauden sortoa.
Jos haluaa avoimen lähdekoodin ohjelmistoille käyttäjille ja etenkin Linuxille, niin älkää puhuko mistään "Ubuntu-käyttöjärjestelmä":stä, nimittäin sellaista ei ole eikä koskaan tule olemaan jos ei Canonical nimenomaan ohjelmoi omaa käyttöjärjestelmää ja kutsu sitä Ubuntuksi. Mutta mitä luulette, kauanko Canonicallilla kestäisi saada oma käyttöjärjestelmä sille tasolle missä Linux on nyt? Kuka haluaisi alkaa tukemaan jotain Canonicalin käyttöjärjestelmää kun Linuxia kehittää tuhannet yritykset ja sadat tuhannet kehittäjät?
Linux pyörittää supertietokoneita, ADSL-modeemeja, Internetin runkoreitittimiä, älypuhelimia, televisioita, pöytäkoneita ym.
Vaatikaa Linux-yhteensopivuutta, älkää puhuko mitään Ubuntustua kun täytyy puhua käyttöjärjestelmistä.