OSDN Git Service

Support for lxc host without kernel & grub.
authorTatsuki Sugiura <sugi@nemui.org>
Wed, 11 Sep 2019 01:00:05 +0000 (10:00 +0900)
committerTatsuki Sugiura <sugi@nemui.org>
Wed, 11 Sep 2019 01:00:05 +0000 (10:00 +0900)
create-image

index 139f124..c2e6139 100755 (executable)
@@ -96,7 +96,7 @@ class ImageCreator
         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
@@ -113,23 +113,45 @@ class ImageCreator
       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