#!/usr/bin/python
-# Copyright 2011, 2012 Lars Wirzenius
+# Copyright 2011-2013 Lars Wirzenius
# Copyright 2012 Codethink Limited
#
# This program is free software: you can redistribute it and/or modify
import tempfile
+__version__ = '0.1.0'
+
+
class VmDebootstrap(cliapp.Application):
def add_settings(self):
self.mount_points = []
try:
+ rootdev = None
+ roottype = 'ext4'
+ bootdev = None
+ boottype = None
if self.settings['image']:
self.create_empty_image()
self.partition_image()
self.install_mbr()
(rootdev,bootdev) = self.setup_kpartx()
- self.mkfs(rootdev)
+ self.mkfs(rootdev, type=roottype)
rootdir = self.mount(rootdev)
if bootdev:
if self.settings['boottype']:
- fstype = self.settings['boottype']
+ boottype = self.settings['boottype']
else:
- fstype = 'ext2'
- self.mkfs(bootdev, type=fstype)
+ boottype = 'ext2'
+ self.mkfs(bootdev, type=boottype)
bootdir = '%s/%s' % (rootdir, 'boot/')
os.mkdir(bootdir)
bootdir = self.mount(bootdev, bootdir)
rootdir = self.mkdtemp()
self.debootstrap(rootdir)
self.set_hostname(rootdir)
- self.create_fstab(rootdir)
+ self.create_fstab(rootdir, rootdev, roottype, bootdev, boottype)
self.install_debs(rootdir)
self.cleanup_apt_cache(rootdir)
self.set_root_password(rootdir)
return dirname
def mount(self, device, path=None):
- self.message('Mounting %s' % device)
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])
self.mount_points.append(mount_point)
logging.debug('mounted %s on %s' % (device, mount_point))
boot = '/dev/mapper/%s' % devices[bootindex]
return (root,boot)
- def mkfs(self, device, type='ext2'):
- self.message('Creating filesystem')
+ def mkfs(self, device, type):
+ self.message('Creating filesystem %s' % type)
self.runcmd(['mkfs', '-t', type, device])
def debootstrap(self, rootdir):
line += ' %s' % hostname
f.write('%s\n' % line)
- def create_fstab(self, rootdir):
+ def create_fstab(self, rootdir, rootdev, roottype, bootdev, boottype):
+ def fsuuid(device):
+ out = self.runcmd(['blkid', '-c', '/dev/null', '-o', 'value',
+ '-s', 'UUID', device])
+ return out.splitlines()[0].strip()
+
+ if rootdev:
+ rootdevstr = 'UUID=%s' % fsuuid(rootdev)
+ else:
+ rootdevstr = '/dev/sda1'
+
+ if bootdev:
+ bootdevstr = 'UUID=%s' % fsuuid(bootdev)
+ else:
+ bootdevstr = None
+
fstab = os.path.join(rootdir, 'etc', 'fstab')
with open(fstab, 'w') as f:
f.write('proc /proc proc defaults 0 0\n')
- f.write('/dev/sda1 / ext4 errors=remount-ro 0 1\n')
+ 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))
def install_debs(self, rootdir):
if not self.settings['custom-package']:
if __name__ == '__main__':
- VmDebootstrap().run()
+ VmDebootstrap(version=__version__).run()