libguestfs实现原理summary
最近在做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 |-----+ | +---------+ +------------+ |
+--+-----------+-----------------+---------------------------------------+