1. // 创建thin pool
  2. // 调用路径:NewDeviceSet->initDevmapper->createPool
  3. 1.1 func createPool(poolName string, dataFile, metadataFile *os.File, poolBlockSize uint32) error {
  4. //通过task封装与libdevmapper的交互
  5. task, err := createTask(DeviceCreate, poolName)
  6. if task == nil {
  7. return err
  8. }
  9. //data block device的大小。通过ioctl
  10. size, err := GetBlockDeviceSize(dataFile)
  11. if err != nil {
  12. return fmt.Errorf("Can't get data size %s", err)
  13. }
  14. //创建thin pool的參数
  15. params := fmt.Sprintf("%s %s %d 32768 1 skip_block_zeroing", metadataFile.Name(), dataFile.Name(), poolBlockSize)
  16. //加入函数參数
  17. if err := task.AddTarget(0, size/512, "thin-pool", params); err != nil {
  18. return fmt.Errorf("Can't add target %s", err)
  19. }
  20. //创建一个同步量
  21. var cookie uint = 0
  22. if err := task.SetCookie(&cookie, 0); err != nil {
  23. return fmt.Errorf("Can't set cookie %s", err)
  24. }
  25. //运行任务
  26. if err := task.Run(); err != nil {
  27. return fmt.Errorf("Error running DeviceCreate (createPool) %s", err)
  28. }
  29. //等待thin pool创建完毕
  30. UdevWait(cookie)
  31.  
  32. return nil
  33. }
  34.  
  35. // 创建操作,task封装对devicemapper的操作
  36. 1.2 func createTask(t TaskType, name string) (*Task, error) {
  37. //创建tasktype相应的封装函数
  38. task := TaskCreate(t)
  39. if task == nil {
  40. return nil, fmt.Errorf("Can't create task of type %d", int(t))
  41. }
  42. if err := task.SetName(name); err != nil {
  43. return nil, fmt.Errorf("Can't set task name %s", name)
  44. }
  45. return task, nil
  46. }
  47.  
  48. // 创建一个指定的操作类型
  49. 1.3 func TaskCreate(tasktype TaskType) *Task {
  50. //创建操作
  51. Ctask := DmTaskCreate(int(tasktype))
  52. if Ctask == nil {
  53. return nil
  54. }
  55. task := &Task{unmanaged: Ctask}
  56. runtime.SetFinalizer(task, (*Task).destroy)
  57. return task
  58. }
  59.  
  60. // 创建指定的操作
  61. // DmTaskCreate=dmTaskCreateFct
  62. 1.4 func dmTaskCreateFct(taskType int) *CDmTask {
  63. return (*CDmTask)(C.dm_task_create(C.int(taskType)))
  64. }

graph driver-device mapper-04libdevmapper基本操作的更多相关文章

  1. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  2. [转] Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  3. Linux kernel device mapper

    Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,如图 1. 图1 Device Mappe ...

  4. Docker存储驱动之Device Mapper简介

    Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别, ...

  5. Docker Device Mapper 使用 direct-lvm

      一.Device Mapper: loop-lvm 默认 CentOS7 下 Docker 使用的 Device Mapper 设备默认使用 loopback 设备,后端为自动生成的稀疏文件,如下 ...

  6. flashcache中应用device mapper机制

    Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备. DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射” ...

  7. Device Mapper 代码分析

    Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备. DM以块设备的形式注册到Linux内核中,凡是挂载(或者说&quo ...

  8. Linux系统中的Device Mapper学习

    在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. ...

  9. 使用 Device Mapper来改变Docker容器的大小

    作者:Jérôme Petazzoni ( Docker 布道师) 译者:Mark Shao ( EMC 中国高级工程师) 如果在 CentOS . REHL . Fedor 或者其他默认没有 AUF ...

  10. Device Mapper Multipath(DM-Multipath)

    Device Mapper Multipath(DM-Multipath)能够将server节点和存储阵列之间的多条I/O链路配置为一个单独的设备.这些I/O链路是由不同的线缆.交换机.控制器组成的S ...

随机推荐

  1. 工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)

    序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中 ...

  2. 55. 略谈Lotus Notes的与众不同及系列文章至此的总结

    在二十多年的悠久历史里,Lotus Notes发展出一整套独特的概念.技术和思维.由于它早期惊人的领先时代和后续发展中同样惊人的忠于传统,这位软件领域的寿星在如今发展更新速度远超往日和技术愈趋公开互通 ...

  3. Ubuntu安装Adobe Reader

               到 这里依次选择最新版本的Adobe Reader,我选择目前最新的 9.5.5版本的,下载下来后,双击选择dep包,启动软件中心进行安装,中间会提示软件包欠佳,选择" ...

  4. docker 数据盘映射方案

    docker run -itd -v /data/:/data1 centos bash // -v 用来指定挂载目录, :前面的/data为本地目录,:后面的/data1 为容器里的目录: dock ...

  5. [上海] 携程 门票事业部 招聘.NET 架构师 2 名 - V2EX

    [上海] 携程 门票事业部 招聘.NET 架构师 2 名 - V2EX [上海] 携程 门票事业部 招聘.NET 架构师 2 名

  6. nodejs笔记2——请求路由

    对于不同的URL请求,服务器应该有不同的反应.我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码.我们需要的所有数据都会包含在request对象中, ...

  7. iOS开发关于AppStore程序的上传流程

    主要内容: 1.创建唯一标示符App ID(前提是你的程序在真机上测试没有任何问题) 2.申请发布证书 3.申请发布描述文件 4.iTunes Connect创建App并填写信息 5.选择证书编译打包 ...

  8. php四舍五入函数(floor、ceil、round与intval)

    原文链接:php四舍五入函数(floor.ceil.round与intval) PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法 ...

  9. CodeForces 294B Shaass and Bookshelf 【规律 & 模拟】或【Dp】

    这道题目的意思就是排两排书,下面这排只能竖着放,上面这排可以平着放,使得宽度最小 根据题意可以得出一个结论,放上这排书的Width 肯定会遵照从小到大的顺序放上去的 Because the total ...

  10. 转:js包装DOM对象

    我们在日常的应用中,使用Javascript大多数时间都是在用DOM ,以致于很多人都有一种看法就是DOM==JS,虽然这种看法是错误的,但是也可以说明DOM的重要性. 这就导致了我们在写JS的时候, ...