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
  1. 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
    
  2. Kita perlu untuk me-mount volume logis yang berisi partisi root:

    ><fs> mount /dev/vg_centosbase/lv_root /
    
  3. 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
    
  4. Kami ingin mengedit file ifcfg-eth0 untuk menghapus baris HWADDR. Perintah edit akan menyalin file ke host, memanggil editor, dan kemudian menyalin file kembali.

    ><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
    
  5. 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
    
  6. Kami tambahkan baris berikut ke file dan menyimpannya:

    modprobe 8021q
    
  7. Kemudian kita atur ke executable:

    ><fs> chmod 0755 /etc/sysconfig/modules/8021q.modules
    
  8. 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.

  1. 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
    
  2. 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
    
  3. Setelah di-mount, kita bisa melakukan berbagai hal seperti mendaftar paket yang diinstal dengan menggunakan rpm:

    # rpm -qa --dbpath /mnt/var/lib/rpm
    
  4. 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.

  1. 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   -
    
  2. 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