148 lines
7.2 KiB
Diff
148 lines
7.2 KiB
Diff
diff --git a/vmdebootstrap b/vmdebootstrap
|
|
index 4895147..c46be43 100755
|
|
--- a/vmdebootstrap
|
|
+++ b/vmdebootstrap
|
|
@@ -218,6 +218,25 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
self.runcmd(['mkswap', swapdev])
|
|
self.mkfs(rootdev, fstype=roottype)
|
|
rootdir = self.mount(rootdev)
|
|
+ rootfsdir = rootdir
|
|
+ if 'btrfs' == roottype:
|
|
+ # Put root in a subvolume, to ease snapshots and volume management
|
|
+ self.message("Creating root file system as btrfs subvolume @")
|
|
+ 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/build" % 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']
|
|
@@ -245,9 +264,9 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
|
|
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']:
|
|
@@ -300,13 +319,19 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
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)
|
|
+ self.runcmd(cmd)
|
|
self.mount_points.append(mount_point)
|
|
logging.debug('mounted %s on %s', device, mount_point)
|
|
return mount_point
|
|
@@ -458,6 +483,9 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
if self.settings['grub']:
|
|
include.append('grub-pc')
|
|
|
|
+ if 'btrfs' == self.settings['roottype']:
|
|
+ include.append('btrfs-tools')
|
|
+
|
|
if not self.settings['no-kernel']:
|
|
if self.settings['kernel-package']:
|
|
kernel_image = self.settings['kernel-package']
|
|
@@ -546,7 +574,12 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
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))
|
|
if self.settings['swap'] > 0:
|
|
@@ -661,7 +694,8 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
cfg.write("%s\n" % terminal)
|
|
cfg.write("%s\n" % 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])
|
|
@@ -679,12 +713,12 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
self.runcmd(['chroot', rootdir, 'grub-install', install_dev])
|
|
except cliapp.AppException:
|
|
self.message("Failed. Is grub2-common installed? Using extlinux.")
|
|
- self.install_extlinux(rootdev, rootdir)
|
|
+ self.install_extlinux(rootdev, rootdir, rootfsdir)
|
|
self.runcmd(['umount', os.path.join(rootdir, 'sys')])
|
|
self.runcmd(['umount', os.path.join(rootdir, 'proc')])
|
|
self.runcmd(['umount', os.path.join(rootdir, 'dev')])
|
|
|
|
- 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
|
|
@@ -711,7 +745,7 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth
|
|
'-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)
|
|
kserial = 'console=ttyS0,115200' if self.settings['serial-console'] else ''
|
|
extserial = 'serial 0 115200' if self.settings['serial-console'] else ''
|
|
@@ -721,13 +755,14 @@ timeout 1
|
|
|
|
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, # pylint: disable=bad-continuation
|
|
'initrd': initrd_image, # pylint: disable=bad-continuation
|
|
'uuid': uuid, # pylint: disable=bad-continuation
|
|
'kserial': kserial, # pylint: disable=bad-continuation
|
|
+ 'rootflags': 'rootfsflags=subvol=@' if 'btrfs' == self.settings['roottype'] else '', # pylint: disable=bad-continuation
|
|
'extserial': extserial, # pylint: disable=bad-continuation
|
|
} # pylint: disable=bad-continuation
|
|
logging.debug("extlinux config:\n%s", msg)
|
|
@@ -738,7 +773,7 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s
|
|
f = open(conf, 'w')
|
|
f.write(msg)
|
|
|
|
- self.runcmd(['extlinux', '--install', rootdir])
|
|
+ self.runcmd(['extlinux', '--install', rootfsdir])
|
|
self.runcmd(['sync'])
|
|
time.sleep(2)
|
|
|