Mój pracodawca umożliwia korzystanie z otwartych rozwiązań. Dostarcza też niezbędne oprogramowanie, ba!, dla popularniejszych dystrybucji są nawet repozytoria pakietów i podręczniki. Postanowiłem to przetestować i zmniejszyłem partycję z Windowsem do ~80G (cały dysk ma ~320G), aby resztę przeznaczyć na Debiana. Ze względów bezpieczeństwa (służbowy laptop) musiałem użyć LUKS-a, oczywistym wobec tego stał się dla mnie wybór LVM-a. Podział partycji prezentował się tak:

/dev/sda1 -- Windows XP, NTFS, ~80G
/dev/sda2 -- /boot, ext2, ~512M
/dev/sda5 -- szyfrowany LUKS-em LVM
   |--/root, ext4, ~10G
   |--swap, ~4G
   |--/home, ext4, ~226G

Działało i wszystko było dobrze, tyle tylko, że w końcu postanowiłem przenieść się całkiem na Linuksa i używać Windowsa (kiedy/jeśli będzie potrzebny) w wirtualnej maszynie (pracodawca udostępnia gotowy obraz KVM). Rzecz w tym, że mogę mieć tylko jedną licencję. Zresztą, nawet pomijając to, ostatnie zmiany w polityce bezpieczeństwa firmy dopuszczają tylko dwie możliwości1 — żadna z nich nie zakłada i nie umożliwia dual-boota.
Postanowiłem wobec tego usunąć partycję z Windowsem, a ~80G zwolnionego miejsca przeznaczyć na poszerzenie roota do ~20G i wpasowania reszty na /home.

Pamiętaj, że wszelkie kombinacje z partycjami grożą utratą wszystkich danych. Przed wprowadzaniem i zapisywaniem jakichkolwiek zmian na dysku — zrób kopię bezpieczeństwa. Albo przynajmniej nie płacz, kiedy coś ci się posypie ;]

Jeśli partycja windowsowa nie jest zamontowana (jeśli jest,to trzeba ją najpierw odmontować), można przystąpić do rzezi:

sudo fdisk -cu /dev/sda

(fdisk): p    (wypisanie tablicy partycji)

Dysk /dev/sda: 320.1 GB, bajtów: 320072933376
głowic: 255, sektorów/ścieżkę: 63, cylindrów: 38913, w sumie sektorów: 625142448Jednostka = sektorów, czyli 1 * 512 = 512 bajtów
Rozmiar sektora (logiczny/fizyczny) w bajtach: 512 / 512
Rozmiar we/wy (minimalny/optymalny) w bajtach: 512 / 512
Identyfikator dysku: 0x64656469

Urządzenie Rozruch   Początek      Koniec   Bloków   ID  System
/dev/sda1   *          63   165427919    82713928+   7  HPFS/NTFS
/dev/sda2       165429248   166404095      487424   83  Linux
/dev/sda3       166406142   625141759   229367809    5  Rozszerzona
/dev/sda5       166406144   625141759   229367808   83  Linux

Jak widać, w moim przypadku do skasowania jest partycja nr 1. No to do dzieła:

(fdisk): d    (usunięcie partycji)
(fdisk): 1    (numer partycji do usunięcia)
(fdisk): p    (wypisanie nowej tablicy partycji)

Dysk /dev/sda: 320.1 GB, bajtów: 320072933376głowic: 255, sektorów/ścieżkę: 63, cylindrów: 38913, w sumie sektorów: 625142448
Jednostka = sektorów, czyli 1 * 512 = 512 bajtów
Rozmiar sektora (logiczny/fizyczny) w bajtach: 512 / 512
Rozmiar we/wy (minimalny/optymalny) w bajtach: 512 / 512
Identyfikator dysku: 0x64656469

Urządzenie Rozruch   Początek      Koniec   Bloków   ID  System
/dev/sda2       165429248   166404095      487424   83  Linux
/dev/sda3       166406142   625141759   229367809    5  Rozszerzona
/dev/sda5       166406144   625141759   229367808   83  Linux

Jeśli wszystkie zmiany są dokładnie takie, jakich oczekiwano2:

(fdisk): w     (zapis tablicy partycji na dysk i zakończenie)

Teraz należy zrestartować system (np. shutdown -r now).

Po restarcie trzeba zagospodarować nowo zwolnione miejsce. Aby móc je przyłączyć później do istniejącej volume grupy, trzeba będzie nadać tej partycji typ Linux LVM:

sudo fdisk -cu /dev/sda

(fdisk): n    (dodanie nowej partycji)
(fdisk): 1    (umiejscowienie partycji)
(fdisk): 2048    (domyślnie)
(fdisk): 165429247    (domyślnie)
(fdisk): p    (wypisanie nowej tablicy partycji)

Dysk /dev/sda: 320.1 GB, bajtów: 320072933376
głowic: 255, sektorów/ścieżkę: 63, cylindrów: 38913, w sumie sektorów: 625142448
Jednostka = sektorów, czyli 1 * 512 = 512 bajtów
Rozmiar sektora (logiczny/fizyczny) w bajtach: 512 / 512
Rozmiar we/wy (minimalny/optymalny) w bajtach: 512 / 512
Identyfikator dysku: 0x64656469

Urządzenie Rozruch   Początek      Koniec   Bloków   ID  System
/dev/sda1            2048   165429247    82713600   83  Linux
/dev/sda2       165429248   166404095      487424   83  Linux
/dev/sda3       166406142   625141759   229367809    5  Rozszerzona
/dev/sda5       166406144   625141759   229367808   83  Linux

(inside fdisk): t    (zmiana ID systemu partycji)
(inside fdisk): 1    (wybór partycji, która ma zostać zmieniona)
(inside fdisk): L    (lista wszystkich ID)
(inside fdisk): 8e   (Linux LVM)
(inside fdisk): p    (wypisanie nowej tablicy partycji)

Dysk /dev/sda: 320.1 GB, bajtów: 320072933376głowic: 255, sektorów/ścieżkę: 63, cylindrów: 38913, w sumie sektorów: 625142448
Jednostka = sektorów, czyli 1 * 512 = 512 bajtów
Rozmiar sektora (logiczny/fizyczny) w bajtach: 512 / 512
Rozmiar we/wy (minimalny/optymalny) w bajtach: 512 / 512
Identyfikator dysku: 0x64656469
Urządzenie Rozruch   Początek      Koniec   Bloków   ID  System
/dev/sda1            2048   165429247    82713600   8e  Linux LVM
/dev/sda2       165429248   166404095      487424   83  Linux
/dev/sda3       166406142   625141759   229367809    5  Rozszerzona
/dev/sda5       166406144   625141759   229367808   83  Linux

(fdisk): w     (zapis tablicy partycji na dysk i zakończenie)

Oczywiście drugi restart komputera (ale to już ostatni, obiecuję ;-)).

Teraz zaczyna się najfajniejsza część. Mamy już przygotowane miejsce, teraz trzeba je zagospodarować. Najpierw trzeba powiększyć obszar fizyczny o nowo zwolnioną część:

sudo pvcreate /dev/sda1
Physical volume "/dev/sda1" successfully created

Teraz ten fizyczny obszar trzeba przyszyć do istniejącej volume grupy:

sudo vgextend foo /dev/sda1
Volume group "foo" successfully extended

„foo” należy oczywiście zamienić na nazwę swojej grupy LVM. Do wyświetlenia wszystkich logicznym woluminów (+ takie informacje jak rozmiar etc.) służy polecenie lvdisplay. Można to polecenie wywołać bez żadnych dodatkowych parametrów i wtedy wyświetlone zostaną wszystkie woluminy.
Nadszedł czas poszerzenia istniejących partycji o przydzielone miejsce. Najpierw /root:

sudo lvextend -L20G /dev/foo/root
Extending logical volume root to 20,00 GiB
Logical volume root successfully resized

Flaga -L20G sprawi, że /dev/foo/root zostanie powiększone do 20 GiB. Gdybym chciał powiększyć tę partycję o 20 GiB, wtedy flaga wyglądałaby następująco: -L+20G.
Teraz system plików musi zostać zaktualizowany do nowego, fizycznego rozmiaru woluminu:

sudo resize2fs /dev/foo/root

OK, teraz reszta wolnego miejsca ma wylądować na partycji /home:

sudo lvextend -l+100%FREE /dev/foo/home

Zmienna %FREE determinuje ile procent z dostępnego wolnego miejsca ma zostać przydzielone do danej partycji. Zwracam też uwagę, że tym razem została użyta inna flaga — -l.
Tu także system plików musi być zaktualizowany:

sudo resize2fs /dev/foo/home

Aby sprawdzić, czy wszystkie zmiany zostały wprowadzone prawidłowo, można użyć np. pvdisplay, vgdisplay, lvdisplay i df (np. z flagą -h)

Więcej na ten temat:

Pamiętaj, że wszelkie kombinacje z partycjami grożą utratą wszystkich danych. Przed wprowadzaniem i zapisywaniem jakichkolwiek zmian na dysku — zrób kopię bezpieczeństwa. Albo przynajmniej nie płacz, kiedy coś ci się posypie ;]


  1. Jeden system normalny, drugi system wirtualny. ↩︎

  2. Jeśli nie, wpisz q zamiast w i spróbuj ponownie. ↩︎