LVM: Logical Volume Manager

Logical Volume Manager, eller LVM som man oftast förkortar det, är ett riktigt smidigt verktyg när det gäller att hantera diskar/volymer i Linux. Med LVM behöver man inte oroa sig för att partitionen/disken inte är tillräckligt stor då man enkelt kan öka eller minska storleken vid ett senare tillfälle. Detta kan även göras under drift beroende på vilket filsystem du använder. Det är även enkelt att ta backup med hjälp av snapshots och det är enkelt att kopiera/klona en hel partition/volym om så skulle behövas. LVM gör det lätt att hantera system med flera fysiska diskar då man enkelt kan flytta volymer från en disk till en annan och att lägga till eller ta bort disk.

Strukturen i LVM

  • Fysiska Volymer (PV) – Är de fysiska diskarna som används för att lagra informationen.
  • Volym Grupper (VG) – Är den poolen med disk du använder när du skapar logiska volymer.
  • Logiska Volymer (LV) – Är den volymen där du skriver filsystemet och sedan monterar.

Vad gör device-mapper?

För att LVM (eller mjukvaru RAID för den delen) ska fungera så krävs att du använder dig av device-mapper. Det är en drivare som finns med i 2.6 kärnan som fungerar som mellanlager mellan kärnan och de program som försöker komma åt den logiska volymen. När du skapar en logisk volym i LVM så kommer device-mapper automagiskt skapa en fil i /dev som du sedan kan skriva ett filsystem till och montera.

För att använda device-mapper måste du installera dmsetup och libdevmapper, vilket borde följa med när du installera LVM (beroende på distribution och pakethanterare så klart)

Skapa en logisk volym

Jag förutsätter att du har en tom disk att arbeta med, om du är osäker eller rädd att förstöra något, varför inte virtualisera det hela? Först måste du skapa den partitionen som LVM ska använda:

fdisk /dev/sdb

Använd hela /dev/sdb för att skapa en LVM partition:

  1. tryck n för att skapa en ny partition.
  2. tryck p för att skapa en primär partition.
  3. tryck 1 för att skapa den första partitionen på disken.
  4. tryck enter för att använda hela disken.
  5. tryck t för att ändra vilken typ av partition det är.
  6. tryck L för att lista alla typer och välj 8e (LVM)
  7. tryck p för att visa diskens nya layout.
  8. om allt ser bra ut, tryck w för att skriva/spara.

Nu kan du skapa den fysiska volymen med hjälp av pvcreate:

pvcreate /dev/sdb1

Därefter använder du vgcreate för att skapa en volymgrupp med namnet VolGrupp0:

vgcreate VolGrupp0 /dev/hdb1

Nu kan du skapa en logisk volym med lvcreate som heter LogVol0 och är 5GB stor:

lvcreate -L 5G -n LogVol0 VolGrupp0

Här kommer device-mapper automatiskt skapa /dev/VolGrupp0/LogVol0 som du kan använda som en helt vanlig disk/partition. För att skriva ett filsystem och montera den logiska volymen, så börjar du först med att skriva ett filsystem till disken:

mke2fs -j /dev/VolGrupp0/LogVol0

Sen kan du montera den som vanligt:

mount /dev/VolGrupp0/LogVol0 /mnt
df -h /mnt

Öka storleken på en logisk volym (grow)

Att öka storleken på en logisk volym är enormt simpelt och kräver inget mer än att du har ledigt diskutrymme. Dock måste du även utöka filsystemet, vilket kan vara enkelt eller svårt beroende på vilket filsystem du kör. Om du använder ext3 som i exemplet ovan, så är detta en barnlek.
Börja med att öka den logiska volymen:

lvresize -L 10G /dev/VolGrupp0/LogVol0

För att sedan utöka filsystemet så kräver resize2fs att du kontrollerar att filsystemet är som det ska:

e2fsck -f /dev/VolGrupp0/LogVol0

Om allt ser bra ut och ditt filsystem inte är trasigt, kör resize2fs:

resize2fs /dev/VolGrupp0/LogVol0

Om du inte anger någon storlek till resize2fs, så tar den så mycket plats som finns tillgängligt, dvs hela den logiska volymen (10GB). Notera att detta kan göras även när disken är online, dvs monterad och används.

Minska storleken på en logisk volym (shrink)

Att minska storleken på en logisk volym är lite klurigare dock, då risken att förlora data blir betydligt större om man gör fel. För att minska storleken på den logiska volymen måste du först minska storleken på filsystemet. Därför måste du självklart även ha ledigt utrymma på filsystemet. Om du minskar storleken på filsystemet till 5GB men använder 6GB, då förlorar du 1GB data och kommer med största sannolikhet att ha ett väldigt trasigt filsystem. Jag vet inte hur pass det är möjligt att krympa ett filsystem när det är monterat, men rekommenderar starkt att du avmonterar det för att minska risken att förlora data.

umount /dev/VolGrupp0/LogVol0

Åter igen är det bra att kontrollera så filsystemet inte är trasigt:

e2fsck -f /dev/VolGrupp0/LogVol0

Därefter kan du minska storleken till 4GB (förutsatt att du inte använder mer än 4GB av volymen):

resize2fs /dev/VolGrupp0/LogVol0 4G

Nu har du alltså en logisk volym som är 10GB stor med ett filsystem på 4GB i. Tanken är att krympa det till 5GB, men för att vara på den säkra sidan och inte riskera att krympa den logiska partitionen för mycket, så har vi nu 1GB tillgodo. För att krympa den logiska volymen gör vi på exakt samma sätt som ovan:

lvresize -L 5G /dev/VolGrupp0/LogVol0

Vilket gör att den logiska volymen är 5GB och ditt filsystem är 4GB, vilket du, med lite mer säkerhet, nu kan öka igen:

e2fsck -f /dev/VolGrupp0/LogVol0
resize2fs /dev/VolGrupp0/LogVol0

Åter igen så skippar du storleken när du kör resize2fs och låter den själv fylla den logiska volymen. Nu har du en logisk volym och ett filsystem som är 5GB.

Snapshot av en logisk volym

Möjligheten att ta en snapshot av ett filsystem kommer väl tillhands när du ska ta backup på ett aktivt filsystem men fortfarande vill tillåta skrivning till filsystemet. Om du till exempel har använt tar för att ta backup på en log-fil samtidigt som något skriver till den, så kanske du har råkar ut för följande:

tar: access.log: file changed as we read it

För att undvika att behöva stänga av alla tjänster som skriver till loggarna så kan man därför skapa en till logisk volym som agerar snapshot av en befintlig logisk volym. En snapshot volym sparar bara de filer som ändras på filsystemet och behöver därför inte vara lika stor. Manualen påstår att 15-20% av storleken bör vara tillräckligt vid ett “typical scenario”, självklart beror detta helt på vad du lagrar på volymen och hur ofta och hur mycket som förändras. Kontrollera istället hur mycket som används på din snapshot volym med hjälp av lvdisplay eller lvs. För att skapa en snapshot av volymen ovan, så använder du -s flaggan och istället för att ange vilken volym grupp vi ska använda, så anger du vilken “origin volym” (vilken volym) du ska ta snapshot av:

lvcreate -s -n SnapVol0 -L 1G /dev/VolGrupp0/LogVol0

För att kontrollera storleken på snapshot volymen använder du:

lvs
  LV       VG        Attr   LSize  Origin   Snap%  Move Log Copy%
  LogVol0  VolGrupp0 owi-a- 5.00G
  SnapVol0 VolGrupp0 swi-a- 1.00G  LogVol0    0.00

Om volymen börjar få ont om ledigt utrymme så använder du lvresizesamma sätt som tidigare för att öka storleken på den. När du sedan ska ta backup så monterar du bara /dev/VolGrupp0/SnapVol0 och får då en snapshot av filsystemet som finns på /dev/VolGrupp/LogVol0. Ta backup på det som behövs och avmontera när du är klar, så fortsätter LVM att uppdatera snapshot volymen. För att

Klona en logisk volym (clone)

LVM verkar inte ha något kommando för att enkelt kunna klona en logisk volym. Detta är förmodligen pga att det är enormt lätt att göra själv. Smidigast är att helt enkelt bara skapa en lika stor logisk volym och sen använda dd för att kopiera över all data från en befintlig volym.

lvcreate -L 5G -n LogVol1 VolGrupp0
dd if=/dev/VolGrupp0/LogVol0 of=/dev/VolGrupp0/LogVol1 bs=64k

Jag har personligen bara gjort detta från en disk till en annan, där 100GB tog ca 30 minuter att kopiera, kan tänka mig att det tar lite mer tid om båda volymerna ligger på samma fysiska disk. När du gör detta bör du även se till att ha båda volymerna avmonterade för att undvika problem.

Att lägga till en disk till en volymgrupp

För att lägga till mer disk till en volymgrupp så måste du skapa en LVM partition på samma sätt som ovan, därefter använder du dig av vgextend:

vgextend VolGrupp0 /dev/sdc1

Nu kommer VolGrupp00 vara betydligt större och du kan se hur mycket ledigt utrymme som finns tillgängligt med vgdisplay:

vgdisplay VolGrupp0

Skapa en volym på båda de fysiska volymerna (raid0)

Om du har en eller flera fysiska volymer kan du använda dig av -i flaggan när du skapar en logisk volym. Detta kommer dela upp den logiska volymen så den fysiskt sparas på båda diskarna. Fördelen med detta är att du kan båda läsa och skriva snabbare till den logiska volymen då du kan utnyttja båda läs/skriv-huvudena på diskarna. Nackdelen är att om ena disken går sönder, så förlorar du all information. För att skapa en logisk volym på båda diskarna kör du:

lvcreate -i 2 -L 10G -n StripeVol0 VolGrupp0

Det kan även vara värt att titta på -I för att ange storleken på varje bit som den logiska volymen delas upp i.

Att flytta data inom en volymgrupp

Normalt hanterar LVM vart på diskarna de logiska volymerna ska ligga. Dock kan du välja själv vilken fysisk volym som den logiska volymen ska ligga på. Du kan till och med flytta en logisk volym från en fysisk volym till en annan medan den logiska volymen är monterad och används. Självklart sjunker prestandan medan den logiska volymen flyttas och det kan ta en hel del tid beroende på storleken.

För att flytta den LogVol0 från /dev/sdb1 till /dev/sdc1 använder vi pvmove:

pvmove -n /dev/VolGrupp0/LogVol0 /dev/sdb1 /dev/sdc1

När det är klart kan du kolla med lvdisplay och se att LogVol0 ligger på /dev/sdc1:

lvdisplay -v /dev/VolGrupp0/LogVol0

Att ta bort en disk ifrån LVM

För att försäkra dig om att ingen information finns kvar på /dev/sdb1 så använder du pvmove ännu en gång, fast utan att ange någon logisk volym denna gång:

pvmove /dev/sdb1

Du behöver heller inte ange någon destinations volym då LVM flyttar över informationen där plats finns tillgängligt. Eftersom du redan flyttat den logiska volymen borde detta gå fort. Därefter tar du bort den fysiska volymen från din volymgrupp med vgreduce:

vgreduce VolGrupp0 /dev/sdb1

Nu kan du även plocka bort den fysiska volymen med pvremove, vilket tar bort de block som markerar disken/partitionen som en LVM enhet. Detta är inget måste direkt, men gör att det skapar mindre förvirring den dagen man använder disken på nytt:

pvremove /dev/sdb1

Avslut

Detta är en relativt snabb genomgång av LVM, men förhoppningsvis täcker den det mesta som LVM har att erbjuda. En sak som jag medvetet inte tagit med är mirroring (raid1), då jag aldrig använt det. Kommer förmodligen skriva en artikel om det när jag väl kommer i kontakt med det. Om något inte stämmer i texten ovan eller om jag missat något annat angående LVM, då är det fritt fram att kommentera det så att jag kan uppdatera artikeln.