Bagaimana cara memindahkan / menyalin volume logis (lv) ke grup volume lain (vg)?

17

Pada dasarnya, saya ingin memindahkan / menyalin beberapa volume logis (lv) ke grup volume baru (vg). Grup volume baru berada pada set volume fisik baru. Adakah yang tahu cara melakukannya dengan aman tanpa merusak data di dalam volume logis itu ??

tak seorangpun
sumber
Bisakah Anda memberikan rincian lebih lanjut? Apakah Anda tahu cara membuat VG dan LV baru? Apakah Anda memindahkan partisi data atau partisi root Anda?
Panther
@ bodhi.zazen: Sebenarnya saya mencoba untuk memindahkan semacam partisi data. Yang saya maksud dengan "semacam" adalah, volume-volume logis itu adalah mesin virtual. (Yaitu volume logis muncul ke mesin virtual sebagai perangkat blok). Lagi pula, saya bisa menangani situasi dengan cara saya sendiri. Langkah-langkah diberikan dalam jawaban saya. Namun, Anda dan Anda semua dipersilakan untuk mengomentari metode saya. Jika ada cara yang lebih baik untuk melakukan hal seperti ini, mohon berbaik hati untuk membagikannya. :)
tidak ada yang
Pertama-tama saya akan membuat PV / LV baru, mematikan VM, kemudian menyalin data dengan dd, boot VM baru dan konfirmasikan itu berfungsi.
Panther

Jawaban:

11

vgmerge memungkinkan Anda menggabungkan dua VG. Anda juga dapat menggunakan pvmove untuk memindahkan data dalam VG, dan vgsplit jika Anda ingin kembali ke beberapa VG.

Gabriel
sumber
9

Tidak ada alasan untuk menyalinnya ke file .img terlebih dahulu, cukup lakukan lvcreate dulu, lalu salin langsung ke:

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
segera
sumber
2
Ini agak terlalu singkat. Itu tidak mengatakan apa sebenarnya ukuran yang disebutkan - misalnya <ukuran> bisa sangat kecil, karena hanya untuk perbedaan snapshot.
Gorn
@ memberikan poin yang valid, tetapi dia membalas jawaban tidak ada di bawah ini, yang pertama pada saat itu. Baca itu untuk konteks tambahan.
Tobias J
7

Oke, saya bisa menangani situasi dengan cara saya sendiri. Berikut langkah-langkah yang saya ambil:

1) Ambil snapshot dari volume logis penargetan.

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

Catatan: Ukuran snapshot bisa sebesar atau sekecil yang Anda inginkan. Yang penting adalah memiliki cukup ruang untuk menangkap perubahan selama periode snapshot.

2) Buat salinan gambar dari konten snapshot menggunakan dd

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

3) Buat volume logis baru dengan ukuran yang cukup di grup volume penargetan (baru).

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

4) Tulis data ke volume logis baru dari cadangan gambar menggunakan dd

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

5) hapus snapshot dan cadangan gambar menggunakan lvremovedan rmmasing - masing.

Itu semua orang ... Semoga ini bisa membantu seseorang :)

tak seorangpun
sumber
Jika seseorang memiliki opsi / metode yang lebih baik, beri tahu saya juga :-)
tidak ada yang
2

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: kami membuat grup volume vg1 dengan volume logis lv1, dan vg2 dengan lv2, dan membuat salinan lv1 di vg2.

Buat file.

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

Atur 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 grup volume vg1 dan vg2 di / dev / loop1 dan / dev / loop2 masing-masing.

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

Buat volume logis lv1 dan lv2 masing-masing pada vg1 dan vg2.

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

Buat filesystem ext4 di lv1 dan lv2.

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

Secara opsional, tulis sesuatu di lv1 sehingga nanti Anda dapat memeriksa salinan yang dibuat dengan benar. Jadikan vg1 tidak aktif.

vgchange -a n vg1

Jalankan perintah gabung dalam mode uji. Ini menggabungkan lv1 menjadi 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. Argumen <> memberi tahu lvconvertuntuk membuat salinan mirror lv1_copyaktif /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 vg2 tidak 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
itu tidak ada gunanya. Anda harus meng-unmount sistem file, menonaktifkan volume, dll. Anda bisa saja unmount dir dan menyalin data juga.
user189142
2

Keempat jawaban sejauh ini semuanya kehilangan bahwa ukuran pasti dari volume seringkali tidak diketahui. lvdisplayhanya menunjukkan nilai yang dibulatkan ke 2 tempat desimal dan man lvdisplayhanya menunjuk ke perintah lain untuk opsi yang tersedia. Berikut ini memilih MiB, yang cukup akurat dengan ukuran blok LVM standar 4 MiB:

lvdisplay --units m

MiB juga unit default untuk --sizedari lvcreate. Jika ragu, periksa kembali ukuran yang benar dengan lvdisplaysetelah membuat volume target. Kemudian lanjutkan seperti pada jawaban lain untuk membuat salinan. Selanjutnya, saya akan merekomendasikan untuk memverifikasi salinan , misalnya dengan cmp.

Di sini mengapa snapshot digunakan dan apa yang dilindungi dan tidak dilindungi:

  • Snapshot dibuat agar semua data disalin seperti pada saat snapshot dibuat. Aktivitas pada volume sumber selama proses penyalinan tidak akan tercermin dalam salinan.

  • Cuplikan juga melindungi volume sumber dari kesalahan manusia di ddbaris perintah. Jika Anda secara tidak sengaja menulis ke snapshot, hanya data snapshot yang akan rusak dan Anda cukup menghapus snapshot dan memulai dari awal.

  • Volume target tidak dilindungi selama proses penyalinan. Jika admin lain (atau proses otomatis seperti os-prober of dracut) me-mount volume yang tidak lengkap, mount mungkin mengacaukan hal-hal. (Bahkan mount baca-saja masih dapat menulis entri jurnal ke volume.)

Joachim Wagner
sumber
2

Saya akan menawarkan sendiri:

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/

jika semuanya baik, hapus sumbernya

lvremove vgsource/lv0
conan
sumber
0

Jika Anda perlu menyalin volume logis dari VG A ke VG B lainnya, saya menemukan varian menarik yang digunakan partclone. Cuplikan kemudian salin dengan dd adalah metode yang baik tetapi mungkin lambat jika sistem file Anda tidak penuh. Solusi ini sangat cepat karena hanya menyalin blok yang digunakan.

  1. Pertama buat snapshot dari sumber LV
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

di --sizesini adalah berapa banyak penulisan dapat terjadi sebelum snapshot akan dinonaktifkan

  1. Buat LV tujuan di VG tujuan
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size minimal harus ukuran sumber LV

  1. Salin sistem file dari cadangan sumber lv ke tujuan LV
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typebisa ext4, fat32, btrfs, xfs, ... setiap FS didukung oleh partclone

  1. Hapus snapshot
lvremove /dev/sourcevg/lv-backup
HugoPoi
sumber