graph driver-device mapper-03thin pool基本操作

本文详细介绍了Docker中使用devicemapper驱动时,thin pool中thin device的创建、删除、挂载和解挂载等基本操作。包括如何在thin pool中创建新的thin device,创建镜像文件的快照,注册和删除设备信息,以及如何挂载和解挂载设备。主要涉及Golang实现的内部函数,如`AddDevice`、`DeleteDevice`、`MountDevice`和`UnmountDevice`。
摘要由CSDN通过智能技术生成
//	在thin pool中创建一个新thin device
//	调用路径:driver.Create()
1.1 func (devices *DeviceSet) AddDevice(hash, baseHash string) error {
	//查找父device
	baseInfo, err := devices.lookupDevice(baseHash)
	if err != nil {
		return err
	}

	baseInfo.lock.Lock()
	defer baseInfo.lock.Unlock()

	devices.Lock()
	defer devices.Unlock()

	//检查imageid/containerid对应的image是否存在
	if info, _ := devices.lookupDevice(hash); info != nil {
		return fmt.Errorf("device %s already exists", hash)
	}

	deviceId := devices.nextDeviceId

	//创建父设备的镜像
	if err := createSnapDevice(devices.getPoolDevName(), &deviceId, baseInfo.Name(), baseInfo.DeviceId); err != nil {
		utils.Debugf("Error creating snap device: %s\n", err)
		return err
	}
	//创建thin device的DevInfo,并保存信息到/var/lib/docker/devicemapper/metadata/$id文件中
	if _, err := devices.registerDevice(deviceId, hash, baseInfo.Size); err != nil {
		deleteDevice(devices.getPoolDevName(), deviceId)
		utils.Debugf("Error registering device: %s\n", err)
		return err
	}
	return nil
}

//	创建镜像文件的快照
//		libdevmapper通过发送msg发送命令
//	调用路径:AddDevice->createSnapDevice
1.2 func createSnapDevice(poolName string, deviceId *int, baseName string, baseDeviceId int) error {
	devinfo, _ := getInfo(baseName)
	doSuspend := devinfo != nil && devinfo.Exists != 0

	//设备存在,则在快照前要先挂起父设备
	if doSuspend {
		if err := suspendDevice(baseName); err != nil {
			return err
		}
	}

	for {
		//创建task,libdevmapper通过msg传递命令
		task, err := createTask(DeviceTargetMsg, poolName)
		if task == nil {
			//创建task失败
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值