Change to extract kernel and initrd
This commit is contained in:
+26
-16
@@ -150,24 +150,29 @@ def detachNBD( nbd ):
|
|||||||
|
|
||||||
|
|
||||||
def extractKernel( image, flavor ):
|
def extractKernel( image, flavor ):
|
||||||
"Extract kernel from base image"
|
"Extract kernel and initrd from base image"
|
||||||
kernel = path.join( VMImageDir, flavor + '-vmlinuz' )
|
kernel = path.join( VMImageDir, flavor + '-vmlinuz' )
|
||||||
|
initrd = path.join( VMImageDir, flavor + '-initrd' )
|
||||||
if path.exists( kernel ) and ( stat( image )[ ST_MODE ] & 0777 ) == 0444:
|
if path.exists( kernel ) and ( stat( image )[ ST_MODE ] & 0777 ) == 0444:
|
||||||
return kernel
|
# If kernel is there, then initrd should also be there
|
||||||
|
return kernel, initrd
|
||||||
log( '* Extracting kernel to', kernel )
|
log( '* Extracting kernel to', kernel )
|
||||||
nbd = attachNBD( image, flags='-r' )
|
nbd = attachNBD( image, flags='-r' )
|
||||||
print srun( 'partx ' + nbd )
|
print srun( 'partx ' + nbd )
|
||||||
# Assume kernel is in partition 1/boot/vmlinuz*generic for now
|
# Assume kernel is in partition 1/boot/vmlinuz*generic for now
|
||||||
part = nbd + 'p1'
|
part = nbd + 'p1'
|
||||||
mnt = mkdtemp()
|
mnt = mkdtemp()
|
||||||
srun( 'mount %s %s' % ( part, mnt ) )
|
srun( 'mount -o ro %s %s' % ( part, mnt ) )
|
||||||
kernsrc = glob( '%s/boot/vmlinuz*generic' % mnt )[ 0 ]
|
kernsrc = glob( '%s/boot/vmlinuz*generic' % mnt )[ 0 ]
|
||||||
run( 'sudo cp %s %s' % ( kernsrc, kernel ) )
|
initrdsrc = glob( '%s/boot/initrd*generic' % mnt )[ 0 ]
|
||||||
run( 'sudo chmod 0444 ' + kernel )
|
srun( 'cp %s %s' % ( initrdsrc, initrd ) )
|
||||||
|
srun( 'chmod 0444 ' + initrd )
|
||||||
|
srun( 'cp %s %s' % ( kernsrc, kernel ) )
|
||||||
|
srun( 'chmod 0444 ' + kernel )
|
||||||
srun( 'umount ' + mnt )
|
srun( 'umount ' + mnt )
|
||||||
run( 'rmdir ' + mnt )
|
run( 'rmdir ' + mnt )
|
||||||
detachNBD( nbd )
|
detachNBD( nbd )
|
||||||
return kernel
|
return kernel, initrd
|
||||||
|
|
||||||
|
|
||||||
def findBaseImage( flavor, size='8G' ):
|
def findBaseImage( flavor, size='8G' ):
|
||||||
@@ -189,9 +194,9 @@ def findBaseImage( flavor, size='8G' ):
|
|||||||
# Write-protect image, also signaling it is complete
|
# Write-protect image, also signaling it is complete
|
||||||
log( '* Write-protecting image', image)
|
log( '* Write-protecting image', image)
|
||||||
os.chmod( image, 0444 )
|
os.chmod( image, 0444 )
|
||||||
kernel = extractKernel( image, flavor )
|
kernel, initrd = extractKernel( image, flavor )
|
||||||
log( '* Using base image', image, 'and kernel', kernel )
|
log( '* Using base image', image, 'and kernel', kernel )
|
||||||
return image, kernel
|
return image, kernel, initrd
|
||||||
|
|
||||||
|
|
||||||
# Kickstart and Preseed files for Ubuntu/Debian installer
|
# Kickstart and Preseed files for Ubuntu/Debian installer
|
||||||
@@ -279,9 +284,9 @@ def makeKickstartFloppy():
|
|||||||
return floppy, kickstart, preseed
|
return floppy, kickstart, preseed
|
||||||
|
|
||||||
|
|
||||||
def kvmFor( path ):
|
def kvmFor( filepath ):
|
||||||
"Guess kvm version for file path"
|
"Guess kvm version for file path"
|
||||||
name = path.basename( path )
|
name = path.basename( filepath )
|
||||||
if '64' in name:
|
if '64' in name:
|
||||||
kvm = 'qemu-system-x86_64'
|
kvm = 'qemu-system-x86_64'
|
||||||
elif 'i386' in name or '32' in name:
|
elif 'i386' in name or '32' in name:
|
||||||
@@ -335,7 +340,7 @@ def installUbuntu( iso, image, logfilename='install.log' ):
|
|||||||
log( '* Ubuntu installation completed in %.2f seconds ' % elapsed )
|
log( '* Ubuntu installation completed in %.2f seconds ' % elapsed )
|
||||||
|
|
||||||
|
|
||||||
def boot( cow, kernel, logfile ):
|
def boot( cow, kernel, initrd, logfile ):
|
||||||
"""Boot qemu/kvm with a COW disk and local/user data store
|
"""Boot qemu/kvm with a COW disk and local/user data store
|
||||||
cow: COW disk path
|
cow: COW disk path
|
||||||
kernel: kernel path
|
kernel: kernel path
|
||||||
@@ -353,6 +358,7 @@ def boot( cow, kernel, logfile ):
|
|||||||
'-m 1024',
|
'-m 1024',
|
||||||
'-k en-us',
|
'-k en-us',
|
||||||
'-kernel', kernel,
|
'-kernel', kernel,
|
||||||
|
'-initrd', initrd,
|
||||||
'-drive file=%s,if=virtio' % cow,
|
'-drive file=%s,if=virtio' % cow,
|
||||||
'-append "root=/dev/vda1 init=/sbin/init console=ttyS0" ' ]
|
'-append "root=/dev/vda1 init=/sbin/init console=ttyS0" ' ]
|
||||||
cmd = ' '.join( cmd )
|
cmd = ' '.join( cmd )
|
||||||
@@ -432,17 +438,21 @@ def convert( cow, basename ):
|
|||||||
def build( flavor='raring32server' ):
|
def build( flavor='raring32server' ):
|
||||||
"Build a Mininet VM"
|
"Build a Mininet VM"
|
||||||
start = time()
|
start = time()
|
||||||
date = time.strftime( '%y%m%d-%H:%M:%S', time.localtime())
|
date = strftime( '%y%m%d-%H-%M-%S', localtime())
|
||||||
dir = os.mkdir( 'mn-' + flavor + date )
|
dir = 'mn-%s-%s' % ( flavor, date )
|
||||||
|
try:
|
||||||
|
os.mkdir( dir )
|
||||||
|
except:
|
||||||
|
raise Exception( "Failed to create build directory %s" % dir )
|
||||||
os.chdir( dir )
|
os.chdir( dir )
|
||||||
log( '* Created working directory', dir )
|
log( '* Created working directory', dir )
|
||||||
image, kernel = findBaseImage( flavor )
|
image, kernel, initrd = findBaseImage( flavor )
|
||||||
volume = flavor + '.qcow2'
|
volume = flavor + '.qcow2'
|
||||||
run( 'qemu-img create -f qcow2 -b %s %s' % ( image, volume ) )
|
run( 'qemu-img create -f qcow2 -b %s %s' % ( image, volume ) )
|
||||||
log( '* VM image for', flavor, 'created as', volume )
|
log( '* VM image for', flavor, 'created as', volume )
|
||||||
logfile = open( flavor + '.log', 'w+' )
|
logfile = open( flavor + '.log', 'w+' )
|
||||||
log( '* Logging results to', abspath( logfile.name ) )
|
log( '* Logging results to', abspath( logfile.name ) )
|
||||||
vm = boot( volume, kernel, logfile )
|
vm = boot( volume, kernel, initrd, logfile )
|
||||||
interact( vm )
|
interact( vm )
|
||||||
vmdk = convert( volume, basename=flavor )
|
vmdk = convert( volume, basename=flavor )
|
||||||
log( '* Converted VM image stored as', abspath( vmdk ) )
|
log( '* Converted VM image stored as', abspath( vmdk ) )
|
||||||
@@ -463,7 +473,7 @@ def parseArgs():
|
|||||||
"Parse command line arguments and run"
|
"Parse command line arguments and run"
|
||||||
parser = argparse.ArgumentParser( description='Mininet VM build script' )
|
parser = argparse.ArgumentParser( description='Mininet VM build script' )
|
||||||
parser.add_argument( '--depend', action='store_true',
|
parser.add_argument( '--depend', action='store_true',
|
||||||
help='Install dependencies for this script' )
|
help='install dependencies for this script' )
|
||||||
parser.add_argument( '--list', action='store_true',
|
parser.add_argument( '--list', action='store_true',
|
||||||
help='list valid build flavors' )
|
help='list valid build flavors' )
|
||||||
parser.add_argument( '--clean', action='store_true',
|
parser.add_argument( '--clean', action='store_true',
|
||||||
|
|||||||
Reference in New Issue
Block a user