X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=vmdebootstrap;h=a8126fd99f881bc0a833eaa9542a0e91af886649;hb=d1bb4c91882c4b2c8e25ae04dc75b62f78898d8e;hp=5f01f5a37e1788862b36ecbf4ff66d5f9662c8b9;hpb=6a5784a44511ec930ae96e1ba4dc181a77ba4e8f;p=forks%2Fvmdebootstrap.git diff --git a/vmdebootstrap b/vmdebootstrap index 5f01f5a..a8126fd 100755 --- a/vmdebootstrap +++ b/vmdebootstrap @@ -1,5 +1,5 @@ #!/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 @@ -23,9 +23,10 @@ import re import shutil import subprocess import tempfile +import time -__version__ = '0.1.0' +__version__ = '0.2' class VmDebootstrap(cliapp.Application): @@ -109,19 +110,23 @@ class VmDebootstrap(cliapp.Application): 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) @@ -129,7 +134,7 @@ class VmDebootstrap(cliapp.Application): 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) @@ -180,11 +185,11 @@ class VmDebootstrap(cliapp.Application): 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)) @@ -216,7 +221,7 @@ class VmDebootstrap(cliapp.Application): self.runcmd(['install-mbr', self.settings['image']]) def setup_kpartx(self): - out = self.runcmd(['kpartx', '-av', self.settings['image']]) + out = self.runcmd(['kpartx', '-avs', self.settings['image']]) if self.settings['bootsize']: bootindex = 0 rootindex = 1 @@ -235,8 +240,8 @@ class VmDebootstrap(cliapp.Application): 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): @@ -292,11 +297,28 @@ class VmDebootstrap(cliapp.Application): 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']: @@ -448,10 +470,15 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s if self.settings['image']: for i in xrange(len(self.mount_points) - 1, -1, -1): mount_point = self.mount_points[i] - self.runcmd(['umount', mount_point], ignore_fail=True) + try: + self.runcmd(['umount', mount_point], ignore_fail=False) + except cliapp.AppException: + logging.debug("umount failed, sleeping and trying again") + time.sleep(5) + self.runcmd(['umount', mount_point], ignore_fail=False) self.runcmd(['kpartx', '-d', self.settings['image']], ignore_fail=True) - + for dirname in self.remove_dirs: shutil.rmtree(dirname)