Jak zwiększyć przestrzeń dyskową gościa KVM?


Odpowiedzi:


115
  1. zatrzymać maszynę wirtualną
  2. uruchom, qemu-img resize vmdisk.img +10Gaby zwiększyć rozmiar obrazu o 10 Gb
  3. uruchom maszynę wirtualną, normalnie zmień rozmiar partycji i struktury LVM

Ach, pobiłeś mnie do tego, właśnie zauważyłem opcje zmiany rozmiaru qemu-img na stronie podręcznika. To oszczędza kilka kroków. Miły!
slm

1
Pracowałem nad zmianą rozmiaru mojego * .qcow2 img na RHEL6.6. Dzięki!
Jacob Goulden,

8
start the VM, resize the partitions and LVM structure within it normallyJak to zrobić? Proszę wyjaśnij to.
Waki,

1
Nie możesz mieć wszystkiego na talerzu. Jeśli próbowałeś i nie udało się zmienić rozmiaru partycji lub LV, otwórz nowe pytanie, opisz, co próbowałeś, a co nie działało
dyasny,

4
Aby zmienić rozmiar partycji i LVM, wykonaj wszystkie kroki opisane w tym doskonałym artykule: sandilands.info/sgordon/...
skonsoft

32

Metoda online (przy użyciu qemu, libvirt i virtio-block)

Na lepsze lub gorsze, poniższe polecenia będą działać, nawet jeśli docelowy dysk wirtualny zostanie podłączony. Może to być przydatne w środowiskach, w których nie można odmontować dysku (takich jak partycja root), maszyna wirtualna musi pozostać włączona, a właściciel systemu jest gotów podjąć ryzyko uszkodzenia danych . Aby usunąć to ryzyko, musisz najpierw zalogować się do maszyny wirtualnej i odmontować dysk docelowy, co nie zawsze jest możliwe.

Wykonaj następujące czynności z hiperwizora KVM.

  1. Zwiększ rozmiar samego pliku obrazu dysku (określ kwotę, którą chcesz zwiększyć):

    qemu-img resize <my_vm>.img +10G
    
  2. Uzyskaj nazwę urządzenia virtio za pośrednictwem powłoki libvirt ( drive-virtio-disk0w tym przykładzie):

    virsh qemu-monitor-command <my_vm> info block --hmp
      drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/<my_vm>.img ro=0 drv=raw encrypted=0
      drive-ide0-1-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
    
  3. Wyślij sygnał do sterownika virtio, aby wykrył nowy rozmiar (określ całkowitą nową pojemność):

    virsh qemu-monitor-command <my_vm> block_resize drive-virtio-disk0 20G --hmp
    

Następnie zaloguj się do maszyny wirtualnej. Uruchomiony dmesgpowinien zgłosić, że dysk virtio wykrył zmianę pojemności. W tym momencie przejdź do zmiany rozmiaru partycji i struktury LVM w razie potrzeby.


4
Strona podręcznika qemu-img (moja data jest datowana na 2016-05-08) mówi: „ Ostrzeżenie: Nigdy nie używaj qemu-img do modyfikowania obrazów używanych przez działającą maszynę wirtualną lub inny proces; może to zniszczyć obraz. pamiętaj, że zapytanie o obraz, który jest modyfikowany przez inny proces, może napotkać niespójny stan. ” Nie jestem więc pewien, czy (pierwszy krok) jest bezpieczny, gdy maszyna wirtualna nadal działa.
user44400

Nie działa na centos7 + kvm
e-info128

1
To działało idealnie dla mnie. Korzystanie z urządzeń blokujących ceph i virtio. przechowujemy dane aplikacji / MySQL db na osobnej partycji. Zatrzymaj aplikacje uzyskujące dostęp do tej partycji. Odmontuj to. Zmień rozmiar. fsck. następnie zamontuj go ponownie w nowym rozmiarze. Wyłączenie nie jest potrzebne.
nelaaro

Ta sama odpowiedź, ale przy użyciu libvirt zamiast konsoli monitora: serverfault.com/a/952868/30946
Mircea Vutcovici

21

Te pytania o awarię serwera są podobne, ale bardziej szczegółowe, zmiana rozmiaru dysku online KVM? & Centos Xen zmienia rozmiar partycji DomU i grupy woluminów . Pierwszy pyta o to, jak zwiększyć gościa KVM, gdy jest on online, natomiast drugi dotyczy XEN przy użyciu LVM. Pytam, jak to zrobić, gdy KVM jest offline.

UWAGA: Ten link był przydatny dla METODY nr 1 i pokazuje, jak osiągnąć zwiększenie przestrzeni dyskowej KVM (na podstawie ext3), HOWTO: Zmiana rozmiaru obrazu maszyny wirtualnej KVM .

Jedną z rzeczy, o których należy pamiętać w przypadku gości KVM, jest to, że partycje, których używają w środku, mogą wpływać na metodę, której można użyć do zwiększenia ich miejsca na dysku.

METODA 1: Partycje oparte są na ext2 / ext3 / ext4

Nakrętki tej metody są następujące:

# 1. stop the VM
# 2. move the current image
mv mykvm.img mykvm.img.bak

# 3. create a new image
qemu-img create -f raw addon.raw 30G

# 4. concatenate the 2 images
cat mykvm.img.bak addon.raw >> mykvm.img

Teraz, mając w ręku większy plik mykvm.img, uruchom partycję gpart i rozszerz istniejącą partycję na nowo dodane miejsce na dysku. Ten ostatni krok zasadniczo rozszerza partycję systemu operacyjnego, aby mogła ona wykorzystać dodatkową przestrzeń.

METODA 2: Partycje są oparte na LVM

Oto kroki, które z grubsza wykonałem, aby zmienić rozmiar gościa KVM, który używał LVM wewnętrznie.

  1. Zamknij maszynę wirtualną
  2. dodaj więcej miejsca do „pliku obrazu” gościa (coś w rodzaju: cat old.img 10G_addon.raw >> new.img
  3. uruchom maszynę wirtualną (używając nowo utworzonego new.img)
  4. uruchom fdisk wewnątrz VM i usuń i ponownie utwórz partycję LVM

    % fdisk /dev/vda
    ...
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        3263    26105625   8e  Linux LVM
    
    Command (m for help): d
    Partition number (1-4): 2
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    
    Command (m for help): n 
    Command action
      e   extended
      p   primary partition (1-4)
    p
    Partition number (1-4): 2
    First cylinder (14-5874, default 14): 14
    Last cylinder or +size or +sizeM or +sizeK (14-5874, default 5874): 
    Using default value 5874
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        5874    47078482+  83  Linux
    
    Command (m for help): t
    Partition number (1-4): 2
    Hex code (type L to list codes): 8e
    Changed system type of partition 2 to 8e (Linux LVM)
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        5874    47078482+  8e  Linux LVM
    
    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.
    Syncing disks.
    %
    
  5. Uruchom ponownie maszynę wirtualną

  6. Zmień rozmiar woluminu fizycznego LVM

    % pvdisplay 
      --- Physical volume ---
      PV Name               /dev/vda2
      VG Name               VolGroup00
      PV Size               24.90 GB / not usable 21.59 MB
      Allocatable           yes (but full)
      PE Size (KByte)       32768
      Total PE              796
      Free PE               0
      ...
    
    % pvresize /dev/vda2
    
    % pvdisplay
      --- Physical volume ---
      PV Name               /dev/vda2
      VG Name               VolGroup00
      PV Size               44.90 GB / not usable 22.89 MB
      Allocatable           yes 
      PE Size (KByte)       32768
      Total PE              1436
      Free PE               640
      ...
    
  7. Zmień rozmiar woluminu logicznego LVM

      % lvresize /dev/VolGroup00/LogVol00 -l +640
      Extending logical volume LogVol00 to 43.88 GB
      Logical volume LogVol00 successfully resized
    
  8. Rozwijaj system plików

      % resize2fs /dev/VolGroup00/LogVol00 
      resize2fs 1.39 (29-May-2006)
      Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
      Performing an on-line resize of /dev/VolGroup00/LogVol00 to 11501568 (4k) blocks.
      The filesystem on /dev/VolGroup00/LogVol00 is now 11501568 blocks long.
    

Powyższy przykład jest moim przykładem, ale podążyłem za krokami na tej stronie


metoda nr 1 w tym poście wydaje się nie działać tak dobrze - menedżer maszyn wirtualnych w red hat nie zgłasza później nowego rozmiaru. Metoda sugerowana przez @dyasny wydaje się działać przynajmniej lepiej pod tym względem.
Iwan Aucamp

@IwanAucamp - ciekawe, używam virt-manageri używałem metod # 1 i # 2 intensywnie, zanim przeprowadziłem migrację naszych serwerów KVM do nowszej wersji KVM (CentOS 5 -> CentOS 6). Teraz również używam tej qemu-img resizemetody.
slm

Dla metody # 2 możesz znaleźć lvextend handier jako krok 7: lvextend /dev/Volgroup/lvname /dev/vda2(wszystko w jednym wierszu, gdzie / dev / vda2 będzie twoim woluminem fizycznym). Bez innych opcji użyje maksymalnego rozmiaru w tej grupie woluminów.
Mike S

Metoda nr 2 krok 4 nie zadziała, jeśli w tabeli partycji są woluminy logiczne. Po odtworzeniu rozszerzonego typu partycji pierwszy dostępny sektor nie będzie już pasował do tego, który miał przed wprowadzeniem zmian. Np. Jeśli pierwszym sektorem partycji logicznej był 1001472, po zmianach będzie to 1003518 (zakładając, że dysk 10G przed i 50G po zmianie rozmiaru). Czy ktoś wie, jak odtworzyć, jeśli to w ogóle możliwe, woluminy logiczne w tym samym pierwszym sektorze?
ILIV

1
Wynika to z domyślnego zastosowania przez fdisk ograniczeń wyrównania (krok 1 MB) do partycji. Aby obejść ten problem, zaakceptuj wartość domyślną 1003518, wejdź w tryb eksperta (x), a następnie wybierz b i ustaw pierwszy sektor na 1001472. Szczegółowe informacje można znaleźć na stronie unix.stackexchange.com/a/320447 .
ILIV

11

Zmień rozmiar i rozszerz wewnętrzne partycje w jednym kroku

Miałem hosta Ubuntu z obrazem pliku gościa qcow2 i chciałem zmienić rozmiar dysku i rozwinąć odpowiednie partycje w jednym kroku. Wymaga to skonfigurowania narzędzi systemu plików gościa libvirt, ale i tak warto je mieć.

Inspiracja tutaj: http://libguestfs.org/virt-resize.1.html

Kluczowe polecenie tutaj to: virt-resize

  • jest to narzędzie libvirt
  • może rozwinąć dysk gościa ORAZ rozszerzyć partycje w jednym kroku
  • kopiuje dysk, nie rozwija go w miejscu
    • jest to dobre, ponieważ masz nietknięty oryginał jako kopię zapasową

Przygotowanie:

* Install libvirt file system utilities package 
    * sudo apt-get install libguestfs-tools

* Test to see if it works (it won't) -- you need to see "===== TEST FINISHED OK =====" at the bottom:
    * sudo libguestfs-test-tool

* If you don't see "===== TEST FINISHED OK =====" at the bottom then repair it:
    * sudo update-guestfs-appliance

* Run the test again and verify it works
    * sudo libguestfs-test-tool

Teraz wykonaj następujące czynności:

1) zamknij gościa:

2) Sprawdź bieżące rozmiary i wyświetl nazwę partycji, którą chcesz rozwinąć za pomocą narzędzia libvirt:

sudo virt-filesystems --long --parts --blkdevs -h -a name-of-guest-disk-file

3) Utwórz nowy dysk wyjściowy (40G):

qcow: sudo qemu-img create -f qcow2 -o preallocation=metadata outdisk 40G
img:  sudo truncate -s 40G outdisk

4) Skopiuj stary do nowego, a następnie rozwiń odpowiednią partycję (zakładając, że twoja partycja dysku z kroku 2 to / dev / sda1):

sudo virt-resize --expand /dev/sda1 indisk outdisk

5) Zmień nazwę pliku indisk na kopię zapasową, zmień nazwę przestarzałego na indisk (lub zmodyfikuj XML gościa)

6) Uruchom ponownie gościa i dokładnie przetestuj nowy plik dysku przed usunięciem oryginalnego pliku

7) Zysk!


W moim przypadku prawie to działa. Niestety prawie. Gdy gość (serwer CentOS 7) zostanie zrestartowany, nie będzie można uruchomić rozszerzonego dysku.
Urhixidur

1
Działa mi to świetnie. Pominięcie -o preallocation=metadatatworzy rzadki plik. Dzięki tej opcji wstępnie przydziela cały rozmiar.
Dennis Williamson

Znakomicie, ta odpowiedź mnie przybiła. Dzięki wielkie! „Oficjalna” dokumentacja dla libguestfs ( libguestfs.org/virt-resize.1.html ), niestety nie jest dobrze napisana i ostatecznie jest dość myląca.
mbello,

1
Działa dla mnie dobrze, pamiętaj, że tak naprawdę nie musisz używać, -o preallocation=metadataa jeśli nie, powinieneś pominąć truncatekrok. virt-resizei tak powiększy plik.
amoe

5

Jeśli używasz LVM w maszynie wirtualnej, najprostszym sposobem na to jest dodanie nowego dysku wirtualnego do maszyny wirtualnej i rozwinięcie grupy woluminów i woluminów logicznych.

Aby sprawdzić, czy używasz LVM run sudo pvs; sudo vgs; sudo lvs, otrzymasz coś takiego:

PV         VG     Fmt  Attr PSize  PFree
/dev/vda1  vgWWW  lvm2 a-   30.00g    0

VG     #PV #LV #SN Attr   VSize  VFree
vgWWW    1   2   0 wz--n- 30.00g    0

LV   VG    Attr   LSize 
root vgWWW -wi-ao 28.80g
swap vgWWW -wi-ao  1.19g

jeśli system operacyjny maszyny wirtualnej korzysta z LVM. W powyższym przykładzie maszyna wirtualna ma dysk VDisk o pojemności 30 GB, skonfigurowany przy użyciu LVM z jedną grupą woluminów o nazwie vgWWW zawierającą dwa woluminy logiczne, jeden do wymiany i jeden do wszystkiego innego.

Jeśli LV jest używany na maszynie wirtualnej:

  1. Zamknij maszynę wirtualną
  2. Na hoście utwórz nowy plik dysku wirtualnego i dodaj go do maszyny wirtualnej
  3. Uruchom ponownie maszynę wirtualną i zaloguj się
  4. Oznacz nowy dysk jako wolumin fizyczny dla LVM za pomocą sudo pvcreate /dev/vdb
  5. Rozszerz grupę woluminów, aby uwzględnić ten nowy blok dysku sudo vgextend vgWWW /dev/vdb
  6. Rozszerz wolumin logiczny, aby zajął nowe miejsce sudo lvextend --extents +100%FREE /dev/vgWWW/root(lub coś takiego, sudo lvextend --size +8G /dev/vgWWW/rootjeśli nie chcesz go powiększać do końca, ten przykład dodałby 8 GB do woluminu)
  7. Zmień rozmiar systemu plików za pomocą resize2fs /dev/vgWWW/root

Uwaga: powyższe zakłada, że ​​nazwy vg / lv są takie same jak w moim przykładzie, co jest mało prawdopodobne, zmień odpowiednio, również jeśli maszyna wirtualna miała już dysk wirtualny o nazwie vdbnowy, będzie to coś innego ( vdci tak dalej)

Uwaga: resize2fs działa tylko w systemie plików ext2, ext3 i ext4. Jeśli używasz czegoś innego, spowoduje to błąd i nic nie zrobisz.

Uwaga: ponieważ podczas zmiany rozmiaru systemu plików na żywo resize2fsnie pojawi się monit o uruchomienie fsckgo, tak jak w przypadku odmontowanego systemu plików, po prostu pójdzie dalej. Przed kontynuowaniem może być konieczne sprawdzenie systemu plików tylko do odczytu. Nie ma żadnych problemów.


Można to również zrobić za pomocą GUI, który jest całkiem niezły centos.org/docs/5/html/Deployment_Guide-en-US/...
Nux

5

Można zmienić rozmiar online. libvirtd obsługuje to natywnie:

Znajdź nazwę urządzenia blokowego. Powinno być coś w stylu „vda”

$ virsh domblklist <libvirtd_vm_name>

Zmień rozmiar urządzenia wirtualnego:

$ virsh blockresize --domain <libvirtd_vm_name> --path <block_device_name> --size <new_size>

Oto przykład gdybym rozszerzyć vdadysk od 50GBcelu 51GBdla undercloudVM.

[root@gss-rhos-4 ~]# virsh domblklist undercloud
Target     Source
------------------------------------------------
vda        /home/images/undercloud.qcow2

Teraz spójrz na szczegóły pliku obrazu .qcow2:

[root@gss-rhos-4 ~]# qemu-img info /home/images/undercloud.qcow2
image: /home/images/undercloud.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 38G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

Teraz zmieńmy rozmiar urządzenia blokującego VDA:

[root@gss-rhos-4 ~]# virsh blockresize undercloud vda 51G
Block device 'vda' is resized

I potwierdź:

[root@gss-rhos-4 ~]# qemu-img info /home/images/undercloud.qcow2
image: /home/images/undercloud.qcow2
file format: qcow2
virtual size: 51G (54760833024 bytes)
disk size: 38G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
[root@gss-rhos-4 ~]#

Następnie możesz użyć tego skryptu w maszynie wirtualnej, aby wyświetlić polecenia zmiany rozmiaru urządzeń blokowych i fs: https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh .


3

Istnieje możliwość zwiększenia rozmiaru dysku maszyny wirtualnej bez ponownego uruchamiania maszyny wirtualnej, jeśli używasz napędu virtio i LVM.

  1. Użyj virt-manager lub virsh, aby zdefiniować nowy pusty dysk
  2. Jądro powinno zobaczyć nowy / dev / vdb
  3. (Opcjonalnie) Utwórz partycję podstawową za pomocą fdisk, aby uzyskać / dev / vdb1, a następnie użyj kpartx -a / dev / vdb, aby ponownie odczytać tablicę partycji

  4. Użyj vgextend vg_name / dev / vdb1 (lub / dev / vdb, jeśli nie utworzyłeś partycji)

  5. Użyj lvextend -l + 100% ZA DARMO / dev / vg_name / lv_name
  6. Użyj resize2fs / dev / vg_name / lv_name, aby rozszerzyć swój system plików

Jesteś skończony.


2
Dodam, że libguestfs.org/virt-resize.1.html powinien również pomóc.
FearlessFuture,

3

W ten sposób możesz rozwinąć żądaną partycję:

    # see what partitions you have? 
    virt-filesystems --long -h --all -a olddisk

    truncate -r olddisk newdisk
    truncate -s +5G newdisk

    # Note "/dev/sda2" is a partition inside the "olddisk" file.
    virt-resize --expand /dev/sda2 olddisk newdisk

Zobacz więcej przykładów tutaj .


2

Kolejny sposób to zrobić

truncate -s +2G vm1.img 

wejdź w make res dysku i po tym, jak możesz zmienić rozmiar lvm.


1

Jeśli masz LVM na maszynie wirtualnej, jest to szalenie łatwe i szybkie.

  1. Wyłącz maszynę wirtualną (maszynę gościa).
  2. Na komputerze-hoście dodaj nowe urządzenie pamięci masowej.
  3. Włącz gościa.
  4. Otwórz system -> Administracja -> Zarządzanie woluminami logicznymi (lub wpisz sudo system-config-lvmterminal) *.

Znalazłem GUI dość intuicyjny, ale jeśli masz problemy, wykonaj kolejne kroki.

  1. Otwórz „Niezainicjowane jednostki” i znajdź nowy dysk.
  2. Po wybraniu nowego dysku poniżej obrazu powinien znajdować się przycisk inicjalizacji. Naciśnij.
  3. Zapyta Cię o partycjonowanie - nie potrzebujesz go.
  4. Po zakończeniu dodaj dysk do istniejącej grupy woluminów.
  5. Wreszcie musisz zwiększyć woluminy logiczne - odbywa się to w widoku logicznym grupy poprzez edycję właściwości woluminu.
  6. Zapisz i gotowe. Nie ma potrzeby ponownego uruchamiania maszyny wirtualnej.

Uwaga! Przynajmniej GUI CentOS 6 LVM nie jest domyślnie instalowany, ale można go zainstalować za pomocą yum install system-config-lvm.


1
  1. Zamknij maszynę wirtualną
  2. Zmiana rozmiaru obrazu:

    qemu-img resize vmdisk.img +16G
    

    zwiększa rozmiar obrazu o 16 GB.

  3. Jeśli twój obraz ma GPT (tabelę partycji GUID), to rozmiar dysku użyty w GPT będzie się różnić od nowego rozmiaru, musisz to naprawić za pomocą gdisk:

    MY_DRIVE=/dev/vda
    gdisk $MY_DRIVE <<EOF
    w
    Y
    Y
    EOF
    

    lub z parted:

    parted $MY_DRIVE print Fix
    

    Z jakiegoś powodu partedpoprawka nie działa, gdy nie jest prezentowane tty (na przykład podczas udostępniania z Vagrant), więc używam gdisk.

  4. Zwiększ rozmiar partycji, aby wypełnić całą dostępną przestrzeń:

    MY_PARTITION_GUID=$(
    gdisk $MY_DRIVE <<EOF | sed -n -e 's/^Partition unique GUID: //p'
    i
    EOF
    )
    
    MY_PARTITION_FIRST_SECTOR=$(
    gdisk $MY_DRIVE <<EOF | sed -n -e 's/^First sector: \([0-9]\+\).*/\1/p'
    i
    EOF
    )
    
    gdisk $MY_DRIVE <<EOF
    d
    n
    
    $MY_PARTITION_FIRST_SECTOR
    
    
    x
    a
    2
    
    c
    $MY_PARTITION_GUID
    w
    Y
    EOF
    

    Ta x a 2 <Enter>część jest opcjonalna i potrzebna, jeśli używasz starszego systemu BIOS. MY_PARTITION_GUID=...a c $MY_PARTITION_GUIDczęści są również opcjonalne i potrzebne tylko, jeśli używasz UUID partycji w /etc/fstablub gdzie indziej.

  5. Uruchom ponownie lub ponownie przeczytaj partycje za pomocą partx -u $MY_DRIVElub partprobe.

  6. Rozszerzyć partycji, na przykład ext2, ext3lub ext4:

    MY_PARTITION="${MY_DRIVE}1"
    resize2fs $MY_PARTITION
    

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.