Q: How to move filesystems (including root and boot) from one drive to another
Philip Prindeville
philipp_subx at redfish-solutions.com
Sat Apr 25 01:07:24 UTC 2009
Mikkel L. Ellertson wrote:
> Philip Prindeville wrote:
>
>> I recently decided that my build server was running too slow (disk
>> bound) and went out and bought a 3ware 9650SE controller and disks.
>>
>> Got the array configured as a single RAID 5 logical unit (yes, I know,
>> RAID 5 has slow writes...) and ran fdisk on the unit to create partitions.
>>
>> I formatted the partitions...
>>
>> I mounted each of the partitions and did the following:
>>
>> # cd /old-fs-mnt-point
>> # find . -depth -mount -print0 | cpio --null -pdv /new-fs-mnt-point
>>
>> then I ran:
>>
>> # mkswap ...
>> # hal-device | less
>>
>> to get the UUID's. I edited the new /boot/grub/grub.conf and /etc/fstab
>> and rebooted. Oops. Didn't quite work. Needed to change the BIOS
>> drive assignment order so that the array was now /dev/sda.
>>
>> Rebooted.
>>
>>
> You also have to tell Grub about the BIOS drive changes. Grub use
> the BIOS to access the drives. The first stage is dumb, and only
> know the physical location of stage 1.5, and if you change the BIOS
> ordering, it looks on the wrong drive.
>
>
>> System hung: forgot to install the boot blocks.
>>
>> Hmmm... Tried to run "install-grub /dev/sda" from the Live CD, but that
>> didn't work. Something about not being able to figure out the BIOS
>> drive number... don't understand why that's relevant, but that's a
>> different story...
>>
>>
> Grub uses the BIOS to access the hard drive. So you need to know the
> BIOS number of the drive as Grub will see it. This may not be the
> same numbering as when you boot from a CD/DVD.
>
>
>> So I reran the installer, using a small partition that I had left for
>> whatever... and it wrote the boot blocks and MBR.
>>
>> Editted /boot/grub/grub.conf to change back the default to what I
>> wanted... and rebooted.
>>
>> Now the system hangs at:
>>
>> Red Hat nash version 6.0.52 starting
>> Unable to access resume device (/dev/sda3)
>> mount: error mounting /dev/root on /sysroot as ext3: No such file or
>> directory
>> setuproot: moving /dev failed: No such file or directory
>> setuproot: error mounting /proc: No such file or directory
>> setuproot: error mounting /sys: No such file or directory
>> Mount failed for selinuxfs: on /selinux: No such file or directory
>> switchroot: mount failed: No such file or directory
>>
>>
>>
>> This is FC9 (updated) x86_64 on a Phenom/NVidia MB.
>>
>> What have I forgotten?
>>
>>
> You need to rebuild the initrd.
>
>
>> Moving filesystems used to be a lot easier (these are plain ol' ext3
>> filesystems... I'm not using LVM)... and I thought the whole UUID
>> support was to simplify moving drives around, etc.
>>
>> Doesn't seem to be the case. (Ah, for the days when just about
>> everything that caused a booting system to hang was pretty much
>> self-evident and transparent...)
>>
>> There's a certain amount of tweaking I've done of the configuration, the
>> rpm's I've installed, accounts created, kernel variables that I tune...
>> it's kind of painful to have to do a reinstall from scratch.
>>
>> Also, I wanted to peek inside the initrd.*.img files and see if there
>> was anything in there choking up... but I couldn't figure out how to
>> mount them as loopback filesystems.
>>
>> Any revelation of these mysteries appreciated.
>>
>> -Philip
>>
>>
> One problem with changing the root file system to a drive on a
> different controller is that the driver may not be in the initrd, so
> the kernel can not access the drive. This is inherent with building
> a kernel with all the driver controllers as modules. But with all
> the different controllers, the only other way to handle it would be
> to have a much larger kernel with lots of unneeded drivers build in,
> or have a initrd with all the drivers. Both would wast a lot of memory.
>
> One other thing you are going to run into if you use SELinux is the
> the new drive is going to have the wrong contexts. You are going to
> have to relabel the files.
>
> Mikkel
>
And as I found out late last night (too bad you hadn't yet written
this!), you are exactly right on both counts.
I needed to rerun mkinitrd:
mkinitrd --with=3w-9xxx --with=shpchp --with=libata --with=ahci
/boot/initrd-`uname -r`.img `uname -r`
then I unpacked the .img file:
mkdir /tmp/xx
cd $!
gunzip -c /boot/initrd-`uname -r`.img | cpio -idv
and edited the "init" file. Turning off "setquiet" helped a lot (if
"init" understood command-line args, passing in -v -- or something
similar -- would have been really handy here). Verified the "mkrootdev"
and "resume" lines...
I'm a little disappointed that "init" can't just grab the "root="
argument from the command line.
Embedding the actual device name in the "resume": not sure why this
happens and why we can't just use UUID. The man page for "nash" doesn't
mention "resume" as a built-in, and the .img doesn't contain sbin/resume
or bin/resume ... Odd.
So, the bottom line is that I was bitten in the butt by not rerunning
"mkinitrd" with the drivers that I would need to have to reboot on the
3ware controller.
Plus, as you also astutely point out, I needed to do:
touch /.autorelabel
before rebooting.
It would be great to have a tool (or even a How-To) to make sure a
transition easier... but as you point out, you don't always know what
the drive assignments are going to be until after the fact (which is a
good argument for having a FreeDOS partition... too bad FreeDOS can't
boot from USB or understand USB drives).
-Philip
More information about the fedora-list
mailing list