Class: Bootloader::UdevMapping

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Singleton, Yast::Logger
Defined in:
src/lib/bootloader/udev_mapping.rb

Overview

Class manages mapping between udev names of disks and partitions.

Constant Summary

Instance Method Summary (collapse)

Instance Method Details

- (String?) to_kernel_device(dev)

Converts full udev name to kernel device ( disk or partition )

Parameters:

  • dev (String)

    device udev, mdadm or kernel name like /dev/disk/by-id/blabla

Returns:

  • (String, nil)

    kernel device or nil when running AutoYaST configuration.

Raises:

  • when device have udev format but do not exists



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'src/lib/bootloader/udev_mapping.rb', line 26

def to_kernel_device(dev)
  log.info "call to_kernel_device for #{dev}"
  raise "invalid device nil" unless dev

  # for non-udev devices try to see specific raid names (bnc#944041)
  if dev =~ /^\/dev\/disk\/by-/
    # in mode config if not found, then return itself
    all_devices[dev] or Yast::Mode.config ? dev : raise("Unknown udev device #{dev}")
  else
    param = Yast::ArgRef.new({})
    result = Yast::Storage.GetContVolInfo(dev, param)
    return dev unless result # not raid with funny name

    info = param.value
    return info["vdevice"] unless info["vdevice"].empty?
    return info["cdevice"] unless info["cdevice"].empty?

    raise "unknown value for raid device '#{info.inspect}'"
  end
end

- (String) to_mountby_device(dev)

Converts udev or kernel device (disk or partition) to udev name according to mountby option or kernel device if such udev device do not exists

Parameters:

  • dev (String)

    device udev or kernel one like /dev/disk/by-id/blabla

Returns:

  • (String)

    udev name

Raises:

  • when device have udev format but do not exists



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'src/lib/bootloader/udev_mapping.rb', line 52

def to_mountby_device(dev)
  kernel_dev = to_kernel_device(dev)

  log.info "#{dev} looked as kernel device name: #{kernel_dev}"

  storage_data = storage_data_for(kernel_dev)
  return kernel_dev unless storage_data

  mount_by = used_mount_by(storage_data)
  # explicit request to mount by kernel device
  return kernel_dev if mount_by == :device

  udev_data_key = MOUNT_BY_MAPPING_TO_UDEV[mount_by]
  raise "Internal error unknown mountby #{mount_by}" unless udev_data_key
  udev_pair = map_device_to_udev_devices(
    storage_data[udev_data_key],
    udev_data_key,
    kernel_dev
  ).first
  if !udev_pair
    log.warn "Cannot find udev link to satisfy mount by for #{kernel_dev}"
    return kernel_dev
  end

  # udev pair contain as first udev device and as second coresponding kernel device
  udev_pair.first
end