diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2012-03-23 14:46:14 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2012-03-23 14:46:14 +0000 |
commit | 2987b637a787cb12a345e4f33bd7c47dd5e54e64 (patch) | |
tree | 5182a8af19db608444b108bc5ca2a4c0bba2fd44 /morphlib/fsutils.py | |
parent | 336177cd946a89a791c487fd20fb521f69da1156 (diff) | |
download | morph-2987b637a787cb12a345e4f33bd7c47dd5e54e64.tar.gz |
morphlib: move filesystem stuff out of builder
The system images will later need to be read, so useful commands
want to be shared
Diffstat (limited to 'morphlib/fsutils.py')
-rw-r--r-- | morphlib/fsutils.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/morphlib/fsutils.py b/morphlib/fsutils.py new file mode 100644 index 00000000..081ce0e8 --- /dev/null +++ b/morphlib/fsutils.py @@ -0,0 +1,70 @@ +# Copyright (C) 2012 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +def create_image(ex, image_name, size): + # FIXME a pure python implementation may be better + self.ex.runv(['dd', 'if=/dev/zero', 'of=' + image_name, 'bs=1', + 'seek=%d' % size, 'count=0']) + +def partition_image(ex, image_name): + # FIXME make this more flexible with partitioning options + ex.runv(['sfdisk', image_name], feed_stdin='1,,83,*\n') + +def install_mbr(ex, image_name): + for path in ['/usr/lib/extlinux/mbr.bin', + '/usr/share/syslinux/mbr.bin']: + if os.path.exists(path): + self.ex.runv(['dd', 'if=' + path, 'of=' + image_name, + 'conv=notrunc']) + break + +def setup_device_mapping(ex, image_name): + out = ex.runv(['sfdisk', '-d', image_name]) + for line in out.splitlines(): + words = line.split() + if (len(words) >= 4 and + words[2] == 'start=' and + words[3] != '0,'): + n = int(words[3][:-1]) # skip trailing comma + start = n * 512 + break + + ex.runv(['losetup', '-o', str(start), '-f', image_name]) + + out = ex.runv(['losetup', '-j', image_name]) + line = out.strip() + i = line.find(':') + return line[:i] + +def create_fs(ex, partition): + # FIXME: the hardcoded size of 4GB is icky but the default broke + # when we used mkfs -t ext4 + ex.runv(['mkfs', '-t', 'btrfs', '-L', 'baserock', + '-b', '4294967296', partition]) + +def mount(ex, partition, mount_point): + os.mkdir(mount_point) + self.ex.runv(['mount', partition, mount_point]) + +def unmount(ex, mount_point): + ex.runv(['umount', mount_point]) + +def undo_device_mapping(ex, image_name) + out = ex.runv(['losetup', '-j', image_name]) + for line in out.splitlines(): + i = line.find(':') + device = line[:i] + ex.runv(['losetup', '-d', device]) |