wiki:linux/Filesystem/LVM

LVM, autofs, blkid, dd, dd/Festplatte (HDD) sicher löschen, df, du, fdisk, findmnt, ls, lsblk, mount, rm, wipefs


Linux optimal partitionieren
ubuntuusers
wiki.archlinux
wikipedia

Voraussetzung
Erstellen einer volume group
Partitionen einer volume group einbinden
Größe eines logical volumes ändern
Größe einer volume group ändern
Verschlüsseltes LVM erstellen - LVM on LUKS

Voraussetzung

Zur Nutzung eines lvm muss das Paket lvm2 installiert und das Kernelmodul dm-mod geladen sein:

$ apt-get install lvm2
$ modprobe dm-mod

Erstellen einer volume group

Ausgehend davon, dass aus 3 vorhandenen Partitionen sda1, sda2 und sda3 eine volume group erstellt werden soll, müssen diese für eine lvm-Nutzung initialisiert werden.
Achtung: Die Partitionen lassen sich danach nur noch innerhalb einer lvm-Umgebung verwenden und sind unter "normalen" Umständen nicht mehr einzubinden bzw. müssen dazu erst wieder mit einem Filesystem wie z. B. ext4 versehen werden.

$ pvcreate /dev/sda1 /dev/sda2 /dev/sda3
  Physical volume "/dev/sda1" successfully created
  Physical volume "/dev/sda2" successfully created
  Physical volume "/dev/sda3" successfully created

Nun stehen also 3 physical volumes zur Verfügung:

$ pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sda1       lvm2 a-   7.66g 7.66g
  /dev/sda2       lvm2 a-   7.66g 7.66g
  /dev/sda3       lvm2 a-   7.66g 7.66g

Daraus erstellen wir eine volume group mit dem unglaublichen Namen test:

$ vgcreate test /dev/sda1 /dev/sda2 /dev/sda3
  Volume group "test" successfully created

Die 3 physical volumes gehören nun zur volume group test:

$ pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sda1  test lvm2 a-   7.66g 7.66g
  /dev/sda2  test lvm2 a-   7.66g 7.66g
  /dev/sda3  test lvm2 a-   7.66g 7.66g
$ vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  test   3   0   0 wz--n- 22.98g 22.98g

Innerhalb der volume group test lassen sich nun beliebige logical volumes (Partitionen) anlegen:

$ lvcreate -L 5G -n bilder test
  The link /dev/test/bilder should had been created by udev but it was not found. Falling back to direct link creation.
  Logical volume "bilder" created
$ lvcreate -L 5G -n dokumente test
  The link /dev/test/dokumente should had been created by udev but it was not found. Falling back to direct link creation.
  Logical volume "dokumente" created
$ lvs
  LV        VG   Attr   LSize Origin Snap%  Move Log Copy%  Convert
  bilder    test -wi-a- 5.00g                                      
  dokumente test -wi-a- 5.00g

Um mit den beiden logical volumes arbeiten zu können, müssen wir sie natürlich noch mit einem Filesystem ausstatten:

$ mke2fs -t ext4 /dev/test/bilder
mke2fs 1.41.12 (17-May-2010)

... bla ... bla ... bla ...

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
$ mke2fs -t ext4 /dev/test/dokumente
mke2fs 1.41.12 (17-May-2010)

... bla ... bla ... bla ...

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Partitionen einer volume group einbinden

Sollte das LV verschlüsselt sein, muss es natürlich zuerst entschlüsselt werden. Im folgenden wird davon ausgegangen, dass sich die Volume-Gruppe auf /dev/sda2 befindet.

$ cryptsetup luksOpen /dev/sda2 lvm
Geben Sie den Passsatz für /dev/sda2 ein:

Sollten sich mehrere Gruppen auf derselben Platte befinden, können die Namen mit vgscan ermittelt werden (in diesem Beispiel befindet sich lediglich 1 Gruppe auf /dev/sda2):

$ vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "debian" using metadata type lvm2

Um ein logical volume (Partition) einbinden zu können, muss dieses zuerst zugänglich gemacht werden. Das wird erreicht, indem das a-Attribut der volume group auf y (yes) gesetzt wird.
Anmerkung: Der volume groupe Name 'debian' könnte in unserem Beispiel auch weggelassen werden, da sich auf unserem Laufwerk nur 1 Gruppe befindet und ohne Angabe eines Gruppennamens die Attribute aller Gruppen geändert werden.

$ vgchange -a y debian
  3 logical volume(s) in volume group "debian" now active

Mit lvs kann überprüft werden, ob die Volumes der Gruppe nun auch active sind:

$ lvs
  LV   VG     Attr     LSize   Pool Origin Data%  Move Log Copy%  Convert
  home debian -wi-a---  17,69g                                          
  root debian -wi-a---   4,66g                                           
  swap debian -wi-a--- 956,00m

Die 3 logical volumes home, root und swap der volume group debian sind nun unter /dev/debian/ als Links zu /dev/mapper/ abgebildet und lassen sich wie gewöhnliche Partitionen einbinden:

$ ls -la /dev/debian
total 0
drwxr-xr-x  2 root root   80 Feb 28 09:44 .
drwxr-xr-x 17 root root 3180 Feb 28 09:44 ..
lrwxrwxrwx  1 root root   23 Feb 28 09:43 home -> /dev/mapper/debian-home
lrwxrwxrwx  1 root root   26 Feb 28 09:44 root -> /dev/mapper/debian-root
lrwxrwxrwx  1 root root   26 Feb 28 09:44 swap -> /dev/mapper/debian-swap
$ mount /dev/debian/home /mnt
$ ls -l /mnt
insgesamt 20
drwx------  2 root      root      16384 Feb 19 22:02 lost+found
drwxr-xr-x 13 mutetella mutetella  4096 Feb 21 11:08 mutetella

Um das logical volume wieder auszuhängen und die Partition, auf der sich die volume group befindet wieder zu verschlüsseln:

$ umount /dev/debian/home
$ vgchange -a n debian
$ cryptsetup luksClose lvm

Größe eines logical volumes ändern

  • Verkleinern
    << Erst Filesystem, dann logical volume! >>

    Zuerst muss ermittelt werden, auf welche minimale Größe das Filesystem verkleinert werden kann, damit nachher keine Daten verloren gehen (Partition muss dazu noch eingehängt sein!):
    $ df -h /dev/mapper/debian-home
    Dateisystem             Größe Benutzt Verf. Verw% Eingehängt auf
    /dev/mapper/debian-home   15G    2,6G   12G   19% /home
    

In diesem Fall könnte das logical volume, nachdem es ausgehängt wurde, bis 12G verkleinert werden. Zuvor verlangt resize2fs aber noch einen Check des Filesystems.

$ umount /dev/mapper/debian-home
$ e2fsck -f /dev/mapper/debian-home
e2fsck 1.42.5 (29-Jul-2012)
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
home: 54545/956592 Dateien (0.1% nicht zusammenhängend), 721634/3831808 Blöcke
$ resize2fs /dev/mapper/debian-home 12G
resize2fs 1.42.5 (29-Jul-2012)
Die Grösse des Dateisystems auf /dev/mapper/debian-home wird auf 3145728 (4k) Blöcke geändert.

Das Dateisystem auf /dev/mapper/debian-home ist nun 3145728 Blöcke groß.

Nun kann das logical volume endlich verkleinert werden:

$ lvreduce -L 12G /dev/mapper/debian-home
  WARNING: Reducing active logical volume to 12,00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce home? [y/n]: y
  Reducing logical volume home to 12,00 GiB
  Logical volume home successfully resized

Und siehe da, das logical volume home ist auf 12G verkleinert und innerhalb der logical group sind 2,62G Platz verfügbar:

$ lvs
  LV   VG     Attr     LSize  Pool Origin Data%  Move Log Copy%  Convert
  home debian -wi-a--- 12,00g
  root debian -wi-ao--  4,66g
  swap debian -wi-ao--  4,01g
$ vgdisplay
  --- Volume group ---
  VG Name               debian
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  23
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               23,28 GiB
  PE Size               4,00 MiB
  Total PE              5960
  Alloc PE / Size       5290 / 20,66 GiB
  Free  PE / Size       670 / 2,62 GiB
  VG UUID               BoOj9E-xhD0-mh9Q-3MLx-G3kG-C3dd-q5ng1w
  • Vergrößern
    << Erst logical volume, dann Filesystem! >>

    Wollen wir die soeben frei gewordenen 2,62G wieder an das logical volume home anhängen, vergrößern wir dieses zuerst. Um Rundungsfehler zu vermeiden, verwenden wir als Einheit nicht GB sondern die LVM-internen extents, die standardmäßig jeweils 4 MB groß sind:
    $ lvextend -l +670 /dev/mapper/debian-home
      Extending logical volume home to 14,62 GiB
      Logical volume home successfully resized
    $ vgdisplay
      --- Volume group ---
      VG Name               debian
      System ID
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  27
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                3
      Open LV               2
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               23,28 GiB
      PE Size               4,00 MiB
      Total PE              5960
      Alloc PE / Size       5960 / 23,28 GiB
      Free  PE / Size       0 / 0
      VG UUID               BoOj9E-xhD0-mh9Q-3MLx-G3kG-C3dd-q5ng1w
    

Das Vergrößern des Filesystems kann nun ohne Größenangabe geschehen. In diesem Fall verwendet resize2fs die maximale Größe:

$ resize2fs /dev/mapper/debian-home
resize2fs 1.42.5 (29-Jul-2012)
Die Grösse des Dateisystems auf /dev/mapper/debian-home wird auf 3831808 (4k) Blöcke geändert.

Das Dateisystem auf /dev/mapper/debian-home ist nun 3831808 Blöcke groß.

Größe einer volume group ändern

How can I resize a LVM partition
Extending a LVM
vgresize... Ich kapier's nicht...

Eines vorweg: Eine volume group kann immer nur um physical volumes vergrößert oder verkleinert werden da eine volume group letztlich "nur" ein Verbund von physical volumes darstellt.
Möchte man eine volume group um weniger als das kleinste darin enthaltene physical volume verkleinern, so muss zuerst ein leeres physical volume aus der volume group herausgenommen, verkleinert (siehe fdisk) und wieder zur volume group hinzugefügt werden.

In der folgenden volume group sind ~3.49G Speicher frei. Davon sollen ~2.5G "ausgekoppelt" werden:

$ vgs
  VG   #PV #LV #SN Attr   VSize VFree
  test   3   1   0 wz--n- 7.99g 3.49g

Falls logical volumes innerhalb der volume group eingehängt sind (erkennbar am o Attribut) müssen diese zuerst ausgehängt werden. Danach die volume group deaktivieren:

$ lvs
  LV     VG   Attr   LSize Origin Snap%  Move Log Copy%  Convert
  bilder test -wi-ao 4.50g
$ umount /dev/test/bilder
$ vgchange -a n test
  The link /dev/test/bilder should have been removed by udev but it is still present. Falling back to direct link removal.
  0 logical volume(s) in volume group "test" now active

Die folgende Liste der physical volumes zeigt, dass innerhalb der volume group kein physical volume vorhanden ist, das ~2.5G groß und leer wäre:

$ pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sda1  test lvm2 a-   3.00g    0 
  /dev/sda2  test lvm2 a-   3.00g 1.49g
  /dev/sda3  test lvm2 a-   2.00g 2.00g

Folgende Schritte sind demnach nötig:

  1. /dev/sda2 leeren und aus der volume group lösen
  2. Die herausgelöste /dev/sda2 um ~0.5G auf ~2.5G (entspricht 5242880 Sektoren) verkleinern (siehe auch fdisk) und wieder zur volume group hinzufügen
  3. /dev/sda3 leeren und aus der volume group lösen
  4. Aus den freien Sektoren von /dev/sda2 und der herausgelösten /dev/sda3 eine ~2.5G (5242880 Sektoren) große neue Partition bilden (fdisk...)

Schritt 1 /dev/sda2 leeren und lösen

$ pvmove /dev/sda2
  /dev/sda2: Moved: 0.8%
  /dev/sda2: Moved: 44.4%
  /dev/sda2: Moved: 88.3%
  /dev/sda2: Moved: 100.0%
$ vgreduce test /dev/sda2
  Removed "/dev/sda2" from volume group "test"
$ pvs
  PV         VG   Fmt  Attr PSize PFree  
  /dev/sda1  test lvm2 a-   3.00g      0 
  /dev/sda2       lvm2 a-   3.00g   3.00g
  /dev/sda3  test lvm2 a-   2.00g 504.00m

Schritt 2 /dev/sda2 verkleinern und wieder einfügen

$ fdisk /dev/sda

Command (m for help): p

Disk /dev/sda: 32.0 GB, 32017047552 bytes
255 heads, 63 sectors/track, 3892 cylinders, total 62533296 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 identifier: 0xe8bfa451

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     6293503     3145728   83  Linux
/dev/sda2         6293504    12584959     3145728   83  Linux
/dev/sda3        12584960    16779263     2097152   83  Linux

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First sector (6293504-62533295, default 6293504): 
Using default value 6293504
Last sector, +sectors or +size{K,M,G} (6293504-12584959, default 12584959): +5242880

Command (m for help): p

Disk /dev/sda: 32.0 GB, 32017047552 bytes
255 heads, 63 sectors/track, 3892 cylinders, total 62533296 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 identifier: 0xe8bfa451

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     6293503     3145728   83  Linux
/dev/sda2         6293504    11536384     2621440+  83  Linux
/dev/sda3        12584960    16779263     2097152   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

$ partprobe
$ pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized
$ vgextend test /dev/sda2
  Volume group "test" successfully extended

Schritt 3 /dev/sda3 leeren und lösen

$ pvmove /dev/sda3
  /dev/sda3: Moved: 0.8%
  /dev/sda3: Moved: 47.3%
  /dev/sda3: Moved: 86.2%
  /dev/sda3: Moved: 100.0%
$ vgreduce test /dev/sda3
  Removed "/dev/sda3" from volume group "test"

Schritt 4 Neue freie Partition erstellen

$ fdisk /dev/sda

Command (m for help): p

Disk /dev/sda: 32.0 GB, 32017047552 bytes
255 heads, 63 sectors/track, 3892 cylinders, total 62533296 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 identifier: 0xe8bfa451

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     6293503     3145728   83  Linux
/dev/sda2         6293504    11536384     2621440+  83  Linux
/dev/sda3        12584960    16779263     2097152   83  Linux

Command (m for help): d
Partition number (1-4): 3

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First sector (11536385-62533295, default 11536385): 
Using default value 11536385
Last sector, +sectors or +size{K,M,G} (11536385-62533295, default 62533295): +5242880

Command (m for help): p

Disk /dev/sda: 32.0 GB, 32017047552 bytes
255 heads, 63 sectors/track, 3892 cylinders, total 62533296 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 identifier: 0xe8bfa451

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     6293503     3145728   83  Linux
/dev/sda2         6293504    11536384     2621440+  83  Linux
/dev/sda3        11536385    16779265     2621440+  83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
$ partprobe

Möchte man /dev/sda3 weiterhin als physical volume verwenden, muss es als solches neu erstellt werden, da durch das Verschieben kein physical volume label mehr erkennbar ist.

$ pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created

Verschlüsseltes LVM erstellen - LVM on LUKS

archlinux wiki: System Encryption with LUKS <- LUKS on LVM Methode
Arch Linux: LVM on top of an encrypted partition <- LVM on LUKS Methode

Für meine Debian-Installation habe ich mich für LVM on LUKS entschieden, da mir das gegenüber LUKS on LVM dafür als geeigneter erscheint (und weil es der Debian Installer auch so macht *grins*):
Der bereits verlinkte Blogeintrag Arch Linux: LVM on top of an encrypted partition beschreibt recht ausführlich, wie dabei vorgegangen werden kann. Deshalb hier nur die einzelnen Schritte, /dev/sda2 soll dabei die zu verschlüsselnde Partition sein:

Partition verschlüsseln (-s 256, falls das System nicht besonders flink ist):

$ cryptsetup -c aes-xts-plain -y -s 512 luksFormat /dev/sda2

Die Sicherheitsabfrage mit YES (lowercase!) beantworten...

Die verschlüsselte Partition öffnen:

$ cryptsetup luksOpen /dev/sda2 lvm

Das physical volume und daraus die volume group erstellen:

$ pvcreate /dev/mapper/lvm
$ vgcreate crypt_vg /dev/mapper/lvm

Jetzt noch die systemrelevanten logical volumes erstellen:

lvcreate -L 4GB -n root crypt_vg
lvcreate -L 512MB -n swap crypt_vg
lvcreate -l 100%FREE -n home crypt_vg
Last modified 5 years ago Last modified on Dec 8, 2014, 5:58:34 PM