Festplatten-Kapazität erweitern (mdadm + LVM + LUKS)

Aus Linupedia
Wechseln zu: Navigation, Suche
Höhe=24px Dieser Artikel oder Teile davon wurden mit 'Review' markiert. Das bedeutet, dass größere Arbeiten am Inhalt des Artikels abgeschlossen sind und der Autor eine Korrekturlesung durch andere User zur Qualitätssicherung für angebracht hält.

Zu sichtende Teile: Gesamter Artikel

Bitte hilf LinuxClubWiki, indem du den zu sichtenden Teil überprüfst und den Artikel gegebenenfalls überarbeitest!

--Gehrke (Diskussion) 17:05, 15. Jan. 2015 (CET)


In diesem Artikel sollen anhand eines Beispiels die notwendigen Arbeitsschritte erläutert werden, mit welchen die Festplatten-Kapazität eines Linux-Systems mit einem bestimmten, aber durchaus verbreiteten Partitionierungslayouts erweitert werden kann. Dabei handelt es sich um eine komplexe Konfiguration mit diesen Komponenten:

  • Linux Software RAID (mdadm): Durch diese Software-Lösung im Kernel des Betriebssystems werden mehrere Festplatten zu einem einzigen, virtuellen Datenspeicher (RAID) zusammengefasst. Es gibt unterschiedliche Ausprägungen eines RAIDs. Im vorliegenden Fall bietet der Typ 'RAID6' neben einer zweifachen Redundanz auch Performance-Verbesserungen im Vergleich zu den Eigenschaften einer einzelnen Festplatte. Dies wird dadurch erreicht, dass die Daten mehrfach auf die beteiligten Datenträger geschrieben werden, wodurch die Gesamtkapazität des Verbundes im Vergleich zur der Gesamtkapazität der einzelnen Festplatten erheblich gesenkt wird.
  • Linux Unified Key Setup (LUKS): Eine blockweise-arbeitende Verschlüsselungsschicht, welche transparent beim Zugriff auf ein dahinter liegendes Block-Device agiert. Nach Eingabe der Passphrase zur Entschlüsselung (beim Öffnen des LUKS-Containers) ist im praktischen Betrieb von der Existenz dieser Software kaum etwas zu merken.
  • Logical Volume Manager (LVM): LVM bildet eine zusätzliche Abstraktionsebene zwischen den in realer Hardware existierenden Speicherkomponenten (Festplatten bzw. Partionen) einerseits und rein logischen Speicherblöcken andererseits. Auf Basis von LVM können logische Verbünde von Speicherbereichen über mehrere Datenträger angelegt werden und es wird eine flexiblere und dynamischere Verwaltung dieser Bereiche ermöglicht, als das mit der herkömmlichen Partitionierungsmethode möglich ist. Diese Schicht ist im Kernel implementiert.

In dem folgenden Beispiel wird eine zusätzliche Festplatte (4 TB) zu einem bestehenden Verbund aus 4 Festplatten (3 TB) eingefügt. Bei dem in diesem Beispiel verwendeten System handelt es sich um ein CentOS 6.2 in einer klassischen Fileserver-Konfiguration. Prinzipiell kann die Vorgehensweise auch auf beliebigen anderen Distributionen verwendet werden, solange die oben genannten Komponenten von dem jeweiligen System unterstützt werden.

Alle Schritte erfolgen im laufenden Betrieb, jeweils durch kurze Offlinezeiten für Reboots unterbrochen. Das ist insofern relevant, als dass einige Schritte allein schon aufgrund der großen Kapazität mehrere Tage in Anspruch nehmen und das System in dieser Zeit trotzdem seine Dienste anbieten kann. Diese Online-Funktionalität birgt ein gewisses Risiko, denn wenn ein Server in einer solchen Phase unter hohe Last gerät (und der Reshaping-Prozess verursacht selbst schon erhebliche Last), dann steigt die Wahrscheinlichkeit, dass es durch irgendeine ungünstige Randbedingung zu Problemen kommen könnte. Im vorliegenden Fall konnte dies weitgehend ausgeschlossen werden und in Anbetracht der Tatsache, dass es sich hier durchweg um 'abgehangene' Software handelt, wurde dieses Risiko zugunsten der Verfügbarkeit bewusst eingegangen. In jedem Fall ist hier aber mit temporären Performance-Einbußen zu rechnen.

Alternativ können die einzelnen Schritte aber auch im Admin-Mode oder von einer separaten Live-Distribution gebootet und somit offline durchgeführt werden.

Das Verfahren wurde nacheinander mit 2 Festplatten getestet.

Hinweis: In einem RAID6 können ausschließlich gleich große Einheiten genutzt werden. Im vorliegenden Fall werden von der neu hinzugefügten 4 TB Festplatte lediglich 3 TB für das RAID verwendet, weil das die Kapazität der schon vorhandenen Festplatten ist. Nur auf diesem Wege kann die Redundanz des Gesamtkonstruktes sichergestellt werden. Diese Festplatte hätte auch auf 3+1 TB partitioniert werden können. In diesem Fall stünde 1 TB dem System für andere Zwecke zur Verfügung.


Bestandsaufnahme

Vorweg wird vor Durchführung irgendwelcher Maßnahmen die aktuelle Konfiguration protokolliert.

Verfügbarer Diskspace:

-bash-4.1$ df -h
Dateisystem             Size  Used Avail Use% Eingehängt auf
/dev/mapper/system-os2   15G  8,7G  5,5G  62% /
tmpfs                   1,9G     0  1,9G   0% /dev/shm
/dev/md0                189M  148M   32M  83% /boot
/dev/mapper/system-home 5,4T  5,3T  7,4G 100% /home

Partitionierungslayout:

-bash-4.1$ lsblk
NAME                                                   MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                                                      8:0    0   2,7T  0 disk  
├─sda1                                                   8:1    0   195M  0 part  
│ └─md0                                                  9:0    0   195M  0 raid1 /boot
└─sda2                                                   8:2    0   2,7T  0 part  
  └─md1                                                  9:1    0   5,5T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   5,5T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm   
sdb                                                      8:16   0   2,7T  0 disk  
├─sdb1                                                   8:17   0   195M  0 part  
│ └─md0                                                  9:0    0   195M  0 raid1 /boot
└─sdb2                                                   8:18   0   2,7T  0 part  
  └─md1                                                  9:1    0   5,5T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   5,5T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm   
sdc                                                      8:32   0   2,7T  0 disk  
└─sdc1                                                   8:33   0   2,7T  0 part  
  └─md1                                                  9:1    0   5,5T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   5,5T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm   
sdd                                                      8:48   0   2,7T  0 disk  
└─sdd1                                                   8:49   0   2,7T  0 part  
  └─md1                                                  9:1    0   5,5T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   5,5T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm

Man erkennt mit 'md1' ein RAID6, welches sich über 4 Festplatten mit einer Kapazität von jeweils 3 TB erstreckt. Die hierfür verwendeten Partitionen sind: sda2, sdb2, sdc1, sdd1. Insgesamt bietet dieses Array eine Kapazität von 5,5 TB an.

In diesen RAID-Verbund wurde ein LUKS-Container gelegt, welcher für die Verschlüsselung des gesamten Inhalts sorgt. Innerhalb dieses LUKS-Containers wurde mittels LVM die eigentliche Partitionierierung mit einer VolumeGroup (VG) 'system' und mehreren LogicalVolumes (LV) eingehängt.

In diesen LVs wurden die Dateisysteme installiert und entsprechend die unterschiedlichen Mountpoints angelegt.

Status des RAID-Systems

Vorweg ein Blick in die grundlegende Konfiguration von mdadm:

[root@j4 ~]# cat /etc/mdadm.conf
# mdadm.conf written out by anaconda
MAILADDR <xxx>@<xxx>.de
AUTO +imsm +1.x -all
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=b81b0e1c:6abf044a:6a1c70a2:d2ce5ea8
ARRAY /dev/md1 level=raid6 num-devices=4 UUID=777dc012:1265b112:1deadd70:c147ba88

Der aktuelle Status lässt sich wie folgt abrufen:

-bash-4.1$ cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] [raid1] [raid0]                                                                          
md0 : active raid1 sda1[0] sdb1[1]                                                                                               
      199668 blocks super 1.0 [2/2] [UU]                                                                                         
      bitmap: 0/1 pages [0KB], 65536KB chunk                                                                                     
                                                                                                                                 
md1 : active raid6 sdb2[1] sda2[4] sdd1[3] sdc1[2]                                                                               
      5860130304 blocks super 1.0 level 6, 128k chunk, algorithm 2 [4/4] [UUUU]                                                  
      bitmap: 8/22 pages [32KB], 65536KB chunk                                                                                   
                                                                                                                                 
unused devices: <none>
  • md0: Ein RAID1 für die Boot-Partition. Diese soll unverändert bleiben.
  • md1: Dieser Bereich nimmt den gesamten Rest der Festplatten auf und enthält innerhalb eines LUKS-Containers eine Partitionierung auf Basis von LVM. Der Großteil des verfügbaren Speicherbereiches liegt im Logical Volume (LV) 'home' der Volume Group (VG) 'system' , welches für die home-Partition genutzt wird. Das LV 'home' soll vergrößert werden.

Zur Sicherheit wird die Konfiguration des RAIDs komplett protokolliert, was im Fehlerfall sehr hilfreich sein kann:

[root@j4 ~]# mdadm -Evvvvs
mdadm: No md superblock detected on /dev/dm-6.
mdadm: No md superblock detected on /dev/md2.
/dev/sdg:
          Magic : 1c8b6af0
        Version : 1.2
    Feature Map : 0x0
     Array UUID : d6222b74:62a16222:72ce5222:021ffa21
           Name : j4.gehrke.local:2  (local to host j4.gehrke.local)
  Creation Time : Sun Apr 21 10:33:40 2013
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : e399d670:1f393a93:1a97d969:50e99398

    Update Time : Sun Apr 21 10:33:40 2013
       Checksum : 5f1b2ffb - correct
         Events : 0

     Chunk Size : 512K

   Device Role : Active device 0
   Array State : AA ('A' == active, '.' == missing)
/dev/sdf:
          Magic : 1c8b6af0
        Version : 1.2
    Feature Map : 0x0
     Array UUID : d6222b74:62a16222:72ce5222:021ffa21
           Name : j4.gehrke.local:2  (local to host j4.gehrke.local)
  Creation Time : Sun Apr 21 10:33:40 2013
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : 1ee8c2fc:61ff51e1:17e1d316:81b4fe18

    Update Time : Sun Apr 21 10:33:40 2013
       Checksum : 9889113d - correct
         Events : 0

     Chunk Size : 512K

   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing)
/dev/dm-5:
   MBR Magic : aa55
Partition[0] :       208782 sectors at           63 (type 83)
Partition[1] :     20755980 sectors at       208845 (type 8e)
mdadm: No md superblock detected on /dev/dm-4.
mdadm: No md superblock detected on /dev/dm-3.
mdadm: No md superblock detected on /dev/md0.
mdadm: No md superblock detected on /dev/dm-2.
mdadm: No md superblock detected on /dev/dm-1.
mdadm: No md superblock detected on /dev/dm-0.
mdadm: No md superblock detected on /dev/md1.
/dev/sdd1:
          Magic : 1c8b6af0
        Version : 1.0
    Feature Map : 0x1
     Array UUID : 777dc012:1265b112:1deadd70:c147ba88
           Name : linux:1
  Creation Time : Tue Aug 30 23:44:02 2011
     Raid Level : raid6
   Raid Devices : 4

 Avail Dev Size : 5860529904 (2794.52 GiB 3000.59 GB)
     Array Size : 11720260608 (5588.66 GiB 6000.77 GB)
  Used Dev Size : 5860130304 (2794.33 GiB 3000.39 GB)
   Super Offset : 5860530160 sectors
          State : active
    Device UUID : 46a44e64:25490431:1bdf44dd:045476e5

Internal Bitmap : -16 sectors from superblock
    Update Time : Fri Dec 26 18:18:11 2014
       Checksum : 4eb54f4b - correct
         Events : 852198

         Layout : left-symmetric
     Chunk Size : 128K

   Device Role : Active device 3
   Array State : AAAA ('A' == active, '.' == missing)
/dev/sdd:
   MBR Magic : aa55
Partition[0] :   4294967295 sectors at         2048 (type 83)
Partition[1] :   4294967295 sectors at       401408 (type 83)
Partition[3] :            1 sectors at            1 (type ee)
/dev/sdc1:
          Magic : 1c8b6af0
        Version : 1.0
    Feature Map : 0x1
     Array UUID : 777dc012:1265b112:1deadd70:c147ba88
           Name : linux:1
  Creation Time : Tue Aug 30 23:44:02 2011
     Raid Level : raid6
   Raid Devices : 4

 Avail Dev Size : 5860529904 (2794.52 GiB 3000.59 GB)
     Array Size : 11720260608 (5588.66 GiB 6000.77 GB)
  Used Dev Size : 5860130304 (2794.33 GiB 3000.39 GB)
   Super Offset : 5860530160 sectors
          State : clean
    Device UUID : cafb19a0:27a4a2a5:fa21aa35:6aecae86

Internal Bitmap : -16 sectors from superblock
    Update Time : Fri Dec 26 18:18:11 2014
       Checksum : 26d438a2 - correct
         Events : 852197

         Layout : left-symmetric
     Chunk Size : 128K

   Device Role : Active device 2
   Array State : AAAA ('A' == active, '.' == missing)
/dev/sdc:
   MBR Magic : aa55
Partition[0] :   4294967295 sectors at         2048 (type 83)
Partition[1] :   4294967295 sectors at       401408 (type 83)
Partition[3] :            1 sectors at            1 (type ee)
/dev/sdb2:
          Magic : 1c8b6af0
        Version : 1.0
    Feature Map : 0x1
     Array UUID : 777dc012:1265b112:1deadd70:c147ba88
           Name : linux:1
  Creation Time : Tue Aug 30 23:44:02 2011
     Raid Level : raid6
   Raid Devices : 4

 Avail Dev Size : 5860130544 (2794.33 GiB 3000.39 GB)
     Array Size : 11720260608 (5588.66 GiB 6000.77 GB)
  Used Dev Size : 5860130304 (2794.33 GiB 3000.39 GB)
   Super Offset : 5860130800 sectors
          State : clean
    Device UUID : 20d270d6:70a10cd2:40d00d99:905540a0

Internal Bitmap : -16 sectors from superblock
    Update Time : Fri Dec 26 18:18:11 2014
       Checksum : dc596b58 - correct
         Events : 852197

         Layout : left-symmetric
     Chunk Size : 128K

   Device Role : Active device 1
   Array State : AAAA ('A' == active, '.' == missing)
/dev/sdb1:
          Magic : 1c8b6af0
        Version : 1.0
    Feature Map : 0x1
     Array UUID : b81b0e1c:6abf044a:6a1c70a2:d2ce5ea8
           Name : linux.site:0
  Creation Time : Fri Oct 21 23:08:05 2011
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 399336 (195.02 MiB 204.46 MB)
     Array Size : 399336 (195.02 MiB 204.46 MB)
   Super Offset : 399344 sectors
          State : clean
    Device UUID : 09eff255:25b5e555:6559d544:6552956a

Internal Bitmap : -8 sectors from superblock
    Update Time : Fri Dec 26 13:29:17 2014
       Checksum : a92b2b9b - correct
         Events : 445


   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing)
/dev/sdb:
   MBR Magic : aa55
Partition[0] :   4294967295 sectors at            1 (type ee)
/dev/sda2:
          Magic : 1c8b6af0
        Version : 1.0
    Feature Map : 0x1
     Array UUID : 777dc012:1265b112:1deadd70:c147ba88
           Name : linux:1
  Creation Time : Tue Aug 30 23:44:02 2011
     Raid Level : raid6
   Raid Devices : 4

 Avail Dev Size : 5860130544 (2794.33 GiB 3000.39 GB)
     Array Size : 11720260608 (5588.66 GiB 6000.77 GB)
  Used Dev Size : 5860130304 (2794.33 GiB 3000.39 GB)
   Super Offset : 5860130800 sectors
          State : clean
    Device UUID : f488edfc:383b88e2:93f894b8:e8af58f8

Internal Bitmap : -16 sectors from superblock
    Update Time : Fri Dec 26 18:18:11 2014

Status von LUKS

[root@j4 ~]# cryptsetup status /dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16 
/dev/mapper//dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16 is active and is in use.
  type:  LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/md1
  offset:  4096 sectors
  size:    11720256512 sectors
  mode:    read/write
Achtung:

Der Cipher 'aes-cbc' kann vom aktuellem Standpunkt nicht mehr als sicher eingestuft werden und sollte dringend in nächster Zeit gegen 'aes-xts' ausgetauscht werden (s. Erfolgreicher Angriff auf Linux-Verschlüsselung (heise security 23.12.2013))!


Status von LVM

[root@j4 ~]# lvs
  LV   VG     Attr   LSize  Origin Snap%  Move Log Copy%  Convert
  home system -wi-ao  5,39t                                      
  os1  system -wi-a- 15,00g                                      
  os2  system -wi-ao 15,00g                                      
  swap system -wi-ao  4,00g                                      
  vm1  system -wi-a- 10,00g

[root@j4 ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16
  VG Name               system
  PV Size               5,46 TiB / not usable 1,50 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              1430695
  Free PE               6474
  Allocated PE          1424221
  PV UUID               g9hWlI-2sO1-ZubK-DZXV-yNcZ-P2UM-ReEDlx

[root@j4 ~]# lvdisplay
  --- Logical volume ---
  LV Name                /dev/system/home
  VG Name                system
  LV UUID                n2gKl4-gCf3-R3Zb-822b-fbI1-rYkA-mz544F
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                5,39 TiB
  Current LE             1412957
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     1024
  Block device           253:3
   
  --- Logical volume ---
  LV Name                /dev/system/os1
  VG Name                system
  LV UUID                m4JIJe-qO12-bJLU-A33Q-art1-2fb8-oVgkJ4
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                15,00 GiB
  Current LE             3840
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     1024
  Block device           253:4
   
  --- Logical volume ---
  LV Name                /dev/system/os2
  VG Name                system
  LV UUID                KXn60L-fr1L-fi3R-Foa0-fpi9-ew3u-S40oP1
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                15,00 GiB
  Current LE             3840
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     1024
  Block device           253:1
   
  --- Logical volume ---
  LV Name                /dev/system/swap
  VG Name                system
  LV UUID                rXyEIP-M3xE-tj3J-AiQy-524d-Tq6e-IpLy4v
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                4,00 GiB
  Current LE             1024
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     1024
  Block device           253:2
   
  --- Logical volume ---
  LV Name                /dev/system/vm1
  VG Name                system
  LV UUID                3v326C-M9go-prOT-QLIX-9Sf3-924t-wZ4BeY
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                10,00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     1024
  Block device           253:5

Durchführung

Zuerst werden zwingend notwendige Vorarbeiten wie das Backup durchgeführt. Erst danach werden die eigentlichen Schritte durchgeführt, bei denen die Systemkonfiguration auch verändert wird.

Die Schritte im Einzelnen:

  1. Backup
  2. Festplatte: Physischer Einbau und Hardware-Tests
  3. Festplatte: Partitionierung
  4. Festplatte: Initialisierung Entropie
  5. Hinzufügen der Festplatten zur RAID-Konfiguration (mdadm)
  6. Vergrößerung des LUKS-Containers (cryptsetup)
  7. Vergrößerung des LogicalVolumes (LVM)
  8. Vergrößerung des Dateisystems (ext4)
  9. End-Kontrolle

Backup

Achtung:

Die folgenden Schritte greifen sehr tief in das System ein und bergen ein erhebliches Risiko, sämtliche Daten auf den Festplatten zu zerstören!


Es ist demnach absolut notwendig, vor der Durchführung der folgenden Schritte ein komplettes und valides Backup durchzuführen.

Festplatte: Physischer Einbau und Hardware-Tests

Festplatten können auf aktueller Server-Hardware in der Regel im laufenden Betrieb eingebaut werden. Die neue Festplatte wird physisch eingebaut und kontrolliert, dass die Hardware vom Controller erkannt wird:

[root@j4 ~]# tail -f /var/log/messages
Dec 27 08:57:11 j4 kernel: ata10: exception Emask 0x10 SAct 0x0 SErr 0x4040000 action 0xe frozen
Dec 27 08:57:11 j4 kernel: ata10: irq_stat 0x00000040, connection status changed
Dec 27 08:57:11 j4 kernel: ata10: SError: { CommWake DevExch }
Dec 27 08:57:11 j4 kernel: ata10: hard resetting link
Dec 27 08:57:21 j4 kernel: ata10: softreset failed (device not ready)
Dec 27 08:57:21 j4 kernel: ata10: hard resetting link
Dec 27 08:57:22 j4 kernel: ata9: exception Emask 0x10 SAct 0x0 SErr 0x4040000 action 0xe frozen
Dec 27 08:57:22 j4 kernel: ata9: irq_stat 0x00000040, connection status changed
Dec 27 08:57:22 j4 kernel: ata9: SError: { CommWake DevExch }
Dec 27 08:57:22 j4 kernel: ata9: hard resetting link
Dec 27 08:57:26 j4 kernel: ata10: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Dec 27 08:57:26 j4 kernel: ata10.00: ATA-8: WDC WD4000FYXX-35TH42J, 01.01K02, max UDMA/133
Dec 27 08:57:26 j4 kernel: ata10.00: 7814037168 sectors, multi 0: LBA48 NCQ (depth 31/32), AA
Dec 27 08:57:26 j4 kernel: ata10.00: configured for UDMA/133
Dec 27 08:57:26 j4 kernel: ata10: EH complete
Dec 27 08:57:26 j4 kernel: scsi 9:0:0:0: Direct-Access     ATA      WDC WD4000FYXX-0 01.0 PQ: 0 ANSI: 5
Dec 27 08:57:26 j4 kernel: sd 9:0:0:0: Attached scsi generic sg6 type 0
Dec 27 08:57:26 j4 kernel: sd 9:0:0:0: [sde] 7814037168 512-byte logical blocks: (4.00 TB/3.63 TiB)
Dec 27 08:57:26 j4 kernel: sd 9:0:0:0: [sde] Write Protect is off
Dec 27 08:57:26 j4 kernel: sd 9:0:0:0: [sde] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Dec 27 08:57:26 j4 kernel: sde: unknown partition table
Dec 27 08:57:26 j4 kernel: sd 9:0:0:0: [sde] Attached SCSI disk

Die neue Hardware wurde also erkannt und kann verwendet werden. Auch 'lsblk' zeigt die neue Festplatte, bislang ohne Verwendung (MOUNTPOINT):

[root@j4 ~]# lsblk
NAME                                                   MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
[...]
sde                                                      8:64   0   3,7T  0 disk  

An dieser Stelle sollten ebenfalls die Informationen zur Festplatten-Geometrie abgerufen und für den Notfall gespeichert werden:

[root@j4 ~]# fdisk -l /dev/sde

Platte /dev/sde: 4000.8 GByte, 4000787030016 Byte
255 Köpfe, 63 Sektoren/Spur, 486401 Zylinder
Einheiten = Zylinder von 16065 × 512 = 8225280 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Festplatte /dev/sde enthält keine gültige Partitionstabelle

Bei dieser Gelegenheit sollte man sich auch mittels smartctl die Hardware-Eigenschaften der (hoffentlich) neuen Festplatte genauer ansehen und auf Fehler prüfen:

[root@j4 ~]# smartctl --all /dev/sde
smartctl 5.39.1 2010-01-28 r3054 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     WDC WD4000FYXX-35TH42J
Serial Number:    WD-WCC233242840
Firmware Version: 01.01K02
User Capacity:    4.000.787.030.016 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Sat Dec 27 09:05:56 2014 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x80) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline 
data collection:                 (45660) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine 
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        ( 255) minutes.
Conveyance self-test routine
recommended polling time:        (   5) minutes.
SCT capabilities:              (0x70bd) SCT Status supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   253   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   100   253   021    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       1
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   100   253   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       0
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       1
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       0
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   125   119   000    Old_age   Always       -       27
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   253   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   100   253   000    Old_age   Offline      -       0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]


SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Durchführung eines kurzen Selbst-Tests der Festplatte:

[root@j4 ~]# smartctl --test=short /dev/sde
smartctl 5.39.1 2010-01-28 r3054 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Sat Dec 27 09:28:24 2014

Use smartctl -X to abort test.

Nach entsprechender Wartezeit:

[root@j4 ~]# smartctl --all /dev/sde
smartctl 5.39.1 2010-01-28 r3054 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     WDC WD4000FYXX-35TH42J
Serial Number:    WD-WCC233242840
Firmware Version: 01.01K02
User Capacity:    4.000.787.030.016 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Sat Dec 27 09:23:51 2014 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x80) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline 
data collection:                 (45660) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine 
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        ( 255) minutes.
Conveyance self-test routine
recommended polling time:        (   5) minutes.
SCT capabilities:              (0x70bd) SCT Status supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   253   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   100   253   021    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       1
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   100   253   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       0
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       1
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       0
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   112   112   000    Old_age   Always       -       40
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   253   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   100   253   000    Old_age   Offline      -       0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%         0         -
# 2  Short offline       Completed without error       00%         0         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Festplatte: Initialisierung Entropie

Die Qualität eines Verschlüsselungssystems hängt ab von der initialen Herstellung einer geeigneten Entropie auf dem jeweiligem Datenträger. Bei einer Formatierung für LUKS wird der verwendete Bereich nicht überschrieben, so dass in noch nicht neu verwendeten Blöcken alte Datenstrukturen oder einfach nur Nullen (bei einer neuen Festplatte) erkennbar bleiben. Dies könnte Angreifern Rückschlüsse ermöglichen, die die Vertraulichkeit des Containerinhaltes gefährden.

Um das zu verhindern, wird in diesem Schritt der Datenträger mit Zufallswerten beschrieben. Je nach Anwendungsfall und nach Grad der persönlichen Paranoia kann dieser Schritt auch mehrfach durchgeführt werden.

Achtung:

Bei diesem Schritt werden alle Daten auf dem angegebenen Datenträger überschrieben. Es ist deshalb unbedingt sicherzustellen, dass hier das korrekte Ziel angegeben wird.


Es wird screen verwendet, damit ein solch lang-anhaltender Prozess nicht die Remote-Verbindung blockiert. Auf 'screen' kann auch verzichtet werden:

[root@j4 ~]# screen time dd if=/dev/urandom of=/dev/sde bs=8K

Ein einzelner Durchgang kann - in Abhängigkeit von der Performance und Größe der Festplatte - viele Stunden oder auch Tage andauern. Die Initialisierung erfolgt über das Pseudo-Device '/dev/urandom'. Im Vergleich dazu bietet '/dev/random' eine bessere Qualität bei der Zufälligkeit, ist aber sehr viel langsamer und insofern für die Initialisierung von Festplatten im Terabyte-Bereich nicht praktikabel.


Eine Möglichkeit, diesen Prozess zu beschleunigen, ist es, die Generierung auf mehrere Computer zu verteilen: Verteilte Generierung von Zufallszahlen‎.

Eine um Faktor 20 schnellere Alternativlösung ist es, zuerst einen LUKS-Container aufzubringen und diesen danach mittels dd mit Nullen vom Pseudo-Device /dev/zero vollzuschreiben: Wie eine Platte unwiederherstellbar und sicher loeschen#Überschreiben mittels Verschlüsselung.

Der Autor kann die Auswirkung dieser beiden Verfahren auf die resultierende Sicherheitslage nicht verlässlich beurteilen, hier muss der Anwender die Entscheidung selbst auf Basis eigener Recherchen und passend zu den eigenen Bedürfnissen treffen!

Festplatte: Partitionierung

Es besteht die Wahlmöglichkeit, entweder die komplette Festplatte oder eine Partition dem RAID hinzuzufügen. Da die bestehenden Teile des RAIDs schon als Partitionen hinzugefügt worden sind, wird zugunsten einer konsistenten Lösung hier ebenfalls diese Option gewählt.

Dementsprechend wird eine Partition über die gesamte Festplatte angelegt und mit dem passenden Typ '0xFD' bzw. 'fd00' (Linux RAID) gekennzeichnet. Hierzu wird das Tool gdisk statt fdisk verwendet, weil für eine solch große Partition GPT verwendet werden muss und 'fdisk' diese Technik nicht beherrscht:

[root@j4 ~]# gdisk /dev/sde
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-7814037134, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-7814037134, default = 7814037134) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): fd00
Changed type of partition to 'Linux RAID'

Command (? for help): p
Disk /dev/sde: 7814037168 sectors, 3.6 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): FFA78597-F5DA-4933-8539-80E043629B91
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 7814037134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048      7814037134   3.6 TiB     FD00  Linux RAID

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sde.
The operation has completed successfully.

Nach der Änderung der Partitionierung wird das System sicherheitshalber neu gestartet:

[root@j4 ~]# reboot

Hinzufügen der Festplatten zur RAID-Konfiguration (mdadm)

Im nächsten Schritt wird das RAID um die zuvor erzeugte Partition erweitert:

[root@j4 ~]# mdadm --manage /dev/md1 --add /dev/sde1
mdadm: added /dev/sde1
[root@j4 ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1] 
md0 : active raid1 sda1[0] sdb1[1]
      199668 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md1 : active raid6 sde1[5](S) sda2[4] sdb2[1] sdc1[2] sdd1[3]
      5860130304 blocks super 1.0 level 6, 128k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 1/22 pages [4KB], 65536KB chunk

unused devices: <none>
[root@j4 ~]# mdadm --grow /dev/md1 --raid-devices=5
mdadm: Need to backup 768K of critical section..
mdadm: Cannot set device shape for /dev/md1: Device or resource busy
       Bitmap must be removed before shape can be changed

Es liegt ein write-intent bitmap vor (s. [1]), welches zuerst entfernt werden muss:

[root@j4 ~]# mdadm --grow /dev/md1 -b none
[root@j4 ~]# mdadm --grow /dev/md1 --raid-devices=5
mdadm: Need to backup 768K of critical section..
[root@j4 ~]# mdadm --wait /dev/md1

In einer parallelen Session kann man jetzt die Aktivität des Re-Shapings erkennen, auch die Statusanzeigen der Festplatten dürften jetzt hektisch dauerblinken. An dieser Stelle werden die bislang auf 4 Festplatten lagernden Datenbestände auf 5 Platten ('UUUUU') umverteilt, es wird aber noch keinerlei Speicherplatz zusätzlich zur Verfügung gestellt. Dieser Prozess kann je nach Kapazität und Performance der Platten viele Stunden oder Tage andauern. Im folgenden Beispiel wird eine Restlaufzeit von ca. 43 Stunden (2557.6min) als Hochrechnung auf Basis der aktuellen Performance prognostiziert, welche sich aber kontinuierlich ändern kann:

[root@j4 ~]# watch "cat /proc/mdstat"
Personalities : [raid6] [raid5] [raid4] [raid1]                                                                                              
md0 : active raid1 sda1[0] sdb1[1]           
      199668 blocks super 1.0 [2/2] [UU]  
      bitmap: 0/1 pages [0KB], 65536KB chunk
                                                                                                       
md1 : active raid6 sda2[4] sdb2[1] sdd1[3] sdc1[2] sde1[5]
      5860130304 blocks super 1.0 level 6, 128k chunk, algorithm 2 [5/5] [UUUUU]
      [>....................]  reshape =  1.5% (46714588/2930065152) finish=2557.6min speed=18788K/sec
      
unused devices: <none>

In dieser Phase ist das System durch das Re-Shaping stark ausgelastet und reagiert nur noch eingeschränkt - es ist mit Performance-Einbussen zu rechnen. Die Auslastung (load) auf dem hier verwendeten System lag ohne zusätzliche Useraktivitäten bei ca. 1,2.

Erst nach Abschluss des Re-Shaping-Prozesses geht es weiter:

[root@j4 ~]# mdadm --grow /dev/md1 -b internal

Nach erfolgreichem Abschluss sollte der Status des Arrays sauber dargestellt werden (nun wird auch wieder ein bitmap verwendet):

Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid1 sda1[0] sdb1[1]
      199668 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md1 : active raid6 sda2[4] sdb2[1] sdd1[3] sdc1[2] sde1[5]
      8790195456 blocks super 1.0 level 6, 128k chunk, algorithm 2 [5/5] [UUUUU]
      bitmap: 1/11 pages [4KB], 131072KB chunk

unused devices: <none>

Es ist notwendig, die Konfiguration für die Anzahl der Devices (num-devices) für den nächsten Boot-Vorgang von '4' auf '5' zu verändern.

Nahcher:

[root@j4 ~]# grep 'md1' /etc/mdadm.conf
ARRAY /dev/md1 level=raid6 num-devices=5 UUID=777dc012:1265b112:1deadd70:c147ba88

Zum Abschluss sollte das System gebootet und der saubere Status noch einmal sichergestellt werden.

[root@j4 ~]# fdisk -l /dev/md1

Platte /dev/md1: 9001.2 GByte, 9001160146944 Byte
2 Köpfe, 4 Sektoren/Spur, -2097418432 Zylinder
Einheiten = Zylinder von 8 × 512 = 4096 Bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 131072 bytes / 393216 bytes
Disk identifier: 0x08040000

Festplatte /dev/md1 enthält keine gültige Partitionstabelle
[root@j4 ~]# lsblk
NAME                                                   MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdb                                                      8:16   0   2,7T  0 disk  
├─sdb1                                                   8:17   0   195M  0 part  
│ └─md0                                                  9:0    0   195M  0 raid1 /boot
└─sdb2                                                   8:18   0   2,7T  0 part  
  └─md1                                                  9:1    0   8,2T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   8,2T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm   
sdc                                                      8:32   0   2,7T  0 disk  
└─sdc1                                                   8:33   0   2,7T  0 part  
  └─md1                                                  9:1    0   8,2T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   8,2T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm   
sda                                                      8:0    0   2,7T  0 disk  
├─sda1                                                   8:1    0   195M  0 part  
│ └─md0                                                  9:0    0   195M  0 raid1 /boot
└─sda2                                                   8:2    0   2,7T  0 part  
  └─md1                                                  9:1    0   8,2T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   8,2T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm   
sde                                                      8:64   0   3,7T  0 disk  
└─sde1                                                   8:65   0   3,7T  0 part  
  └─md1                                                  9:1    0   8,2T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   8,2T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm   
sdd                                                      8:48   0   2,7T  0 disk  
└─sdd1                                                   8:49   0   2,7T  0 part  
  └─md1                                                  9:1    0   8,2T  0 raid6 
    └─luks-bc641135-b1f2-4127-8112-b158e0112e16 (dm-0) 253:0    0   8,2T  0 crypt 
      ├─system-os2 (dm-1)                              253:1    0    15G  0 lvm   /
      ├─system-swap (dm-2)                             253:2    0     4G  0 lvm   [SWAP]
      ├─system-home (dm-3)                             253:3    0   5,4T  0 lvm   /home
      ├─system-os1 (dm-4)                              253:4    0    15G  0 lvm   
      └─system-vm1 (dm-5)                              253:5    0    10G  0 lvm

Hinweis: md1 verfügt nun über eine Kapazität von 8,2T - zuvor hatte dieses Device nur 5,5T. In einem zweiten Schritt wurde eine weitere 4T Festplatte hinzugefügt, wodurch sich die Gesamtkapazität real um weitere 2,8T erhöhte. Die dabei auftretenden 1,2T Differenz (30%) werden für die Bildung der doppelten Redundanz (RAID6) verwendet und können nicht für Nutzdaten verwendet werden. Diesen Preis muss man dafür bezahlen, dass das RAID auch bei Ausfall von 2 Festplatten noch verfügbar sein soll.

Vergrößerung des LUKS-Containers (cryptsetup)

Im Vergleich zum zuvor protokolliertem Stand erkennt man eine Vergrößerung auch schon beim LUKS-Container, welche das System automatisch erkannt hat.

[root@j4 ~]# cryptsetup status /dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16 
/dev/mapper//dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16 is active and is in use.
  type:  LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/md1
  offset:  4096 sectors
  size:    17580386816 sectors
  mode:    read/write

Zuvor:

size:    11720256512 sectors

Vergrößerung des LogicalVolumes (LVM)

Im Gegensatz zu LUKS ist die Größenänderung beim LVM noch nicht bekannt:

[root@j4 ~]# pvs
  PV                                                    VG     Fmt  Attr PSize PFree 
  /dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16 system lvm2 a--  5,46t 25,29g

Ein Aufrug von pvresize sorgt dafür, dass die Kapazitäten auf dem physischen Layer zur Kenntnis genommen werden:

[root@j4 ~]# pvresize /dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16
  Physical volume "/dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

[root@j4 ~]# pvs
  PV                                                    VG     Fmt  Attr PSize PFree
  /dev/mapper/luks-bc641135-b1f2-4127-8112-b158e0112e16 system lvm2 a--  8,19t 2,75t

Jetzt kommt der große Moment, bei dem das LV für '/home' auf die maximale Größe erweitert wird. Beachtenswert ist, dass dies in einem Zuge mit einer Erweiterung des darin liegenden Dateisystems (ext4) einher geht (Parameter resizefs).

Dieser Prozess passiert ebenfalls online (mit gemountetem Dateisystem) und dauert einige Stunden:

[root@j4 ~]# lvresize --resizefs --size +2,75T system/home
  Extending logical volume home to 8,14 TiB
  Logical volume home successfully resized
resize2fs 1.41.12 (17-May-2010)
Das Dateisystem auf /dev/mapper/system-home ist auf /home eingehängt; Online-Grössenveränderung nötig
old desc_blocks = 345, new_desc_blocks = 521
Führe eine Online-Grössenänderung von /dev/mapper/system-home auf 2185065472 (4k) Blöcke durch.

... 5 Stunden warten ...

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

[root@j4 ~]# df -h
Dateisystem           Size  Used Avail Use% Eingehängt auf
/dev/mapper/system-os2
                       15G  8,7G  5,4G  62% /
tmpfs                 1,9G     0  1,9G   0% /dev/shm
/dev/md0              189M  148M   32M  83% /boot
/dev/mapper/system-home
                      8,1T  5,3T  2,8T  66% /home

Man erkennt, dass nun tatsächlich der neue Speicherplatz für /home verfügbar gemacht wurde. Der Anstieg der Speicherkapazität erfolgt nicht plötzlich, sondern kontinuierlich und kann während des Prozesses beispielsweise mit dem Tool 'df' beobachtet werden.

Vergrößerung des Dateisystems (ext4)

Die Vergrößerung des Dateisystems wurde schon implizit im vorigen Prozessschritt durchgeführt. Das war möglich, weil das verwendete Dateisystem ext4 die Funktionalität Online-Grössenveränderung bietet. Bei Wahl eines anderen Systems hätte dieser Schritt aber auch explizit jetzt ausgeführt werden können, wobei dabei das Dateisystem möglicherweise ausgehangen (umount) werden muss.

End-Kontrolle

Nach einem erneuten Reboot und einer anschließenden End-Kontrolle inklusive Durchsicht der Logs sollte der Prozess nun abgeschlossen sein.

Ein detaillierter Blick auf das RAID:

[root@j4 ~]# mdadm --detail /dev/md1                                                                                                         
/dev/md1:                                                                                                                                    
        Version : 1.0                                                                                                                        
  Creation Time : Tue Aug 30 23:44:02 2011                                                                                                   
     Raid Level : raid6                                                                                                                      
     Array Size : 11720260608 (11177.31 GiB 12001.55 GB)                                                                                     
  Used Dev Size : 2930065152 (2794.33 GiB 3000.39 GB)                                                                                        
   Raid Devices : 6                                                                                                                          
  Total Devices : 6                                                                                                                          
    Persistence : Superblock is persistent                                                                                                   
                                                                                                                                             
  Intent Bitmap : Internal                                                                                                                   
                                                                                                                                             
    Update Time : Wed Jan 21 20:17:34 2015                                                                                                   
          State : active                                                                                                                     
 Active Devices : 6
Working Devices : 6
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 128K

           Name : linux:1
           UUID : 777dc012:1265b112:1deadd70:c147ba88
         Events : 905152

    Number   Major   Minor   RaidDevice State
       4       8        2        0      active sync   /dev/sda2
       1       8       18        1      active sync   /dev/sdb2
       2       8       33        2      active sync   /dev/sdc1
       3       8       49        3      active sync   /dev/sdd1
       5       8       65        4      active sync   /dev/sde1
       6       8       81        5      active sync   /dev/sdf1

Links