Oppgave 1 - Kommandolinjen (10%)
a) Hva er feil i denne bash-kommandoen:
$filinfo = ls -l fil.txt
b) I bash gir ls -l
følgende i en mappe:
-rw-r--r-- 1 hh staff 10686 Apr 28 11:43 h.texForklar kort ut ifra dette hvordan rettighetene er satt for denne filen og hvilke brukere som har disse rettighetene.
c) Skriv en bash-kommando som setter samme rettigheter til filen h2.tex
som filen h.tex
i forrige deloppgave hadde.
d) Hva blir output av følgende bash-kommando?
echo "en to tre" | sort | grep to | grep tre
e) Hva blir output av følgende bash-kommando?
for tall in $(seq 1 5); do echo -n $tall; done
f) Anta at fil.txt
er en Windows tekstfil i mappen du står i. Hva gir følgende PowerShell-kommando?
PS> ls fil.txt | Get-Member
Oppgave 2 - Prosesser og scheduling (20%)
a) Linux-kjernen konfigurerer vanligvis hardware-timeren til å sende et interrupt hvert hundredels sekund. Forklar kort hvorfor dette timer-interruptet er nødvendig for at Linux-kjernen skal kunne fordele CPU-tid mellom alle prosessene uten at en av disse prosessene kan ta over styringen.
b) En hardware-timer deler tiden inn i jiffies eller ticks. En jiffy er tiden mellom hvert interrupt mellom fra timeren, ett hundredels sekund i eksempelet i forrige delspørsmål. Forklar kort hvordan et operativsystem kan prioritere prosesser forskjellig ved hjep av denne tidsinndelingen.
Tre 100% CPU-avhengige prosesser A, B og C kjører på en Linux-PC med kun én CPU. Ved starten av en epoke er alle tre klare til å kjøre og de er de eneste prosessene i ready-list. Prosess A har en tildelt timeslice på 30 ticks/jiffies, B har 20 og C har 10.
c) Forklar kort hvordan disse prosessene kjøres og hvordan fordelingen av CPU-tid vil skje for disse tre prosessene i løpet av epoken. Anta at det ikke forekommer andre interrupts enn fra timeren og at prosessene ikke gjør noen systemkall.
d) Forklar kort hvor mange timer-interrupts og context switches som vil skje i denne epoken.
e) Hva skjer når epoken er over? Vil prosessene nødvendigvis få tildelt samme antall ticks som før? Forklar kort.
f) Linux 2.6 kjernen deler dynamisk prosessene inn i 140 forkjellige prioritetsklasser.
Hver prioritetsklasse tilsvarer et antall tildelte ticks i starten av en epoke.
Hver gang scheduleren kalles, velges prosessen som
har høyest prioritet og den kjører til den har brukt opp alle sine tildelte ticks. Deretter kalles scheduleren på nytt. Men hvis det i løpet av epoken kommer et
interrupt, for eksempel fra tastaturet, vil et flagg need_resched
bli satt og scheduler på grunn
av dette kjøres etter neste timer-tick. Forklar kort
hvorfor need_resched
er viktig for at interaktive prosesser skal ha rask responstid.
g) Forklar kort med bakgrunn i forrige delspørsmål omtrent hvor lang tid det maksimalt vil ta fra en bruker taster et tegn på tastaturet til det synes på skjermen når en teksteditor kjører under Linux 2.6 kjernen. Hvordan vil en endring av lengden av en jiffy påvirke tiden det tar?
h) Anta at den minste mulige time-slice en prosess kan tildeles er 10 ticks = 100ms.
Prosesser i laveste prioritetsklasse vil da ha 10 ticks. Anta videre at de eneste aktive prosessene er
en teksteditor kjører samtidig med en regnejobb-prosess som er 100% CPU avhengig.
Regnejobben havner derfor raskt havne i laveste prioritetsklasse.
Hvis 2.6 kjernen ikke brukte need_resched
, omtrent hvor mange millisekunder ville det
gjennomsnittlig ta fra et trykk på tastaturet til et tegn vises i teksteditoren? Omtrent hvor mange millisekunder ville
det gjennomsnittlig ta når need_resched
brukes? Forklar kort.
Oppgave 3 - Prosesser og CPUer (25%)
Følgende Perl-script sum.pl
kjører en CPU-intensiv subrutine run()
som
utfører en regneoppgave. Den bruker en Perl-modul som har en funksjon gettimeofday()
som
returnerer et flyttall som er antall sekunder som har gått siden 1/1-1970. Dermed vil det når
subrutinen run()
har blitt kjørt ferdig skrives ut en linje som sier hvor mange sekunder det har
gått siden scriptet startet.
#! /usr/bin/perl use Time::HiRes qw(gettimeofday); $start = gettimeofday(); # Starter kjøring sum.pl run(); # kjøring avsluttet sub run(){ for ($i = 0;$i < 10000000;$i++){ $tall = ($i + 1)*($i + 1) - $i*$i; } $slutt = gettimeofday(); $tid = $slutt - $start; printf("Ferdig etter %4.2f sekunder\n",$tid); }
Når dette scriptet kjøres på tre forskjellige maskiner:
Tre andre Perl-script sum1.pl
, sum2.pl
og sum3.pl
er identiske bortsett
fra koden mellom kommentarene "Starter kjøring" og "kjøring avsluttet" som ser slik ut:
# Starter kjøring sum1.pl run(); run(); # kjøring avsluttet |
# Starter kjøring sum2.pl $pid = fork(); if($pid == 0){ run() } else{ run(); } # kjøring avsluttet |
# Starter kjøring sum3.pl $pid = fork(); if($pid == 0){ run() } else{ fork(); run(); } # kjøring avsluttet |
Scriptene sum1.pl
, sum2.pl
og sum3.pl
kjøres på hver av maskinen A, B og C og det
gir de ni forskjellige output som vist under. Din oppgave er på grunnlag av den gitte informasjonen å avgjøre
hvilke kombinasjoner av script og maskin som har gitt hvert resultat med en kort begrunnelse og
forklaring av output til hver.
a) Ferdig etter 7.31 sekunder Ferdig etter 7.34 sekunder Ferdig etter 7.36 sekunder
b) Ferdig etter 4.84 sekunder Ferdig etter 9.67 sekunder
c) Ferdig etter 18.39 sekunder Ferdig etter 18.53 sekunder Ferdig etter 18.58 sekunder
d) Ferdig etter 3.98 sekunder Ferdig etter 7.94 sekunder
e) Ferdig etter 11.80 sekunder Ferdig etter 12.50 sekunder
f) Ferdig etter 5.02 sekunder Ferdig etter 5.03 sekunder
g) Ferdig etter 4.01 sekunder Ferdig etter 4.05 sekunder Ferdig etter 4.05 sekunder
h) Ferdig etter 4.08 sekunder Ferdig etter 4.18 sekunder
i) Ferdig etter 6.24 sekunder Ferdig etter 12.49 sekunder
Besvarelsen skal altså bestå av ni linjer eller avsnitt av typen:
output 1: sum1.pl kjørt på C. Fordi C har fire CPU'er vil.... etc.Eksempelet er ikke riktig svar. Om du vil kan du gi en generell innledende forklaring slik at du ikke trenger å forklare så mye under hvert punkt.
Oppgave 4 - Scripting og internminne (30%)
a) Linux-kommandoen free
viser hvor mye ledig minnet det er og output kan se slik ut:
$ free -m total used free shared buffers cached Mem: 398 386 12 0 25 100 -/+ buffers/cache: 260 138 Swap: 349 57 292Her er buffers antall MBytes brukt til I/O buffere og cached antall MBytes brukt til disk-cache. Kjernen kan dynamisk minske sin bruk av I/O-buffere og disk-cache ved behov for minne til andre formål. Verdien 138 Mbytes i andre linje i free-kolonnen er
free + buffers + cached
fra første linje.
Forklar kort hvorfor dette er et tall som viser hvor mye minne som er ledig for applikasjoner.
b) Skriv et Perl-script free.pl
som fra output av kommandoen free -m
skriver ut
verdien som viser tilgjengelig minne for applikasjoner fra andre linje i free-kolonnen, tallet 138 i eksempelet i
forrige delspørsmål.
c) Skriv et bash-script som starter 10 instanser av programmet xcal
(en kalkulator). Etter at
en instans av xcalc
er startet skal scriptet vente i 10 sekunder og så skrive ut hvor mye av det
frie applikasjonsminnet som har blitt brukt opp siden scriptet startet. Scriptet skal bruke perl-scriptet free.pl
fra forrige delspørsmål til å finne tilgjengelig applikasjonsminne. Deretter skal det fortsette på samme
måte til alle 10 instansene har startet. Til slutt skal det stoppe alle kjørende xcalc
-prosesser.
Kan resultatet fra en kjøring av dette scriptet si noe om hvorvidt programmet xcalc
deler minne
med andre xcalc
prosesser?
d) I PowerShell gir ps | gm
blant annet følgende
PM AliasProperty PM = PagedMemorySize WS AliasProperty WS = WorkingSetSkriv et PowerShell-script som legger sammen PagedMemorySize og WorkingSet for alle Windows-prosessene som kjører og skriver ut den totale summen for begge verdiene.
e) Når du kjører scriptet, får du følgende output som viser totalt antall bytes:
WS: 257339392 PM: 497008640PagedMemorySize for en prosess er den delen av minnet til en prosess som er paged ut til disk (Windows page file). Hva er Working Set? Denne Windowsmaskinen har ca 360 MByte internminne. Sammenlign de totale summene WS og PM med størrelsen på totalt minne. Er det et problem om WS eller PM er større enn totalt minne?
Oppgave 5 - Perl sockets (15%)
a) Anta at du lager en Perl socket-server som lytter på port 9999. For hver gang det kommer en oppkobling leser serveren en linje fra socketen, sender linjen den mottok uendret tilbake og lukker oppkoblingen. Hvis du nå i en browser på en annen maskin skriver inn som URL:
http://host.domene:9999/unameder host.domene er Linux-maskinen du kjører serveren på, vil output i browseren bli:
GET /uname HTTP/1.1Ordet du skriver inn i browseren mottas altså av serveren og det serveren sender blir vist i browseren. Skriv en slik server slik at den gjør at du kan utføre Linux-kommandoer på Linux-maskinen Perl-serveren kjører på fra en hvilken som helst browser. For eksempel skal
http://host.domene:9999/psgi noe slik som
PID TTY TIME CMD 1841 pts/1 00:00:33 firefox 5042 pts/1 00:00:00 bash 11343 pts/1 00:00:00 s.pl
b) Når du eksperimenterer mer med den opprinnelige serveren finner du følgende:
http://host.domene:9999/ls -l gir GET /ls%20-l HTTP/1.1 http://host.domene:9999/"|>$<;'/ gir GET /%22|%3E$%3C;%27/ HTTP/1.1Bruk dette til å endre serveren slik at du også kan bruke mellomrom og de andre tegnene i kommandoene du sender fra browseren. Sørg i tillegg for at web-shellet får et passende prompt slik at
http://host.domene:9999/ls -lgir
Webshell$ ls -l totalt 120 -rw------- 1 haugerud syslog 249 2010-05-20 21:20 1cpu.txt -rwx------ 1 haugerud syslog 333 2010-05-20 20:22 sum1.pl -rwx------ 1 haugerud syslog 380 2010-05-20 20:22 sum2.pl -rwx------ 1 haugerud syslog 400 2010-05-20 21:23 server.pli browseren. Klarer du med denne serveren fra browseren å skrive et script på Linux-serveren og kjøre det? Forklar kort.
c) Diskuter kort de sikkerhetsmessige aspektene ved dette webshellet. Implementer en metode i serveren som gjør at du må sende med et egetdefinert passord i URL'en i browseren for å få utført en kommando.