virt-resize(1) | Virtualization Support | virt-resize(1) |
virt-resize — програма для зміни розмірів дисків віртуальної машини
virt-resize [--resize /dev/sdaN=[+/-]<розмір>[%]] [--expand /dev/sdaN] [--shrink /dev/sdaN] [--ignore /dev/sdaN] [--delete /dev/sdaN] [...] вхідний_диск вихідний_диск
Virt-resize — програма, за допомогою якої можна змінити розміри диска віртуальної машини, зробивши його більшим або меншим чи змінивши розміри розділів, які містяться на диску, або вилучивши їх.
Virt-resize не може змінювати розмір образів дисків «на місці». Virt-resize не слід використовувати для активних віртуальних машин — щоб отримати належний результат, перш ніж змінювати розміри дисків, зупиніть роботу віртуальної машини.
Якщо ви ще не знайомі з принципами роботи пов'язаних інструментів, virt-filesystems(1) і virt-df(1), рекомендуємо вам спершу ознайомитися із документацією щодо цих інструментів.
virt-filesystems --long -h --all -a старий_диск truncate -r старий_диск новий_диск truncate -s +5G новий_диск # Зауважте, що «/dev/sda2» є розділом у у файлі «старий_диск». virt-resize --expand /dev/sda2 старий_диск новий_диск
virt-resize --resize /dev/sda1=+200M --expand /dev/sda2 \ старий_диск новий_диск
virt-resize --expand /dev/sda2 --LV-expand /dev/vg_guest/lv_root \ старий_диск новий_диск
qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 15G virt-resize --expand /dev/sda2 olddisk newdisk.qcow2
# virsh dumpxml guestname | xpath /domain/devices/disk/source Знайдено 1 вузли: -- NODE -- <source dev="/dev/vg/lv_guest" />
# virt-filesystems --long --parts --blkdevs -h -a /dev/vg/lv_guest Name Type Size Parent /dev/sda1 partition 101M /dev/sda /dev/sda2 partition 7.9G /dev/sda /dev/sda device 8.0G -
(У цьому прикладі маємо справу з віртуальною машиною з диском у 8 ГБ, який ми хочемо розширити до 10 ГБ).
Для збереження образу диска зі зміненим розміром створіть файл відповідного розміру:
# rm -f outdisk # truncate -s 10G outdisk
Або скористайтеся lvcreate(1) для створення логічного тому:
# lvcreate -L 10G -n lv_name vg_name
Або скористайтеся virsh(1) vol-create-as для створення тому сховища даних libvirt:
# virsh pool-list # virsh vol-create-as poolname newvol 10G
# virt-resize indisk outdisk
Ця команда просто копіює образ диска "indisk" до образу диска "outdisk" без зміни розмірів або будь-яких змін у наявних розділах. Якщо диск "outdisk" є завеликим для даних, створюється додатковий порожній розділ наприкінці диска, розмір якого відповідатиме зайвому місцю. Якщо диск "outdisk" виявиться замалим, програма повідомить про помилку.
Реалістичнішим буде варіант, коли вам потрібно розширити наявні розділи на образі диска передаванням додаткових параметрів (повний список параметрів наведено у розділі "ПАРАМЕТРИ" нижче).
"--expand" є найкориснішим параметром. За його допомогою можна розширити вказаний за назвою розділ на диску так, щоб він зайняв усе зайве місце:
# virt-resize --expand /dev/sda2 indisk outdisk
(У цьому випадку наприкінці диска не створюватиметься додаткових розділів, оскільки невикористаного місця просто не буде).
"--resize" — ще один широковживаний параметр. Наступна команда збільшить розмір /dev/sda1 на 200 МБ і розширить /dev/sda2 так, щоб той заповнив решту доступного місця:
# virt-resize --resize /dev/sda1=+200M --expand /dev/sda2 \ indisk outdisk
Якщо на розширюваному розділі у образі міститься файлова система або фізичний том LVM, тоді, якщо virt-resize відомий спосіб, програма змінить розміри вмісту так, як це роблять виклики команд pvresize(8), resize2fs(8), ntfsresize(8), btrfs(8), xfs_growfs(8) або resize.f2fs(8). Втім, virt-resize не відомі способи зміни розмірів деяких файлових систем, тому вам доведеться якось змінювати їхні розміри після завантаження гостьової системи.
# virt-resize --expand /dev/sda2 nbd://example.com outdisk
Диском із вхідними даними може бути адреса, якщо як джерело слід використати віддалений диск. Формат адреси є сумісним із guestfish. Див. "ДОДАВАННЯ ВІДДАЛЕНОГО СХОВИЩА" in guestfish(1).
Інші параметри описано нижче.
Якщо ви користуєтеся libvirt, внесіть зміни до XML так, щоб він вказував на новий диск:
# virsh edit назва_гостьової_системи
Змініть <source ...>, див. http://libvirt.org/formatdomain.html#elementsDisks
Далі, запустіть домен з новим диском, розмір якого було змінено:
# virsh start назва_гостьової_системи
і перевірте, чи все лишається працездатним. Див. також додаткові зауваження у розділі "ПРИМІТКИ" нижче.
Після завантаження гостьової системи у ній має з'явитися вільне місце, принаймні для файлових систем, способи зміни розмірів яких відомі virt-resize, та фізичних томів. Користувачеві, ймовірно, слід буде змінити логічні томи у фізичних томах, а також змінити розміри типів файлових систем, способи розширення яких не відомі virt-resize.
Зменшення розмірів є дещо складнішим завданням за збільшення. У цьому розділі наведено лише загальний огляд.
По-перше, virt-resize не робитиме спроб стиснути будь-який вміст розділу (фізичні томи, файлові системи). Користувачеві слід подбати про зменшення розмірів вмісту до передавання диска на обробку до virt-resize, і virt-resize перевірить, чи було стиснено вміст належним чином.
(Зменшення розмірів також можна виконати без завантаження системи за допомогою guestfish(1))
Після стискання фізичних томів і файлових систем, вимкніть гостьову систему і виконайте описані вище кроки 3 і 4 для розміщення нового образу диска.
Потім запустіть virt-resize із відповідними параметрами --shrink і/або --resize.
Крім того, virt-resize надає вам зручний спосіб ігнорувати або вилучати розділи при копіюванні з диска вхідних даних на диск вихідних даних. Ігнорування розділу пришвидшує копіювання там, де вам все одно що станеться із наявним вмістом розділу. Вилучення розділу вилучає його повністю, але зауважте, що це також призводить до перенумерування усіх розділів після вилучено, що може призвести до неможливості завантаження деяких гостьових систем.
Якщо дисх вхідних даних записано у форматі qcow2, ймовірно, варто записати вихідні дані теж у форматі qcow2. Крім того, virt-resize може перетворювати дані з одного формату на інший «на льоту». Формат виведених даних просто визначається форматом порожнього контейнера для виведення даних, який ви надасте. Таким чином, щоб записати виведені дані у форматі qcow2, скористайтеся такою командою:
qemu-img create -f qcow2 -o preallocation=metadata outdisk [розмір]
замість команди truncate.
Так само, щоб отримати дані у нерозрідженому простому форматі (raw) скористайтеся такою командою:
fallocate -l розмір вихідний_диск
(у застарілих системах, де немає команди fallocate(1), скористайтеся командою "dd if=/dev/zero of=outdisk bs=1M count=..")
Розміри логічних розділів (тобто /dev/sda5+ на дисках із таблицею розділів DOS) не може бути змінено.
Щоб розібратися у тому, що відбувається, по-перше, слід пам'ятати, що один із чотирьох розділів /dev/sda1-4 матиме тип розділу MBR 05 або "0f". Такий розділ називається розширеним розділом. Для перегляду типу розділу MBR скористайтеся virt-filesystems(1).
Логічні розділи містяться у розширеному розділі.
Розширений розділ може бути збільшено, але не може бути зменшено (це можна зробити у примусовому режимі, але ми не радимо так робити). При копіюванні розширеного розділу неявним чином копіюються усі логічні розділи, які на ньому містяться. Virt-resize не зазирає до розширеного розділу, отже сліпо копіює логічні розділи.
Вказати логічний розділ (/dev/sda5+) у рядку команди не можна. Якщо ви це зробите, програма повідомить про помилку.
Типовою поведінкою є використання параметра --align-first auto, який вирівнює лише перший розділ, якщо це безпечно робити. Тобто, лише якщо програмі достеменно відомо, як виправити завантажувач автоматично, і, у поточній версії, лише для гостьових систем Windows.
--align-first never означає, що пересування першого розділу ніколи не відбуватиметься. Це найбезпечніший варіант. Скористайтеся ним, якщо після зміни розмірів гостьова система відмовляється завантажуватися.
--align-first always означає, що завжди відбуватиметься вирівнювання першого розділу (якщо його треба вирівнювати). Для деяких гостьових систем це може завадити роботи завантажувача, зробивши гостьову систему непридатною до завантаження.
Якщо припускати розмір сектора у гостьовій системі у 512 байтів, ось придатні значення для цього параметра:
Увімкнути показ діагностичних повідомлень.
Зауважте, що коли ви вилучаєте розділ, вилучаються і усі дані, які зберігалися на ньому. Більше того, у результаті усі розділи за вилученим перенумеровуються, що може призвести до неможливості завантаження гостьової системи.
Цей параметр можна вказувати декілька разів.
Якщо virt-resize відомий спосіб, програма розширить безпосередній вміст розділу. Наприклад, якщо розділ є фізичним томом LVM, програма розширить фізичний том так, щоб він зайняв усе місце (подібно до виклику pvresize(8)). Якщо спосіб розширення виявиться невідомим virt-resize, програма не чіпатиме вмісту розділу.
У поточній версії virt-resize може змінювати розміри таких файлових систем:
Роботу файлової системи під час її останнього використання має бути завершено у штатному режимі. Крім того, ntfsresize(8) позначає файлові системи зі зміненими розмірами як такі, що потребують перевірки, отже під час першого наступного запуску Windows на розділі зі зміненим розміром буде виконано перевірку диска.
Будь ласка, зауважте, що libguestfs знищує наявний вміст розділу резервної пам'яті на диску, відтворюючи його за допомогою "mkswap", тому такі розділи не слід використовувати, якщо гостьова система присипляється.
Зауважте, що параметри --expand і --shrink не можна використовувати у одній і тій самій команді.
Якщо ви працюєте із образами дисків гостьових систем у форматі raw із ненадійних джерел, вам слід завжди вказувати назву формату.
Зауважте, що цей параметр не впливає на формат виведених даних. Див. "QCOW2 І НЕРОЗРІДЖЕНІ ФОРМАТИ RAW".
Цей параметр можна вказувати декілька разів.
virt-resize indisk outdisk \ --expand /dev/sda2 --LV-expand /dev/vg_guest/lv_root
Ця команда спершу розширить розділ (і фізичний том), а потім розширить кореневий пристрій так, що він займе усе наявне зайве місце на фізичному томі.
Розмір вмісту логічного тому також буде змінено, якщо virt-resize відомий спосіб, як це зробити. Ви можете заборонити virt-resize змінювати розміри вмісту за допомогою параметра --no-expand-content.
Скористайтеся virt-filesystems(1) для отримання списку файлових систем у гостьовій системі.
Ви можете вказати у одній команді цей параметр декілька разів, але сенсу у цьому небагато, хіба що вказані вами логічні томи належать до різних груп томів.
Якщо ви вкажете цей прапорець, це початкове копіювання не виконуватиметься. У цьому випадку може виникнути потреба у перевстановленні завантажувача.
Зауважте, що якщо зайвого місця виявиться менше за 10 МБ, додатковий розділ не створюватиметься.
Якщо ви вкажете параметр --no-expand-content, virt-resize не виконуватиме таких спроб.
Якщо ви працюєте із образами дисків гостьових систем у форматі raw із ненадійних джерел, вам слід завжди вказувати назву формату.
Зауважте, що цей параметр не створює образ диска у визначеному форматі. Цей параметр призначено лише для того, щоб libguestfs не намагалася вгадати формат. Створити диск у належному форматі маєте ви самі. Див. "QCOW2 І НЕРОЗРІДЖЕНІ ФОРМАТИ RAW".
"РОЗМІР" можна вказати як значення за модулем із додаванням суфікса b/K/M/G на позначення байтів, кілобайтів, мегабайтів або гігабайтів, або як відсоток від поточного розміру, або як відносну частку. Приклад:
--resize /dev/sda2=10G --resize /dev/sda4=90% --resize /dev/sda2=+1G --resize /dev/sda2=-200M --resize /dev/sda1=+128K --resize /dev/sda1=+10% --resize /dev/sda1=-10%
Ви можете збільшити розмір будь-якого розділу. Virt-resize розширить безпосередній вміст розділу, якщо програмі відомий спосіб виконати таке розширення (див. --expand вище).
Зменшити розмір розділів, які містять файлові системи або фізичні томи, можна лише якщо ці файлові системи або фізичні томи вже зменшено у розмірах всередині розділу. Virt-resize виконає перевірку виконання цієї умови до того, як розпочне обробку даних. Якщо умову не виконано, програма повідомить про помилку (див. також --resize-force).
Цей параметр можна вказувати декілька разів.
Див. також опис параметра --ignore.
Об'єм, на який має бути зменшено увесь диск (після виконання усіх інших дій, вказаних користувачем), називається «дефіцитом». Наприклад, просте копіювання (якщо не виконується жодних інших дій) з образу диска у 5 ГБ на образ диска у 4 ГБ дає дефіцит у 1 ГБ. У цьому випадку virt-resize повідомить про помилку, якщо користувач не вказав такий розділ для стискання, на якому є понад гігабайт вільного місця.
Зауважте, що параметри --expand і --shrink не можна використовувати у одній і тій самій команді.
Використання параметра --unknown-filesystems ignore призведе до того, що virt-resize без додаткових повідомлень ігноруватиме такі файлові системи і нічого не виводитиме щодо них.
Використання параметра --unknown-filesystems warn (типове поведінка) призводитиме до того, що virt-resize попереджатиме про кожну файлову систему, яку не може бути розширено, але продовжуватиме зміну розмірів розділів на диску.
Використання параметра --unknown-filesystems error призведе до того, що virt-resize повідомлятиме про помилку, якщо виявить файлову систему, розміри якої не можна збільшити.
Див. також "unknown/unavailable method for expanding the TYPE filesystem on DEVICE/LV".
Для виведення даних у зручному для машинної обробки форматі можна скористатися параметром --machine-readable. Додавання цього параметра робить зручним використання virt-resize з інших програм, графічних інтерфейсів тощо.
Існує два способи використання цього параметра.
По-перше, можна скористатися ним без інших параметрів для того, щоб дізнатися про можливості виконуваного файла virt-resize. Типові виведені дані виглядатимуть так:
$ virt-resize --machine-readable virt-resize ntfsresize-force 32bitok ntfs btrfs
Виводиться список можливостей, по одній на рядок, і програма завершує роботу зі станом 0.
По-друге, можна скористатися цим параметром у поєднанні із іншими параметрами для того, щоб зробити звичайні виведені програмою дані придатнішими для подальшої машинної обробки.
У поточній версії це означає таке:
^[0-9]+/[0-9]+$
У версіях програми до 1.13.9 не передбачено використання параметра --machine-readable. Якщо цей параметр буде використано для такої версії, програма поверне повідомлення про помилку.
Можна вказати рядок форматування для керування виведенням, див. "РОЗШИРЕНЕ ПРИДАТНЕ ДО ЧИТАННЯ КОМП'ЮТЕРОМ ВИВЕДЕННЯ" in guestfs(3).
Virt-resize вирівнює розділи на позиції, кратні до 128 секторів (див. параметр --alignment). Зазвичай, це означає, що розділи не буде вирівняно за давньою геометрією CHS (циліндр-голівка-сектор). Втім, геометрія CHS не має сенсу для дисків, які вироблено після ранніх 1990-х, і зовсім не має сенсу для віртуальних жорстких дисків. Вирівнювання розділів за циліндрами не є вимогою жодної сучасної операційної системи.
Якщо гостьова система Linux не завантажується після зміни розміру, і завантаження зупиняється після виведення слова "GRUB" до консолі, спробуйте перевстановити grub.
guestfish -i -a newdisk ><fs> cat /boot/grub/device.map # check the contents of this file are sensible or # edit the file if necessary ><fs> grub-install / /dev/vda ><fs> exit
Для гнучкішого переналаштовування гостьової системи, зокрема випадків, коли вам потрібно вказати інші параметри grub-install, скористайтеся virt-rescue(1).
У Windows Vista і новіших версіях компанія Microsoft перейшла до використання окремого розділу завантаження. У віртуальних машинах із цими операційними системами, типово, /dev/sda1 є розділом завантаження, а /dev/sda2 є основним диском (C:). Зміна розмірів першого розділу (розділу завантаження) спричиняє помилку завантажувача 0xC0000225. Зміна розмірів другого розділу (тобто диска C:) має працювати.
Диск Windows, на якому використовується NTFS, має бути коректним, перш ніж virt-resize зможе ним скористатися. Якщо спроба виконати дію ntfsresize завершиться повідомленням про помилку, спробуйте завантажити початкову віртуальну машину і запустіть "chkdsk /f" для усіх розділів NTFS, потім завершіть роботу віртуальної машини у штатний спосіб. Докладнішу інформацію наведено тут: https://bugzilla.redhat.com/show_bug.cgi?id=975753
Після зміни розмірів Windows може ініціювати тривалу обробку chkdsk при першому завантаженні, якщо було розширено розділи NTFS. Це усього лише для забезпечення надійного зберігання даних, і (якщо не буде знайдено помилок) ви можете бути спокійні.
Після приготування системи гостьової операційної системи Windows із наступною зміною її розміру за допомогою virt-resize ви можете отримати непридатну до завантаження систему, яка показуватиме синій екран смерті із помилкою "UNMOUNTABLE_BOOT_VOLUME". Цю помилку спричинено наявністю рядка "ExtendOemPartition=1" у файлі sysprep.inf. Якщо вилучити цей рядок до обробки sysprep, проблема зникає.
«Швидкий запуск» Windows 8 може заважати virt-resize змінювати розмір розділів NTFS. Див. "ПРИСИПЛЯННЯ WINDOWS ТА ШВИДКИЙ ЗАПУСК WINDOWS 8" in guestfs(3).
Вам слід створити новий, заповнений нулями образ диска призначення, який використовуватиме virt-resize.
Virt-resize типово виконує розріджене копіювання. Це означає, що програма не копіює ті блоки з початкового диска, які заповнено лише нулями. Це підвищує швидкість та ефективність роботи, але може призвести до некоректних результатів, якщо на образі диска призначення є незанулені дані.
В основному, така проблема виникає, якщо образом призначення є розділ основної системи (наприклад, "virt-resize source.img /dev/sda4"), оскільки звичайні інструменти поділу диска на розділи лишають недоторканними усі дані, які раніше зберігалися на диску.
Якщо ви змушені використатися образ призначення, на якому вже зберігалися дані, вам слід скористатися параметром --no-sparse. Зауважте, що це значно уповільнить роботу програми.
Virt-resize було наказано розширити розділ або логічний том, на якому міститься файлова система типу "TYPE", але програмі недоступний або невідомий спосіб розширення цієї файлової системи.
Причиною може бути будь-що із наведеного нижче:
Спробуйте такі команди:
virt-resize --machine-readable guestfish -a /dev/null run : available guestfish -a /dev/null run : filesystem_available TYPE
У цьому випадку достатньо встановити належні пакунки із підтримкою файлових систем. Наприклад, достатньо встановити "libguestfs-xfs" у Red Hat Enterprise Linux, CentOS, Debian, Ubuntu та дистрибутивах, які від них походять, щоб можна було працювати із файловою системою "xfs".
У цьому випадку нічого не поробиш: virt-resize не зможе розширити файлову систему цього типу.
In both cases, virt-resize will not expand the mentioned filesystem; the result (unless --unknown-filesystems error is specified) is that the partitions containing such filesystems will be actually bigger as requested, but the filesystems will still be usable at their older sizes.
Існує декілька пропрієтарних інструментів для зміни розмірів розділів. Тут ми не будемо згадувати назви жодного з таких інструментів.
parted(8) і її графічний інтерфейс, gparted, можуть виконувати певні типи дій із зміни розміру образів дисків. Ці програми можуть змінювати розмір і пересувати розділи, але не слід вважати, що вони можуть виконувати будь-які дії із вмістом розділів, і, звичайно ж, вони не можуть працювати з LVM.
guestfish(1) може виконувати усі ті дії, які може виконувати virt-resize, і набагато більше, але на суттєво нижчому рівні. Ймовірно, вам доведеться вручну обчислювати відступи у секторах, робити те, що за означенням має робити virt-resize. Якщо хочете дізнатися, які команди у guestfish запускає virt-resize, скористайтеся параметром --debug.
До складу dracut(8) включено модуль із назвою "dracut-modules-growroot", яким можна скористатися для збільшення розмірів кореневого розділу під час першого завантаження гостьової системи. Документацію з цього модуля наведено у пов'язаному із ним файлі README.
Ця програма повертає значення 0 у разі успішного завершення і ненульове значення, якщо сталася помилка.
virt-filesystems(1), virt-df(1), guestfs(3), guestfish(1), lvm(8), pvresize(8), lvresize(8), resize2fs(8), ntfsresize(8), btrfs(8), xfs_growfs(8), resize.f2fs(8), virsh(1), parted(8), truncate(1), fallocate(1), grub(8), grub-install(8), virt-rescue(1), virt-sparsify(1), virt-alignment-scan(1), http://libguestfs.org/.
Richard W.M. Jones http://people.redhat.com/~rjones/
Copyright (C) 2010-2023 Red Hat Inc.
To get a list of bugs against libguestfs, use this link: https://bugzilla.redhat.com/buglist.cgi?component=libguestfs&product=Virtualization+Tools
To report a new bug against libguestfs, use this link: https://bugzilla.redhat.com/enter_bug.cgi?component=libguestfs&product=Virtualization+Tools
When reporting a bug, please supply:
2024-01-04 | guestfs-tools-1.52.0 |