The Dell Precision M4500, which had already given me so much grief died this morning. It was working fine last night, but this morning it would simply not power on; no lights, beeps, no indication of life at all. (I’m thinking motherboard; even though I got myself back up and running, I’ll probably order a replacement, just to get it working again so I can add it to my ever-growing pile of working-but-unused laptops.) Since this was my primary school and development laptop, it was imperative that I get something working.

(Note that I wasn’t worried about data loss. I use Tarsnap and have been quite happy with it, and I was pretty sure the HD was OK in any case; I just needed a working computer, preferably one with all my stuff on it.)

I still had my old Thinkpad T61 at home (which the M4500 was intended to replace), I figured I’d try a simple HD swap. This usually works well on Linux installs with stock kernels, as the distros tend to include drivers for everything so that changing hardware isn’t an issue. In this case, however, I ran into two problems.

Things that did not work

Setting the boot flag on the protective MBR partition did not work. Setting the legacy boot flag on the Linux system partition did not work. Installing Grub did not work (on GPT Grub needs its own partition to work with, and I didn’t have room to create one).

GPT vs. MBR

The M4500 was built to boot via GPT and UEFI; the Thinkpad supports neither. The first step was to get it booting via the old MBR+BIOS. Although there are apparently ways to partition your HD so that both GPT and MBR booting are supported, I hadn’t done that when I set this system up. That left converting the GPT structures to MBR. I only had three partitions, so I didn’t expect any problems, but it’s still scary whenever you do something that involves blowing away the partition table and building it from scratch. I used a Linux live USB drive (running Mint 17.1, the same version I’m using on the desktop) and ran sgdisk. The r menu contains a g option to convert GPT to MBR. It does almost all the work for you: you only have to set the boot flag on your Linux system partition when it’s done.

Grub for UEFI vs. MBR

The newly-created MBR does not have any bootloader code in it, so I had to reinstall Grub. This isn’t hard to do from a Live install, but there were a few quirks. Most tutorials will tell you to mount your existing Linux, mount /dev, /proc and a few other things into it, and then chroot in to run grub-install. But in my case, I didn’t have the x86-pc Grub modules, just the UEFI modules. So I also had to mount in /usr/lib/grub from the flash drive. After that the Grub install/update worked fine. (After booting my new system, I installed the grub-pc package so that the modules would always be available. This also removed the UEFI modules and reinstalled Grub (again!) just to make sure everything is in sync.)

The full process

Here’s a transcript of the full process, run from a live USB drive, after converting from GPT to MBR (which is just a matter of running sudo gdisk, then r, g, then exit and set the boot flag with the utility of your choice).

mint@mint ~ $ sudo mkdir /mnt/hd        
mint@mint ~ $ sudo mount /dev/sda2 /mnt/hd
mint@mint ~ $ sudo mount --bind /dev /mnt/hd/dev
mint@mint ~ $ sudo mount --bind /dev/pts /mnt/hd/dev/pts
mint@mint ~ $ sudo mount --bind /proc /mnt/hd/proc      
mint@mint ~ $ sudo mount --bind /sys /mnt/hd/sys     
mint@mint ~ $ sudo mount --bind /usr/lib/grub/ /mnt/hd/usr/lib/grub/
mint@mint ~ $ sudo chroot /mnt/hd
mint / # grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
mint / # grub-install --recheck /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
mint / # update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.13.0-37-generic
Found initrd image: /boot/initrd.img-3.13.0-37-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
  No volume groups found
done
mint / # exit
mint@mint ~ $ sudo umount /mnt/hd/sys
mint@mint ~ $ sudo umount /mnt/hd/proc
mint@mint ~ $ sudo umount /mnt/hd/dev/pts
mint@mint ~ $ sudo umount /mnt/hd/dev    
mint@mint ~ $ sudo umount /mnt/hd/usr/lib/grub
mint@mint ~ $ sudo umount /mnt/hd

Remaining Issues

After all that, I was able to boot my system into X just fine. Only a few issues remained:

  • I had fiddled with the touchpad threshold values (in order to make the M4500’s touchpad less insane) and the new values didn’t make any sense on the Thinkpad. I reset them to FingerLow=10 and FingerHigh=20.

  • Having a different Wifi adapter means all my remembered connections were forgotten. Aparently the saved connections are keyed to the GUID of the WiFi card itself, which on one hand would allow you to have a separate set of connections per card (if you had more than one), but would also mean that just replacing your WiFi device would invalidate all your existing connections, too.

  • I also had some issues with NVidia (as usual), which for now seem to have been largely dealt with by adding

    Section “Device” Identifier “Quadro NVS 140M” Driver “nvidia” Option “NoLogo” “1” Option “RenderAccel” “1” Option “TripleBuffer” “true” Option “MigrationHeuristic” “greedy” Option “UseEvents” “False” EndSection

    to /usr/share/X11/xorg.conf.d/20-nvidia.conf. (NoLogo is purely cosmetic; it just disables the NVidia spash screen when X starts up. UseEvents hopefully prevents an issue where the NVidia driver fills up X’s event queue and makes the server hang.)