Eksamen høst 2002 Operativsystemer og UNIX Le.~ nøye gjennom oppgavene før du begynner og pass på å besvare alle spørsmålene. Alle trykte og skrevne hjelpemidler er tillatt. Oppgavene vil ikke bli vektlagt likt ved sensur. En sannsynlig fordeling er at oppgave 1 teller 10%, oppgave 2 teller 15%, oppgave 3, 4' og 5 teller 25%. Innenfor hver oppgave vil deloppgavene telle omtrent likt. De som ønsker det kan besvare oppgavene eller deler av oppgavene på engelsk. Sett gjerne egne forutsetninger dersom du synes oppgave teksten er uklar. Beskriv forutsetningene og løs oppgaven utifra dem. Oppgave 1 I denne oppgaven skal du i delspørsmål a) og b) løse problemet ved å angi en kommando på en linje; slik du ville ha tastet den inn til bash på en Linux-maskin fra tastaturet (du svarer f.eks. mkdir kat hvis du blir spurt: Opprett en katalog med navn kat). a) Gi en kommando som endrer på navnet til en fil i katalogen du står fra current.version til old.version. b) Gi en kommando som for filen readme.txt i katalogen du står gir: kun lese og skriverettigheter til eieren, kun leserettigheter til gruppen og ingen rettigheter til andre brukere. c) I en tom katalog med navn - /tmp utføres følgende Unix-kommandoer: $ cp /proc/cpuinfo. $ _dir hosts $ cp /etc/paasvd passvd $ cp /etc/hosts hosta S _dir info S!DY cpuinfo info $!DY info hosta Tegn en liten skisse som viser katalogstrukturen under kommandoene er utført. d) Du gjør følgende i et bash-shell og får kun den output som du ser -/tmp med navn på alle kataloger og filer etter at disse $ cd /tmp $ cd tmp 2> /dev/null $ cd tmp 2> /dev/null $ /bin/pvd /tmp $ Angi tre forskjellige katalogstrukturer under /tmp som vil gi dette resultatet. Oppgave 2 Lag et bash-script pidkill som tar ett argument fra kommandolinjen og betrakter argumentet som en prosesspm. Hvis ingen eller flere enn ett argument gis. skal scriptet avslutte med en passende feilmelding. Ellers skal scriptet drepe alle prosesser som har en PID som er høyere enn den som er gitt ved argumentet. Kun prosesser som eies av den som kjører scriptet skal drepes. Ved f. eks. $ pidkill 1456 skal alle prosesser brukeren eier som har pm høyere enn 1456 drepes. For hver prosess som drepes, skal det gis en melding om det til skjermen. Unngå at scriptet dreper seg selv og eventuelle prosesser det selv starter. Output fra kommandoen ps aux ser slik ut:
USER PID XCPU XMEM vsz ass TTY haugerud 3671 0.0 0.1 5748 1616? haugerud 3672 0.0 0.1 2260 1304 pts/l Oppgave 3 STAT START S 08:31 S 08:31 TIME COMMAND 0:00 /usr/sbin/sshd 0:00 -ba,sh a) En CPU bruker 20-bits registere til å adresser en byte i internminnet. adresseres? Hvor mange r..1bytes kan da b) Hvilken av lagringsenhetene RAM, register og harddisk bruker CPU henholdsvis kortest og lengst tid på å hente en byte fra? c) Hva er linking av programmer? Forklar kort d) Hva er et dynamisk bibliotek. Forklar kort. e) Du har filen Kernel. class i hjemmekatalogen din på en Linux-maskin og kjører den med $ java Kernel. Etter en stund er programmet helt uvirksomt, men ikke ferdig med å kjøre. OS slipper andre til ved å fjerne det helt fra minnet ved hjelp av paging. Hvor legger da OS alt som fjernes fra minnet? f) Swa~partisjonen har under Linux et litt anderledes filsystem enn partisjoner som brukes til vanlige filer. Hva er grunnen til det? g) Forklar kort hvorfor du kan kjøre den samme Java byte-koden på en Intel Windows-PC som på en Sull Unix-maskin. h) Du kompilerer et C-program på en Intel Windows-PC og får en exe-fil. Du kopierer denne til en Sun Unix-maskin og kjører den der. Forklar kort hvorfor programmet ikke vil virke. i) Forklar kort hva systemkallet fork() Kiør. j) Anta at du kjører følgende perl-script.! /bin/perl print "\mork() er komplisert Si. 1; Spid. fork(); Si++; if (Spid - O) sleep(5); print lia: i. $i\n"; Si++; print "B: i. Si\n" Spid. fork(); if (Spid.. O) sleep(5) j print "c: i. $i\n" \n" Angi hva output fra scriptet blir med tidspunkt siden scriptet startet (anta det ikke kjøres noe annent samtidig) i hele sekunder for hver linje. Start slik: fork() er kollpliaert (O sek.) 2
Oppgave 4 I denne oppgaven skal du skrive tre Perl subrutiner som skal kjøres på en Linux-maskin og som skal brukes i neste oppgave (ikke skriv dem på nytt der!). Alle subrutinene skal benytte lokale variabler. a) Lag en Perl-subrutine g~tfile() som tar ett filnavn som argument. Subrutinen skal returnere en streng som begynner med en linje hvor det står FILE: filnavn der filnavn er navnet som er gitt i argumentet. Resten av strengen som returneres skal være innehaidet av filen. Hvis filen ikke kan åpnes for lesing, skal strengen som returneres kun inneholde FILENOTFOUND: Can't open file filnavn der filnavn er navnet som er gitt i argumentet. b) Lag en Perl-subrutine getcommand () som tar en skalar streng som argument. Subrutinen skal returnere en streng som begynner med en linje hvor det står COMMAND : ko~do der kommando er strengen som er gitt i argumentet. Resten av strengen som returneres skal inneholde output som denne kommandoen gir når den kjøres på Linux-maskinen. c) Lag en Perl-subrutine getip() som skal returnere maskinens lp-adresse om den klarer å finne den og strengen "lp unknown" om den ikke finner den. Subrutinen skal finne lp-adressen ved å bruke programmet /sbin/ifconfig. Output fra dette programmet inneholder bl. a. en linje inet addr:128.39.89.9 Bcast:128.39.89.2SS Mask:2SS.2SS.2SS.0 der tallet 128.39.89.9 er maskinens lp-adresse. Dette er den første linjen "inet addr". Oppgave 5 output som inneholder strengen Etter din avsluttende eksamen ved Il7 spredte ryktene seg om dine glitrende resultater og du fikk snart et tilbud om jobb ved Microsofts hovedkontor i Seattle. Første dag på jobb kom selveste Bill Gates innom kontoret ditt og fortalte at de hadde valgt deg p.g.a. ditt kjennskap til Linux. Han fortalte at de nå kontinuerlig mottok informasjon fra alle i verden som hadde installert Windows XP, men at de visste for lite om den lille men potensielt farlige konkurrenten Linux. De hadde laget en såkalt MISS (Microsoft Information Spy Server) som skulle stå og kjøre på maskinen miss.mictosoft.com og du fikk utlevert MISS sin kildekode: I! /bin/perl uae IO::Soc:ket::DlETj use Crypt::CBCeasy; Smy_key. "miss"; my Sserver_port = 6686; 's.rver - IO::Socke~::IHET->nev(LocalPor~ a> 'server_port. buse -> 1. Lis~en => 5) or di. "Can'~ 8~art MISS a~ port 's.rver_port\n" j 3
SBUFFSIZE.1000000; print "Starting HISS on port Sserver_port.\n" vhile <$client. $server->accept(».buffer. ""; vhile(true) recv(sclient.snevbuffer.$buffslze."o") i Sbuffer.- $nevbufferi last if (Sbuffer 8- s/endoftranskissions/ /) *buffer = Blovfish::decipher(*my_key.*buffer) open(fil. "»LinuxWorld. log") i print FIL Sbuffer; clo.e(fil); Det var viktig at informasjone skulle krypteres, slik at ingen fant ut hva som foregikk. Gates gav deg så i oppdrag å skrive en klient som skulle kunne kjøres på en hvilken som helst Linux-maskin i verden og sende informasjon om maskinen den kjørte på til spy-serveren på miss.microsoft.com. Han fortalte et en samarbeidspartner ved navn Kram Segrub hadde skrevet et GPL-program enignefc som er med i alle Linux-distribusjoner og som skulle sørge for at din klient ble startet en gang hver time. Siden du var nyansatt, skulle du få hele 40 minutter på oppgaven. Skriv en slik Perl-klient som gjør følgende (bruk subrutinene fra oppgave 4). Sender en kryptert rapport til MISS på miss.microsoft.com slik at MISS kan dekryptere og lagre den. Hvis klienten kjører på maskinen tube. skall. linje i rapporten se slik ut: REPORT: from tube (128.39.74.16) on \Ved Dec 1114:40:21 2002. Deretter skal følgende informasjon sendes: 1. En fil som inneholder navn og info om alle brukere på systemet 2. En fil som inneholder info om CPU'en: modell, klokkefrekvens, etc.. 3. Output fra en kommando son gir info om nettverkskortet: ethernettadresse, lp-adresse, netmask~ etc. 4. Output fra en kommando som gir en linje med OS-navn, versjon, etc. 5. Output fra en kommando som gir en detaljert listing av alle prosesser 6. Output fra en kommando som gir informasjon om tjenesten telnet er tilgjengelig. Før innholdet i filene skal det sendes en linje: FILE: filnavn (FILENOTFOUND: filnavn hvis den ikke kan leses). Før output fra kommandoene skal det sendes en linje: COMMAND: kommando-navn. Etter at informasjonen er sendt. skal klienten bryte forbindelsen og avslutte. Heldigvis hadde du allerede skrevet Perl-subrutiner som hentet lp-adresse samt innhold i filer og output fra kommandoer på det formatet som var ønsket (forrige oppgave), så du kan bruke disse subrutinene i programmet (ikke skriv dem inn på nytt!). -SLUTT- 4