Diskar och filsystem

En hårddisk

En hårddisk är uppbyggd av flera elektromagnetiska skivor som sitter på en axel. En läs- och skrivarm rör sig hela tiden över de roterande skivorna.

$ sudo vol_id --uuid /dev/sda1
754fc3df-ad71-4ccc-ae86-80e011056241

Hantera partitioner

Det finns flera olika sätt att partionera lagringsmedia i Linux. Vi kommer titta på två av dem: fdisk och cfdisk.

fdisk

För att se alla partitioner vi har på hårddiskar som är anslutna till datorn kan vi använda kommandot fdisk -l :

$ sudo fdisk -l

Ett annat sätt att visa diskar och partitioner är att använda kommandot lsblk :

$ sudo lsblk

För att hantera en disk med kommandot fdisk startar vi fdisk med diskens namn:

$ sudo fdisk /dev/sda
  • p visar partitioner på disken
  • m visar hjälp
  • n skapar en ny partition
  • q avslutar fdisk

Var säker på vad du gör med fdisk, för gör du fel kan du förlora data på din disk!

cfdisk

Kommandot fdisk är lite omständigt att jobba med. Ett alternativ är att använda kommandot cfdisk som är enklare. Vi startar det på samma sätt som vi startade kommandot fdisk :

$ sudo cfdisk /dev/sda
  • ? ger oss hjälp
  • q avslutar

Filen /etc/fstab

Filen /etc/fstab innehåller information om hur och var diskar och nätverksenheter (NFS, CIFS, ..) skall monteras i filsystemsträdet. Filen används av systemet för att hitta vilka diskar som skall monteras vid uppstart av systemet och vi kan också skapa egna monteringspunkter till enheter som vi vill montera enklare.

Filen består av flera rader med sex fält som är separerade med mellanslag eller tabb:

$ cat /etc/fstab
/dev/sda1    /            ext4  defaults    0 0
LABEL=UEFI   /boot/efi    vfat  defaults    0 0

Fälten:

  • /dev/sda1 är enheten. Det kan vara /dev/sda1 som här, eller en UUID eller en LABEL.
  • / är monteringspunkten, det är här filsystemet kommer monteras i filsystemsträdet.
  • ext4 anger filsystemet
  • defaults anger alternativ till filsystemet. Här kan vi ibland hitta ro (read-only), rw (read-write) och andra alternativ.
  • 0 hör ihop med ett kommando som heter dump, en nolla här betyder att dump inte skall göra backup på filsystemet.
  • 0 anger vilken ordning filsystemet skall kontrolleras vid uppstart. / bör ha en 1:a här, andra monteringspunkter bör ha en 2:a om de skall kontrolleras, eller en 0:a om de install kontrolleras.

För att montera alla filsystem som definerats i filen /etc/fstab skriver vi:

$ sudo mount -a

Vill bara montera /home som vi definerat i filen /etc/fstab skriver vi:

$ sudo mount /home

RAID

Redundant Array of Independent Disks (när RAID kom hette det Inexpensive och inte Independent, vilket man kan läsa och höra fortfrande).

RAID är indelade i olika nivåer och de vanligaste nivåerna vi använder är:

  • RAID 0 - Stripe set
  • RAID 1 - Mirroring
  • RAID 5 - Stripe set med paritet
  • RAID 6 - Stripe set med dubbel paritet
  • RAID 10 - Mirroring och stripe set

RAID 0 - Stripe Set

Stripe set är den enklaste formen av RAID vi kan använda. För att bygga en stripe set behöver vi minst två diskar och tekniken fungerar så att när vi skriver data till stripe setet skrivs det första blocket på disk 1, det andra blocket på disk 2, det tredje blocket på disk 1, och så vidare. Fördelen med stripe set är att vi ökar hastigheten på diskläsningar och -skrivningar eftersom vi sprider ut datat på flera diskar. Vi får också en större volym att lagra data på.

Om vi har två stycken två (2) terabyte stora diskar och sätter upp dem i en stripe set kommer vi få en volym om fyra (4) terabyte där vi kan lagra data.

Nackdelen med stripe set är att om en av diskarna som ingår i volymen går sönder förlorar vi all data på hela volymen. Därför kom RAID 5 och RAID 6 som erbjuder stripe set med paritet.

Ibland kan vi se begreppet JBOD, Just a Bunch Of Disks, i samband med RAID-lösningar. JBOD fungerar i princip som RAID 0, med skillnaden att data skrivs först på disk 1 tills den blir full, då fortsätter vi skriva på disk 2. Tills den blir full. Fördelen med JBOD är att vi kan få större volymer att lagra data på eftersom vi slår ihop flera diskar till en och samma volym.

RAID 1 - Mirroring

Med mirroring speglar vi data på två diskar. Mirroring kräver minst två (2) diskar och all data som skrivs på disk 1 skrivs också på disk 2. Det här gör att om den ena disken går sönder så finns vår data kvar på den andra disken.

RAID 5 - Stripe set med paritet

I RAID 5 använder vi minst tre (3) diskar och bygger en stripe set på dem (som i RAID 0). Vi får partitet på stripe setet vilket är kontrolldata som sprids på diskarna. Om en disk går sönder kan vi återskapa data som fanns på den disken genom att använda data och partitet som finns på de andra diskarna.

RAID 5 är vanlig i servrar eftersom det erbjuder både bra prestanda på läsningar och en viss dataintegritet i och med pariteten. Pariteten använder lika mycket utrymme som en disk, men är utspridd över alla diskarna, vilket innebär att vi tappar en disks lagringskapacitet.

Om vi har tre (3) stycken två (2) terabytes diskar och använder RAID 5 på dem kommer vi alltså att ha fyra (4) terabyte utrymme att lagra data på, trots att de tre diskarna tillsammans blir sex (6) terabyte.

RAID 6 - Stripe set med dubbel paritet

RAID 6 fungerar i princip som RAID 5, men i RAID 6 utökas pariteten till den dubbla. Pariteten skrivs på två ställen i volymen och vi förlorar således utrymme motsvarande två (2) diskar. Det här betyder att två diskar kan gå sönder utan att vi har dataförlust. För att kunna använda RAID 6 behöver vi ha minst fyra (4) diskar.

Om vi har fyra (4) stycken två (2) terabytes diskar och använder RAID 6 på dem kommer vi ha fyra (4) terabyte att lagra data på, de andra två (2) terabyten används för pariteten.

RAID 10 - Mirroring och stripe set

I RAID 10 (ibland kallat RAID 1+0) kombinerar vi speglingen från RAID 1 med stripe set från RAID 0. Det betyder att vi speglar en stripe set. För att kunna göra detta behöver vi minst fyra diskar som vi delar upp i par om två och två där vi kör stripe set på det ena paret och speglar det till det andra paret.

Fördelen med den här lösningen är att det krävs mycket innan vi skall ha dataförlust på vår volym. Nackdelen är naturligtvis att lösningen är dyr, vi behöver dubbelt så mycket disk mot vad vi kan lagra på dem.

Om vi har fyra (4) stycken två (2) terabyte stora diskar och använder RAID 10 på dem kommer vi kunna lagra fyra terabyte data på dem. De fyra terabyte som vi inte kan använda för datalagring är speglingen.

Logical Volume Manager (LVM)

Logical Volume Manager (LVM) är ett verktyg för att hantera virtuella lagringsenheter (hårddiskar). LVM består av tre delar: Physical Volume (PV), Volume Group (VG) och Logical Volume (LV). Physical Volume motsvarar de fysiska enheterna, som till exempel en hårddisk. En Volume Group innehåller en eller flera Physical Volumes för att bilda en lagringspool, från vilken vi kan skapa Logical Volumes.

Skapa Physical Volumes

# fdisk -l
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/vdc: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/vdd: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
# pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created.
# pvcreate /dev/vdc
  Physical volume "/dev/vdc" successfully created.
# pvcreate /dev/vdd
  Physical volume "/dev/vdd" successfully created.

Vi kan också ange alla enheterna på en och samma rad:

# pvcreate /dev/vdb /dev/vdc /dev/vdd
  Physical volume "/dev/vdb" successfully created.
  Physical volume "/dev/vdc" successfully created.
  Physical volume "/dev/vdd" successfully created.

För att se att vår Physical Volume skapades kan vi använda kommandot pvdisplay, här visar vi bara enheten /dev/vdb:

# pvdisplay /dev/vdb 
  "/dev/vdb" is a new physical volume of "1.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb
  VG Name               
  PV Size               1.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               Oz14rm-VVjd-XHmn-PxE0-vaej-FS1b-NgUc2D
   

Vill vi visa alla Physical Volumes vi har skriver vi bara pvdisplay:

# pvdisplay

Nu behöver vi lägga till våra Physical Volumes i en Volume Group.

Skapa Volume Group

The valid characters for VG and LV names are: a-z A-Z 0-9 + _ . - får inte börja med -

# vgcreate data /dev/vdb /dev/vdc 
  Volume group "data" successfully created
# vgdisplay data
  --- Volume group ---
  VG Name               data
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               SQU8hS-Zi76-gzGs-Bn1F-Mp0K-OJPd-t0QGAw

Skapa Logical Volume

Vi skapar en logical volume med kommandot lvcreate :

$ sudo lvcreate -L 500M -n mina_filer data
  Logical volume "mina_filer" created.

Skapa ett filsystem

När vi partionerat vår disk måste vi skapa ett filsystem på partitionen innan vi kan börja använda disken. Vi använder kommandot mkfs för att skapa filsystem i Linux.

Linux har stöd för många olika typer av filsystem, en del kan vara inkompilerade i kärnan och andra kan finnas tillgängliga som moduler. Modulerna, som kan ses som drivrutiner, finns listade i katalogen /lib/modules/DIN_VERSION/kernel/fs[footnote:Du får fram din kärnas versionsnamn med kommandot `uname -r]. Vi kommer titta på ett par stycken av dessa filsystem: ext2, ext3 och ext4, iso9660, UDF, FAT och NTFS.

Ett journalförande filsystem innebär att filsystemet håller en journal över förändringarna som sker i filsystemet. När vi sparar en fil till filsystemet håller filsystemet reda på hur långt det kommit med skrivningen och skulle systemet krascha eller plötsligt dö kommer journalen användas för att kontrollera filsystemet och återställa det till ett korrekt tillstånd. Vi behöver alltså inte köra en komplett filsystemskontroll på ett journalförande filsystem, vilket innebär att vi minskar tiden som krävs för att komma igång efter en krasch igen.

Linux har stöd för flera olika typer av filsystem som används över nätverk. Bland annat Network File System (NFS) och Common Internet File System (CIFS) som används av Windows. Ibland kan man höra talas om Samba som är den äldre varianten av CIFS.

ext2, ext3 och ext4

  • Ext2, second extended filesystem, var det filsystem som gällde i Linux under många år. Ext2 är ett ett ganska enkelt filsystem som har stöd för rättigheter på filnivå. Idag används ext2 enbart i specialfall, eftersom ext4 ersatt det.

  • Ext3, third extended filesystem, är ett journalförande filsystem. Filsystemet lagrar information om filer och kataloger i inoder. I en inode finns information om hur stor filen är, vilken enhet filen finns på, vem som äger filen, vilken grupp filen tillhör, vilka rättigheter som är satta på filen, vilken tid filen skapades (ctime), när den senast förändrades (mtime) och när den senast användes (atime), vilka länkar som pekar på filen och slutligen var på enheten filen ligger lagrad.

  • Filnamnen kan bestå av 255 bytes.
  • Filnamnen är skiftlägeskänsliga.
  • Filstorleken kan vara upp till 2 TiB.
  • Den största volymstorleken som kan skapas är 16 TiB.
  • Ext3 är ett journalförande filsystem.
  • Ext4, fourth extended filesystem, är en utökning av filsystemet ext3 vilket innebär att det också är ett journalförande filsystem. Den stora skillnaden mellan ext3 och ext4 är prestandaökningar och bättre hantering av fragmentering (filerna hålls ihop på disken). Ext4 ger också stöd för större filsystem, upp till 1 EiB (exabyte).
  • Filnamnen kan bestå av 255 bytes.
  • Filnamnen är skiftlägeskänsliga.
  • Filstorleken kan vara upp till 16 TiB.
  • Den största volymstorleken som kan skapas är 1 EiB (exabyte).
  • Ext4 är ett journalförande filsystem.
  • Bättre prestanda än ext3.

iso9660

ISO9660 är det filsystem som används på CD-ROM skivor. ISO9660 är indelad i tre nivåer där Level 1 är den ursprungliga standarden som stödjer 8.3 tecken, dvs åtta tecken i filnamnet och tre tecken i en filändelse. Level 2 och Level 3 utökar detta till 255 tecken.

  • Filnamnen kan vara 8.3 tecken långa (Level 1) och upp till 180 tecken (Level 2 och Level 3)
  • Filstorleken på lagrade filer kan vara 4 GiB (Level 1 och Level 2) och 8 TiB (Level 3)
  • Den största partitionen vi kan skapa med ISO9660 är 8 TiB

UDF

Universal Disk Format Filesystem (UDF) är ett filsystem som ofta används på CD-RW (läs/skrivbara skivor) och DVD.

  • Filnamn kan vara 255 tecken långa.
  • Filstorleken kan vara 16 EiB.
  • Partitionerna kan vara 2 TiB på hårddiskar och 8 TiB på optisk media.

FAT

FAT, eller File Allocation Table, finns i tre olika varianter: FAT12, FAT16 och FAT32. På en FAT-volym kan man som mest ha 512 filer i rotkatalogen, i underkataloger kan vi ha upp till 65 535 filer per katalog. En FAT-volym kan vara 8 TiB stor och lagra filer som är mest 4 GiB stora.

Filallokeringstabellen (FAT) innehåller information om filnamnet, filattributen, filstorlek, när filen senast förändrades och vilket kluster filen börjar på. FAT har saknar säkerhet och vi kan inte sätta rättigheter på filer och kataloger i FAT. FAT har stöd för filattribut som read-only, hidden, system och archive. Read-only innebär att filen är skrivskyddad och enbart går att läsa, hidden innebär att filen är dold, system att det är en systemfil och archive är en flagga som sätts när filen är arkiverad. Archive används av backup-program.

FAT har stöd för 8.3 tecken i filnamnen. Det innebär att filnamnet kan vara åtta (8) tecken och ha en filändelse på tre (3) tecken. Med stödet för långa filnamn (VFAT) kan vi ha upp till 255 tecken totalt i filnamnet. Den enda fördelen FAT har jämfört med NTFS är på små diskar (under 512 MiB), har vi en disk som är större än 512 MiB bör vi köra NTFS om vi kör operativsystemet Microsoft Windows.

I Linux heter modulen för att få stöd för FAT just fat. För att få stöd för långa filnamn laddar vi istället modulen vfat. Linux klarar av att både läsa och skriva till FAT.

  • Filnamnen kan vara 8.3 tecken eller 255 tecken om man har stöd för utökade filnamn.
  • Filnamnen är inte skiftlägeskänsliga.
  • Filstorleken kan vara: FAT12–32 MiB, FAT16–2 GiB och FAT32–4 GiB.
  • Den största volymstorleken som kan skapas är: FAT12–32 MiB, FAT16–2 GiB och FAT32–8 TiB.

NTFS

NTFS, New Technology File System, kom första gången i Windows NT4. NTFS är ett journalförande filsystem och informationen om filerna som filnamnet, storleken och rättigheter lagras i en Master File Table (MFT).

NTFS har stöd för filkompression, vilket innebär att en fil som sparas på enheten komprimeras automatiskt (om du aktiverat det). NTFS känner också själv av trasiga sektorer i filsystemet och flyttar filer därifrån och markerar sektorerna som skadade.

NTFS 3.0, den version som kom med Windows 2000, erbjuder en del utökningar till NTFS som Encrypted File System (EFS), Quota och stöd för att montera enheter i kataloger (Volume Mount Point).

I de versioner av Windows som stödjer NTFS kan vi konvertera ett FAT-filsystem till NTFS med hjälp av kommandot convert.

Linux har ett bra stöd för att läsa NTFS-filsystem, men har lite svårare med att skriva till dem. Det finns idag en del möjligheter att skriva till ett NTFS-filsystem i Linux - men det finns inget riktigt stabilt sätt. Modulen för att läsa NTFS heter ntfs.

  • Filnamnen kan vara 254 tecken långa, filändelsen skiljs åt med en punkt.
  • Filnamnen är inte skiftlägeskänsliga.
  • Filstorleken kan vara 16 EiB.
  • Den största volymstorleken som kan skapas är 16 EiB.
  • NTFS är ett journalförande filsystem.

Mjuka- och hårda länkar

I Linux kan vi skapa mjuka- och hårda länkar i filsystemet. Vi kan se länkar som de genvägar som vi kan skapa i Windows. Istället för att behöva komma ihåg hela sökvägen till en katalog eller en fil skapar vi en genväg till den.

Hård länk

En mjuk länk (symbolic link) är en länk som kan peka på en fil eller en katalog vart som helst i filsystemet. En hård länk (hard link) kan enbart pekas på filer inom samma partition i filsystemet.

En mjuk länk