Як перемістити / скопіювати логічний том (lv) до іншої групи томів (vg)?


17

В основному я хочу перемістити / скопіювати кілька логічних томів (lv) у нову групу томів (vg). Нова група томів розміщена на новому наборі фізичних томів. Хтось знає, як це зробити безпечно, не пошкоджуючи дані всередині цих логічних томів ??


Чи можете ви надати більше деталей? Чи знаєте ви, як зробити нові VG та LV? Ви переміщуєте розділ даних або ваш кореневий розділ?
Пантера

@ bodhi.zazen: Насправді я намагався перемістити певний розділ даних. Що я мав на увазі під "родом", це те, що ці логічні томи - це віртуальні машини. (тобто ці логічні томи видаються віртуальним машинам як блокові пристрої). У всякому разі, я зміг по-своєму впоратися з ситуацією. Кроки наведені у моїй відповіді. Однак ви і всі ви можете прокоментувати мій метод. Якщо є / є кращі способи зробити таку річ, будьте ласкаві поділитися нею. :)
ніхто

Я б спершу створив новий PV / LV, вимкнув VM, потім скопіював дані з dd, завантажив новий VM і підтвердив, що він працював.
Пантера

Відповіді:


12

vgmerge дозволяє об'єднати два VG. Ви також можете використовувати pvmove для переміщення даних у VG, а vgsplit, якщо ви хочете повернутися до декількох VG.


Одна примітка. Для цього у вас повинен бути тимчасовий пристрій, який використовується для передачі інтернет-телебачення на інший VG. Звичайно, після передачі слід оновити / etc / fstab та іншу пошкоджену конфігурацію, а також запланувати деякий час в режимі офлайн для перезавантаження, а згодом зробити деяке оновлення конфігурації. Якщо ви робите якісь дії з rootfs або bootfs, ви повинні мати деякий linux live distro для відновлення основної системи.
Зник

10

Немає причини спершу скопіювати його у файл .img, просто спочатку зробіть lvcreate, а потім скопіюйте безпосередньо:

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume

2
Це занадто коротко. Це не говорить про те, які саме згадані розміри - наприклад, <розмір> може бути дуже малим, як це стосується лише різниць знімків.
gorn

1
@gorn є дійсним пунктом, але він відповів ні на кого не відповів нижче, що було першим у той час. Прочитайте це для додаткового контексту.
Tobias J

7

Гаразд, я зміг вирішити ситуацію по-своєму. Ось такі кроки:

1) Зробіть знімок логічного тома націлювання.

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

Примітка. Розмір знімка може бути таким же великим або маленьким, як ви хочете. Важливо мати достатньо місця для зйомки змін протягом періоду зйомки.

2) Створіть копію зображення вмісту знімка за допомогою dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3) Створіть новий логічний об'єм достатнього розміру в цільовій (новій) групі томів.

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4) Запишіть дані в новий логічний том із резервної копії зображення, використовуючи dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5) видаліть знімок та резервну копію зображення за допомогою lvremoveта rmвідповідно.

Це все, люди ... Сподіваюся, це комусь допомагає :)


Якщо хтось має кращий варіант / метод, дайте мені знати також :-)
ніхто

ising backup.img для тимчасового резервного копіювання зберігається непотрібно. Ви можете безпосередньо входити зі знімка джерела до місця призначення LV з не встановленим станом.
Зник

3

Станом на LVM в Debian ділянці (9.0), а саме 2.02.168-2, це можливо зробити копію логічного тому по групах томів , використовуючи комбінацію vgmerge, lvconvertі vgsplit. Оскільки переміщення - це комбінація копії та видалення, це також буде працювати для переміщення.

Крім того, ви можете використовувати pvmoveпросто переміщення гучності.

Повний самостійний приклад сеансу з використанням циклічних пристроїв і lvconvertдалі.

Підсумок: ми створюємо групу томів vg1 з логічним томом lv1, і vg2 з lv2, і робимо копію lv1 у vg2.

Створення файлів.

truncate pv1 --size 100MB
truncate pv2 --size 100MB

Налаштування циклічних пристроїв на файли.

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

Створіть фізичні обсяги на петльових пристроях (ініціалізуйте петлеві пристрої для використання LVM).

pvcreate /dev/loop1 /dev/loop2

Створіть групи томів vg1 та vg2 on / dev / loop1 та / dev / loop2 відповідно.

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

Створіть логічні томи lv1 та lv2 на vg1 та vg2 відповідно.

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

Створіть файлові системи ext4 на lv1 та lv2.

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

За бажанням напишіть щось на lv1, щоб потім можна було перевірити, чи копія була створена правильно. Зробіть vg1 неактивним.

vgchange -a n vg1

Запустіть команду злиття в тестовому режимі. Це зливає lv1 у lv2.

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1

І тоді по-справжньому.

vgmerge -A y -l -v vg2 vg1

Потім створіть з lv1використанням дзеркальну пару RAID 1 lvconvert. <> Аргумент каже , lvconvertщоб зробити дзеркальну копію lv1_copyна /dev/loop2.

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

Потім розділіть дзеркало. Новий LV тепер lv1_copy.

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

Зробіть vg2 неактивним.

vgchange -a n vg2

Потім (тестовий режим)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1

Насправді

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1

Отриманий результат:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m

ПРИМІТКИ:

1) Більшість цих команд потрібно запустити як root.

2) Якщо в двох групах томів є дублювання імен логічних томів, vgmergeвідмовитися продовжуватиметься.

3) При злитті:

Logical volumes in `vg1` must be inactive

І на розкол:

Logical volume `vg2/lv1` must be inactive.

1
це просто безглуздо. Вам доведеться демонтувати файлові системи, дезактивувати томи тощо. Ви можете просто відключити dir та скопіювати дані.
користувач189142

по-перше, як сказав користувач189142, це безглуздо. по-друге, він застосовується лише в ситуації, коли ми можемо зупинити послуги, використовуючи переміщений обсяг. це проблема з сервісами, які працюють 24/7, і обсяг дуже великий, якщо дані перераховані в терабайт. Тому ця процедура потребує дуже тривалого часу обслуговування. Це набагато простіше просто створити новий том, rsync в Інтернеті, а потім короткий час rsync в автономному режимі для оновлення, перезавантаження та повернення системи в онлайн-стан. Звичайно, дуже гарна ідея - видалити зайві дані з тома джерела. можливо тимчасово перенести його в якесь тимчасове місце.
Зник

3

На сьогодні всі 4 відповіді пропускають, що точний розмір гучності часто не відомий. lvdisplayпоказує лише значення, округлені до двох знаків після коми, і man lvdisplayлише вказує на інші команди за доступними параметрами. Далі вибирається MiB, що є достатньо точним з розміром блоку LVM за замовчуванням у 4 MiB:

lvdisplay --units m

MiB також блок за замовчуванням --sizeв lvcreate. Якщо ви сумніваєтеся, двічі перевірте правильність розміру lvdisplayпісля створення цільового обсягу. Потім продовжуйте, як і в інших відповідях, щоб зробити копію. Крім того, я рекомендую підтвердити копію , наприклад, за допомогою cmp.

Ось чому використовується знімок і що він захищає та не захищає:

  • Знімок зроблений таким чином, що всі дані копіюються так, як це було в момент створення знімка. Діяльність над томом джерела під час копіювання не відображатиметься в копії.

  • Знімок також захищає вихідний об'єм від помилок людини в ddкомандному рядку. Якщо ви випадково напишіть на знімок, тільки дані знімка будуть пошкоджені, і ви можете просто видалити знімок і почати спочатку.

  • Цільовий обсяг не захищений під час процесів копіювання. Якщо інший адміністратор (або автоматичний процес, наприклад os-prober of dracut) змонтує неповний об'єм, він може викрутити речі. (Навіть кріплення, доступне лише для читання, все ще може записувати записи журналу до тома.)


2

Я запропоную своє:

umount /somedir/

lvdisplay /dev/vgsource/lv0 --units b

lvcreate -L 12345b -n lv0 vgtarget

dd if=/dev/vgsource/lv0 of=/dev/vgtarget/lv0 bs=1024K conv=noerror,sync status=progress

mount /dev/vgtarget/lv0 /somedir/

якщо все добре, видаліть джерело

lvremove vgsource/lv0

що робити, якщо обсяг джерела дуже великий, і сервіс чи систему не слід зупиняти?
Зник

0

Якщо вам потрібно скопіювати логічний том з VG A в інший VG B, я знайшов цікавий варіант, використовуючи partclone. Знімок, який потім скопіювати з DD, - хороший метод, але може бути повільним, якщо ваші файлові системи не заповнені. Це рішення дуже швидко, оскільки воно копіює лише використані блоки.

  1. Спочатку створіть знімок джерела LV
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

--sizeтут скільки записи може статися до того , як знімок буде відключений

  1. Створіть LV пункту призначення у VG пункту призначення
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size повинен бути принаймні розміром джерела LV

  1. Скопіюйте файлову систему з резервного резервного копіювання lv в LV призначення
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typeможе бути ext4, fat32, btrfs, xfs, ... будь-FS підтримується partclone

  1. Видаліть знімок
lvremove /dev/sourcevg/lv-backup
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.