Class | BoxGrinder::ImageHelper |
In: |
lib/boxgrinder-build/helpers/image-helper.rb
lib/boxgrinder-build/helpers/image-helper.rb |
Parent: | Object |
# File lib/boxgrinder-build/helpers/image-helper.rb, line 25 25: def initialize(config, appliance_config, options = {}) 26: @config = config 27: @appliance_config = appliance_config 28: 29: @log = options[:log] || LogHelper.new 30: @exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log) 31: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 25 25: def initialize(config, appliance_config, options = {}) 26: @config = config 27: @appliance_config = appliance_config 28: 29: @log = options[:log] || LogHelper.new 30: @exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log) 31: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 37 37: def convert_disk(disk, format, destination) 38: @log.debug "Conveting '#{disk}' disk to #{format} format and moving it to '#{destination}'..." 39: 40: unless File.exists?(destination) 41: info = disk_info(disk) 42: 43: if info['file format'] == format.to_s 44: @exec_helper.execute "cp '#{disk}' '#{destination}'" 45: else 46: 47: format_with_options = format.to_s 48: 49: if format == :vmdk 50: format_with_options += (`qemu-img --help | grep '\\-6'`.strip.chomp.empty? ? ' -o compat6' : ' -6') 51: end 52: 53: @exec_helper.execute "qemu-img convert -f #{info['file format']} -O #{format_with_options} '#{disk}' '#{destination}'" 54: end 55: else 56: @log.debug "Destination already exists, skipping disk conversion." 57: end 58: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 37 37: def convert_disk(disk, format, destination) 38: @log.debug "Conveting '#{disk}' disk to #{format} format and moving it to '#{destination}'..." 39: 40: unless File.exists?(destination) 41: info = disk_info(disk) 42: 43: if info['file format'] == format.to_s 44: @exec_helper.execute "cp '#{disk}' '#{destination}'" 45: else 46: 47: format_with_options = format.to_s 48: 49: if format == :vmdk 50: format_with_options += (`qemu-img --help | grep '\\-6'`.strip.chomp.empty? ? ' -o compat6' : ' -6') 51: end 52: 53: @exec_helper.execute "qemu-img convert -f #{info['file format']} -O #{format_with_options} '#{disk}' '#{destination}'" 54: end 55: else 56: @log.debug "Destination already exists, skipping disk conversion." 57: end 58: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 117 117: def create_disk(disk, size) 118: @log.trace "Preparing disk..." 119: @exec_helper.execute "dd if=/dev/zero of='#{disk}' bs=1 count=0 seek=#{(size * 1024).to_i}M" 120: @log.trace "Disk prepared" 121: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 117 117: def create_disk(disk, size) 118: @log.trace "Preparing disk..." 119: @exec_helper.execute "dd if=/dev/zero of='#{disk}' bs=1 count=0 seek=#{(size * 1024).to_i}M" 120: @log.trace "Disk prepared" 121: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 123 123: def customize(disks, options = {}) 124: options = { 125: :ide_disk => ((@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5') ? true : false 126: }.merge(options) 127: 128: GuestFSHelper.new(disks, @appliance_config, @config, :log => @log).customize(options) do |guestfs, guestfs_helper| 129: yield guestfs, guestfs_helper 130: end 131: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 123 123: def customize(disks, options = {}) 124: options = { 125: :ide_disk => ((@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5') ? true : false 126: }.merge(options) 127: 128: GuestFSHelper.new(disks, @appliance_config, @config, :log => @log).customize(options) do |guestfs, guestfs_helper| 129: yield guestfs, guestfs_helper 130: end 131: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 33 33: def disk_info(disk) 34: YAML.load(@exec_helper.execute("qemu-img info '#{disk}'")) 35: end
# File lib/boxgrinder-build/helpers/image-helper.rb, line 33 33: def disk_info(disk) 34: YAML.load(@exec_helper.execute("qemu-img info '#{disk}'")) 35: end
Synchronizes filesystem from one image with an empty disk image. Input image can be a partioned image or a partition image itself. Output disk is a partition image.
See also bugzilla.redhat.com/show_bug.cgi?id=690819
# File lib/boxgrinder-build/helpers/image-helper.rb, line 66 66: def sync_filesystem(guestfs, guestfs_helper) 67: devices = guestfs.list_devices 68: in_device = devices.first 69: out_device = devices.last 70: partitions = guestfs.list_partitions.reject { |i| !(i =~ /^#{in_device}/) } 71: 72: @log.debug "Loading SELinux policy to sync filesystem..." 73: partitions.size > 0 ? guestfs_helper.mount_partitions(in_device) : guestfs_helper.mount_partition(in_device, '/') 74: guestfs_helper.load_selinux_policy 75: partitions.size > 0 ? guestfs_helper.umount_partitions(in_device) : guestfs_helper.umount_partition(in_device) 76: @log.debug "SELinux policy was loaded, we're ready to sync filesystem." 77: 78: @log.info "Synchronizing filesystems..." 79: 80: # Create mount points in libguestfs 81: guestfs.mkmountpoint('/in') 82: guestfs.mkmountpoint('/out') 83: guestfs.mkmountpoint('/out/in') 84: 85: # Create filesystem on EC2 disk 86: guestfs.mkfs(@appliance_config.default_filesystem_type, out_device) 87: # Set root partition label 88: guestfs.set_e2label(out_device, '79d3d2d4') # This is a CRC32 from / 89: 90: # Mount empty EC2 disk to /out 91: guestfs_helper.mount_partition(out_device, '/out/in') 92: partitions.size > 0 ? guestfs_helper.mount_partitions(in_device, '/in') : guestfs_helper.mount_partition(in_device, '/in') 93: 94: @log.debug "Copying files..." 95: 96: # Copy the filesystem 97: guestfs.cp_a('/in/', '/out') 98: 99: @log.debug "Files copied." 100: 101: # Better make sure... 102: guestfs.sync 103: 104: guestfs_helper.umount_partition(out_device) 105: partitions.size > 0 ? guestfs_helper.umount_partitions(in_device) : guestfs_helper.umount_partition(in_device) 106: 107: guestfs.rmmountpoint('/out/in') 108: guestfs.rmmountpoint('/out') 109: guestfs.rmmountpoint('/in') 110: 111: @log.info "Filesystems synchronized." 112: 113: # Remount the destination disk 114: guestfs_helper.mount_partition(out_device, '/') 115: end
Synchronizes filesystem from one image with an empty disk image. Input image can be a partioned image or a partition image itself. Output disk is a partition image.
See also bugzilla.redhat.com/show_bug.cgi?id=690819
# File lib/boxgrinder-build/helpers/image-helper.rb, line 66 66: def sync_filesystem(guestfs, guestfs_helper) 67: devices = guestfs.list_devices 68: in_device = devices.first 69: out_device = devices.last 70: partitions = guestfs.list_partitions.reject { |i| !(i =~ /^#{in_device}/) } 71: 72: @log.debug "Loading SELinux policy to sync filesystem..." 73: partitions.size > 0 ? guestfs_helper.mount_partitions(in_device) : guestfs_helper.mount_partition(in_device, '/') 74: guestfs_helper.load_selinux_policy 75: partitions.size > 0 ? guestfs_helper.umount_partitions(in_device) : guestfs_helper.umount_partition(in_device) 76: @log.debug "SELinux policy was loaded, we're ready to sync filesystem." 77: 78: @log.info "Synchronizing filesystems..." 79: 80: # Create mount points in libguestfs 81: guestfs.mkmountpoint('/in') 82: guestfs.mkmountpoint('/out') 83: guestfs.mkmountpoint('/out/in') 84: 85: # Create filesystem on EC2 disk 86: guestfs.mkfs(@appliance_config.default_filesystem_type, out_device) 87: # Set root partition label 88: guestfs.set_e2label(out_device, '79d3d2d4') # This is a CRC32 from / 89: 90: # Mount empty EC2 disk to /out 91: guestfs_helper.mount_partition(out_device, '/out/in') 92: partitions.size > 0 ? guestfs_helper.mount_partitions(in_device, '/in') : guestfs_helper.mount_partition(in_device, '/in') 93: 94: @log.debug "Copying files..." 95: 96: # Copy the filesystem 97: guestfs.cp_a('/in/', '/out') 98: 99: @log.debug "Files copied." 100: 101: # Better make sure... 102: guestfs.sync 103: 104: guestfs_helper.umount_partition(out_device) 105: partitions.size > 0 ? guestfs_helper.umount_partitions(in_device) : guestfs_helper.umount_partition(in_device) 106: 107: guestfs.rmmountpoint('/out/in') 108: guestfs.rmmountpoint('/out') 109: guestfs.rmmountpoint('/in') 110: 111: @log.info "Filesystems synchronized." 112: 113: # Remount the destination disk 114: guestfs_helper.mount_partition(out_device, '/') 115: end