Lưu ý: Tutorial giả định bạn không có virt-sysprep; xem bên dưới!
Không phải generic howto dùng virt-clone. Dù virt-clone hữu ích tạo duplicate VM, cấu hình hiện tại chỉ gán unique ID và MAC address cho clone, buộc bạn additional tweaks và customizations sau khi clone boot. Nghĩa là meddle khá nhiều, không phải ý muốn.
Tôi chỉ cách khác tạo identical copies VM trong KVM, với unique per-host info để bất kỳ số duplicate nào trở thành individual host trên network. Tức là install once, tạo bao nhiêu instance guest tùy ý, mỗi cái hostname, MAC, IP riêng. Fully scriptable. Follow me.
Lưu ý: Hình ảnh từ Wikimedia, license CC BY 2.0.
Cách kém hiệu quả
Thảo luận ngắn virt-clone. Không phải bad utility, nhưng use không standard across distro. Một số ship GUI component (Virtual Machine Manager), khác cung cấp command line tool. Cả hai, clone chỉ gán unique ID và MAC, không info khác. Config file lưu ở /etc/libvirt/qemu.
Ví dụ:
Không muốn này. Không perfect.
Cloning + tools of the trade
Cách đúng. Cần rất ít tool; thực tế chỉ một tool: kpartx – utility tạo device maps từ partition tables. Cụ thể ở đây, dùng nó tạo partition mappings cho guest machines bằng cách query virtual disks. Demo dùng Linux, hầu hết UNIX-based systems work.
Đọc partition table từ virtual disk. Đầu tiên, tạo copy virtual disk, vì mỗi machine có disk riêng. Đây là slow step duy nhất của clone procedure, phụ thuộc size file và disk speed. Chung vài phút copy typical 20GB disk file.
cp <old disk file> <new disk file>
Bây giờ partition table:
kpartx -a <virtual disk file>
Generate output. Sẽ thấy separate mapper cho mỗi partition trong VM. Ví dụ có / và /home, sẽ có 2 mappers.
kpartx -av /kvm/disk.raw add map loop0p1 (253:0): 0 4206592 linear /dev/loop0 2048 add map loop0p2 (253:1): 0 79677440 linear /dev/loop0 4208640
Mount relevant device và làm per-host changes:
mount /dev/mapper/<relevant partition loopback> /mountpoint # Ví dụ: mount /dev/mapper/loop0p1 /mnt
Unique host changes
VM likely cần changes sau:
/etc/hosts /etc/HOSTNAME # Network config tùy Debian hoặc RedHat/SUSE, có thể không cần nếu DHCP. Nhưng static IP thì bắt buộc: /etc/sysconfig/network/ifcfg-<device> HOẶC /etc/network/interfaces
Có thể cần changes khác, nhưng đây basic. Save changes, umount. Bước sau: edit KVM config file cho clone mới. XML files thường ở /etc/kvm/vm hoặc /etc/libvirt/qemu nếu auto-created bằng Virtual Machine Manager.
XML file changes
Đầu tiên, copy template config. Edit unique ID, name, MAC address của domain. Apply uniqueness logic: grep, awk, inline search & replace với sed, plus regex khi cần, để fully script procedure. Cũng cần point hard disk directive đến file đúng.
Ví dụ commands:
sed -i -e 's/\<uuid\>.*/\<\/uuid\>/uuid\>dedoimedo\<\/uuid/' file.xml # Kiểm tra với grep: sed -i -e 's/\<uuid\>.*/\<\/uuid\>/uuid\>dedoimedo\<\/uuid/' file.xml. | grep dedoimedo <uuid>dedoimedo</uuid>
Gộp tất cả lại
Complete clone script (typical RedHat example, tự adjust). Một số phần cần logic riêng: parse partitions output. Cần extra work parse XML files, strip brackets, quotes, chars khác.
#!/bin/bash # suspend template OS while cloning virsh suspend <domain> cp <old disk> <new disk> virsh resume <domain> kpartx -a <new disk> # some logic to read relevant partitions mount <desired partition> <mount point> # some logic to parse contents of host-unique files sed -i -e 's/old hostname line/new hostname line/' /etc/HOSTNAME sed -i -e 's/old hostname line/new hostname line/' /etc/hosts sed -i -e 's/old IP config/new IP config/' /etc/sysconfig/network/ifcfg-eth0 umount <mount point> cp /etc/kvm/vm/old.xml /etc/kvm/vm/new.xml # some logic to create new uuid, name, mac, etc # some logic to parse XML files correctly sed -i -e 's/old uuid/new uuid/' /etc/kvm/vm/new.xml sed -i -e 's/old name/new name/' /etc/kvm/vm/new.xml sed -i -e 's/old mac/new mac/' /etc/kvm/vm/new.xml sed -i -e 's/old disk/new disk/' /etc/kvm/vm/new.xml virsh create /etc/kvm/vm/new.xml exit 0
Done. Boot và enjoy!
Tương lai: virt-sysprep
Toàn bộ tutorial trở nên vô nghĩa nếu bạn có virt-sysprep trên box, nghĩa là dùng later edition OS. Tuy nhiên, business environment likely không có, tool không available cho hầu hết sysadmin. Nếu có cơ hội dùng, nó offer handy improvements cho basic clone tool. Trích docs gốc:
Virt-sysprep resets or unconfigures a virtual machine so that clones can be made from it. Steps include removing SSH host keys, removing persistent network MAC configuration, and removing user accounts. Each step can be enabled or disabled as required. Virt-sysprep modifies the guest or disk image in place. The guest must be shut down. If you want to preserve the existing contents of the guest, you must copy or clone the disk first.
Sẽ bàn tool này riêng bài khác.
Tài liệu tham khảo thêm
- KVM + VirtualBox living in harmony
- KVM bridged network tutorial
- KVM storage và network administration
- Clone ESXi machines – similar concept
- Libguestfs – resource dandy cho VM disk image tools
Kết luận
Tutorial simple và elegant. Rất hữu ích, complement manual cloning procedures với tools khác. Bạn có set commands đặt vào single BASH script, Bob's your uncle.
Serious note: bạn học thêm về KVM config và file locations, rudimentary virt-clone, mount VM disk và edit data trong partition liên quan dùng kpartx,包括 network và host config, gán unique fields cho virtual domain. Còn libguestfs. Plus guides hữu ích khác. Not bad cho 5 phút work.
Cuối cùng, virt-sysprep làm cloning dễ hơn, nhưng manual method, dù phức tạp hơn, foolproof. Bạn làm bất cứ gì muốn, không limited bởi subset command-line switches/options. Luôn work, luôn fully scriptable. Splendid.
Done.
Cheers.