For noen uker siden skrev jeg en artikkel om hvordan du kjører flere X-sesjoner uten virtualisering, som viste hvordan du kan kjøre flere skrivebordsmiljøer samtidig på samme datamaskin og bytte mellom dem med et trykk på en knapp. Jeg innrømmer at dette var noe av en oppvarming for det virkelige showet - hvordan du kjører flere Linux-distribusjoner samtidig uten å måtte håndtere ulempene med virtualiseringsprogramvare.

I dag skal vi bruke chroot til å behandle bestemte deler av ditt Linux-filsystem som (nesten) helt isolerte systemer. Dette kan la deg gjøre alle slags interessante ting, for eksempel å kjøre et fullstendig Gentoo-system fra innsiden av Ubuntu-systemet med lite eller ingen prestasjonsfeil.

Hvordan det fungerer

Før vi kommer i gang, vil det være en god ide å gå over nøyaktig hva vi gjør og hvordan alt fungerer. Når du starter opp Linux-datamaskinen, går du gjennom en rekke trinn for å starte opp. GRUB, bootloaderen din, laster kjernen som er angitt i GRUBs config-fil, legger den til rotpartisjonen din, og kjører init-skriptene som er lagret der. Fra da av går systemet ditt fra den rotte partisjonen.

Vi skal bruke et vert Linux-system (jeg skal gjøre det fra Debian, men trinnene skal være ganske identiske uavhengig av distribusjon) som går gjennom den normale oppstartsprosessen, men deretter behandler en viss del av filsystemet ditt ( som / mnt / gjest) som sin egen isolerte installasjon. Det gjeste systemet vil ikke gå gjennom oppstartsprosessen, vil ikke laste inn en kjerne, og vil ikke kjøre init-skript. Du forteller bare verten din "Koble til denne katalogen som om den er den nye rotpartisjonen". Diagrammet nedenfor skal bidra til å demonstrere hva jeg mener.

Dette er omtrent hvordan filene skal legges ut på systemet, bare sitte der som vanlige filer på en vanlig partisjon, behandlet det samme som andre filer til vi bruker "chroot" for å gjøre dem til noe spesielt.

Men når vi bruker chroot (CHange ROOT) og peker det til / mnt / guest (eller hvor vi legger filene i neste trinn), er denne katalogen nå et eget rotfilsystem. Det blir helt uvitende om vertssystemet. Alle programmer og kommandoer løper fra den nye roten kjøres basert på programvaren i den nye grenen.

Hvis du for eksempel er chrooted i / mnt / guest og skriver "ls", leser den kommandoen ls fra det chrooted miljøet, helt uvitende om "ls" -kommandoen på vertssystemet. Hvis du skriver "firefox", kjører den Firefox fra innsiden av den nye roten, uansett om du har Firefox installert på verten.

Komme og bruke gjestdistro

For å gjøre dette arbeidet trenger du bare basisfilsystemet til en Linux distro, uansett distro som kan være. Debian har et flott verktøy for nettopp denne formålet, kalt debbootstrap, som laster ned basfiler og plasserer dem der du vil. For å holde ting interessant, og å demonstrere hva chroot kan gjøre, skal vi bruke et Gentoo filsystem for vår gjest. For å holde ting enkelt og direkte, skal jeg inkludere nedlasting av tarball som en av trinnene vi skal gjøre på kommandolinjen.

Disse trinnene kommer til å laste ned alle basfiler for et Gentoo-system, trekke dem ut i vår målkatalog (jeg skal bruke / mnt / guest, men du kan bruke alt du liker) og deretter kaste inn i katalogen slik at den blir behandlet som Ny rot (/) katalog. Du kan trenge root (sudo) tillatelser for noen av følgende kommandoer.

 mkdir / mnt / guest cd / mnt / gjest wget http://distfiles.gentoo.org/releases/x86/2008.0/stages/stage3-x86-2008.0.tar.bz2 tar -jxvf stage3-x86-2008.0.tar.bz2 chroot / mnt / guest 

Disse kommandoene gjør følgende trinn, i rekkefølge av linjenummer:

  1. Opprett plass for vårt gjestesystem å leve
  2. Flytt inn i det rommet
  3. Last ned Gentoo systemfiler
  4. Trekk dem ut
  5. Behandle denne nye plassen som root (/) katalogen

Følgende skjermbilde skal bidra til å demonstrere at når vi har brukt chroot til å koble til vår nye katalog som rot, er den nå isolert fra forrige grener i filsystemtreet.

For å forklare skjermbildet, starter vi ved en vanlig ledetekst på vertssystemet. Jeg bruker pwd til å vise min nåværende katalog, der alle Gentoos filer sitter som ren gamle filer uten spesiell betydning. Jeg bruker deretter chroot til å behandle denne katalogen som den nye roten, og du kan nå se visuelt at spørringen min har endret seg fordi kommandolinjen nå drar all sin info (inkludert hvordan man tegner spørringen) fra Gentoos rotmiljø. ALLE kommandoer og handlinger jeg tar mens chrooted er avhengig av de kommandoene som finnes i det nye filtreet. Når jeg skriver pwd igjen, sier det ikke lenger / mnt / guest, fordi så vidt det skal vite, eksisterer ingenting annet enn det det ser i det treet.

Ting å huske på

Som jeg antydet ovenfor, er dette ikke 100% isolert fra vertssystemet. Det chrootede miljøet ble aldri "oppstartet", så det lastet aldri sin egen kjerne, og kjørte aldri sine egne init-skript. I vårt eksempel har vi Gentoo kjørt på kjernen som verten (i mitt tilfelle Debian) startet opp med.

Denne metoden er absolutt ikke en erstatning for virtualisering, og kan ikke gjøre alt VM-programvare kan gjøre. Gjestesystemet setter aldri "støvler" eller kjører init-skript, og det er mulig at gjestenes operativsystem krever at noen funksjoner ikke inneholder kjernekjernen.

Til hva?

I tiden jeg har nevnt denne teknikken til folk i fortiden, har de ofte sagt noe i tråd med "Det er kult, men hva vil du bruke det til?". Personlig har jeg funnet flere bruksområder for chroot :

  • Test utvikle programvare i et uberørt miljø
  • Kjør programvare ment for en annen distribusjon
  • Kjør programvare som krever en eldre eller nyere versjon av din nåværende distro
  • Få tilgang til en Linux-installasjon på en annen partisjon uten å måtte starte på nytt
  • Start en Live CD og bruk chroot til å reparere installasjonen eller GRUB
  • Tilgang til en stasjon hvor du har glemt brukeren / passet
  • Kjør en 32-biters app i et 64-biters miljø

Og jeg er sikker på at det er mye mer som jeg aldri har skjønt. Har du noen gang brukt chroot til å kjøre flere distroer? Hva med å reparere et Linux-system fra en Live CD? Gi oss beskjed i kommentarene.