For et par uger siden skrev jeg en artikel om, hvordan du kører flere X-sessioner uden virtualisering, hvilket viste, hvordan du kan køre flere skrivebordsmiljøer på samme tid på samme computer og skifte mellem dem med et tryk på en knap. Jeg indrømmer, at dette var noget af en opvarmning til det rigtige show - hvordan man kører flere Linux-distributioner samtidig uden at skulle klare ulemperne ved virtualiseringssoftware.

I dag skal vi bruge chroot til at behandle visse dele af dit Linux-filsystem som (næsten) helt isolerede systemer. Dette kan lade dig gøre alle slags interessante ting, som f.eks. Løbe et fuldt Gentoo system indefra i dit Ubuntu system med lidt eller ingen præstationstab.

Hvordan det virker

Før vi kommer i gang, ville det være en god idé at gå over præcis, hvad vi laver, og hvordan det hele virker. Når du starter din Linux computer, går du igennem en række trin for at starte op. GRUB, din bootloader, indlæser kernen, der er angivet i GRUBs config-fil, vedhæftes den til din rodpartition og kører init-scriptene der er gemt der. Derefter kører dit system fra den pågældende rodpartition.

Vi skal bruge et Linux-system til Linux (jeg skal gøre det fra Debian, men trinene skal være temmelig identiske uanset distribution), der går gennem den normale opstartsproces, men derefter behandler en bestemt del af dit filsystem ( lignende / mnt / gæst) som sin egen isolerede installation. Dette gæstersystem går ikke igennem opstartsprocessen, vil ikke indlæse en kerne, og vil ikke køre init scripts. Du fortæller blot din vært "Opret forbindelse til denne mappe, som om den er den nye rodpartition". Diagrammet nedenfor skal hjælpe med at demonstrere, hvad jeg mener.

Dette er omtrent, hvordan filerne vil blive lagt på dit system, bare sidder der som normale filer på en normal partition, behandlet det samme som andre filer, indtil vi bruger "chroot" for at gøre dem til noget specielt.

Men når vi bruger chroot (CHange ROOT) og peger det på / mnt / guest (eller hvor vi lægger filerne i næste trin), er denne mappe nu et eget rodfilsystem. Det bliver helt uvidende om værtssystemet. Alle programmer og kommandoer kører indefra, at den nye rod køres baseret på softwaren inde i den nye filial.

Hvis du for eksempel er chrooted i / mnt / guest og skriver "ls", læser den kommandoen "ls" inde fra det chrootede miljø, helt uvidende om kommandoen "ls" på værtssystemet. Hvis du skriver "firefox", kører den Firefox fra inde i den nye rod, uanset om du har Firefox installeret på værten.

Kom og brug gæste distro

For at gøre dette arbejde behøver du bare base filsystemet til en Linux distro, uanset distro, der måtte være. Debian har et godt værktøj til netop dette formål kaldet debbootstrap, som downloader basisfilerne og placerer dem, hvor du vil. For at holde tingene interessant, og for at demonstrere, hvad chroot kan gøre, vil vi bruge et Gentoo filsystem til vores gæst. For at holde tingene simple og direkte, vil jeg medtage downloaden af ​​tarball som et af de trin, vi vil gøre på kommandolinjen.

Disse trin skal downloade alle basisfiler til et Gentoo-system, udpakke dem i vores målkatalog (jeg bruger / mnt / gæst, men du kan bruge alt, hvad du vil) og derefter chroot ind i den mappe, så den behandles som den Ny rod (/) bibliotek. Du kan have brug for root (sudo) tilladelser for nogle af følgende kommandoer.

 mkdir / mnt / gæst cd / mnt / gæst 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 / gæst 

Disse kommandoer tager følgende trin i rækkefølge af linjenummer:

  1. Opret plads til vores gæstersystem til at leve
  2. Flyt ind i det rum
  3. Download Gentoo systemfiler
  4. Uddrag dem
  5. Behandl denne nye plads som root (/) biblioteket

Følgende skærmbillede skal medvirke til at vise, at når vi har brugt chroot til at forbinde vores nye mappe som root, er den nu isoleret fra de foregående grene i filsystemtræet.

For at forklare screenshotet starter vi ved en normal kommandoprompt på værtssystemet. Jeg bruger pwd til at vise min nuværende mappe, hvor alle Gentoos filer sidder som almindelige gamle filer uden særlig betydning. Jeg bruger derefter chroot til at behandle denne mappe som den nye rod, og du kan nu se visuelt, at min prompte er ændret, fordi kommandolinjen nu trækker hele sin info (herunder hvordan man tegner prompten) fra Gentoos rotmiljø. ALLE kommandoer og handlinger, jeg tager under chrooted, afhænger af de kommandoer, der findes i det nye filtræ. Når jeg skriver pwd igen, siger den ikke længere / mnt / gæst, for så vidt som den skal kender, eksisterer der intet andet end det, det ser indeni det træ.

Ting at huske på

Som jeg antydede ovenfor er dette ikke 100% isoleret fra værtssystemet. Det chrootede miljø blev aldrig "bootet op", så det lastede aldrig sin egen kerne og løb aldrig sine egne init scripts. I vores eksempel har vi Gentoo kørende på kernen, som værten (i mit tilfælde Debian) startede med.

Denne metode er bestemt ikke en erstatning for virtualisering, og kan ikke gøre alt, hvad VM-software kan gøre. Gæstersystemet aldrig faktisk "støvler" eller kører init scripts, og det er muligt, at din gæst OS muligvis kræver nogle funktioner, som din hostkern ikke tilbyder.

Hvorfor?

I de gange, jeg har nævnt denne teknik til folk i fortiden, har de ofte sagt noget i retning af "Det er sejt, men hvad vil du bruge det til?". Personligt har jeg fundet flere anvendelser til chroot :

  • Test udvikler software i et uberørt miljø
  • Kør software beregnet til en anden distribution
  • Kør software, der kræver en ældre eller nyere version af din nuværende distro
  • Få adgang til en Linux-installation på en anden partition uden at skulle genstarte
  • Start en Live CD og brug chroot til at reparere din installation eller GRUB
  • Få adgang til et drev, hvor du har glemt brugeren / passet
  • Kør en 32-bit app i et 64-bit miljø

Og jeg er sikker på, at der er meget mere, jeg aldrig har tænkt på. Har du nogensinde brugt chroot til at køre flere distroer? Hvad med at reparere et Linux-system fra en Live CD? Lad os vide i kommentarerne.