Hello Sharukh! 

First of all this is nothing ddrescue itself supports programmatically. It is 
completely agnostic to partition tables, metadata, filesystems etc., operating 
strictly on (mostly raw) block devices. 

So taking care of all that is not a question of bugs or features, but of the 
adequate usage of ddrescue. However, since this „bug“ mailing list 
traditionally also serves as a user support group to some extent, I’ll give you 
my ideas for your workflow. 

How about working on the partition level instead of whole drive? That means you 
would have to prepare your destination drive beforehand to be a GPT drive with 
suitable placeholder partitions (of the correct size, type and label) to 
receive the partition(s) you’d like to clone. Then you proceed like you did 
before, just with partition device identifiers, so e.g.
    ddrescue -f /dev/sda3 /dev/sdb2 mapfile

If that method will also work (like in your example B, using -s) to clone to a 
smaller partition, is entirely dependent on the filesystem that resides in the 
partition. 

Greetings, Florian 

Am 13.04.2025 um 07:49 schrieb Shahrukh Merchant 
<shahr...@shahrukhmerchant.com>:

I've been using ddrescue to clone MBR hard drives for many many years, even 
when the source and destination drives are of different sizes. This has been 
rather trivial in the case of MBR drives:

A. If destination drive capacity > source drive capacity
    ddrescue -f /dev/sda /dev/sdb mapfile
i.e., nothing special to be done and any extra space on the destination drive 
is just unallocated and can be used to expand the last partition or create a 
new one with standard disk management tools on Windows or Linux.

B. If destination drive capacity < source drive capacity (of course the 
allocated partitions still must fit within the destination drive, with 
unallocated sectors at the end, which occurs quite frequently in my use cases)
    ddrescue -f -s12345678s /dev/sda /dev/sdb mapfile
where one would use "fdisk -l" to determine the last-used sector of the last 
partition to use with the -s option (after adding 1)

The problem I now have is with GPT drives (I resisted crossing the 2 TiB 
threshold till now ...) which have several sectors of backup partition table 
and other information at the very END of the disk as well as the beginning 
(regardless of unallocated space in between). So my approach above needs to be 
augmented to take into account this additional structural information stored 
not only at the very start of the disk as in the case of MBR drives, but also 
at the very end. How would I need to adjust my ddrescue commands to take this 
into account? Specifically:

1. What command can I use to get the sector number and size of the position of 
the secondary GPT header at the end of the disk?
2. Is there any other structure information scattered elsewhere on the drive 
(i.e., other than at the very beginning and the very end) that would complicate 
this even more?
3. How would I modify my simple 1-liner ddrescue flow (to presumably multiple 
invocations) to copy all the relevant parts and have a clean GPT drive at the 
end of my cloning operation in the case where the disks are not EXACTLY the 
same size?
4. Another more subtle problem: There is also a protective MBR on a GPT drive 
that makes the entire drive look like a single partition fully allocated disk, 
and this would also need adjustment of the faked partition size if the 
destination drive is larger or smaller than the source drive; so where and how 
would that adjustment need to be made?

More fundamentally, I'm actually surprised that this hasn't come up before 
since GPT drives have been around for a while now and I would imagine that 
rescuing or cloning to a drive that is larger than the original would be a 
frequent occurrence. For the purely cloning application perhaps there are other 
tools that take care of this, but they typically aren't doing any rescuing. And 
even though the end result would be useable since the primary GPT header and 
partition information would still be intact, the secondary header/partition 
info blocks would indeed be corrupted.

I believe gdisk will fix this corruption both by recreating the secondary 
end-of-disk partition information and fixing the protective MBR info, but this 
is not self-evident and it seems anecdotally that many tools including gparted 
will choke on the mismatch and not recognize any partitions, which would cause 
unnecessary anguish when in fact the disk might indeed be entirely useable.

Perhaps a new option for ddrescue is called for here? A 
"GPT-fix-unequal-source-vs-destination-size" option? Which of course would only 
apply in the case of a complete disk copy (i.e., not a partition copy, which 
wouldn't have this problem).

Shahrukh Merchant


Reply via email to