diff --git a/elbepack/fstab.py b/elbepack/fstab.py index dc061d321..6cee0d163 100644 --- a/elbepack/fstab.py +++ b/elbepack/fstab.py @@ -155,3 +155,25 @@ def get_label_opt(self): if self.fstype == 'f2fs': return '-l ' + self.label return '' + + def mkfs(self, loopdev, filesystem_tree): + mkfs_fs_copy_argument_dict = { + 'ext2': f'-d {filesystem_tree}', + 'ext3': f'-d {filesystem_tree}', + 'ext4': f'-d {filesystem_tree}', + 'btrfs': f'-r {filesystem_tree}', + 'xfs': f'-p {filesystem_tree}' + } + mkfs_fs_copy_extra_cmd_dict = {'f2fs': f'sload.f2fs -f {filesystem_tree} {loopdev}'} + mkfs_supports_fs_copy = self.fstype in mkfs_fs_copy_argument_dict or \ + self.fstype in mkfs_fs_copy_extra_cmd_dict + + mkfs_fs_copy_argument = mkfs_fs_copy_argument_dict.get(self.fstype, '') + do( + f'mkfs.{self.fstype} {" ".join(self.mkfsopts)} {self.get_label_opt()} ' + f'{mkfs_fs_copy_argument} ' + f'{loopdev}') + if self.fstype in mkfs_fs_copy_extra_cmd_dict: + do(mkfs_fs_copy_extra_cmd_dict[self.fstype]) + + return not mkfs_supports_fs_copy diff --git a/elbepack/hdimg.py b/elbepack/hdimg.py index cde64a25d..f76e04c32 100644 --- a/elbepack/hdimg.py +++ b/elbepack/hdimg.py @@ -304,21 +304,18 @@ def create_label(disk, part, ppart, fslabel, target, grub): grub.add_fs_entry(entry) with entry.losetup() as loopdev: - do( - f'mkfs.{entry.fstype} {" ".join(entry.mkfsopts)} {entry.get_label_opt()} ' - f'{loopdev}') + filesystem_tree = os.path.join(target, 'filesystems', entry.id) + '/.' + needs_cp = entry.mkfs(loopdev, filesystem_tree) _execute_fs_commands(entry.fs_device_commands, dict(device=loopdev)) mount_path = Path(target, 'imagemnt') - with mount(loopdev, mount_path, options=entry.options, force_writable=True): - _execute_fs_commands(entry.fs_path_commands, dict(path=mount_path)) - do([ - 'cp', '-a', - os.path.join(target, 'filesystems', entry.id) + '/.', - str(mount_path) + '/', - ]) + if entry.fs_path_commands or needs_cp: + with mount(loopdev, mount_path, options=entry.options, force_writable=True): + _execute_fs_commands(entry.fs_path_commands, dict(path=mount_path)) + if needs_cp: + do(['cp', '-a', filesystem_tree, str(mount_path) + '/']) return ppart