libguestfs实现原理

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  |-----+           |       +---------+  +------------+     |
+--+-----------+-----------------+---------------------------------------+

你可能感兴趣的:(java,image,api,socket,command,工具)