mirror of https://github.com/k3s-io/k3s
Use `blkid` to get fs type of device.
`lsblk` reads fs type info from udev files. If udev rules are not installed. `lsblk` could not get correct fs type. This will cause problems, e.g. expanding volume depends on fs type of disk.pull/6/head
parent
c817765b0e
commit
75359c0b94
|
@ -536,11 +536,11 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string,
|
||||||
return mountErr
|
return mountErr
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDiskFormat uses 'lsblk' to see if the given disk is unformated
|
// GetDiskFormat uses 'blkid' to see if the given disk is unformated
|
||||||
func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) {
|
func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) {
|
||||||
args := []string{"-n", "-o", "FSTYPE", disk}
|
args := []string{"-p", "-s", "TYPE", "-o", "value", disk}
|
||||||
glog.V(4).Infof("Attempting to determine if disk %q is formatted using lsblk with args: (%v)", disk, args)
|
glog.V(4).Infof("Attempting to determine if disk %q is formatted using blkid with args: (%v)", disk, args)
|
||||||
dataOut, err := mounter.Exec.Run("lsblk", args...)
|
dataOut, err := mounter.Exec.Run("blkid", args...)
|
||||||
output := string(dataOut)
|
output := string(dataOut)
|
||||||
glog.V(4).Infof("Output: %q", output)
|
glog.V(4).Infof("Output: %q", output)
|
||||||
|
|
||||||
|
@ -549,23 +549,12 @@ func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split lsblk output into lines. Unformatted devices should contain only
|
if len(output) <= 0 {
|
||||||
// "\n". Beware of "\n\n", that's a device with one empty partition.
|
// no fs type
|
||||||
output = strings.TrimSuffix(output, "\n") // Avoid last empty line
|
|
||||||
lines := strings.Split(output, "\n")
|
|
||||||
if lines[0] != "" {
|
|
||||||
// The device is formatted
|
|
||||||
return lines[0], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(lines) == 1 {
|
|
||||||
// The device is unformatted and has no dependent devices
|
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// The device has dependent devices, most probably partitions (LVM, LUKS
|
return strings.TrimSpace(output), nil
|
||||||
// and MD RAID are reported as FSTYPE and caught above).
|
|
||||||
return "unknown data, probably partitions", nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// isShared returns true, if given path is on a mount point that has shared
|
// isShared returns true, if given path is on a mount point that has shared
|
||||||
|
|
|
@ -100,55 +100,55 @@ func TestSafeFormatAndMount(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Test that 'lsblk' is called and fails",
|
description: "Test that 'blkid' is called and fails",
|
||||||
fstype: "ext4",
|
fstype: "ext4",
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")},
|
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")},
|
||||||
execScripts: []ExecArgs{
|
execScripts: []ExecArgs{
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "ext4\n", nil},
|
{"blkid", []string{"-p", "-s", "TYPE", "-o", "value", "/dev/foo"}, "ext4\n", nil},
|
||||||
},
|
},
|
||||||
expectedError: fmt.Errorf("unknown filesystem type '(null)'"),
|
expectedError: fmt.Errorf("unknown filesystem type '(null)'"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Test that 'lsblk' is called and confirms unformatted disk, format fails",
|
description: "Test that 'blkid' is called and confirms unformatted disk, format fails",
|
||||||
fstype: "ext4",
|
fstype: "ext4",
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")},
|
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")},
|
||||||
execScripts: []ExecArgs{
|
execScripts: []ExecArgs{
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "\n", nil},
|
{"blkid", []string{"-p", "-s", "TYPE", "-o", "value", "/dev/foo"}, "", nil},
|
||||||
{"mkfs.ext4", []string{"-F", "/dev/foo"}, "", fmt.Errorf("formatting failed")},
|
{"mkfs.ext4", []string{"-F", "/dev/foo"}, "", fmt.Errorf("formatting failed")},
|
||||||
},
|
},
|
||||||
expectedError: fmt.Errorf("formatting failed"),
|
expectedError: fmt.Errorf("formatting failed"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount fails",
|
description: "Test that 'blkid' is called and confirms unformatted disk, format passes, second mount fails",
|
||||||
fstype: "ext4",
|
fstype: "ext4",
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), fmt.Errorf("Still cannot mount")},
|
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), fmt.Errorf("Still cannot mount")},
|
||||||
execScripts: []ExecArgs{
|
execScripts: []ExecArgs{
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "\n", nil},
|
{"blkid", []string{"-p", "-s", "TYPE", "-o", "value", "/dev/foo"}, "", nil},
|
||||||
{"mkfs.ext4", []string{"-F", "/dev/foo"}, "", nil},
|
{"mkfs.ext4", []string{"-F", "/dev/foo"}, "", nil},
|
||||||
},
|
},
|
||||||
expectedError: fmt.Errorf("Still cannot mount"),
|
expectedError: fmt.Errorf("Still cannot mount"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount passes",
|
description: "Test that 'blkid' is called and confirms unformatted disk, format passes, second mount passes",
|
||||||
fstype: "ext4",
|
fstype: "ext4",
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil},
|
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil},
|
||||||
execScripts: []ExecArgs{
|
execScripts: []ExecArgs{
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "\n", nil},
|
{"blkid", []string{"-p", "-s", "TYPE", "-o", "value", "/dev/foo"}, "", nil},
|
||||||
{"mkfs.ext4", []string{"-F", "/dev/foo"}, "", nil},
|
{"mkfs.ext4", []string{"-F", "/dev/foo"}, "", nil},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount passes with ext3",
|
description: "Test that 'blkid' is called and confirms unformatted disk, format passes, second mount passes with ext3",
|
||||||
fstype: "ext3",
|
fstype: "ext3",
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil},
|
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil},
|
||||||
execScripts: []ExecArgs{
|
execScripts: []ExecArgs{
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "\n", nil},
|
{"blkid", []string{"-p", "-s", "TYPE", "-o", "value", "/dev/foo"}, "", nil},
|
||||||
{"mkfs.ext3", []string{"-F", "/dev/foo"}, "", nil},
|
{"mkfs.ext3", []string{"-F", "/dev/foo"}, "", nil},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
|
@ -159,30 +159,20 @@ func TestSafeFormatAndMount(t *testing.T) {
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil},
|
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil},
|
||||||
execScripts: []ExecArgs{
|
execScripts: []ExecArgs{
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "\n", nil},
|
{"blkid", []string{"-p", "-s", "TYPE", "-o", "value", "/dev/foo"}, "", nil},
|
||||||
{"mkfs.xfs", []string{"/dev/foo"}, "", nil},
|
{"mkfs.xfs", []string{"/dev/foo"}, "", nil},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Test that 'lsblk' is called and reports ext4 partition",
|
description: "Test that 'blkid' is called and reports ext4 partition",
|
||||||
fstype: "ext3",
|
fstype: "ext3",
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")},
|
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")},
|
||||||
execScripts: []ExecArgs{
|
execScripts: []ExecArgs{
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "\next4\n", nil},
|
{"blkid", []string{"-p", "-s", "TYPE", "-o", "value", "/dev/foo"}, "LVM2_member\n", nil},
|
||||||
},
|
},
|
||||||
expectedError: fmt.Errorf("failed to mount the volume as \"ext3\", it already contains unknown data, probably partitions. Mount error: unknown filesystem type '(null)'"),
|
expectedError: fmt.Errorf("failed to mount the volume as \"ext3\", it already contains LVM2_member. Mount error: unknown filesystem type '(null)'"),
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "Test that 'lsblk' is called and reports empty partition",
|
|
||||||
fstype: "ext3",
|
|
||||||
mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")},
|
|
||||||
execScripts: []ExecArgs{
|
|
||||||
{"fsck", []string{"-a", "/dev/foo"}, "", nil},
|
|
||||||
{"lsblk", []string{"-n", "-o", "FSTYPE", "/dev/foo"}, "\n\n", nil},
|
|
||||||
},
|
|
||||||
expectedError: fmt.Errorf("failed to mount the volume as \"ext3\", it already contains unknown data, probably partitions. Mount error: unknown filesystem type '(null)'"),
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue