Not only do hard drives hold your
programs and data, but they fill up and run out of free space sooner
than you would like. When this happens, it's time to
buy a larger hard drive and migrate the system. While there are many
different ways to copy files from one hard drive to another, some
work better than others when transferring the full
/ directory. This hack outlines a method to
transfer full systems and partitions from one machine to another.
Why This Can Be Complicated
When
you copy a full Linux system from one partition to another, there are
a few issues you need to consider:
- Preserve permissions
If your files aren't owned by the same people and
have the same permissions, your new system probably does not run as
expected.
- Properly handle special files
Certain methods of copying a system don't properly
handle the /dev and /proc
filesystems. As a result, you boot on the new drive only to find you
have no device entries listed.
- Span filesystems
When you copy one filesystem to another, especially the root
filesystem, you don't want to span across
filesystems. For example, if you have a new hard drive mounted at
/mnt/temp and you recursively copy
/ to /mnt/temp and allow
filesystem spanning, you could end up with
/mnt/temp copied into
/mnt/temp/mnt/temp and
/mnt/temp/mnt/temp copied to
/mnt/temp/mnt/temp/mnt/temp (not to mention the
rest of the filesystem you have copied to
/mnt/temp). To avoid this, most copy programs
have an option to copy only the mounted filesystem it is started from
without continuing to other mounted filesystems.
Knoppix removes some of these complications. For instance, if you are
booting on top of a system, you no longer have to worry about whether
the copy method spans filesystems, because each filesystem is mounted
under /mnt only when you choose to mount it.
What to Do
The best method to copy the / filesystem
combines
find
with
cpio
(both are utilities that are standard on any Linux distribution,
including Knoppix). This example transfers a Linux installation from
a single-root partition on /dev/hda1 to
/dev/hdb1, which is a freshly formatted
partition that becomes the new root partition:
knoppix@tty0[knoppix] sudo mount /mnt/hda1
knoppix@tty0[knoppix] sudo mount -o rw /mnt/hdb1
knoppix@tty0[knoppix] cd /mnt/hda1
knoppix@tty0[hda1] sudo sh -c "find ./ -xdev -print0 | cpio -pa0V /mnt/hdb1"
This example uses /mnt/hda1 and
/mnt/hdb1, but you should change those
values to the two partitions you are using. When you run this
command, it recursively copies everything on the
/mnt/hda1 filesystem, without crossing over into
other mounted partitions. It properly handles any special files, and
it completely preserves permissions. For each file that is copied,
this command prints out a single dot to the screen, so you get a
sense of the progress. If you want more specific information on the
progress, use the watch command in a different
terminal:
knoppix@tty0[knoppix] watch df
The watchcommand runs df
every two seconds and allows you to compare the used and available
space on both the old and new partitions.
If you have other filesystems mounted on other partitions, you simply
repeat the command and replace hda1 and
hdb1 with the new partitions you want to
copy from and migrate to, respectively.
After the partitions have been migrated, edit the
/etc/fstab file on the new partition if any
partition numbers have changed. Remember to change
/etc/fstab entries to reflect the partition
letters the new drive has once it is moved to its final bus location,
not the partition letter it is currently assigned.
You must also restore the boot loader to the new partition. Follow
the steps in or , depending
on your boot loader. Once the boot loader is restored, halt the
machine, swap the old drive with the new drive, and boot the machine
from the new partition and make sure everything has copied over
correctly before wiping the old drive and using it for something
else.
I have used this method to copy numerous systems from one drive to
another, to transfer to a larger partition or a new filesystem, and
even to move to software RAID5 (and back). While the options passed
to find and cpio seem
daunting at first, I have found this command so useful that it has
become engrained in my memory. I usually run this command directly
from the system being copied in single-user mode, but
it's not necessary. When you use Knoppix, you also
don't have to worry about whether files have changed
since you started copying them. In addition, while the files are
copying, you can browse the Web or play games if watching
df output bores you.
is done lilo or grub need to be re-installed on
the MBR.
In my case it was lilo and before it you have to
be aware that you have to run it in chroot
environment for it to work. In practice you would
do at as Follow:
#Chroot /mnt/newroot (where newroot is the root
partition of the new disk mounted under /mnt/newroot)
Lilo -v
Or even easier
Lilo -v -r /mnt/newroot (which changes to /mnt/newroot before running lilo)
Howeve running lilo in either way would always
come up with the error message:
"Fatal: open /dev/had: permission denied"
Trawling google I found the following:
>I'm not sure, but thought knoppix would mount partitions with nodev, so
> chrooting and running lilo will fail, since the devices are not
> accesable.
And that's the main problem. If you mount your
"newroot" partition by doing:
#mount /mnt/newroot
This will mount "newroot" with default knoppix options which include "nodev"
Issuing "mount" will confirm that your /mnt/newroot will confirm if the partition
has been mounted with or without the "nodev" option.
What you have to do is:
#mount /dev/hdaX /mnt/newroot (whrere X is the partition number referencing of the root partition)
Surely enough, doing:
Lilo -v -r /mnt/newroot
Now worked