X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=vmdebootstrap;h=f5041cde93025de934a9c17422f4dfa24b3bdc5b;hb=3a6a2626569b75cf17900ffd6bffdc4035a2a554;hp=4894bae7455d93e92003b973ea1f7ccabaaf91c5;hpb=cf4dc75495793ccda7d69ef2e6ee51a62d72669a;p=forks%2Fvmdebootstrap.git diff --git a/vmdebootstrap b/vmdebootstrap index 4894bae..f5041cd 100755 --- a/vmdebootstrap +++ b/vmdebootstrap @@ -20,6 +20,7 @@ import cliapp import crypt import logging import os +import glob import re import sys import shutil @@ -30,7 +31,7 @@ import time from distro_info import DebianDistroInfo, UbuntuDistroInfo -__version__ = '0.10' +__version__ = '0.11' # pylint: disable=invalid-name,line-too-long,missing-docstring,too-many-branches @@ -482,7 +483,11 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth def setup_kpartx(self): bootindex = None swapindex = None - out = self.runcmd(['kpartx', '-avs', self.settings['image']]) + if 'freebsd' in os.sys.platform: + out = self.runcmd(['mdconfig', '-a', '-t', 'vnode', '-f', + self.settings['image']]) + else: + out = self.runcmd(['kpartx', '-avs', self.settings['image']]) if self.settings['bootsize'] and self.settings['swap'] > 0: bootindex = 0 rootindex = 1 @@ -510,19 +515,22 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth parts = 1 boot = None swap = None - devices = [line.split()[2] - for line in out.splitlines() - if line.startswith('add map ')] + if 'freebsd' in os.sys.platform: + devices = glob.glob("/dev/%ss*" % out.strip()) + else: + devices = ['/dev/mapper/%s' % line.split()[2] + for line in out.splitlines() + if line.startswith('add map ')] if len(devices) != parts: msg = 'Surprising number of partitions - check output of losetup -a' logging.debug("%s", self.runcmd(['losetup', '-a'])) logging.debug("%s: devices=%s parts=%s", msg, devices, parts) raise cliapp.AppException(msg) - root = '/dev/mapper/%s' % devices[rootindex] + root = devices[rootindex] if self.settings['bootsize'] or self.settings['use-uefi']: - boot = '/dev/mapper/%s' % devices[bootindex] + boot = devices[bootindex] if self.settings['swap'] > 0: - swap = '/dev/mapper/%s' % devices[swapindex] + swap = devices[swapindex] return root, boot, swap def _efi_packages(self): @@ -784,20 +792,34 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth else: logging.debug('not removing non-existent %s', pathname) + def mask_udev_predictable_rules(self, rootdir): + """ + This can be reset later but to get networking working immediately + on boot, the interface we're going to use must be known without + reference to the eventual machine. + http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ + """ + self.message('Disabling systemd predictable interface names') + udev_path = os.path.join( + 'etc', 'udev', 'rules.d', '80-net-setup-link.rules') + self.runcmd(['chroot', rootdir, 'ln', '-s', '/dev/null', udev_path]) + def setup_networking(self, rootdir): self.message('Setting up networking') + ifc_file = os.path.join(rootdir, 'etc', 'network', 'interfaces') + ifc_d = os.path.join(rootdir, 'etc', 'network', 'interfaces.d') - # unconditionally write for wheezy (which became oldstable on 04/25/2015) + # unconditionally write for wheezy (which became oldstable 2015.04.25) if self.was_oldstable(datetime.date(2015, 4, 26)): - with open(os.path.join(rootdir, 'etc', 'network', 'interfaces'), 'w') as netfile: + with open(ifc_file, 'w') as netfile: netfile.write('source /etc/network/interfaces.d/*\n') - os.mkdir(os.path.join(rootdir, 'etc', 'network', 'interfaces.d')) - - elif not os.path.exists(os.path.join(rootdir, 'etc', 'network', 'interfaces')): - iface_path = os.path.join(rootdir, 'etc', 'network', 'interfaces') - with open(iface_path, 'w') as netfile: + elif not os.path.exists(ifc_file): + with open(ifc_file, 'a') as netfile: netfile.write('source-directory /etc/network/interfaces.d\n') - ethpath = os.path.join(rootdir, 'etc', 'network', 'interfaces.d', 'setup') + + if not os.path.exists(ifc_d): + os.mkdir(ifc_d) + ethpath = os.path.join(ifc_d, 'setup') with open(ethpath, 'w') as eth: eth.write('auto lo\n') eth.write('iface lo inet loopback\n') @@ -806,6 +828,8 @@ class VmDebootstrap(cliapp.Application): # pylint: disable=too-many-public-meth eth.write('\n') eth.write('auto eth0\n') eth.write('iface eth0 inet dhcp\n') + # force predictable interface names + self.mask_udev_predictable_rules(rootdir) def append_serial_console(self, rootdir): if self.settings['serial-console']: @@ -1004,7 +1028,13 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s time.sleep(5) self.runcmd(['umount', mount_point], ignore_fail=False) - self.runcmd(['kpartx', '-d', self.settings['image']], ignore_fail=True) + if 'freebsd' in os.sys.platform: + out = self.runcmd(['mdconfig', '-l', '-f', self.settings['image']]) + for devid in out.split(): + self.runcmd(['mdconfig', '-d', '-u', devid], + ignore_fail=True) + else: + self.runcmd(['kpartx', '-d', self.settings['image']], ignore_fail=True) for dirname in self.remove_dirs: shutil.rmtree(dirname)