Apakah ada cara sederhana untuk memindahkan / menyalin volume logis dari satu grup volume ke yang lain? (LVM2)

15

Saya mengatur ulang sekelompok disk di server saya di rumah dan saya menemukan diri saya dalam posisi ingin memindahkan sekelompok volume logis LVM ke grup volume lain. Apakah ada cara sederhana untuk melakukan hal ini? Saya melihat penyebutan suatu cplvperintah tetapi ini sepertinya sudah lama atau bukan sesuatu yang pernah tersedia untuk Linux.

jkp
sumber

Jawaban:

20

Jika Anda dapat mengatur agar volume logis berada di subset terpisah volume fisik dari sisa grup volume sumber ( lvconvert sourcevg/sourcelv /dev/pv1 ...dapat membantu), Anda dapat menggunakan vgsplituntuk membagi lv menjadi vg baru dan vgmergeuntuk menggabungkan vg baru ke dalam target vg.

Meskipun LVM memiliki fitur mirroring, Anda tidak dapat (secara bijaksana) menggunakannya untuk membuat salinan di antara grup volume, karena kedua kaki cermin harus hidup pada vg yang sama dan asosiasi tidak dapat dipatahkan .

Anda dapat menyalin volume LVM ke yang lain dengan cara Anda menyalin volume apa pun ke yang lain: buat target lv dengan ukuran yang sesuai, lalu salin isinya dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M. Jika volume sumber aktif, Anda dapat memanfaatkan LVM untuk membuat salinan yang konsisten: pertama-tama ambil snapshot sumber lv lvcreate -s, lalu salin snapshot.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Brilliant Gilles .... vgsplit / vgmerge mungkin akan baik-baik saja: Saya dapat menggunakan pvmove setelah itu untuk memindahkan luasan fisik ke disk baru dan kemudian menghapus volume lama dari VG.
jkp
Sayang, ini tidak berhasil bagi saya pada akhirnya karena ukuran yang berbeda. Jika itu bukan masalah bagi Anda, saya sarankan metode ini akan lebih mudah.
jkp
Setelah dd(jika Anda tidak terburu-buru untuk membuang volume lama), jangan lupa untuk mengubah UUID dari sistem file baru: tune2fs -U acak / dev / targetvg / targetlv
midenok
2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmove dapat memindahkan data antar volume fisik: Panduan Administrator LVM

Milan
sumber
10
Tetapi tidak di antara grup volume.
MattBianco
Saya ulangi: ini tidak berfungsi untuk dua grup volume yang terpisah
kissgyorgy
Pertama vgextendvg1 dengan pv baru, kemudian pvmovelv Anda ke pv baru, vgsplitvg sementara yang Anda vgmergedi vg2. Kemudian pvmovelagi lv ke vg2 pv asli, vgreducevg2 untuk membaca pv perantara. Atau untuk menghindari salinan perantara, Anda dapat menggabungkan dulu vg1 di vg2, lv1 pvmove, dan vgsplitlagi vg1 dari vg2. Ini harus menjawab keberatan dari @ MattBianco dan @kissgyorgy dan setara dengan solusi @Gilles tetapi mengganti snapshot dan tingkat rendah dddengan apvmove
marcz
1

Sampai dengan LVM di Debian peregangan (9.0), yaitu 2.02.168-2, itu mungkin untuk melakukan copy dari volume logis di seluruh kelompok volume dengan menggunakan kombinasi dari vgmerge, lvconvert, dan vgsplit. Karena langkah adalah kombinasi dari salinan dan penghapusan, ini juga akan berfungsi untuk bergerak.

Atau, Anda dapat menggunakan pvmoveuntuk hanya memindahkan volume.

Sesi contoh lengkap mandiri menggunakan perangkat loop dan lvconvertikuti.

Ringkasan: kita menciptakan kelompok volume vg1dengan volume logis lv1, dan vg2dengan lv2, dan membuat salinan dari lv1dalam vg2.

Buat file.

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

Siapkan perangkat loop pada file.

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

Buat volume fisik pada perangkat loop (inisialisasi perangkat loop untuk digunakan oleh LVM).

pvcreate /dev/loop1 /dev/loop2

Buat kelompok Volume vg1dan vg2di /dev/loop1dan /dev/loop2 masing-masing.

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

Buat volume logis lv1dan lv2terus vg1dan vg2masing - masing.

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

Buat sistem file ext4 di lv1dan lv2.

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

Secara opsional, tuliskan sesuatu lv1agar Anda nanti dapat memeriksa apakah salinannya telah dibuat dengan benar. Jadikan vg1tidak aktif.

vgchange -a n vg1

Jalankan perintah gabung dalam mode uji. Ini bergabung lv1menjadi lv2.

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

Dan kemudian nyata.

vgmerge -A y -l -v vg2 vg1

Kemudian buat pasangan cermin RAID 1 dari lv1menggunakan lvconvert. The <> Argumen mengatakan lvconvertuntuk membuat salinan cermin lv1_copydi /dev/loop2.

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

Lalu belah cermin. LV baru sekarang lv1_copy.

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

Jadikan vg2tidak aktif.

vgchange -a n vg2

Kemudian (mode pengujian)

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

Nyata

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

Output yang dihasilkan:

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

CATATAN:

1) Sebagian besar dari perintah ini perlu dijalankan sebagai root.

2) Jika ada duplikasi nama volume logis dalam dua grup volume, vgmergeakan menolak untuk melanjutkan.

3) Saat digabung:

Logical volumes in `vg1` must be inactive

Dan di split:

Logical volume `vg2/lv1` must be inactive.
Faheem Mitha
sumber