Memodifikasi image¶
Setelah Anda telah memperoleh image mesin virtual, Anda mungkin ingin membuat beberapa perubahan sebelum meng-upload ke layanan Image. Di sini kami menjelaskan beberapa alat yang tersedia yang memungkinkan Anda untuk memodifikasi image.
Peringatan
Jangan mencoba untuk menggunakan alat ini untuk memodifikasi image yang terpasang ke mesin virtual yang berjalan. Alat-alat ini dirancang hanya untuk memodifikasi image yang tidak sedang berjalan.
guestfish¶
Program guestfish
adalah alat dari proyek libguestfs yang memungkinkan Anda untuk memodifikasi file dalam image mesin virtual.
Catatan
guestfish
tidak me-mount image langsung ke sistem file lokal. Sebaliknya, ia menyediakan Anda dengan antarmuka shell yang memungkinkan Anda untuk melihat, mengedit, dan menghapus file. Banyak dari perintah guestfish, seperti touch, chmod, dan rm, menyerupai bash command tradisional.
Example guestfish session¶
Kadang-kadang Anda harus mengubah image mesin virtual untuk menghilangkan jejak dari alamat MAC yang ditugaskan untuk interface card jaringan virtual ketika image pertama kali diciptakan. Penghilangan jejak ini karena alamat MAC ini berbeda ketika image mesin virtual boot. Contoh ini menunjukkan bagaimana menggunakan guestfish
untuk menghapus referensi ke alamat MAC lama dengan menghapus file /etc/udev/rules.d/70-persistent-net.rules
dan menghapus baris HWADDR
dari file /etc/sysconfig/network-scripts/ifcfg-eth0
.
Asumsikan bahwa Anda telah memiliki sebuah image qcow2 CentOS disebut centos63_desktop.img
. Mount image dalam modus read-write sebagai root, sebagai berikut:
# 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>
Disini memulai sesi guestfish.
Catatan
Prompt guestfish terlihat seperti ini fish: ><fs>
.
Pertama kita harus menggunakan perintah run pada prompt guestfish sebelum kita dapat melakukan hal lain. Perintah ini akan meluncurkan mesin virtual, yang akan digunakan untuk melakukan semua manipulasi file.
><fs> run
Kita sekarang dapat melihat file sistem pada image yang menggunakan perintah list-filesystems:
><fs> list-filesystems /dev/vda1: ext4 /dev/vg_centosbase/lv_root: ext4 /dev/vg_centosbase/lv_swap: swap
Kita perlu untuk me-mount volume logis yang berisi partisi root:
><fs> mount /dev/vg_centosbase/lv_root /
Selanjutnya, kita ingin menghapus file. Kita dapat menggunakan perintah guestfish rm, yang bekerjanya sama dengan cara kerja di shell tradisional.
><fs> rm /etc/udev/rules.d/70-persistent-net.rules
Kami ingin mengedit file
ifcfg-eth0
untuk menghapus barisHWADDR
. Perintah edit akan menyalin file ke host, memanggil editor, dan kemudian menyalin file kembali.><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
Jika Anda ingin memodifikasi image ini untuk memuat kernel 8021q pada saat boot, Anda harus membuat skrip yang dapat dieksekusi di direktori
/etc/sysconfig/modules/
. Anda dapat menggunakan perintah guestfish touch untuk membuat file kosong, perintah edit untuk mengeditnya, dan perintah chmod untuk membuatnya executable.><fs> touch /etc/sysconfig/modules/8021q.modules ><fs> edit /etc/sysconfig/modules/8021q.modules
Kami tambahkan baris berikut ke file dan menyimpannya:
modprobe 8021q
Kemudian kita atur ke executable:
><fs> chmod 0755 /etc/sysconfig/modules/8021q.modules
Kita selesai, sehingga kita dapat keluar dengan menggunakan perintah exit:
><fs> exit
Melangkah lebih jauh dengan guestfish¶
Ada sejumlah besar fungsi di guestfish dan perawatan penuh (full treatment) adalah di luar lingkup dokumen ini. Sebaliknya, kami sarankan Anda membaca halaman dokumentasi guestfs-recipes untuk rasa apapun yang mungkin dengan alat ini.
guestmount¶
Untuk beberapa tipe perubahan, Anda mungkin akan lebih mudah untuk me-mount langsung sistem file image di guest. Program guestmount
, juga dari proyek libguestfs, memungkinkan Anda untuk melakukannya.
Misalnya, untuk me-mount partisi root dari image kami
centos63_desktop.qcow2`
ke/mnt
, kita dapat melakukan:# guestmount -a centos63_desktop.qcow2 -m /dev/vg_centosbase/lv_root --rw /mnt
Jika kita tidak tahu sebelumnya apakan mount point berada di guest, kita bisa menggunakan
-i
(inspect) flag untuk memberitahu guestmount secara otomatis untuk menentukan apakah mount point yang akan digunakan:# guestmount -a centos63_desktop.qcow2 -i --rw /mnt
Setelah di-mount, kita bisa melakukan berbagai hal seperti mendaftar paket yang diinstal dengan menggunakan rpm:
# rpm -qa --dbpath /mnt/var/lib/rpm
Setelah selesai, kita unmount:
# umount /mnt
virt-* tools¶
Proyek libguestfs memiliki sejumlah alat yang berguna lainnya, termasuk:
virt-edit untuk mengedit file dalam sebuah image.
virt-df untuk menampilkan ruang bebas di dalam sebuah image.
virt-resize untuk mengubah ukuran image.
virt-sysprep untuk persiapan image untuk distribusi (misalnya, menghapus kunci host SSH, menghapus info alamat MAC, atau menghapus akun pengguna).
virt-sparsify untuk membuat image yang tipis.
virt-p2v untuk mengkonversi mesin fisik menjadi image yang berjalan pada KVM.
virt-v2v untuk mengkonversi image Xen dan VMware ke image KVM.
Memodifikasi file tunggal dalam image¶
Contoh ini menunjukkan bagaimana menggunakan :command: virt-edit untuk memodifikasi file. Perintah dapat mengambil nama file sebagai argumen dengan flag -a
, ataupun nama domain sebagai argumen dengan flag -d
. Contoh berikut menunjukkan bagaimana menggunakan ini untuk memodifikasi file /etc/shadow
dalam instance dengan nama domain libvirt instance-000000e1
yang saat ini sedang berjalan:
# virsh shutdown instance-000000e1
# virt-edit -d instance-000000e1 /etc/shadow
# virsh start instance-000000e1
Mengubah ukuran image¶
Berikut adalah contoh bagaimana menggunakan virt-resize untuk mengubah ukuran image. Anggaplah kita memiliki image Windows 16 GB dalam format qcow2 dimana kita ingin mengubah ukuran menjadi 50 GB.
Pertama, kita menggunakan virt-filesystems untuk mengidentifikasi partisi:
# 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 -
Dalam hal ini, itu adalah `` / dev / sda2`` partisi yang ingin kita resize. Kami menciptakan image qcow2 baru dan menggunakan perintah virt-resize untuk menulis salinan image asli yang telah berubah ukurannya menjadi image baru:
# 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.
Perangkat loop, kpartx, perangkat network block¶
Jika Anda tidak memiliki akses ke libguestfs, Anda dapat me-mount sistem file image langsung di host menggunakan perangkat loop, kpartx, dan perangkat blok jaringan (network block).
Peringatan
Mounting (pemasangan) image guest yang tidak dipercaya menggunakan alat yang dijelaskan dalam bagian ini memiliki resiko keamanan, gunakanlah selalu alat libguestfs seperti guestfish dan guestmount jika Anda memiliki akses kepada mereka. Lihat A reminder why you should never mount guest disk images on the host OS oleh Daniel Berrangé untuk lebih jelasnya.
Mount image baku (tanpa LVM)¶
Jika Anda memiliki image mesin virtual yang masih baku yang tidak menggunakan LVM untuk mengelola partisi nya, gunakan perintah losetup untuk menemukan perangkat loop yang tidak terpakai.
# losetup -f
/dev/loop0
Dalam contoh ini, /dev/loop0
bebas. Kaitkan perangkat loop dengan image baku:
# losetup /dev/loop0 fedora17.img
Jika image hanya memiliki satu partisi, Anda dapat me-mount perangkat loop secara langsung:
# mount /dev/loop0 /mnt
Jika image memiliki beberapa partisi, gunakan kpartx untuk mengekspos partisi sebagai perangkat terpisah (misalnya, /dev/mapper/loop0p1
), kemudian mount partisi yang sesuai dengan sistem file root:
# kpartx -av /dev/loop0
Jika image memiliki, katakanlah tiga partisi (/boot, /, swap), harus ada satu perangkat baru yang dibuat per partisi:
$ 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
Untuk me-mount partisi kedua, sebagai root:
# mkdir /mnt/image
# mount /dev/mapper/loop0p2 /mnt/image
Setelah Anda selesai, untuk membersihkannya:
# umount /mnt/image
# rmdir /mnt/image
# kpartx -d /dev/loop0
# losetup -d /dev/loop0
Mount image baku (dengan LVM)¶
Jika partisi Anda dikelola dengan LVM, penggunaan perintah losetup and kpartx seperti dalam contoh sebelumnya untuk mengekspos partisi ke host.
# losetup -f
/dev/loop0
# losetup /dev/loop0 rhel62.img
# kpartx -av /dev/loop0
Selanjutnya, Anda perlu menggunakan perintah vgscan untuk mengidentifikasi kelompok volume LVM dan kemudian perintah vgchange untuk mengekspos volume sebagai perangkat:
# 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
Bersihkan setelah Anda selesai:
# umount /mnt
# vgchange -an vg_rhel62x8664
# kpartx -d /dev/loop0
# losetup -d /dev/loop0
Mount image qcow2 (tanpa LVM)¶
Anda memerlukan modul kernel nbd
(network block device) yang dimuat untuk me-mount image qcow2. Image ini akan memuat modul kernel dengan dukungan perangkat 16 blok, yang baik-baik saja untuk tujuan kita. Sebagai root:
# modprobe nbd max_part=16
Dengan asumsi perangkat blok pertama (/dev/nbd0
) tidak sedang digunakan, kita dapat mengekspos partisi disk menggunakan perintah qemu-nbd dan partprobe. Sebagai root:
# qemu-nbd -c /dev/nbd0 image.qcow2
# partprobe /dev/nbd0
Jika image memiliki, katakanlah tiga partisi (/boot, /, swap), harus ada satu perangkat baru yang diciptakan untuk setiap partisi:
$ 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
Catatan
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.
Jika partisi image tidak dikelola dengan LVM, mereka dapat dipasang langsung:
# mkdir /mnt/image
# mount /dev/nbd0p2 /mnt/image
Ketika Anda selesai, bersihkan:
# umount /mnt/image
# rmdir /mnt/image
# qemu-nbd -d /dev/nbd0
Mount image qcow2 (dengan LVM)¶
Jika partisi image dikelola dengan LVM, setelah Anda menggunakan :command: qemu-nbd dan :command:` partprobe`, Anda harus menggunakan vgscan dan vgchange -ay dalam rangka untuk mengekspos partisi LVM sebagai perangkat yang dapat dipasang:
# 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
Ketika Anda selesai, bersihkan:
# umount /mnt
# vgchange -an vg_rhel62x8664
# qemu-nbd -d /dev/nbd0