İmajları değiştirin¶
Bir sanal makine imajı elde ettikten sonra, imaj servisine yüklemeden önce bir takım değişiklikler yapmak isteyebilirsiniz. Burda imajları değiştirmenize yardımcı olacak çeşitli araçları tanıtıyoruz.
Uyarı
Bu araçları çalışan bir sanal makineye bağlı imajları değiştirmek için kullanmayın. Bu araçlar yalnızca henüz çalışmayan imajları değiştirmek üzere tasarlanmıştır.
guestfish¶
guestfish
programı libguestfs projesi ile gelen ve bir sanal makine imajındaki dosyaları değiştirmenizi sağlayan bir araçtır.
Not
guestfish
imajı doğrudan yerel dosya sistemine bağlamaz. Bunun yerine, dosyaları görüntülemenizi, düzenlemenizi ve silmenizi sağlayan bir kabuk arayüzü sağlar. Çoğu guestfish komutu, örneğin touch, chmod, ve rm geleneksel bash komutlarını andırır.
Örnek guestfish oturumu¶
Bazen imaj oluşturulurken sanal ağ arayüzü kartına atanmış MAC adresinin izlerini silmek için bir sanal makine imajını değiştirmeniz gerekir. Bunun sebebi sanal makine imajı yüklenirken MAC adresinin farklı olmasıdır. Bu örnek guestfish
kullanarak /etc/udev/rules.d/70-persistent-net.rules
dosyasını silerek ve /etc/sysconfig/network-scripts/ifcfg-eth0
dosyasından HWADDR
satırını kaldırarak eski MAC adresinin başvurularını kaldırmayı gösteriyor.
centos63_desktop.img
isimli bir CentOS qcow2 imajınız olduğunu varsayın. Root olarak imajı okuma-yazma kipinde bağlayın, şu şekilde:
# guestfish --rw -a centos63_desktop.img
Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
><fs>
Bu bir guestfish oturumu başlatır.
Not
guestfish ekranı bir balık gibi görünür: ><fs>
.
Başka bir şey yapabilmemiz için önce run komutunu guestfish komut ekranından kullanmamız gerek. Bu bir sanal makine başlatır, bu da tüm dosya değişikliklerini yapmakta kullanılır.
><fs> run
Artık imajdaki dosya sistemlerini list-filesystems komutuyla görüntüleyebiliriz:
><fs> list-filesystems /dev/vda1: ext4 /dev/vg_centosbase/lv_root: ext4 /dev/vg_centosbase/lv_swap: swap
Kök bölümü içeren mantıksal birimi bağlamamız gerekiyor:
><fs> mount /dev/vg_centosbase/lv_root /
Şimdi, bir dosya silmek istiyoruz. Geleneksel kabuktaki gibi çalışan guestfish rm komutunu kullanabiliriz.
><fs> rm /etc/udev/rules.d/70-persistent-net.rules
ifcfg-eth0
dosyasını düzenleyipHWADDR
satırını kaldırmak istiyoruz. edit komutu dosyayı sunucuya kopyalar, düzenleyicinizi başlatır, ve dosyayı geri kopyalar.><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
Bu imajı değiştirerek önyüklemede 8021q çekirdeğini yüklemek isterseniz,
/etc/sysconfig/modules/
dizininde çalıştırılabilir bir betik oluşturmalısınız. Boş bir dosya oluşturmak için touch guestfish komutunu kullanabilir, edit komutuyla dosyayı düzenleyebilir, ve chmod komutuyla çalıştırılabilir yapabilirsiniz.><fs> touch /etc/sysconfig/modules/8021q.modules ><fs> edit /etc/sysconfig/modules/8021q.modules
Dosyaya şu satırı ekliyoruz ve kaydediyoruz:
modprobe 8021q
Ardından çalıştırılabilir yapıyoruz:
><fs> chmod 0755 /etc/sysconfig/modules/8021q.modules
İşimiz bitti, yani exit komutu ile çıkabiliriz.
><fs> exit
guestfish ile daha ileri gidin¶
guestfish’in oldukça fazla işlevselliği vardır ama bunlar bu belgenin kapsamı dışında kalıyor. Bunun yerine bu araçlar ile neler yapabileceğinizi kavramak için guestfs-recipes belgelendirme sayfasını okumanızı tavsiye ediyoruz.
guestmount¶
Bazı türde değişiklikler için, imajın dosya sistemini doğrudan misafire bağlamayı düşünebilirsiniz. Yine libguestfs projesinden gelen guestmount
programı, bunu yapabilmenizi sağlar.
Örneğin,
centos63_desktop.qcow2
imajımızdan kök bölümü/mnt
yoluna bağlamak için:# guestmount -a centos63_desktop.qcow2 -m /dev/vg_centosbase/lv_root --rw /mnt
Misafirdeki bağlama noktasının ne olduğunu bilmiyorsak,
-i
(inspect) bayrağını kullanarak guestmount’a kullanılacak bağlama noktasını otomatik belirlemesini söyleyebiliriz:# guestmount -a centos63_desktop.qcow2 -i --rw /mnt
Bağlandıktan sonra, rpm kullanarak kurulu paketleri listeleme gibi şeyler yapabiliriz:
# rpm -qa --dbpath /mnt/var/lib/rpm
İş bitince, bağlantıyı kesiyoruz:
# umount /mnt
virt-* araçları¶
libguestfs projesi bir takım faydalı araç içerir, bazıları:
Bir imaj içinden dosya düzenlemek için virt-edit .
Bir imaj içinde boş alanı görüntülemek için virt-df.
Bir imajı boyutlandırmak için virt-resize.
Bir imajı dağıtım için hazırlamak için (örneğin, SSH sunucu anahtarlarını silmek, MAC adres bilgisini silmek, veya kullanıcı hesaplarını silmek) virt-sysprep.
Bir imajı seyrekleştirmek için virt-sparsify.
Bir fiziksel makineyi KVM üzerinde çalışan bir imaja çevirmek için virt-p2v.
Xen ve VMware imajlarını KVM imajlarına çevirmek için virt-v2v.
Bir imaj içinde tek bir dosyayı değiştir¶
Bu örnek virt-edit kullanarak bir dosyanın değiştirilmesini gösteriyor. Komut değişken olarak -a
ile bir dosya ismi alabilir veya -d
bayrağıyla bir alan adı alabilir. Aşağıdaki örnekler çalışan ve libvirt alan adı instance-000000e1
olan bir sunucu içinde /etc/shadow
dosyasının nasıl olacağını gösterir:
# virsh shutdown instance-000000e1
# virt-edit -d instance-000000e1 /etc/shadow
# virsh start instance-000000e1
Bir imajı yeniden boyutlandırın¶
Burda da virt-resize kullanarak bir imajın yeniden boyutlandırılması gösteriliyor. 50 GB olarak boyutlandırmak istediğimiz 16 GB boyutunda ve qcow2 biçiminde bir Windows imajımız olduğunu düşünelim.
Önce bölümleri tanımlamak için virt-filesystems kullanıyoruz:
# virt-filesystems --long --parts --blkdevs -h -a /data/images/win2012.qcow2 Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 16G /dev/sda /dev/sda device - 16G -
Bu durumda,
/dev/sda2
bölümünü yeniden boyutlandırmak istiyoruz. Yeni bir qcow2 imajı oluşturuyoruz ve virt-resize komutu ile asıl imajın yeniden boyutlandırılmış kopyasını yeni imaja yazıyoruz:# qemu-img create -f qcow2 /data/images/win2012-50gb.qcow2 50G # virt-resize --expand /dev/sda2 /data/images/win2012.qcow2 \ /data/images/win2012-50gb.qcow2 Examining /data/images/win2012.qcow2 ... ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be resized from 15.7G to 49.7G. The filesystem ntfs on /dev/sda2 will be expanded using the 'ntfsresize' method. ********** Setting up initial partition table on /data/images/win2012-50gb.qcow2 ... Copying /dev/sda1 ... 100% [ ] 00:00 Copying /dev/sda2 ... 100% [ ] 00:00 Expanding /dev/sda2 using the 'ntfsresize' method ... Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
Döngü aygıtları, kpartx, ağ blok aygıtları¶
libguestfs erişiminiz yoksa, imaj dosya sistemlerini doğrudan döngü aygıtları, kpartx, ve ağ blok aygıtları kullanarak sunucuya bağlayabilirsiniz.
Uyarı
Bu kısımda anlatılan araçları kullanarak güvenilmeyen misafir imajları bağlamak güvenlik riski oluşturur, her zaman guestfish ve guestmount gibi libguestfs araçlarını kullanmaya çalışın. Daniel Berrangé tarafınan yazılan Sunucu işletim sistemine misafir disk imajları bağlamamanız gerektiğiyle ilgili hatırlatmaya göz atın.
Bir raw imaj bağlayın (LVM olmadan)¶
Bölümlerini yönetmek için LVM kullanmayan bir raw sanal makine imajınız varsa, kullanılmayan bir döngü aygıtı bulmak için losetup komutunu kullanın.
# losetup -f
/dev/loop0
Bu örnekte, /dev/loop0
boş. Raw imajla bir döngü aygıtı ilişkilendirelim:
# losetup /dev/loop0 fedora17.img
İmaj tek bir bölümden oluşuyorsa, döngü aygıtını doğrudan bağlayabilirsiniz:
# mount /dev/loop0 /mnt
İmajda birden fazla bölüm varsa, bölümleri ayrı aygıtlar olarak ortaya çıkarmak için kpartx kullanın (örneğin, /dev/mapper/loop0p1
), ardından kök dosya sistemine denk gelen bölümü bağlayın:
# kpartx -av /dev/loop0
İmajın örneğin üç bölümü varsa (/boot, /, swap), bölüm başına bir yeni aygıt oluşturulmuş olmalıdır:
$ ls -l /dev/mapper/loop0p*
brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/mapper/loop0p1
brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/mapper/loop0p2
brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/mapper/loop0p3
İkinci bölümü bağlamak için, root olarak:
# mkdir /mnt/image
# mount /dev/mapper/loop0p2 /mnt/image
İşiniz bittiğinde, temizlik için:
# umount /mnt/image
# rmdir /mnt/image
# kpartx -d /dev/loop0
# losetup -d /dev/loop0
Bir raw imajı bağlayın (LVM ile)¶
Bölümleriniz LVM ile yönetiliyorsa, losetup ve kpartx komutlarını bölümleri önceki örnekteki gibi sunucu için ortaya çıkarmak için kullanın.
# losetup -f
/dev/loop0
# losetup /dev/loop0 rhel62.img
# kpartx -av /dev/loop0
Ardından, vgscan komutunu kullanarak LVM birim gruplarını tanımlamalı ve vgchange komutuyla birimleri aygıtlar olarak ortaya çıkarmalısınız:
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_rhel62x8664" using metadata type lvm2
# vgchange -ay
2 logical volume(s) in volume group "vg_rhel62x8664" now active
# mount /dev/vg_rhel62x8664/lv_root /mnt
İşiniz bittiğinde temizlik yapın:
# umount /mnt
# vgchange -an vg_rhel62x8664
# kpartx -d /dev/loop0
# losetup -d /dev/loop0
Bir qcow2 imajı bağlama (LVM olmadan)¶
Qcow2 imajlarını bağlamak için nbd
(ağ blok aygıtı) çekirdek modülüne ihtiyacını vardır. Bu komut 16 blok aygıt destekleyecek şekilde yükleyecektir, işimiz görmeye yeter. Root olarak.
# modprobe nbd max_part=16
İlk blok aygıtın (/dev/nbd0
) kullanımda olmadığını varsayarsak, qemu-nbd ve partprobe komutlarını kullanarak disk bölümlerini ortaya çıkarabiliriz. Root olarak:
# qemu-nbd -c /dev/nbd0 image.qcow2
# partprobe /dev/nbd0
İmajın örneğin üç bölümü varsa (/boot, /, swap) her bir bölüm için bir yeni aygıt oluşturulmuş olmalı:
$ ls -l /dev/nbd0*
brw-rw---- 1 root disk 43, 48 2012-03-05 15:32 /dev/nbd0
brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/nbd0p1
brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/nbd0p2
brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/nbd0p3
Not
If the network block device you selected was already in use,
the initial qemu-nbd command will fail silently, and the
/dev/nbd0p{1,2,3}
device files will not be created.
İmaj bölümleri LVM ile yönetilmiyorsa, doğrudan bağlanabilirler:
# mkdir /mnt/image
# mount /dev/nbd0p2 /mnt/image
İşiniz bittiğinde, temizlik yapın:
# umount /mnt/image
# rmdir /mnt/image
# qemu-nbd -d /dev/nbd0
Bir qcow2 imajı bağlayın (LVM ile)¶
İmaj bölümleri LVM ile yönetiliyorsa, qemu-nbd ve partprobe komutunu kullandıktan sonra, vgscan ve vgchange -ay komutlarını sırasıyla kullanarak LVM bölümlerini bağlanabilir aygıtlar olarak ortaya çıkarabilirsiniz:
# modprobe nbd max_part=16
# qemu-nbd -c /dev/nbd0 image.qcow2
# partprobe /dev/nbd0
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_rhel62x8664" using metadata type lvm2
# vgchange -ay
2 logical volume(s) in volume group "vg_rhel62x8664" now active
# mount /dev/vg_rhel62x8664/lv_root /mnt
İşiniz bittiğinde, temizlik yapın:
# umount /mnt
# vgchange -an vg_rhel62x8664
# qemu-nbd -d /dev/nbd0