Linux EXT4 FS development
 help / color / mirror / Atom feed
From: Goswin von Brederlow <goswin-v-b@web.de>
To: Theodore Tso <tytso@mit.edu>
Cc: Vineet Agarwal <checkout.vineet@gmail.com>,
	rishi agrawal <postrishi@gmail.com>,
	linux-ext4@vger.kernel.org, listar@nl.linux.org
Subject: Re: merging of two file system
Date: Thu, 07 Aug 2008 14:33:20 +0200	[thread overview]
Message-ID: <87y73957jj.fsf@frosties.localdomain> (raw)
In-Reply-To: <20080728200439.GL9378@mit.edu> (Theodore Tso's message of "Mon, 28 Jul 2008 16:04:39 -0400")

Theodore Tso <tytso@mit.edu> writes:

> On Tue, Jul 29, 2008 at 12:41:25AM +0530, Vineet Agarwal wrote:
>> yeah i meant that we have to separate filesystems,
>> stored for example on /dev/hda1 and /dev/hda2, and we want to combine
>> the data in the two filesystems into a single filesystem /dev/hda3, or
>> combining the contents of /dev/hda2 so that it is also in /dev/hda1
>> 
>> so is there any mechanism exist to do so either online or offline . please help
>
> There is no direct way to do this.
>
> How big are the filesystems involved?  The standard and easist way to
> do this would be to copy /dev/hda2 to another device, then if
> /dev/hda1 was created with on-line resizing inode, expanding /dev/hda1
> to fill the space taken by /dev/hda2, and then simply use "cp" to copy
> the contents that had previously been in /dev/hda2 into the filesystem
> on /dev/hda1.

Or if you have no extra disk but some free space you can copy as much
as possible to hda1, shrink hda2, move hda2, grow hda1, repeat.

At which point you really start to wish you had used LVM in the first
place.

> In theory it would be possible to write a program would take to
> adjacent filesystems, and map out where the blocks would be once the
> two partitions were combined, and then relocate blocks to make a
> single filesystem.  No one has done such a thing, however, for any
> filesytem.  It is definitely not a trivial thing to do, but it is not
> impossible; it's not that different from some of what an off-line
> resize2fs operations does, albeit maybe 3-4 times more complex.
>
> The main thing is that no one has ever taken the time to do such a
> thing, because except for truly large filesystems, it's cheaper just
> to get an extra disk drive, and just copy the contents off, and then
> recreate the filesystem.

I've started such a thing. Not specifically for merging 2 filesystem
but for changing from one filesystem to another. Actually I did it
even more generic by attacking the problem at the block devie layer.
The method was this:

1) Convert the physical block device into a sparse device
   - Copy the first few blocks to a safe place
   - Map the first few blocks to the safe place and the rest to the
     physical device
   - Fill the old filesystem with zero (this frees the blocks from the
     mapping and creates empty space)
2) Create a 2nd sparse device (fully empty)
3) successivley move files from old to new and write more zeroes to
   old (this allocates free blocks to the 2nd device as data gets
   written and frees blocks from the 1st devcie as zeroes are written)
4) Destroy empty 1st device
5) Convert sparse 2nd device to physical
   - Move first few virtual blocks to safe place
   - Defragment all other blocks so virtual == physical
   - move blocks from safe palce to physical overwriting the sparse
     device metadata

The safe palce is used as extra storage when the physical device has
not enough blocks and to store recovery state infos. With enough free
space on the FS only a few MB are needed.


I used this to convert from xfs to ext3 but then run into a bug during
defragmenting and had to restore from backup. As I used ext3 to
restore to I had no need for this anymore so I never finished it.

MfG
        Goswin

  reply	other threads:[~2008-08-07 12:33 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-27 16:05 merging of two file system Vineet Agarwal
2008-07-27 22:52 ` Theodore Tso
2008-07-28 18:59   ` SandeepKsinha
     [not found]   ` <5feb302e0807281147y7362a227kb7d37d713be05296@mail.gmail.com>
2008-07-28 19:11     ` Vineet Agarwal
2008-07-28 20:04       ` Theodore Tso
2008-08-07 12:33         ` Goswin von Brederlow [this message]
2008-08-08  5:47           ` Vineet Agarwal
2008-07-27 23:19 ` Shehjar Tikoo
2008-08-07 12:12   ` Goswin von Brederlow
  -- strict thread matches above, loose matches on Subject: below --
2008-07-27 11:18 Vineet Agarwal
2008-07-27 22:51 ` Theodore Tso

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87y73957jj.fsf@frosties.localdomain \
    --to=goswin-v-b@web.de \
    --cc=checkout.vineet@gmail.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=listar@nl.linux.org \
    --cc=postrishi@gmail.com \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox