libguestfs的使用

欢迎访问个人小站阅读此文  http://www.yandong.org/archives/416

libguestfs 是一组 Linux 下的 C 语言的 API ,用来访问虚拟机的磁盘映像文件。支持的文件系统包括: all known types of Linux filesystem (ext2/3/4, XFS, btrfs, etc.), any Windows filesystem (VFAT and NTFS), any Mac OS X and BSD filesystems, LVM2 volumes, MBR and GPT disk partitions, raw disks, qcow2, CD and DVD ISO images, SD cards, and dozens more. libguestfs 不需要root权限。


官网:
安装
apt-get install libguetfs-tools libguestfs-dev
安装函数库和一些工具
其他工具介绍
guestmount(1)—-交互工具,相当于mount
virt-win-reg(1)hivexregedit(1)——注册表处理工具

使用实例
1.使用函数库处理一个img文件的大致流程什么?
#include <stdio.h>
#include <guestfs.h>
 int main()
 {
guestfs_h *g = guestfs_create ();
guestfs_add_drive (g, “win-B.img”);
guestfs_launch (g);
guestfs_mount (g, “/dev/sda1″, “/”);
getchar();getchar();
guestfs_touch (g, “/hello”);
guestfs_umount (g, “/”);
//guestfs_shutdown (g);
guestfs_close (g);
return 1;
 }
2. guestmount比mount的优势在哪里?
guestmount是在libguestfs基础之上的交互式工具,可以处理更多类型的镜像,如qcow2等。
但是guestmount的速度要比mount慢很多很多。下面做个比较,挂载一个3G的镜像
——mount的挂载和卸载——
# time mount -o loop,offset=32256 win-B.img /mnt/win/
real0m0.040s
user0m0.008s
sys0m0.000s
# time umount /mnt/win/
real0m0.042s
user0m0.000s
sys0m0.004s
——guestmount的挂载和卸载——
# time guestmount -a win-B.img -i –rw /mnt/win/
real0m23.548s
user0m0.080s
sys0m0.112s
# time fusermount -u /mnt/win/
real0m0.027s
user0m0.000s
sys0m0.000s

3.如何使用guestmount挂载镜像文件?

guestmount -a win-B.img -i –rw /mnt/win/

4.如何使用guestmount卸载镜像文件?

fusermount -u /mnt/win/

5.如何挂载指定分区?
mount需要自己计算偏移量来挂载,而guestmount比较省心,可以直接制定
对于函数库 guestfs_mount (g, “/dev/sda1″, “/”);      /*其指定了/dev/sda1,当然也可以换成其他的*/
对于guestmount   guestmount -a win-B.img   -m /dev/sda1  –rw /mnt/win/
6.如何使用libguestfs上传文件夹?
</ div >
< div >
 
/**
  *功能 : 判断是否为目录
  *参数 :
  * */
int IS_DIR( const char * path)
{
  struct stat st;
  lstat(path, &st);
  return S_ISDIR(st.st_mode);
}
 
/**
  *功能 : 遍历文件夹的递归核心
  *参数 :
  * */
void guestfs_upload_dir_core(guestfs_h *g, char *remoteDir, const char *path, int preOffset, int recursive)
{
  DIR *pdir;
  struct dirent *pdirent;
  char temp[256];
  char remotePath[256];
  pdir = opendir(path);
  if (pdir)
  {
  while ( (pdirent = readdir(pdir)))
  {
  //跳过"."和".."
  if ( strcmp (pdirent->d_name, "." ) == 0
  || strcmp (pdirent->d_name, ".." ) == 0)
  continue ;
 
sprintf (temp, "%s/%s" , path, pdirent->d_name);
 
//printf("%s\n", temp);
  sprintf (remotePath, "%s%s" ,remoteDir, temp+preOffset);
  //当temp为目录并且recursive为1的时候递归处理子目录
  if (IS_DIR(temp) && recursive)
  {
  printf ( "mkdir %s\n temp=%s\n" , remotePath, temp);
  guestfs_mkdir (g, remotePath);
  guestfs_upload_dir_core(g,remoteDir,temp, preOffset,recursive);
  } else if ( recursive )
  {
  printf ( "[2]%s--->%s\n" , temp,remotePath);
  guestfs_upload(g, temp, remotePath);
  }
  }
  }
  else
  {
  printf ( "opendir error:%s\n" , path);
  }
  closedir(pdir);
 
}
 
/**
  *功能 : 使用guestfs函数上传文件夹
  *参数 : remoteDir为远段目录,格式为"/WINDOWS",注意斜杠的使用,必须以斜杠开头,结尾不能有斜杠
  * path为本地目录,格式为"./split" ,可以使用绝对路径,也可以使用相对路径,结尾不能有斜杠
  * preOffset为path的本地前缀长度,如"./split"的preOffset的值为1,从0计数为最后一个'/'的位置。
  * preOffset是方便字符串链接的 即将"./split"中的"split"和remoteDir链接,产生远端的文件路径。
  * recursive设置递归遍历文件夹
  * TODO :可以对文件路径中多余的'/'进行处理,这样就不用纠结结尾不能有斜杠了
  * */
void guestfs_upload_dir(guestfs_h *g, char *remoteDir, const char *path, int preOffset, int recursive)
{
  int len;
  char temp[256];
  char remotePath[256];
 
//去掉末尾的'/'
  len = strlen (path);
  strcpy (temp, path);
  if (temp[len - 1] == '/' ) temp[len -1] = '\0' ;
  sprintf (remotePath, "%s%s" ,remoteDir, temp+preOffset);
 
  if (IS_DIR(temp)) /*处理目录*/
  {
  printf ( "mkdir %s\n temp=%s\n" , remotePath, temp);
  guestfs_mkdir (g, remotePath);
  guestfs_upload_dir_core(g,remoteDir,temp, preOffset,recursive);
  }
  else /*输出文件*/
  {
  printf ( "[1]%s--->%s\n" , path,remotePath);
  guestfs_upload(g, temp, remotePath);
  }
}

其中preOffset的计算大致如下:

</pre>
char temp[]= " ..." ;
 
preOffset= strlen (tmp)-1;
  while (tmp[preOffset]!= '/' && tmp[preOffset]!= '\\' )
  {
  preOffset--;
  }
<pre>

转载于:https://my.oschina.net/toyandong/blog/74130

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值