標籤:devicemapper docker
//建立thin pool//調用路徑:NewDeviceSet->initDevmapper->createPool1.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的大小,通過ioctlsize, 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 = 0if 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=dmTaskCreateFct1.4 func dmTaskCreateFct(taskType int) *CDmTask {return (*CDmTask)(C.dm_task_create(C.int(taskType)))}