| Index: mk_arm_sd_image.py
|
| diff --git a/mk_arm_sd_image.py b/mk_arm_sd_image.py
|
| deleted file mode 100755
|
| index ed5e5a2046d9a3b440f67ac5bab7296628316136..0000000000000000000000000000000000000000
|
| --- a/mk_arm_sd_image.py
|
| +++ /dev/null
|
| @@ -1,204 +0,0 @@
|
| -#!/usr/bin/env python
|
| -
|
| -# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""Script to generate ARM beagleboard SD card image from kernel, root fs
|
| -
|
| -This script must be passed a uImage file and a tarred up root filesystem.
|
| -It also needs EITHER an output device or a file + size. If you use a real
|
| -device, the entire device will be used. if you specify a file, the file
|
| -will be truncated to the given length and be formatted as a disk image.
|
| -
|
| -To copy a disk image to a device (e.g. /dev/sdb):
|
| -# dd if=disk_image.img of=/dev/sdb bs=4M
|
| -"""
|
| -
|
| -from optparse import OptionParser
|
| -import math
|
| -import os
|
| -import re
|
| -import shutil
|
| -import subprocess
|
| -import sys
|
| -
|
| -def DieWithUsage(exec_path):
|
| - print 'usage:', exec_path, ' [-f file] [-s filesize] [-d device] ', \
|
| - 'path/to/uImage path/to/armel-rootfs.tgz'
|
| - print 'You must pass either -d or both -f and -s'
|
| - print 'size may end in k, m, or g for kibibyte, mebibytes, gibibytes.'
|
| - print 'This will erase all data on the device or in the file passed.'
|
| - print 'This script must be run as root.'
|
| - sys.exit(1)
|
| -
|
| -def ParseFilesize(size):
|
| - if size == '':
|
| - return -1
|
| - multiplier = 1
|
| - number_part = size[:-1]
|
| - last_char = size[-1]
|
| - if (last_char == 'k') or (last_char == 'K'):
|
| - multiplier = 1024
|
| - elif (last_char == 'm') or (last_char == 'M'):
|
| - multiplier = 1024 * 1024
|
| - elif (last_char == 'g') or (last_char == 'G'):
|
| - multiplier = 1024 * 1024 * 1024
|
| - else:
|
| - number_part = size
|
| - return long(number_part) * multiplier
|
| -
|
| -def ParseArgs(argv):
|
| - use_file = False
|
| - file_size = 0
|
| - device_path = ''
|
| - uimage_path = ''
|
| - rootfs_path = ''
|
| -
|
| - parser = OptionParser()
|
| - parser.add_option('-f', action='store', type='string', dest='filename')
|
| - parser.add_option('-s', action='store', type='string', dest='filesize')
|
| - parser.add_option('-d', action='store', type='string', dest='devname')
|
| - (options, args) = parser.parse_args()
|
| -
|
| - # check for valid arg presence
|
| - if len(args) != 2:
|
| - DieWithUsage(argv[0])
|
| - if (options.filename != None) != (options.filesize != None):
|
| - DieWithUsage(argv[0])
|
| - if not (bool((options.filename != None) and (options.filesize != None)) ^
|
| - bool(options.devname != None)):
|
| - DieWithUsage(argv[0])
|
| -
|
| - # check the device isn't a partition
|
| - if options.devname != None:
|
| - if (options.devname[-1] >= '0') and (options.devname[-1] <= '9'):
|
| - print 'Looks like you specified a partition device, rather than the ' \
|
| - 'entire device. try using -d',options.devname[:-1]
|
| - DieWithUsage(argv[0])
|
| -
|
| - # if size passed, parse size
|
| - if options.filesize != None:
|
| - file_size = ParseFilesize(options.filesize)
|
| - if file_size < 0:
|
| - DieWithUsage(argv[0])
|
| - if options.devname != None:
|
| - device_path = options.devname
|
| - if options.filename != None:
|
| - use_file = True
|
| - device_path = options.filename
|
| - uimage_path = args[0]
|
| - rootfs_path = args[1]
|
| -
|
| - # print args
|
| - if use_file:
|
| - print "file size:", file_size
|
| - print "dev path:", device_path
|
| - print "uimage:", uimage_path
|
| - print 'rootfs:', rootfs_path
|
| - return use_file, file_size, device_path, uimage_path, rootfs_path
|
| -
|
| -def CreateSparseFile(path, size):
|
| - fd = os.open(path, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, 0644)
|
| - if (fd < 0):
|
| - print 'os.open() failed'
|
| - exit(1)
|
| - os.ftruncate(fd, size)
|
| - os.close(fd)
|
| -
|
| -# creates the partion table with the first partition having enough
|
| -# space for the uimage, the second partition takingn the rest of the space
|
| -def CreatePartitions(uimage_path, device_path):
|
| - # get size of first partition in mebibytes
|
| - statinfo = os.stat(uimage_path)
|
| - first_part_size = int(math.ceil(statinfo.st_size / (1024.0 * 1024.0)) + 1)
|
| - System('echo -e ",' + str(first_part_size) \
|
| - + ',c,*\\n,,83,-" | sfdisk -uM \'' + device_path + '\'')
|
| -
|
| -# uses losetup to set up two loopback devices for the two partitions
|
| -# returns the two loopback device paths
|
| -def SetupLoopbackDevices(device_path):
|
| - sector_size = 512 # bytes
|
| - # get size of partitons
|
| - output = subprocess.Popen(['sfdisk', '-d', device_path],
|
| - stdout=subprocess.PIPE).communicate()[0]
|
| - m = re.search('start=\\s+(\\d+), size=\\s+(\\d+),.*?start=\\s+(\\d+), size=\\s+(\\d+),', output, re.DOTALL)
|
| - part1_start = long(m.group(1)) * sector_size
|
| - part1_size = long(m.group(2)) * sector_size
|
| - part2_start = long(m.group(3)) * sector_size
|
| - part2_size = long(m.group(4)) * sector_size
|
| - if part1_start < 1 or part1_size < 1 or part2_start < 1 or part2_size < 1:
|
| - print 'failed to read partition table'
|
| - sys.exit(1)
|
| - return SetupLoopbackDevice(device_path, part1_start, part1_size), \
|
| - SetupLoopbackDevice(device_path, part2_start, part2_size)
|
| -
|
| -# returns loopback device path
|
| -def SetupLoopbackDevice(path, start, size):
|
| - # get a device
|
| - device = subprocess.Popen(['losetup', '-f'],
|
| - stdout=subprocess.PIPE).communicate()[0].rstrip()
|
| - if device == '':
|
| - print 'can\'t get device'
|
| - sys.exit(1)
|
| - System('losetup -o ' + str(start) + ' --sizelimit ' + str(size) + ' ' + device + ' ' + path)
|
| - return device
|
| -
|
| -def DeleteLoopbackDevice(dev):
|
| - System('losetup -d ' + dev)
|
| -
|
| -def FormatDevices(first, second):
|
| - System('mkfs.msdos -F 32 ' + first)
|
| - System('mkfs.ext3 ' + second)
|
| -
|
| -# returns mounted paths
|
| -def MountFilesystems(paths):
|
| - i = 0
|
| - ret = []
|
| - for path in paths:
|
| - i = i + 1
|
| - mntpoint = 'mnt' + str(i)
|
| - System('mkdir ' + mntpoint)
|
| - System('mount ' + path + ' ' + mntpoint)
|
| - ret.append(mntpoint)
|
| - return ret
|
| -
|
| -def UnmountFilesystems(mntpoints):
|
| - for mntpoint in mntpoints:
|
| - System('umount ' + mntpoint)
|
| - os.rmdir(mntpoint)
|
| -
|
| -def System(cmd):
|
| - print 'system(' + cmd + ')'
|
| - p = subprocess.Popen(cmd, shell=True)
|
| - return os.waitpid(p.pid, 0)
|
| -
|
| -def main(argv):
|
| - (use_file, file_size, device_path, uimage_path, rootfs_path) = ParseArgs(argv)
|
| - if use_file:
|
| - CreateSparseFile(device_path, file_size)
|
| - CreatePartitions(uimage_path, device_path)
|
| - if use_file:
|
| - (dev1, dev2) = SetupLoopbackDevices(device_path)
|
| - else:
|
| - dev1 = device_path + '1'
|
| - dev2 = device_path + '2'
|
| -
|
| - FormatDevices(dev1, dev2)
|
| - (mnt1, mnt2) = MountFilesystems([dev1, dev2])
|
| -
|
| - # copy data in
|
| - shutil.copy(uimage_path, mnt1 + '/uImage')
|
| - System('tar xzpf ' + rootfs_path + ' -C ' + mnt2)
|
| -
|
| - UnmountFilesystems([mnt1, mnt2])
|
| -
|
| - if use_file:
|
| - DeleteLoopbackDevice(dev1)
|
| - DeleteLoopbackDevice(dev2)
|
| - print 'all done!'
|
| - if use_file:
|
| - print 'you may want to run dd if=' + device_path + ' of=/some/device bs=4M'
|
| -
|
| -if __name__ == '__main__':
|
| - main(sys.argv)
|
|
|