För några veckor sedan skrev jag en artikel om hur man kör flera X-sessioner utan virtualisering, vilket visade hur du kan köra flera skrivbordsmiljöer samtidigt på samma dator och växla mellan dem med ett knapptryck. Jag erkänner, det var lite av en uppvärmning för den verkliga showen - hur man kör flera Linux-distributioner samtidigt utan att behöva hantera nackdelarna med virtualiseringsprogram.

Idag ska vi använda chroot för att behandla vissa delar av ditt Linux-filsystem som (nästan) helt isolerade system. Detta kan låta dig göra alla möjliga intressanta saker, till exempel kör ett fullständigt Gentoo system från insidan av ditt Ubuntu-system med liten eller ingen prestandaförlust.

Hur det fungerar

Innan vi börjar kommer det vara en bra idé att gå över exakt vad vi gör och hur det fungerar. När du startar din Linux-dator går du igenom en rad steg för att starta upp. GRUB, din startladdare, laddar kärnan som anges i GRUBs config-fil, bifogar den till din rotpartition och kör init-skript som finns lagrade där. Därefter går ditt system från den rotpartitionen.

Vi ska använda ett Linux-system för Linux (jag kommer att göra det från Debian men stegen borde vara ungefär identisk oavsett distribution) som går igenom den normala startprocessen, men sedan behandla en viss del av ditt filsystem ( som / mnt / gäst) som sin egen isolerade installation. Det gästsystemet kommer inte att gå igenom startprocessen, laddar inte en kärna och kör inte init-skript. Du berättar bara för din värd "Anslut till den här katalogen som om den är den nya rotpartitionen". Diagrammet nedan ska hjälpa till att visa vad jag menar.

Det här är ungefär hur filerna läggs ut på ditt system, bara sitter där som vanliga filer på en normal partition, behandlas som alla andra filer tills vi använder "chroot" för att göra dem till något speciellt.

Men när vi använder chroot (CHange ROOT) och pekar på / mnt / guest (eller var vi lägger filerna i nästa steg), är den här katalogen nu ett eget rotfilsystem. Det blir helt omedvetet med värdsystemet. Alla program och kommandon körs inifrån den nya roten körs baserat på programvaran inuti den nya filialen.

Om du till exempel är chrooted i / mnt / guest och skriver "ls", läser den kommandot "ls" från den här chrooted miljön, helt omedveten om ls-kommandot på värdsystemet. Om du skriver "firefox" körs Firefox från inuti den nya roten, oavsett om du har Firefox installerat på värden.

Komma och använda gästdistro

För att göra detta arbete behöver du bara basfilsystemet för en Linux distro, oavsett distro som kan vara. Debian har ett bra verktyg för just detta ändamål som kallas debbootstrap som hämtar basfilerna och placerar dem vart du vill. För att hålla sakerna intressanta, och för att visa vad chroot kan göra, kommer vi att använda ett Gentoo-filsystem för vår gäst. För att hålla sakerna enkla och direkta, kommer jag att inkludera nedladdningen av tarball som ett av de steg vi gör på kommandoraden.

Dessa steg kommer att ladda ner alla basfiler för ett Gentoo-system, extrahera dem till vår målkatalog (jag ska använda / mnt / guest men du kan använda allt du vill) och sedan chroot in i den katalogen så att den behandlas som ny rot (/) -katalog. Du kan behöva root (sudo) behörigheter för några av följande kommandon.

 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 / guest 

Dessa kommandon gör följande steg i linje med radnummer:

  1. Skapa plats för vårt gästsystem att leva
  2. Flytta in i det rummet
  3. Ladda ner Gentoo systemfiler
  4. Extrahera dem
  5. Behandla det här nya utrymmet som root (/) -katalogen

Följande skärmdump ska hjälpa till att visa att när vi har använt chroot för att ansluta vår nya katalog som root, är den nu isolerad från tidigare grenar i filsystemträdet.

För att förklara skärmdumpen börjar vi vid en vanlig kommandotolk på värdsystemet. Jag använder pwd för att visa min nuvarande katalog, där alla Gentoos filer sitter som vanliga gamla filer utan speciell betydelse. Jag använder sedan chroot för att behandla den här katalogen som den nya roten och du kan nu se visuellt att min prompten har ändrats, eftersom kommandoraden nu drar all sin information (inklusive hur man ritar prompten) från Gentoos rotmiljö. ALLA kommandon och åtgärder som jag tar medan chrooted beror på de kommandon som finns i det nya filträdet. När jag skriver in pwd igen, säger den inte längre / mnt / guest, för så långt som det här skalet vet finns inget annat än vad det ser inuti det trädet.

Saker att tänka på

Som jag antydde ovan är detta inte 100% isolerat från värdsystemet. Den chrooted miljön var aldrig "startad", så den laddade aldrig sin egen kärna och körde aldrig egna init-skript. I vårt exempel har vi Gentoo kört på den kärna som värden (i mitt fall Debian) startade med.

Denna metod är verkligen inte en ersättning för virtualisering, och kan inte göra allt VM-program kan göra. Gästsystemet använder aldrig faktiskt "stövlar" eller kör init-skript, och det är möjligt att din gäst-operativsystem kräver vissa funktioner som din värdkärna inte erbjuder.

Varför då?

I de tider som jag har nämnt denna teknik för människor i det förflutna har de ofta sagt något i linje med "Det är coolt men vad skulle du använda det för?". Personligen har jag hittat flera användningsområden för chroot :

  • Test utveckla programvara i en orörd miljö
  • Kör programvara som är avsedd för en annan distribution
  • Kör programvara som kräver en äldre eller nyare version av din nuvarande distro
  • Öppna en Linux-installation på en annan partition utan att behöva starta om
  • Starta en Live CD och använd chroot för att reparera din installation eller GRUB
  • Gå till en enhet där du har glömt användaren / passet
  • Kör en 32-bitars app i en 64-bitars miljö

Och jag är säker på att det finns mycket mer som jag aldrig har tänkt på. Har du någonsin använt chroot för att köra flera distros? Vad sägs om att reparera ett Linux-system från en Live CD? Låt oss veta i kommentarerna.