KVMゲストのディスク容量をどのように増やしますか?


100

最初に6GBのディスクスペースを持つCentOS KVMホストでUbuntuゲストをセットアップします。コマンドラインからUbuntuゲストのディスク容量を増やすにはどうすればよいですか?

編集#1:ディスクイメージファイル(qemu)を使用しています。


1
オンラインリサイズ:serverfault.com/a/952868/30946
ミルチャVutcovici

回答:


116
  1. VMを停止します
  2. 実行qemu-img resize vmdisk.img +10Gして画像サイズを10Gb増やします
  3. VMを起動し、通常はその中のパーティションとLVM構造のサイズを変更します

ああ、あなたは私にそれを打ち負かした、私はちょうどmanページのqemu-imgのサイズ変更オプションに気づいた。これにより、いくつかの手順を節約できます。いいね!
slm

1
RHEL6.6で* .qcow2 imgのサイズを変更するために働きました。ありがとう!
ジェイコブグールデン

8
start the VM, resize the partitions and LVM structure within it normallyどうやるか?説明してください。
ワキ

1
大皿ですべてを手渡すことはできません。パーティションまたはLVのサイズを変更しようとして失敗した場合は、新しい質問を開いて、何を試したか、何が機能しなかったかを説明してください
-dyasny

4
:この優れた記事で説明したようにpartionsとLVMのサイズを変更するには、すべての手順に従ってください sandilands.info/sgordon/...
skonsoft

32

オンライン方法(qemu、libvirt、virtio-blockを使用)

良くも悪くも、ターゲット仮想ディスクがマウントされていても、以下のコマンドが実行されます。これは、ディスクをアンマウントできない環境(ルートパーティションなど)、VMを維持する必要がある環境、およびシステム所有者がデータ破損のリスクを引き受ける意思がある環境で役立ちます。そのリスクを取り除くには、VMにログインして、最初にターゲットディスクをアンマウントする必要がありますが、これは常に可能とは限りません。

KVMハイパーバイザーから次を実行します。

  1. ディスクイメージファイル自体のサイズを増やします(増やす量を指定します)。

    qemu-img resize <my_vm>.img +10G
    
  2. libvirtシェル(drive-virtio-disk0この例では)を使用して、virtioデバイスの名前を取得します。

    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. virtioドライバーにシグナルを送信して、新しいサイズを検出します(新しい合計容量を指定します)。

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

次に、VMにログインします。実行dmesgすると、virtioディスクが容量の変更を検出したことが報告されます。この時点で、必要に応じてパーティションとLVM構造のサイズを変更します。


4
QEMU-IMG(鉱山は2016年5月8日付けの場合)のmanページは言う: " 警告:。実行中の仮想マシンまたは他のプロセスによって使用されている画像を変更するためにQEMU-IMGを使用しないでください。これは、画像を破壊することも、別のプロセスによって変更されているイメージを照会すると、一貫性のない状態が発生する可能性があることに注意してください。」したがって、仮想マシンがまだ実行されているときに(最初のステップ)が安全かどうかはわかりません。
user44400

centos7 + kvmでは機能しません
e-info128

1
これは私にとって完璧に機能しました。cephおよびvirtioブロックデバイスの使用。アプリケーションデータ/ MySQL dbを別のパーティションに保存します。このパーティションにアクセスするアプリケーションを停止します。アンマウントします。サイズを変更します。fsck。その後、新しいサイズで再度マウントします。シャットダウンは不要です。
-nelaaro

この回答と同じですが、代わりにモニタコンソールのlibvirtの使用:serverfault.com/a/952868/30946
ミルチャVutcovici

21

これらのサーバー障害の質問は似ていますが、より具体的には、KVMオンラインディスクのサイズ変更ですか?Centos Xenは、DomUパーティションとボリュームグループのサイズを変更します。1つ目はオンライン中にKVMゲストを増やす方法について質問し、2つ目はLVMを使用してXEN固有です。KVMがオフラインの間にこれを達成する方法を尋ねています。

注:このリンクは方法1で役立ち、KVMのディスク容量(ext3ベース)を増やす方法を示しています。HOWTO:KVM仮想マシンイメージのサイズを変更します。

KVMゲストで知っておくべきことの1つは、内部で使用しているパーティションが、ディスク容量を増やすために使用できる方法に影響する可能性があることです。

方法1:パーティションはext2 / ext3 / ext4ベースです

このメソッドの要点は次のとおりです。

# 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

これで、より大きなmykvm.imgファイルを手に入れて、gpartを起動し、既存のパーティションを新しく追加されたディスクスペースに拡張します。この最後のステップでは、基本的にOSパーティションを拡張して、余分なスペースを利用できるようにします。

方法#2:パーティションはLVMベースです

以下は、LVMを内部的に使用するKVMゲストのサイズを変更するために大まかに行った手順です。

  1. VMをシャットダウンします
  2. ゲストの「イメージファイル」にスペースを追加します(cat old.img 10G_addon.raw >> new.imgのようなもの)
  3. VMを起動します(新しく作成されたnew.imgを使用)
  4. VM内でfdiskを実行し、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. VMを再起動します

  6. 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. LVM論理ボリュームのサイズ変更

      % lvresize /dev/VolGroup00/LogVol00 -l +640
      Extending logical volume LogVol00 to 43.88 GB
      Logical volume LogVol00 successfully resized
    
  8. ファイルシステムを成長させる

      % 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.
    

上記は私の例ですが、このWebサイトの手順に従いました


この投稿の方法#1はうまく機能していないようです-赤い帽子の仮想マシンマネージャーは、その後新しいサイズを報告しません。@dyasnyによって提案された方法は、この点で少なくともより良く機能するようです。
イワンオーカン

@IwanAucamp-興味深いことに、virt-managerKVMサーバーを新しいバージョンのKVM(CentOS 5-> CentOS 6)に移行する前に、方法#1と#2を広範囲に使用しています。現在、このqemu-img resizeメソッドも使用しています。
slm

方法#2の場合、ステップ7としてlvextendが便利ですlvextend /dev/Volgroup/lvname /dev/vda2(すべて1行で、/ dev / vda2が物理ボリュームになります)。他のオプションがない場合、そのボリュームグループの最大サイズが使用されます。
マイクS

パーティションテーブルに論理ボリュームがある場合、方法#2、ステップ4は機能しません。拡張タイプのパーティションを再作成すると、最初に使用可能なセクターは、変更前のセクターと一致しなくなります。たとえば、論理パーティションの最初のセクターが1001472だった場合、変更後は1003518になります(サイズ変更前の10Gディスクとサイズ変更後の50Gを想定)。可能な限り、同じ最初のセクターで論理ボリュームを再作成する方法を知っている人はいますか?
ILIV

1
これは、デフォルトでfdiskがパーティションにアライメント制約(1MBステップ)を適用するためです。回避するには、デフォルト値1003518を受け入れ、エキスパートモード(x)を入力し、bを選択して最初のセクターを1001472に設定します。詳細については、unix.stackexchange.com / a / 320447を参照してください。
ILIV

11

ワンステップで内部パーティションのサイズ変更と拡張

qcow2ゲストファイルイメージを持つUbuntuホストがあり、ディスクのサイズを変更して適切なパーティションをすべて1ステップで拡張したいと考えていました。libvirtゲストファイルシステムユーティリティを設定する必要がありますが、いずれにしてもこれらは便利です。

ここからのインスピレーション:http : //libguestfs.org/virt-resize.1.html

ここで重要なコマンドは次のとおりです。 virt-resize

  • これはlibvirtユーティリティです
  • ゲストディスクを拡張し、内部のパーティションを1ステップで拡張できます
  • ディスクをコピーし、その場で展開しません
    • バックアップとして手つかずのオリジナルを持っているので、これは良いです

準備:

* 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

次の手順を実行します。

1)ゲストをシャットダウンします:

2)現在のサイズを確認し、libvirtユーティリティを使用して拡張するパーティション名を表示します。

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

3)新しい(40G)出力ディスクを作成します。

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

4)適切なパーティションを拡張しながら古いものを新しいものにコピーします(ステップ2のディスクパーティションが/ dev / sda1であったと仮定):

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

5)indiskファイルの名前をバックアップとして、outdiskの名前をindiskに変更します(またはゲストXMLを変更します)

6)ゲストを再起動し、元のファイルを削除する前に新しいディスクファイルを慎重にテストします

7)利益!


私の場合、これはほとんど仕事をしています。悲しいことに、ほとんど。ゲスト(CentOS 7サーバー)を再起動すると、拡張ディスクが起動不能であることがわかります。
-Urhixidur

1
それは私にとって素晴らしい仕事でした。省略-o preallocation=metadataすると、スパースファイルが作成されます。このオプションを使用すると、サイズ全体が事前に割り当てられます。
デニスウィリアムソン

すばらしい、この答えは私にそれを釘付けにしました。本当にありがとう!残念ながらlibguestfsの「公式」ドキュメント(libguestfs.org/virt-resize.1.html)は、残念ながらうまく書かれておらず、最終的に非常に混乱します。
-mbello

1
私にとってはうまくいきました。実際に使用する必要はないことを覚えておいてください-o preallocation=metadata。そうでない場合は、このtruncateステップをスキップする必要があります。 virt-resizeとにかく適切にファイルを拡大します。
アメー

5

VM内でLVMを使用している場合、これを行う最も簡単な方法は、新しい仮想ディスクをVMに追加し、その上にボリュームグループと論理ボリュームを展開することです。

LVM runを使用しているかどうかを確認するにはsudo pvs; sudo vgs; sudo lvs、次のようなものを取得します。

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

VMのOSがLVMを使用している場合。上記の例では、VMには30Gバイトのvdiskがあり、LVMを使用してvgWWWと呼ばれる1つのボリュームグループで構成され、2つの論理ボリュームを含みます。

VMでLVが使用されている場合:

  1. VMをシャットダウンします
  2. ホストで新しい仮想ディスクファイルを作成し、VMに追加します
  3. VMを再起動してログインします
  4. 新しいドライブをLVMの物理ボリュームとしてマークします sudo pvcreate /dev/vdb
  5. ボリュームグループを拡張して、この新しいディスクブロックを含めます。 sudo vgextend vgWWW /dev/vdb
  6. 論理ボリュームを拡張して、新しいスペースを使用しますsudo lvextend --extents +100%FREE /dev/vgWWW/root(または、ボリュームをsudo lvextend --size +8G /dev/vgWWW/rootずっと大きくしたくない場合、この例ではボリュームに8Gbを追加します)
  7. でファイルシステムのサイズを変更します resize2fs /dev/vgWWW/root

注:上記はvg / lv名が私の例と同じであると想定しているため、変更することはほとんどありません。また、VMにvdb新しいものと呼ばれる仮想ドライブが既にある場合は、別のものになります(vdcなど)

注: resize2fs ext2、ext3、ext4ファイルシステムでのみ機能します。他の何かを使用している場合、エラーになり、何もしません。

注:ライブファイルシステムのサイズを変更するresize2fsときfsck、マウントされていないファイルシステムの場合のように最初に実行するように求められることはありません。先に進む前に、読み取り専用のファイルシステムチェックを実行して、問題がないことを確認してください。


これは、GUIを使用して行うこともできます。GUI
Nux

5

オンラインでサイズ変更を行うことができます。libvirtdはこれをネイティブにサポートします。

ブロックデバイス名を見つけます。「vda」のようなものでなければなりません

$ virsh domblklist <libvirtd_vm_name>

仮想デバイスのサイズを変更します。

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

ここで私は拡大した例であるvdaから、ディスクを50GBする51GBためのundercloudVM。

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

.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

それでは、vdaブロックデバイスのサイズを変更しましょう。

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

そして確認:

[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 ~]#

その後、ブロックデバイスとFSのサイズを変更するためのコマンドを表示するには、VMの内部で、このスクリプトを使用することができます。https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh


3

virtioドライブとLVMを使用している場合、VMを再起動せずにVMのディスクのサイズを大きくする可能性があります。

  1. virt-managerまたはvirshを使用して、新しい空のディスクを定義します
  2. カーネルは新しい/ dev / vdbを見るはずです
  3. (オプション)fdiskでプライマリパーティションを作成して/ dev / vdb1を取得し、kpartx -a / dev / vdbを使用してパーティションテーブルを再読み取りします

  4. vgextend vg_name / dev / vdb1(またはパーティションを作成しなかった場合は/ dev / vdb)を使用します

  5. lvextend -l + 100%FREE / dev / vg_name / lv_nameを使用します
  6. resize2fs / dev / vg_name / lv_nameを使用してファイルシステムを拡張します

できました。



3

これにより、必要なパーティションを拡張できます。

    # 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

他の例をご覧ください


2

別の方法

truncate -s +2G vm1.img 

ディスクの再スキャンを行い、lvmのサイズ変更を実行できます。


1

VMにLVMがある場合、これは非常に簡単で高速です。

  1. VM(ゲストマシン)をオフにします。
  2. ホストマシンに新しいストレージデバイスを追加します。
  3. ゲストをオンにします。
  4. [システム]-> [管理]-> [ 論理ボリューム管理](またはsudo system-config-lvm端末に入力)*を開きます。

GUIは非常に直感的ですが、問題がある場合は次の手順に従ってください。

  1. 「初期化されていないエンティティ」を開き、新しいドライブを見つけます。
  2. 新しいドライブを選択すると、画像の下に初期化ボタンが表示されます。それを押してください。
  3. パーティションについて尋ねられます-必要ありません。
  4. 完了したら、ドライブを既存のボリュームグループに追加します。
  5. 最後に、論理ボリュームを拡張する必要があります-これは、ボリュームのプロパティを編集することにより、グループの論理ビューで行われます。
  6. 保存して完了です。VMを再起動する必要はありません。

注意!少なくともCentOS 6では、LVM GUIはデフォルトではインストールされませんが、でインストールできますyum install system-config-lvm


1
  1. VMをシャットダウンします
  2. 画像のサイズ変更:

    qemu-img resize vmdisk.img +16G
    

    画像サイズを16 GB増やします。

  3. イメージにGPT(GUIDパーティションテーブル)がある場合、GPTで使用されるドライブサイズは新しいサイズと異なるため、次のように修正する必要がありますgdisk

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

    またはparted

    parted $MY_DRIVE print Fix
    

    何らかの理由でparted、ttyが表示されない場合(Vagrantでプロビジョニングする場合など)に修正が機能しないため、を使用しますgdisk

  4. パーティションサイズを増やして、使用可能なすべてのスペースを埋めます。

    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
    

    このx a 2 <Enter>部分はオプションであり、レガシーBIOSを使用している場合に必要です。 MY_PARTITION_GUID=...また、c $MY_PARTITION_GUIDpartsはオプションであり、パーティションUUIDを/etc/fstab他の場所で使用する場合にのみ必要です。

  5. 再起動したりしてパーティションを再読み込みpartx -u $MY_DRIVEpartprobe

  6. パーティションを拡張します。たとえばext2ext3またはext4

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.