graph driver-device mapper-04libdevmapper基本操作

//	创建thin pool
//	调用路径:NewDeviceSet->initDevmapper->createPool
1.1 func createPool(poolName string, dataFile, metadataFile *os.File, poolBlockSize uint32) error {
	//通过task封装与libdevmapper的交互
	task, err := createTask(DeviceCreate, poolName)
	if task == nil {
		return err
	}
	//data block device的大小,通过ioctl
	size, err := GetBlockDeviceSize(dataFile)
	if err != nil {
		return fmt.Errorf("Can't get data size %s", err)
	}
	//创建thin pool的参数
	params := fmt.Sprintf("%s %s %d 32768 1 skip_block_zeroing", metadataFile.Name(), dataFile.Name(), poolBlockSize)
	//添加函数参数
	if err := task.AddTarget(0, size/512, "thin-pool", params); err != nil {
		return fmt.Errorf("Can't add target %s", err)
	}
	//创建一个同步量
	var cookie uint = 0
	if err := task.SetCookie(&cookie, 0); err != nil {
		return fmt.Errorf("Can't set cookie %s", err)
	}
	//执行任务
	if err := task.Run(); err != nil {
		return fmt.Errorf("Error running DeviceCreate (createPool) %s", err)
	}
	//等待thin pool创建完成
	UdevWait(cookie)

	return nil
}

//	创建操作,task封装对devicemapper的操作
1.2 func createTask(t TaskType, name string) (*Task, error) {
	//创建tasktype对应的封装函数
	task := TaskCreate(t)
	if task == nil {
		return nil, fmt.Errorf("Can't create task of type %d", int(t))
	}
	if err := task.SetName(name); err != nil {
		return nil, fmt.Errorf("Can't set task name %s", name)
	}
	return task, nil
}

//	创建一个指定的操作类型
1.3 func TaskCreate(tasktype TaskType) *Task {
	//创建操作
	Ctask := DmTaskCreate(int(tasktype))
	if Ctask == nil {
		return nil
	}
	task := &Task{unmanaged: Ctask}
	runtime.SetFinalizer(task, (*Task).destroy)
	return task
}

//	创建指定的操作
//	DmTaskCreate=dmTaskCreateFct
1.4 func dmTaskCreateFct(taskType int) *CDmTask {
	return (*CDmTask)(C.dm_task_create(C.int(taskType)))
}
时间: 2024-09-16 17:25:05

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

Linux系统中的Device Mapper学习

在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. 其实dm是Device Mapper的缩写,Device Mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volum

graph driver-device mapper-01driver初始化

// thin device数据结构 type DevInfo struct { Hash string `json:"-"` DeviceId int `json:"device_id"` Size uint64 `json:"size"` TransactionId uint64 `json:"transaction_id"` Initialized bool `json:"initialized"`

Docker 从入门到精通(一)基本操作

 一,为什么要用 Docker? Docker 是一个能够把开发应用程序自动部署到容器的开源引擎.它由Docker公司的团队编写,基于Apache 2.0开源协议授权.它提供了一个简单.轻量的建模方式,使开发生命周期更高效快速,鼓励了面向服务的架构设计.Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案. Docker 的基础是 Linux 容器(LXC)等技术.在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便.用户操作 Docke

dmsetup remove dm device solve : zpool error:one or more vdevs refer to the same device

这是一个OCZ的SSD, 一般用一半以内的容量是性能比较好, 所以480G的SSD, 我分了220G给ZFS缓存. 但是注意对其的问题. # fdisk -c -u /dev/sda 开始位置2048 新增块数2048*1024*220-1=461373439 因为原来配置的块未对其, 所以准备重新分一下 :  查看cache设备 : # zpool status pool: zp1 state: ONLINE scan: none requested config: NAME STATE RE

多路径(multipath) 介绍

一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来连接,这样的话,就构成了多对多的关系.也就是说,主机到存储可以有多条路径可以选择.主机到存储之间的IO由多条路径可以选择.每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O流量如何分配?其中一条路径坏掉了,如何处理?还有在操作系统的角度来看,每条路径,操作系统会认为是一个实际存

Docker 存储驱动详细介绍_java

Docker 存储驱动详细介绍 最近做项目,期间对Docker 存储驱动不会,于是在网上找资料,并解决了,这里就记录下. 目的 理解docker的存储方式 docker的image和container在host上的目录结构 docker image和container的内容与配置不同存储 Docker是一个开源的应用容器引擎,主要利用Linux内核namespace实现沙盒隔离,用Cgroup实现资源限制.Docker用于统一开发和部署的轻量级 Linux 容器,试图解决"依赖地狱"问

Redhat5.4 Linux多路径dm-multipath之multi-path详解

一.什么是多路径    普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来连接,这样的话,就构成了多对多的关系.也就是说,主机到存储可以有多条路径可以选择.主机到存储之间的IO由多条路径可以选择.每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O流量如何分配?其中一条路径坏掉了,如何处理?还有在操作系统的角度来看,每条路径,操作系统会认为是一个

mkfs -t ext3 错误/dev/sdxx is apparently in use by the system; 解决方法

在存储上共享了一个500G的空间,映射到Linux系统提供上,环境由2个节点组成.  一. 测试一: 直接mount 用fdisk 格式化之后如下: [root@rac1 u01]# fdisk -l -- Disk /dev/sdk: 536.8 GB, 536870912000 bytes 255 heads, 63 sectors/track, 65270cylinders Units = cylinders of 16065 * 512 = 8225280bytes     Devi

Linux 2.6.19.x 内核编译配置选项简介

Linux 2.6.19.x 内核编译配置选项简介 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件.您可以自由链接.下载.传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明. 其他作品 本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表: 金步

Docker 空间使用分析与清理

用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响. 本文先对 Docker 的空间分析与清理进行说明,然后对容器的磁盘容量限制与使用建议做简要说明. 典型问题场景 用户发现 Docker 宿主机的磁盘空间使用率非常高.通过 du 逐层分析,发现是 Volume 或 overlay2 等目录占用了过高空间.示例如下: # 根据使用的存储驱动的不同,相应目录会有所不同: [root@node3 docker]