[Vmdebootstrap-devel] Bug#741223: vmdebootstrap: please support root on btrfs

Petter Reinholdtsen pere at hungry.com
Sun Nov 2 14:54:45 UTC 2014


I managed to trick update-grub to find the device by changing
vmdebootstrap making sure to use mount to place the btrfs subvolume in
the file system, thus making sure /proc/mounts have information about
it.  But with that in place, another problem show up:

  Configuring grub2
  command failed: ['chroot', '/tmp/tmpay9wvT/root', 'grub-install', '/dev/loop0']

  /usr/sbin/grub-probe: error: cannot find a GRUB drive for /dev/mapper/loop0p1.  Check your device.map.
  Auto-detection of a filesystem of /dev/mapper/loop0p1 failed.
  Try with --recheck.
  If the problem persists please report this together with the output of "/usr/sbin/grub-probe --device-map  ="/boot/grub/device.map" --target=fs -v /boot/grub" to <bug-grub at gnu.org>

  Failed. Is grub2-common installed? Using extlinux.
  Installing extlinux
  Cleaning up

I could get a bit further by creating /boot/grub/device.map:

  # cat /boot/grub/device.map 
  (hd0,0) /dev/mapper/loop0p1
  (hd0,1) /dev/mapper/loop0p2
  #

but it did not fix the problem.  Here is the debug output from

  # /usr/sbin/grub-probe --device-map="/boot/grub/device.map" --target=fs -v /boot/grub --verbose
  grub-core/disk/raid.c:740: Scanning for dmraid_nv RAID devices on disk hd0,0
  /usr/sbin/grub-probe: info: Scanning for dmraid_nv RAID devices on disk hd0,0.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for dmraid_nv RAID devices on disk hd0,1
  /usr/sbin/grub-probe: info: Scanning for dmraid_nv RAID devices on disk hd0,1.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  /usr/sbin/grub-probe: info: scanning hd0,0 for LVM.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  /usr/sbin/grub-probe: info: scanning hd0,1 for LVM.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid09 RAID devices on disk hd0,0
  /usr/sbin/grub-probe: info: Scanning for mdraid09 RAID devices on disk hd0,0.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid09 RAID devices on disk hd0,1
  /usr/sbin/grub-probe: info: Scanning for mdraid09 RAID devices on disk hd0,1.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid1x RAID devices on disk hd0,0
  /usr/sbin/grub-probe: info: Scanning for mdraid1x RAID devices on disk hd0,0.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid1x RAID devices on disk hd0,1
  /usr/sbin/grub-probe: info: Scanning for mdraid1x RAID devices on disk hd0,1.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid09 RAID devices on disk hd0,0
  /usr/sbin/grub-probe: info: Scanning for mdraid09 RAID devices on disk hd0,0.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid09 RAID devices on disk hd0,1
  /usr/sbin/grub-probe: info: Scanning for mdraid09 RAID devices on disk hd0,1.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid1x RAID devices on disk hd0,0
  /usr/sbin/grub-probe: info: Scanning for mdraid1x RAID devices on disk hd0,0.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/disk/raid.c:740: Scanning for mdraid1x RAID devices on disk hd0,1
  /usr/sbin/grub-probe: info: Scanning for mdraid1x RAID devices on disk hd0,1.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  /usr/sbin/grub-probe: info: scanning hd0,0 for LVM.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,0'...
  grub-core/kern/disk.c:324: Opening `hd0,0' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  /usr/sbin/grub-probe: info: scanning hd0,1 for LVM.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  grub-core/kern/disk.c:245: Opening `hd0,1'...
  grub-core/kern/disk.c:324: Opening `hd0,1' failed.
  grub-core/kern/disk.c:338: Closing `hd0'.
  /usr/sbin/grub-probe: info: changing current directory to /dev/mapper.
  grub-core/kern/emu/hostdisk.c:1440: /dev/dm-10 is not DM-RAID
  /usr/sbin/grub-probe: info: changing current directory to /dev/mapper.
  grub-core/kern/emu/hostdisk.c:1440: /dev/dm-10 is not DM-RAID
  /usr/sbin/grub-probe: info: changing current directory to /dev/mapper.
  /usr/sbin/grub-probe: info: no mapping exists for `/dev/mapper/loop0p1'.
  /usr/sbin/grub-probe: error: cannot find a GRUB drive for /dev/mapper/loop0p1.  Check your device.map.
  #

Not quite sure how to get any further.  New patch attached.

-- 
Happy hacking
Petter Reinholdtsen
-------------- next part --------------
--- vmdebootstrap.orig	2014-10-18 20:35:19.000000000 +0200
+++ vmdebootstrap	2014-11-02 09:37:27.375454776 +0100
@@ -39,6 +39,9 @@
         self.settings.boolean(['verbose'], 'report what is going on')
         self.settings.string(['image'], 'put created disk image in FILE',
                              metavar='FILE')
+        self.settings.string(['roottype'],
+                             'specify file system type for /',
+                             default='ext4')
         self.settings.bytesize(['size'],
                                'create a disk image of size SIZE (%default)',
                                metavar='SIZE',
@@ -129,7 +132,7 @@
 
         try:
             rootdev = None
-            roottype = 'ext4'
+            roottype = self.settings['roottype']
             bootdev = None
             boottype = None
             rootdir = None
@@ -141,6 +144,25 @@
                 (rootdev, bootdev) = self.setup_kpartx()
                 self.mkfs(rootdev, type=roottype)
                 rootdir = self.mount(rootdev)
+                rootfsdir = rootdir
+                if 'btrfs' == roottype:
+                    self.settings['package'].append("btrfs-tools")
+                    # Put root in a subvolume, to ease snapshots and volume management
+                    self.runcmd(['btrfs', 'subvolume', 'create', "%s/@" % rootdir])
+
+                    # Make sure the subvolume mount point show in in
+                    # /proc/mounts for grub-update to figure out the
+                    # device for the root file system.
+                    newrootdir = "%s/root" % rootdir
+                    os.mkdir(newrootdir)
+                    self.mount(rootdev, newrootdir, ['-o','subvol=@'])
+#                    self.runcmd(['btrfs', 'subvolume', 'set-default', '@', rootdir])
+
+                    # Make the btrfs root file system available in the chroot.
+                    os.mkdir("%s/btrfs" % newrootdir)
+                    self.mount(rootdev, "%s/btrfs" % newrootdir)
+
+                    rootdir = newrootdir
                 if bootdev:
                     if self.settings['boottype']:
                         boottype = self.settings['boottype']
@@ -168,9 +190,9 @@
 
             if self.settings['image']:
                 if self.settings['grub']:
-                    self.install_grub2(rootdev, rootdir)
+                    self.install_grub2(rootdev, rootdir, rootfsdir)
                 elif self.settings['extlinux']:
-                    self.install_extlinux(rootdev, rootdir)
+                    self.install_extlinux(rootdev, rootdir, rootfsdir)
                 self.append_serial_console(rootdir)
                 self.optimize_image(rootdir)
                 if self.settings['squash']:
@@ -221,13 +243,20 @@
         logging.debug('mkdir %s' % dirname)
         return dirname
 
-    def mount(self, device, path=None):
+    def mount(self, device, path=None, opts=None):
         if not path:
             mount_point = self.mkdtemp()
         else:
             mount_point = path
         self.message('Mounting %s on %s' % (device, mount_point))
-        self.runcmd(['mount', device, mount_point])
+        cmd = ['mount']
+        if opts is not None:
+            for opt in opts:
+                cmd.append(opt)
+        cmd.append(device)
+        cmd.append(mount_point)
+        print "M: ", cmd
+        self.runcmd(cmd)
         self.mount_points.append(mount_point)
         logging.debug('mounted %s on %s' % (device, mount_point))
         return mount_point
@@ -379,7 +408,12 @@
         fstab = os.path.join(rootdir, 'etc', 'fstab')
         with open(fstab, 'w') as f:
             f.write('proc /proc proc defaults 0 0\n')
-            f.write('%s / %s errors=remount-ro 0 1\n' % (rootdevstr, roottype))
+            if 'btrfs' == roottype:
+#                f.write('%s / %s defaults 0 1\n' % (rootdevstr, roottype))
+                f.write('%s / %s subvol=@ 0 1\n' % (rootdevstr, roottype))
+                f.write('%s /btrfs %s defaults 1\n' % (rootdevstr, roottype))
+            else:
+                f.write('%s / %s errors=remount-ro 0 1\n' % (rootdevstr, roottype))
             if bootdevstr:
                 f.write('%s /boot %s errors=remount-ro 0 2\n' % (bootdevstr, boottype))
 
@@ -472,7 +506,8 @@
             with open(inittab, 'a') as f:
                 f.write('\nS0:23:respawn:%s\n' % serial_command)
 
-    def install_grub2(self, rootdev, rootdir):
+    def install_grub2(self, rootdev, rootdir, rootfsdir):
+        # FIXME use rootfsdir
         self.message("Configuring grub2")
         # rely on kpartx using consistent naming to map loop0p1 to loop0
         install_dev = os.path.join('/dev', os.path.basename(rootdev)[:-2])
@@ -483,16 +518,17 @@
         self.runcmd(['mount', '/sys', '-t', 'sysfs', '-obind',
                     '%s' % os.path.join(rootdir, 'sys')])
         try:
-            self.runcmd(['chroot', rootdir, 'update-grub'])
             self.runcmd(['chroot', rootdir, 'grub-install', install_dev])
+            self.runcmd(['chroot', rootdir, 'update-grub'])
         except cliapp.AppException as e:
+            self.message(str(e))
             self.message("Failed. Is grub2-common installed? Using extlinux.")
         self.runcmd(['umount', os.path.join(rootdir, 'sys')])
         self.runcmd(['umount', os.path.join(rootdir, 'proc')])
         self.runcmd(['umount', os.path.join(rootdir, 'dev')])
-        self.install_extlinux(rootdev, rootdir)
+        self.install_extlinux(rootdev, rootdir, rootfsdir)
 
-    def install_extlinux(self, rootdev, rootdir):
+    def install_extlinux(self, rootdev, rootdir, rootfsdir):
         if not os.path.exists("/usr/bin/extlinux"):
             self.message("extlinux not installed, skipping.")
             return
@@ -519,7 +555,7 @@
                            '-s', 'UUID', rootdev])
         uuid = out.splitlines()[0].strip()
 
-        conf = os.path.join(rootdir, 'extlinux.conf')
+        conf = os.path.join(rootfsdir, 'extlinux.conf')
         logging.debug('configure extlinux %s' % conf)
         f = open(conf, 'w')
         f.write('''
@@ -528,7 +564,7 @@
 
 label linux
 kernel %(kernel)s
-append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s
+append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s %(rootflags)s
 %(extserial)s
 ''' % {
             'kernel': kernel_image,
@@ -536,11 +572,12 @@
             'uuid': uuid,
             'kserial':
             'console=ttyS0,115200' if self.settings['serial-console'] else '',
+            'rootflags': 'rootfsflags=subvol=@' if 'btrfs' == self.settings['roottype'] else '',
             'extserial': 'serial 0 115200' if self.settings['serial-console'] else '',
         })
         f.close()
 
-        self.runcmd(['extlinux', '--install', rootdir])
+        self.runcmd(['extlinux', '--install', rootfsdir])
         self.runcmd(['sync'])
         time.sleep(2)
 


More information about the Vmdebootstrap-devel mailing list