class BoxGrinder::LinuxHelper

Public Class Methods

new(options = {}) click to toggle source
# File lib/boxgrinder-build/helpers/linux-helper.rb, line 56
def initialize(options = {})
  @log = options[:log] || LogHelper.new
end

Public Instance Methods

kernel_image_name(guestfs) click to toggle source
# File lib/boxgrinder-build/helpers/linux-helper.rb, line 113
def kernel_image_name(guestfs)
  guestfs.sh("ls -1 /boot | grep initramfs | wc -l").chomp.strip.to_i > 0 ? "initramfs" : "initrd"
end
kernel_version(guestfs) click to toggle source
# File lib/boxgrinder-build/helpers/linux-helper.rb, line 94
def kernel_version(guestfs)
  kernel_versions = guestfs.ls("/lib/modules")

  # By default use the latest available kernel...
  version = RPMVersion.new.newest(kernel_versions)

  # ...but prefer xen or PAE kernel over others
  if kernel_versions.size > 1
    kernel_versions.each do |v|
      if v.match(/xen$/) or v.match(/PAE$/)
        version = v
        break
      end
    end
  end

  version
end
partition_mount_points(partitions) click to toggle source

Returns valid array of sorted mount points

'/', '/home'

> ['/', '/home']

'swap', '/', '/home'

> ['/', '/home', 'swap']

'swap', '/', '/home', '/boot'

> ['/', '/boot', '/home', 'swap']

'/tmp-eventlog', '/', '/ubrc', '/tmp-config'

> ['/', '/ubrc', '/tmp-config', '/tmp-eventlog']

# File lib/boxgrinder-build/helpers/linux-helper.rb, line 67
def partition_mount_points(partitions)
  partitions.keys.sort do |a, b|
    a_count = a.count('/')
    b_count = b.count('/')

    if a_count > b_count
      v = 1
    else
      if a_count < b_count
        v = -1
      else
        if a.length == b.length
          v = a <=> b
        else
          v = a.length <=> b.length
        end
      end
    end

    # This forces having swap partition at the end of the disk
    v = 1 if a_count == 0
    v = -1 if b_count == 0

    v
  end
end
recreate_kernel_image(guestfs, modules = []) click to toggle source
# File lib/boxgrinder-build/helpers/linux-helper.rb, line 117
def recreate_kernel_image(guestfs, modules = [])
  kernel_version = kernel_version(guestfs)

  raise "Cannot find valid kernel installs in the appliance. Make sure you have your kernel installed in '/lib/modules'." if kernel_version.nil?

  kernel_image_name = kernel_image_name(guestfs)

  if guestfs.exists("/sbin/dracut") != 0
    command = "/sbin/dracut -f -v --add-drivers #{modules.join(' ')}"
  else
    drivers_argument = ""
    modules.each { |mod| drivers_argument << " --preload=#{mod}" }

    command = "/sbin/mkinitrd -f -v#{drivers_argument}"
  end

  @log.trace "Additional modules to preload in kernel: #{modules.join(', ')}"

  @log.debug "Recreating kernel image for #{kernel_version} kernel..."
  guestfs.sh("#{command} /boot/#{kernel_image_name}-#{kernel_version}.img #{kernel_version}")
  @log.debug "Kernel image recreated."
end