diff options
author | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2015-02-26 16:42:28 +0000 |
---|---|---|
committer | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2015-02-26 16:42:28 +0000 |
commit | 296bec411f9fb25491e081dba3e7ff801e5fd40e (patch) | |
tree | a47691034421e5c22e34690bf39ed9549ed187ca | |
parent | f5163dd418e342fe6e5fb18625828076130a5e57 (diff) | |
download | morph-296bec411f9fb25491e081dba3e7ff801e5fd40e.tar.gz |
Fix Morph producing unbootable systems
Since the version of btrfs-progs in the Baserock reference system
definitions was updated to v3.18.2, Morph has produced unbootable
x86 systems. This is down to lack of support for new Btrfs features
in SYSLINUX.
This patch disables the new features so that deployed systems will boot.
Although I generally don't want to have compatibility code in Morph,
this patch keeps support for the old mkfs.btrfs (which doesn't support
the commandline options that we need to pass to new mkfs.btrfs). This
will hopefully save people from suffering 'I need to use new Morph to
upgrade my devel system, but new Morph doesn't run on my devel system'.
-rw-r--r-- | morphlib/writeexts.py | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/morphlib/writeexts.py b/morphlib/writeexts.py index 6ab2dd55..ad4fabe9 100644 --- a/morphlib/writeexts.py +++ b/morphlib/writeexts.py @@ -237,8 +237,32 @@ class WriteExtension(cliapp.Application): def mkfs_btrfs(self, location): '''Create a btrfs filesystem on the disk.''' + self.status(msg='Creating btrfs filesystem') - cliapp.runcmd(['mkfs.btrfs', '-f', '-L', 'baserock', location]) + try: + # The following command disables some new filesystem features. We + # need to do this because at the time of writing, SYSLINUX has not + # been updated to understand these new features and will fail to + # boot if the kernel is on a filesystem where they are enabled. + cliapp.runcmd( + ['mkfs.btrfs','-f', '-L', 'baserock', + '--features', '^extref', + '--features', '^skinny-metadata', + '--features', '^mixed-bg', + '--nodesize', '4096', + location]) + except cliapp.AppException as e: + if 'unrecognized option \'--features\'' in e.msg: + # Old versions of mkfs.btrfs (including v0.20, present in many + # Baserock releases) don't support the --features option, but + # also don't enable the new features by default. So we can + # still create a bootable system in this situation. + logging.debug( + 'Assuming mkfs.btrfs failure was because the tool is too ' + 'old to have --features flag.') + cliapp.runcmd(['mkfs.btrfs','-f', '-L', 'baserock', location]) + else: + raise def get_uuid(self, location): '''Get the UUID of a block device's file system.''' |