libguestfs 以及 virt-v2v virt-p2v

使用步骤:
1. 

 

virt-inspector     --no-applications /dev/zd672

touch test.txt
virt-copy-in test.txt -a centos6364.qcow2 /root/
virt-copy-out -a centos6364.qcow2 /root/test.txt /hom

 

最近在做libguestfs的项目,这周summary一个实现原理:

libguestfs实现原理:

libguestfs主要有三个大的部分:guestfsd,guestfs-lib,guestfish。
其中,guestfsd是一个daemon,libguestfs是一个lib,guestfish是一个命令行的工具。

guestfsd是一个daemon,但是它不是运行在host上的daemon,它运行在guest上,
libguestfs首先用febootstrap和febootstrap-supermin-helper两个工具
将host中的kernel,用得到的一些modules,配置文件和一些工具的rpm package重新组合到一起,
接着在后台启动一个qemu进程读取这个由febootstrap工具链生成的image。在用qemu启动的
这个guest里运行guestfsd这个daemon。guestfsd通过socket和host进行通信,之间建立了
一个通信的协议,它可以通过socket接受来自host端guestfs-lib写到socket的数据。guestfsd
通过分析接受到的数据,进而执行相应的do_*操作,do_*操作实际上是对guest端普通命令的一些
封装,如果想实现一个NEW API,只要在guestfsd里用相应的do_*对普通命令进行封装即可,但是
一定要将这个普通命令程序通过febootstrap打包到qemu启动时读取的image中。

guestfs-lib是一个库,它实现了一些libguestfs的库函数——guestfs_*。这些库函数向socket
发送相应的数据,数据就会被guest端的guestfsd接收到,进而分析所要执行的操作。

guestfish是对guestfs-lib接口函数的一些应用,guestfish的命令都是通过调用guestfs-lib
的库函数来实现的。

因此在使用libguestfs的时候,可以使用guestfish这样的命令行工具,也可以直接在程序(包括C,java
以及libguestfs支持的一些script language)中调用guestfs-lib实现的库函数。

如下图所示:

+--------------------------------+---------------------------------------+
| Host | Qemu Guest |
| +---------+ +----------+ +---+----+ +---------+ +------------+ |
| | gustfish|->|gustfs-lib|->| socket |->|guestfsd |->| command | |
| +---------+ +-----^----+ +---+----+ +---------| +------------+ |
| | | |Example: | |Example: | |
+ +-----------+ | + |md-stop()|->|mdadm --stop| |
| | my prog |-----+ | +---------+ +------------+ |
+--+-----------+-----------------+---------------------------------------+

 

guestfish套件

guestfish主要包含以下工具:

guestfish interactive shell  挂载镜像,并提供一个交互的shell。

guestmount mount guest filesystem in hos 将镜像挂载到指定的目录。

guestumount unmount guest filesystem 卸载镜像目录。

virt-alignment-scan 镜像块对齐扫描。

virt-builder — quick p_w_picpath builder 快速镜像创建。

virt-cat(1) — display a file 显示镜像中文件内容。

virt-copy-in(1) — copy files and directories into a VM 拷贝文件到镜像内部。

virt-copy-out(1) — copy files and directories out of a VM 拷贝镜像文件出来。

virt-customize(1) — customize virtual machines 定制虚拟机镜像

virt-df(1) — free space 查看虚拟机镜像空间使用情况。

virt-diff(1) — differences 不启动虚拟机的情况下,比较虚拟机内部两份文件差别。

virt-edit(1) — edit a file 编辑虚拟机内部文件。

virt-filesystems(1) — display information about filesystems, devices, LVM 显示镜像文件系统信息。

virt-format(1) — erase and make blank disks 格式化镜像内部磁盘。

virt-inspector(1) — inspect VM p_w_picpaths 镜像信息测试。

virt-list-filesystems(1) — list filesystems 列出镜像文件系统。

virt-list-partitions(1) — list partitions 列出镜像分区信息。

virt-log(1) — display log files 显示镜像日志。

virt-ls(1) — list files 列出镜像文件。

virt-make-fs(1) — make a filesystem 镜像中创建文件系统。

virt-p2v(1) — convert physical machine to run on KVM 物理机转虚拟机。

virt-p2v-make-disk(1) — make P2V ISO 创建物理机转虚拟机ISO光盘。

virt-p2v-make-kickstart(1) — make P2V kickstart 创建物理机转虚拟机kickstart文件。

virt-rescue(1) — rescue shell 进去虚拟机救援模式。

virt-resize(1) — resize virtual machines 虚拟机分区大小修改。

virt-sparsify(1) — make virtual machines sparse (thin-provisioned) 镜像稀疏空洞消除。

virt-sysprep(1) — unconfigure a virtual machine before cloning 镜像初始化。

virt-tar(1) — archive and upload files 文件打包并传入传出镜像。

virt-tar-in(1) — archive and upload files 文件打包并传入镜像。

virt-tar-out(1) — archive and download files 文件打包并传出镜像。

virt-v2v(1) — convert guest to run on KVM 其他格式虚拟机镜像转KVM镜像。

virt-win-reg(1) — export and merge Windows Registry keys windows注册表导入镜像。

libguestfs-test-tool(1) — test libguestfs 测试libguestfs

libguestfs-make-fixed-appliance(1) — make libguestfs fixed appliance

hivex(3) — extract Windows Registry hive 解压windows注册表文件。

hivexregedit(1) — merge and export Registry changes from regedit-format files 合并、并导出注册表文件内容。

hivexsh(1) — Windows Registry hive shell window注册表修改交互的shell。

hivexml(1) — convert Windows Registry hive to XML 将window注册表转化为xml

hivexget(1) — extract data from Windows Registry hive 得到注册表键值。

guestfsd(8) — guestfs daemon guestfs服务。
-----------------------------------

 

qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:

  1. 更小的空间占用,即使文件系统不支持空洞(holes);
  2. 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
  3. 支持快照(snapshot),镜像文件能够包含多个快照的历史;
  4. 可选择基于 zlib 的压缩方式
  5. 可以选择 AES 加密

但是这个镜像文件并不能简单的通过解压来查看和编辑,这时候就需要使用本文的方法进行挂载后再做读写,特别适合微调修改KVM镜像的使用场景。

 

然后使用guestmount命令进行挂载,如果事先不知道虚机内部分区的路径信息,则可以使用参数-i来让guestmount自己决定使用哪一个挂接点。
例如这里我们要修改一个CentOS的镜像,增加Rstudio开机脚本,所以直接挂载上去:

  1. guestmount -a /Hel1-S101/kvm/template/Rstudio_3.6.3_CentOS7/Rstudio_3.6.3_CentOS7.qcow2 -i --rw /tmp_mount

然后使用guestmount命令进行挂载,如果事先不知道虚机内部分区的路径信息,则可以使用参数-i来让guestmount自己决定使用哪一个挂接点。
例如这里我们要修改一个CentOS的镜像,增加Rstudio开机脚本,所以直接挂载上去:

  1. guestmount -a /Hel1-S101/kvm/template/Rstudio_3.6.3_CentOS7/Rstudio_3.6.3_CentOS7.qcow2 -i --rw /tmp_mount

检查是否挂载成功:

  1. root@HPC-HEL1-S101 / # guestmount -a /Hel1-S101/kvm/template/Rstudio_3.6.3_CentOS7/Rstudio_3.6.3_CentOS7.qcow2 -i --rw /tmp_mount
  2. root@HPC-HEL1-S101 / # cd /tmp_mount
  3. root@HPC-HEL1-S101 /tmp_mount # ls
  4. bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

取消挂载

  1. umount /tmp_mount

 

 virt-v2v

 增加 调试信息:

LIBGUESTFS_TRACE=1 LIBGUESTFS_DEBUG=1 

LIBGUESTFS_TRACE=1 LIBGUESTFS_DEBUG=1 virt-v2v -i libvirtxml -os pool --bridge bridge_name guest_name.xml ... 2>&1 | tee virt-v2v.log



example:

1:从VMware vcenter server 到本地libvirt。

首先需要有一个VMware vcenter server 然后设置好Datacenter。

 

virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest

转换后是在本地/var/lib/libvirt/images

 

2:从VMware vcenter server 到RHV/ovirt.

首先确保Vmware 和 RHV 平台配置运行正常。(关于RHV的有其他章节介绍)

 

 virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest \
   -o rhv -os rhv.nfs:/export_domain --network rhvm

3:从本地到OpenStack glance。

 

(现在仅仅支持从kvm本地到openstack)

 

virt-v2v -i disk disk.img -o glance

4:从本地到本地。(比较简单,实现方式也比较多,注意改名字)

 

 

virt-v2v -i disk disk.img -o local -os /var/tmp
virt-v2v -i libvirtxml guest-domain.xml -o local -os /var/tmp
virt-v2v -i disk disk.img -o qemu -os /var/tmp --qemu-boot

 

 

 

参考:

https://www.cnblogs.com/linuxkernel/archive/2011/11/28/2266817.html

https://www.cnblogs.com/potato-chip/p/9031838.html

https://blog.51cto.com/xiaoli110/1568307

https://www.liujason.com/article/796.html

 

virt-v2v

https://access.redhat.com/articles/1351473

 https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/v2v_guide/chap-v2v_guide-debugging_and_troubleshooting#sect-v2v_general

https://www.cnblogs.com/weikunzz/p/6710537.html

posted @   redrobot  阅读(994)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示