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 格式的镜像相比,有以下特性:
- 更小的空间占用,即使文件系统不支持空洞(holes);
- 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
- 支持快照(snapshot),镜像文件能够包含多个快照的历史;
- 可选择基于 zlib 的压缩方式
- 可以选择 AES 加密
但是这个镜像文件并不能简单的通过解压来查看和编辑,这时候就需要使用本文的方法进行挂载后再做读写,特别适合微调修改KVM镜像的使用场景。
然后使用guestmount命令进行挂载,如果事先不知道虚机内部分区的路径信息,则可以使用参数-i来让guestmount自己决定使用哪一个挂接点。
例如这里我们要修改一个CentOS的镜像,增加Rstudio开机脚本,所以直接挂载上去:
- 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开机脚本,所以直接挂载上去:
- guestmount -a /Hel1-S101/kvm/template/Rstudio_3.6.3_CentOS7/Rstudio_3.6.3_CentOS7.qcow2 -i --rw /tmp_mount
检查是否挂载成功:
- 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
- root@HPC-HEL1-S101 / # cd /tmp_mount
- root@HPC-HEL1-S101 /tmp_mount # ls
- bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
取消挂载
- 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix