« previous: Audio Delay in Flash on Linux - Fixed! | next: How To Fix a Broken Mac »
I recently had to upgrade a Gentoo Linux system from a 40 GB hard drive to a new 80 GB drive. This system powers the stereo in my car, and I have a full backup of the system on the main PC in my house. So I started by putting the new drive into a USB2 enclosure and hooking it up to the main PC, but of course you could also hook it directly to the system you’re upgrading, or even just put it inside the system you’re upgrading. Anyway, here’s what I did.
Determine which /dev/sdX device the USB drive gets:
# dmesg |grep sd
Use cfdisk to partition the drive (I usually use a simple 2-partition setup: one partition of about 1GB for swap, and the other partition is the rest of the disk):
# cfdisk /dev/sda
Create the filesystems:
# mke2fs -j -m 1 /dev/sda1 # mkswap /dev/sda2
Mount the main partition:
# mkdir /mnt/new80gig # mount /dev/sda1 /mnt/new80gig
Copy all the data over:
# rsync -av --delete /home/carstereo_backup/ /mnt/new80gig/
Edit the filesystem configuration if the new partition scheme isn’t exactly the same as the old one:
# vim /mnt/new80gig/etc/fstab
Unmount the new drive:
# umount /mnt/new80gig
Next I disconnected the USB2 enclosure and took the new 80 gig drive out of it. I then opened up the old system (the one from my car), removed its old 40 gig drive, and installed the new 80 gig drive. But of course, this new drive is not yet bootable. The system is running an older version of Gentoo, and it uses LILO, which means I need to run the lilo command from within the system itself. But since it won’t boot, I need to boot from a CD (or USB thumb drive, etc) and then chroot into the system. I used a Gentoo install disc (install-x86-universal-2005.1) in an external USB CDROM drive to boot the system, then:
Mount the proc filesystem (if it’s not already):
# mkdir -p /mnt/gentoo/proc # mount -t proc none /mnt/gentoo/proc
Mount the main partition from the new 80 gig drive:
# mount /dev/hda1 /mnt/gentoo
Activate/switch to the installation on the new drive:
# chroot /mnt/gentoo /bin/bash # env-update # source /etc/profile
Edit the LILO configuration if the new partition scheme isn’t exactly the same as the old one:
# vim /etc/lilo.conf
Run lilo to make the new drive bootable:
# lilo
If that command doesn’t give any errors, then you should be all finished. Just reboot.
I ran into one other issue after rebooting, though: the boot-time filesystem check (e2fsck) was giving me an error, saying that "Filesystem has unsupported feature(s) ... Get a newer version of e2fsck!" Since I had created the filesystem on a newer system with a newer version of ext2/ext3, it apparently included some features that the older system’s ext2/3 did not support. So I had to determine which features were enabled:
# dumpe2fs /dev/hda1 |grep -i features
This showed the features has_journal, resize_inode, dir_index, filetype, sparse_super, and large_file. I then ran "man mke2fs" to see which of those features were supported by the currently-installed ext2/3, and saw that all except resize_inode and large_file were supported. The debugfs command can be used to disable features on a filesystem:
# debugfs -w /dev/hda1 debugfs: feature -resize_inode debugfs: feature -large_file debugfs: quit
(It’s apparently fine to run debugfs on a mounted partition.)
I then rebooted and everything worked fine.