X-Git-Url: https://git.siccegge.de//index.cgi?p=forks%2Fvmdebootstrap.git;a=blobdiff_plain;f=vmdebootstrap;h=a5537b7abd6f6191ddc2cf8704470db9082184f5;hp=b675b22599e2f0ba92debb3c0c415d36dbc7e567;hb=0bc3dbfc1fc101a372572aab597175aad45c0be7;hpb=ecf777d3fbf8ba5c5decb4495126d19a2fc36a72 diff --git a/vmdebootstrap b/vmdebootstrap index b675b22..a5537b7 100755 --- a/vmdebootstrap +++ b/vmdebootstrap @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2011, 2012, 2013 Lars Wirzenius +# Copyright 2011, 2012 Lars Wirzenius # Copyright 2012 Codethink Limited # # This program is free software: you can redistribute it and/or modify @@ -25,6 +25,9 @@ import subprocess import tempfile +__version__ = '0.1.0' + + class VmDebootstrap(cliapp.Application): def add_settings(self): @@ -73,6 +76,11 @@ class VmDebootstrap(cliapp.Application): metavar='USER/PASSWORD') self.settings.boolean(['serial-console'], 'configure image to use a serial console') + self.settings.string(['serial-console-command'], + 'command to manage the serial console, appended ' + 'to /etc/inittab (%default)', + metavar='COMMAND', + default='/sbin/getty -L ttyS0 115200 vt100') self.settings.boolean(['sudo'], 'install sudo, and if user is created, add them ' 'to sudo group') @@ -92,6 +100,7 @@ class VmDebootstrap(cliapp.Application): if self.settings['image']: self.create_empty_image() self.partition_image() + self.install_mbr() rootdev = self.setup_kpartx() self.mkfs(rootdev) rootdir = self.mount(rootdev) @@ -101,6 +110,7 @@ class VmDebootstrap(cliapp.Application): self.set_hostname(rootdir) self.create_fstab(rootdir) self.install_debs(rootdir) + self.cleanup_apt_cache(rootdir) self.set_root_password(rootdir) self.create_users(rootdir) self.remove_udev_persistent_rules(rootdir) @@ -108,6 +118,7 @@ class VmDebootstrap(cliapp.Application): self.customize(rootdir) if self.settings['image']: self.install_extlinux(rootdev, rootdir) + self.optimize_image(rootdir) if self.settings['tarball']: self.create_tarball(rootdir) except BaseException, e: @@ -164,6 +175,10 @@ class VmDebootstrap(cliapp.Application): self.runcmd(['parted', '-s', self.settings['image'], 'set', '1', 'boot', 'on']) + def install_mbr(self): + self.message('Installing MBR') + self.runcmd(['install-mbr', self.settings['image']]) + def setup_kpartx(self): out = self.runcmd(['kpartx', '-av', self.settings['image']]) devices = [line.split()[2] @@ -180,21 +195,24 @@ class VmDebootstrap(cliapp.Application): def debootstrap(self, rootdir): self.message('Debootstrapping') + necessary_packages = ['acpid'] + include = self.settings['package'] if not self.settings['no-kernel']: if self.settings['arch'] == 'i386': - kernel_arch = '686' + kernel_arch = '486' else: kernel_arch = self.settings['arch'] - kernel_image = 'linux-image-2.6-%s' % kernel_arch + kernel_image = 'linux-image-%s' % kernel_arch include.append(kernel_image) if self.settings['sudo'] and 'sudo' not in include: include.append('sudo') args = ['debootstrap', '--arch=%s' % self.settings['arch']] - if include: args.append('--include=%s' % ','.join(include)) + args.append( + '--include=%s' % ','.join(necessary_packages + include)) args += [self.settings['distribution'], rootdir, self.settings['mirror']] self.runcmd(args) @@ -238,6 +256,10 @@ class VmDebootstrap(cliapp.Application): logging.debug('stdout:\n%s' % out) shutil.rmtree(tmp) + def cleanup_apt_cache(self, rootdir): + out = self.runcmd(['chroot', rootdir, 'apt-get', 'clean']) + logging.debug('stdout:\n%s' % out) + def set_root_password(self, rootdir): if self.settings['root-password']: self.message('Setting root password') @@ -291,7 +313,7 @@ class VmDebootstrap(cliapp.Application): if self.settings['enable-dhcp']: f.write('\n') - f.write('allow-hotplug eth0\n') + f.write('auto eth0\n') f.write('iface eth0 inet dhcp\n') f.close() @@ -337,15 +359,25 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s f.close() if self.settings['serial-console']: + serial_command = self.settings['serial-console-command'] logging.debug('adding getty to serial console') inittab = os.path.join(rootdir, 'etc/inittab') with open(inittab, 'a') as f: - f.write('\nS0:23:respawn:/sbin/getty -L ttyS0 115200 vt100\n') + f.write('\nS0:23:respawn:%s\n' % serial_command) self.runcmd(['extlinux', '--install', rootdir]) self.runcmd(['sync']) import time; time.sleep(2) - + + def optimize_image(self, rootdir): + """ + Filing up the image with zeros will increase its compression rate + """ + zeros = os.path.join(rootdir, 'ZEROS') + self.runcmd_unchecked(['dd', 'if=/dev/zero', 'of=' + zeros, 'bs=1M']) + self.runcmd(['rm', '-f', zeros]) + + def cleanup_system(self): # Clean up after any errors. @@ -375,5 +407,5 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s if __name__ == '__main__': - VmDebootstrap().run() + VmDebootstrap(version=__version__).run()