begin
system("mount", dev, mount_point) or raise "Failed to mount file system #{dev} on #{mount_point}"
puts "Copying #{src_host}:#{di.srcpath} to #{dev}..."
- system("rsync", "-azHSAX", "--numeric-ids", "--info=progress2", "#{src_host}:#{di.srcpath}/", "#{mount_point}/", *((["--exclude"] * di.exclude.size).zip(di.exclude).flatten))
+ system("rsync", "-azHSAX", "--numeric-ids", "--info=progress2", "#{src_host}:#{di.srcpath}/", "#{mount_point}/", *((["--exclude"] * di.exclude.size).zip(di.exclude).flatten)) or raise "rsync fails"
ensure
system("umount", mount_point)
File.directory?(mount_point) and
coreimg = "#{dir}/core.img"
system("grub-mkimage", "-o", coreimg, "-O", "i386-pc", "-p", "(hd0,gpt2)/boot/grub", "biosdisk", "part_gpt", "ext2", "gzio", "xzio", "lzopio") or raise "Failed to create grub core image."
with_loopdev do |devices, root|
- puts "Override grub..."
+ puts "Override grub with host version..."
system("grub-bios-setup", "-d", dir, root) or raise "Failed to run grub-bios-setup"
rootfs_uuid=`blkid -o value -s UUID #{devices[1]}`.chomp("\n")
puts "New rootfs UUID=#{rootfs_uuid}"
begin
system("mount", devices[1], dir)
- system("cp -a /usr/lib/grub/i386-pc/*.mod #{dir}/boot/grub/i386-pc/") or raise "Failed to copy grub modules"
- grubconf = File.read "#{dir}/boot/grub/grub.cfg"
- if old_uuid = grubconf[/root=UUID=(\S+)/, 1]
- File.write "#{dir}/boot/grub/grub.cfg", grubconf.gsub(/#{old_uuid}/, rootfs_uuid)
- end
puts "Rewrite fstab..."
fstab = File.read "#{dir}/etc/fstab"
fstab.gsub!(%r{^(UUID=|/)\S+(\s+/\s+)}, "UUID=#{rootfs_uuid}\\2")
fstab.gsub!(%r{^(\S+\s+\S+\s+\S+\s+sw(?=\b))}, '#\1')
File.write "#{dir}/etc/fstab", fstab
+
+ unless File.exists? "#{dir}/vmlinuz"
+ system("chroot", dir, "apt-get", "-qy", "update")
+ system("chroot", dir, "apt-get", "-y", "install", "linux-image-amd64")
+ end
+
+ puts "Update grub.cfg..."
+ system("mkdir", "-p", "#{dir}/boot/grub/i386-pc") or raise "Failed to create grub dir"
+ system("cp -a /usr/lib/grub/i386-pc/*.mod #{dir}/boot/grub/i386-pc/") or raise "Failed to copy grub modules"
+ if File.exists? "#{dir}/boot/grub/grub.cfg"
+ grubconf = File.read "#{dir}/boot/grub/grub.cfg"
+ if old_uuid = grubconf[/root=UUID=(\S+)/, 1]
+ File.write "#{dir}/boot/grub/grub.cfg", grubconf.gsub(/#{old_uuid}/, rootfs_uuid)
+ end
+ else
+ File.write "#{dir}/boot/grub/grub.cfg", <<-EOC
+ set timeout=5
+ insmod part_gpt
+ insmod ext2
+ insmod linux
+ search --no-floppy --fs-uuid --set=root #{rootfs_uuid}
+ menuentry 'Linux' {
+ linux /vmlinuz root=UUID=#{rootfs_uuid} ro
+ initrd /initrd.img
+ }
+ EOC
+ end
ensure
system("umount", dir)
end