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:
- tryck n för att skapa en ny partition.
- tryck p för att skapa en primär partition.
- tryck 1 för att skapa den första partitionen på disken.
- tryck enter för att använda hela disken.
- tryck t för att ändra vilken typ av partition det är.
- tryck L för att lista alla typer och välj 8e (LVM)
- tryck p för att visa diskens nya layout.
- 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 lvresize på samma 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 VolGrupp0Skapa 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.


26-01-2010 / 08:09
Mycket bra artikel! Dock heter det Logical Volume Manager och inte Linux Volume Manager. Om jag inte minns fel var det i HPUX och inte Linux som man först såg LVM(?)
Vill passa på att pusha för min egen artikel i samma ämne: http://teknikkonsument.se/2009/09/14/logical-volume-manager-lvm-for-dummies/
26-01-2010 / 11:44
Tack! Stämmer riktigt bra dock, tror inte jag var riktigt vaken än när jag började skriva artikeln igår. Har korrigerat det hela nu samt pekat om gamla adressen på rätt sätt.
Får se om tid ges, i så fall blir det nog att skriva en kort artikeln om iSCSI idag. :-)
26-01-2010 / 15:25
Bra artikel, vill bara passa på att säga att text layouten ser lite wierd ut på iPhone i mobile theme mode. Dock på vissa ställen