From patchwork Sat May 26 22:45:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Artem Blagodarenko X-Patchwork-Id: 921015 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="V0h/P9jG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40tdX73tcyz9s2L for ; Sun, 27 May 2018 08:46:31 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1032474AbeEZWqa (ORCPT ); Sat, 26 May 2018 18:46:30 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:32921 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1032422AbeEZWq1 (ORCPT ); Sat, 26 May 2018 18:46:27 -0400 Received: by mail-wr0-f194.google.com with SMTP id a15-v6so14666570wrm.0 for ; Sat, 26 May 2018 15:46:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=QeogSGZCYi5es4Km2Ip8F3RFpk18hECPv1+hPOU+wPA=; b=V0h/P9jGGYrCpwYiJmG3dAZzGdSS720HVyaxk8J7OSAOCsDHUA6X0EgFZFA8Zj67er OhZJLnREQGDtm2XnIU19KPUzKpJK34aJvm1IqjokXQZs3xx/NDaUvqE6S89jrHo109vq rZ6VZD6rMrhYkW89eUpejW6+7HaBLdEZGCtcGS8KZnQTy6doCKMwjhcD31k8P6gkn8C0 gVvNBc4DJNUboxx7QS99WSyx+L5HvX+3GptJkmmCDWd7zRudlajDiZKWdJ7jUyI0uTp5 y1SpaR230Zhy4cG7/bvC5/jj8+TlROzlb2W6qpJPBFVCcLkCzvCBJ+gvwlKO7BEYw3og feKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=QeogSGZCYi5es4Km2Ip8F3RFpk18hECPv1+hPOU+wPA=; b=fiydJj6/DaxIJh2UOnatu8HG9OR9ItwZIZm2sK9EotZmLGOpNg2/3aBbzKlCmz6CWX 2ZA+nb0eQ09Wmp1ZH/iCy0BDg+OgG4M3InzpCzVl9PcgHiJTn7NZ2Gnx00a77sS4UlHE MgiBJ/s0MVIB9j85YxP1oMAH1cuWrQ7ZS/5Da7cdzTEAFRWElj+ym6IcPH2EYzeSikhr laoH2GYyt68H1wucdoTOchejsZu+Hpy52v+TGgtJtg4yIUUrJVohDsLboKMB0ACwJ6Ix yE+Gt8PPkHXnLil6LYBaZv5CydDKvhPx4Y+n1NO++2ik4+EaPWZglJJwZqebfiqzxbRe iGQw== X-Gm-Message-State: ALKqPwd8OgcNk9LCZ7SozqObJtogXSvspjG5G6JLrnbJbI45TSnsQjOZ 3Jkz2ojIY5T50KhAZJF9dmPU5A== X-Google-Smtp-Source: ADUXVKKUfvscCEEiS9r1DEaTEWhcrQmt2+GXNVegbGSp6MFI6PuBwo+l3IR+o5aI9ouamT4oqwIrUQ== X-Received: by 2002:a19:6387:: with SMTP id v7-v6mr4278306lfi.74.1527374786415; Sat, 26 May 2018 15:46:26 -0700 (PDT) Received: from C02TN4C6HTD6.lan ([91.105.193.141]) by smtp.gmail.com with ESMTPSA id c6-v6sm5029610lja.22.2018.05.26.15.46.25 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 26 May 2018 15:46:26 -0700 (PDT) From: Artem Blagodarenko To: linux-ext4@vger.kernel.org Subject: [PATCH v5 2/4] e2image: add -b and -B options to use supperblock backup Date: Sun, 27 May 2018 01:45:58 +0300 Message-Id: <20180526224600.46905-3-artem.blagodarenko@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180526224600.46905-1-artem.blagodarenko@gmail.com> References: <20180526224600.46905-1-artem.blagodarenko@gmail.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org e2image has no ability to use superblock backup to copy metadata. This feature can be useful if someone wants to make partition image and fix it using e2fsck utility. New -b option allows to pass superblock number, like e2fsck utility do. e2image doesn't change primary superblock and store is as is, so it can be fixed using e2fsck latter. Option -B allows to set superblock size. Signed-off-by: Artem Blagodarenko Reviewed-by: Andreas Dilger --- misc/e2image.8.in | 33 +++++++++++++++++++++++++++++++++ misc/e2image.c | 43 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/misc/e2image.8.in b/misc/e2image.8.in index a7bfdf24..bbbb57ae 100644 --- a/misc/e2image.8.in +++ b/misc/e2image.8.in @@ -12,6 +12,15 @@ e2image \- Save critical ext2/ext3/ext4 filesystem metadata to a file ] [ .B \-f +.B \-b +.I superblock +] +[ +.B \-B +.I blocksize +] +[ +.B \-fr ] .I device .I image-file @@ -167,6 +176,22 @@ the option will prevent analysis of problems related to hash-tree indexed directories. .PP +Option +.B \-b +.I superblock +can be used to get image from partition with broken primary superblock. +The partition is copied as-is including broken primary superblock. +.PP +Option +.B \-B +.I blocksize +can be used to set superblock block size. Normally, e2fsck will search +for the superblock at various different block sizes in an attempt to find +the appropriate blocksize. This search can be fooled in some cases. This +option forces e2fsck to only try locating the superblock at a particular +blocksize. If the superblock is not found, e2fsck will terminate with a +fatal error. +.PP Note that this will work even if you substitute "/dev/hda1" for another raw disk image, or QCOW2 image previously created by .BR e2image . @@ -217,6 +242,14 @@ This can be useful to write a qcow2 image containing all data to a sparse image file where it can be loop mounted, or to a disk partition. Note that this may not work with qcow2 images not generated by e2image. .PP +Options +.B \-b +.I superblock +and +.B \-B +.I blocksize +can be used same way as for raw images. +.PP .SH INCLUDING DATA Normally .B e2image diff --git a/misc/e2image.c b/misc/e2image.c index 83ae6335..727e3876 100644 --- a/misc/e2image.c +++ b/misc/e2image.c @@ -104,7 +104,8 @@ static int get_bits_from_size(size_t size) static void usage(void) { - fprintf(stderr, _("Usage: %s [ -r|Q ] [ -f ] device image-file\n"), + fprintf(stderr, _("Usage: %s [ -r|Q ] [ -f ] [ -b superblock ] [ -B blocksize]" + "[ -fr ] device image-file\n"), program_name); fprintf(stderr, _(" %s -I device image-file\n"), program_name); fprintf(stderr, _(" %s -ra [ -cfnp ] [ -o src_offset ] " @@ -1256,7 +1257,8 @@ static void output_qcow2_meta_data_blocks(ext2_filsys fs, int fd) free_qcow2_image(img); } -static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags) +static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags, + blk64_t superblock) { struct process_block_struct pb; struct ext2_inode inode; @@ -1284,6 +1286,22 @@ static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags) } } + if (superblock) { + int j; + + ext2fs_mark_block_bitmap2(meta_block_map, superblock); + meta_blocks_count++; + + /* + * Mark the backup superblock descriptors + */ + for (j = 0; j < fs->desc_blocks; j++) { + ext2fs_mark_block_bitmap2(meta_block_map, + ext2fs_descriptor_block_loc2(fs, superblock, j)); + } + meta_blocks_count += fs->desc_blocks; + } + mark_table_blocks(fs); if (show_progress) fprintf(stderr, "%s", _("Scanning inodes...\n")); @@ -1463,6 +1481,8 @@ int main (int argc, char ** argv) int ignore_rw_mount = 0; int check = 0; struct stat st; + blk64_t superblock = 0; + int blocksize = 0; #ifdef ENABLE_NLS setlocale(LC_MESSAGES, ""); @@ -1476,8 +1496,14 @@ int main (int argc, char ** argv) if (argc && *argv) program_name = *argv; add_error_table(&et_ext2_error_table); - while ((c = getopt(argc, argv, "nrsIQafo:O:pc")) != EOF) + while ((c = getopt(argc, argv, "b:B:nrsIQafo:O:pc")) != EOF) switch (c) { + case 'b': + superblock = strtoull(optarg, NULL, 0); + break; + case 'B': + blocksize = strtoul(optarg, NULL, 0); + break; case 'I': flags |= E2IMAGE_INSTALL_FLAG; break; @@ -1529,6 +1555,11 @@ int main (int argc, char ** argv) "with raw or QCOW2 images.")); exit(1); } + if (superblock && !img_type) { + com_err(program_name, 0, "%s", _("-b option can only be used " + "with raw or QCOW2 images.")); + exit(1); + } if ((source_offset || dest_offset) && img_type != E2IMAGE_RAW) { com_err(program_name, 0, "%s", _("Offsets are only allowed with raw images.")); @@ -1579,8 +1610,8 @@ int main (int argc, char ** argv) } } sprintf(offset_opt, "offset=%llu", source_offset); - retval = ext2fs_open2(device_name, offset_opt, open_flag, 0, 0, - unix_io_manager, &fs); + retval = ext2fs_open2(device_name, offset_opt, open_flag, + superblock, blocksize, unix_io_manager, &fs); if (retval) { com_err (program_name, retval, _("while trying to open %s"), device_name); @@ -1665,7 +1696,7 @@ skip_device: exit(1); } if (img_type) - write_raw_image_file(fs, fd, img_type, flags); + write_raw_image_file(fs, fd, img_type, flags, superblock); else write_image_file(fs, fd);