1# SPDX-License-Identifier: GPL-2.0+ 2# 3# Copyright (c) 2018, Linaro Limited 4# Author: Takahiro Akashi <takahiro.akashi@linaro.org> 5 6"""Helper functions for dealing with filesystems""" 7 8import re 9import os 10from subprocess import call, check_call, check_output, CalledProcessError 11 12def mk_fs(config, fs_type, size, prefix, size_gran = 0x100000): 13 """Create a file system volume 14 15 Args: 16 config (u_boot_config): U-Boot configuration 17 fs_type (str): File system type, e.g. 'ext4' 18 size (int): Size of file system in bytes 19 prefix (str): Prefix string of volume's file name 20 size_gran (int): Size granularity of file system image in bytes 21 22 Raises: 23 CalledProcessError: if any error occurs when creating the filesystem 24 """ 25 fs_img = f'{prefix}.{fs_type}.img' 26 fs_img = os.path.join(config.persistent_data_dir, fs_img) 27 28 if fs_type == 'fat12': 29 mkfs_opt = '-F 12' 30 elif fs_type == 'fat16': 31 mkfs_opt = '-F 16' 32 elif fs_type == 'fat32': 33 mkfs_opt = '-F 32' 34 else: 35 mkfs_opt = '' 36 37 if re.match('fat', fs_type): 38 fs_lnxtype = 'vfat' 39 else: 40 fs_lnxtype = fs_type 41 42 count = (size + size_gran - 1) // size_gran 43 44 # Some distributions do not add /sbin to the default PATH, where mkfs lives 45 if '/sbin' not in os.environ["PATH"].split(os.pathsep): 46 os.environ["PATH"] += os.pathsep + '/sbin' 47 48 try: 49 check_call(f'rm -f {fs_img}', shell=True) 50 check_call(f'dd if=/dev/zero of={fs_img} bs={size_gran} count={count}', 51 shell=True) 52 check_call(f'mkfs.{fs_lnxtype} {mkfs_opt} {fs_img}', shell=True) 53 if fs_type == 'ext4': 54 sb_content = check_output(f'tune2fs -l {fs_img}', 55 shell=True).decode() 56 if 'metadata_csum' in sb_content: 57 check_call(f'tune2fs -O ^metadata_csum {fs_img}', shell=True) 58 return fs_img 59 except CalledProcessError: 60 call(f'rm -f {fs_img}', shell=True) 61 raise 62 63# Just for trying out 64if __name__ == "__main__": 65 import collections 66 67 CNF= collections.namedtuple('config', 'persistent_data_dir') 68 69 mk_fs(CNF('.'), 'ext4', 0x1000000, 'pref') 70