devicemapper: Compare uuid of base device on startup
| ... | ... |
@@ -105,7 +105,8 @@ type DeviceSet struct {
|
| 105 | 105 |
thinPoolDevice string |
| 106 | 106 |
Transaction `json:"-"` |
| 107 | 107 |
overrideUdevSyncCheck bool |
| 108 |
- deferredRemove bool // use deferred removal |
|
| 108 |
+ deferredRemove bool // use deferred removal |
|
| 109 |
+ BaseDeviceUUID string //save UUID of base device |
|
| 109 | 110 |
} |
| 110 | 111 |
|
| 111 | 112 |
type DiskUsage struct {
|
| ... | ... |
@@ -676,9 +677,70 @@ func (devices *DeviceSet) loadMetadata(hash string) *DevInfo {
|
| 676 | 676 |
return info |
| 677 | 677 |
} |
| 678 | 678 |
|
| 679 |
+func getDeviceUUID(device string) (string, error) {
|
|
| 680 |
+ out, err := exec.Command("blkid", "-s", "UUID", "-o", "value", device).Output()
|
|
| 681 |
+ if err != nil {
|
|
| 682 |
+ logrus.Debugf("Failed to find uuid for device %s:%v", device, err)
|
|
| 683 |
+ return "", err |
|
| 684 |
+ } |
|
| 685 |
+ |
|
| 686 |
+ uuid := strings.TrimSuffix(string(out), "\n") |
|
| 687 |
+ uuid = strings.TrimSpace(uuid) |
|
| 688 |
+ logrus.Debugf("UUID for device: %s is:%s", device, uuid)
|
|
| 689 |
+ return uuid, nil |
|
| 690 |
+} |
|
| 691 |
+ |
|
| 692 |
+func (devices *DeviceSet) verifyBaseDeviceUUID(baseInfo *DevInfo) error {
|
|
| 693 |
+ if err := devices.activateDeviceIfNeeded(baseInfo); err != nil {
|
|
| 694 |
+ return err |
|
| 695 |
+ } |
|
| 696 |
+ |
|
| 697 |
+ defer devices.deactivateDevice(baseInfo) |
|
| 698 |
+ |
|
| 699 |
+ uuid, err := getDeviceUUID(baseInfo.DevName()) |
|
| 700 |
+ if err != nil {
|
|
| 701 |
+ return err |
|
| 702 |
+ } |
|
| 703 |
+ |
|
| 704 |
+ if devices.BaseDeviceUUID != uuid {
|
|
| 705 |
+ return fmt.Errorf("Current Base Device UUID:%s does not match with stored UUID:%s", uuid, devices.BaseDeviceUUID)
|
|
| 706 |
+ } |
|
| 707 |
+ |
|
| 708 |
+ return nil |
|
| 709 |
+} |
|
| 710 |
+ |
|
| 711 |
+func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *DevInfo) error {
|
|
| 712 |
+ if err := devices.activateDeviceIfNeeded(baseInfo); err != nil {
|
|
| 713 |
+ return err |
|
| 714 |
+ } |
|
| 715 |
+ |
|
| 716 |
+ defer devices.deactivateDevice(baseInfo) |
|
| 717 |
+ |
|
| 718 |
+ uuid, err := getDeviceUUID(baseInfo.DevName()) |
|
| 719 |
+ if err != nil {
|
|
| 720 |
+ return err |
|
| 721 |
+ } |
|
| 722 |
+ |
|
| 723 |
+ devices.BaseDeviceUUID = uuid |
|
| 724 |
+ devices.saveDeviceSetMetaData() |
|
| 725 |
+ return nil |
|
| 726 |
+} |
|
| 727 |
+ |
|
| 679 | 728 |
func (devices *DeviceSet) setupBaseImage() error {
|
| 680 | 729 |
oldInfo, _ := devices.lookupDevice("")
|
| 681 | 730 |
if oldInfo != nil && oldInfo.Initialized {
|
| 731 |
+ // If BaseDeviceUUID is nil (upgrade case), save it and |
|
| 732 |
+ // return success. |
|
| 733 |
+ if devices.BaseDeviceUUID == "" {
|
|
| 734 |
+ if err := devices.saveBaseDeviceUUID(oldInfo); err != nil {
|
|
| 735 |
+ return fmt.Errorf("Could not query and save base device UUID:%v", err)
|
|
| 736 |
+ } |
|
| 737 |
+ return nil |
|
| 738 |
+ } |
|
| 739 |
+ |
|
| 740 |
+ if err := devices.verifyBaseDeviceUUID(oldInfo); err != nil {
|
|
| 741 |
+ return fmt.Errorf("Base Device UUID verification failed. Possibly using a different thin pool then last invocation:%v", err)
|
|
| 742 |
+ } |
|
| 682 | 743 |
return nil |
| 683 | 744 |
} |
| 684 | 745 |
|
| ... | ... |
@@ -728,6 +790,10 @@ func (devices *DeviceSet) setupBaseImage() error {
|
| 728 | 728 |
return err |
| 729 | 729 |
} |
| 730 | 730 |
|
| 731 |
+ if err := devices.saveBaseDeviceUUID(info); err != nil {
|
|
| 732 |
+ return fmt.Errorf("Could not query and save base device UUID:%v", err)
|
|
| 733 |
+ } |
|
| 734 |
+ |
|
| 731 | 735 |
return nil |
| 732 | 736 |
} |
| 733 | 737 |
|