// 在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失败
graph driver-device mapper-03thin pool基本操作
最新推荐文章于 2022-04-30 08:54:36 发布
本文详细介绍了Docker中使用devicemapper驱动时,thin pool中thin device的创建、删除、挂载和解挂载等基本操作。包括如何在thin pool中创建新的thin device,创建镜像文件的快照,注册和删除设备信息,以及如何挂载和解挂载设备。主要涉及Golang实现的内部函数,如`AddDevice`、`DeleteDevice`、`MountDevice`和`UnmountDevice`。
摘要由CSDN通过智能技术生成