Install Syslinux and replace GRUB on a running system
This article explains how to replace the existing boot loader (assumed GRUB legacy) on a running system, and install Syslinux on it. Instructions here are tested on a Arch Linux, but should work on any Linux distribution except for the package installation bit.
Back Story
When I first installed my Arch Linux system about year ago I choose GRUB (legacy) as my boot loader without giving it much though as it was the one I'm most familiar with.
Now with the recent GRUB legacy deprecation, I wanted to upgrade my boot loader and while reading about upgrading to GRUB2 I noticed that it is much easier to just switch to Syslinux instead (at least for me).
I'm using an old fashion MBR based partitions on my system with /boot on a separated ext2 partition. And I decided to do change/upgrade as follows.
Steps
Re-format /boot with ext4
First thing to we need to do is backup our existing kernel files to somewhere temporarily.
$ mkdir /tmp/boot-backup $ cp -v /boot/{vmlinuz,initramfs}* /tmp/boot-backup/ ‘/boot/vmlinuz-linux’ -> ‘/tmp/boot-backup/vmlinuz-linux’ ‘/boot/initramfs-linux-fallback.img’ -> ‘/tmp/boot-backup/initramfs-linux-fallback.img’ ‘/boot/initramfs-linux.img’ -> ‘/tmp/boot-backup/initramfs-linux.img’
Note: above command will only copy the files standard naming conversion of the Linux Kernel used in Arch Linux. If your distribution is using a different naming convention or you are using a custom kernel, make sure you copy all the files require the Kernel to boot.
Now to re-format the /boot partition.
# umount /boot # mkfs.ext4 /dev/sda1 mke2fs 1.42.4 (12-June-2012) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 51200 inodes, 204800 blocks 10240 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67371008 25 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done # mount /dev/sda1 /boot
WARNING: /dev/sda1 is system dependant, that is the disk partition I have used for /boot on my system. Make sure you format the correct partition (device node) for your system configuration. (mkfs out put may also be different on your system)
IMPORTANT: Make sure you change the /etc/fstab so it mounts /boot as ext4.
Now you can copy the kernel files to the new /boot partition from the backup we made earlier.
# cp -v /tmp/boot-backup/* /boot ‘/tmp/boot-backup/initramfs-linux-fallback.img’ -> ‘/boot/initramfs-linux-fallback.img’ ‘/tmp/boot-backup/initramfs-linux.img’ -> ‘/boot/initramfs-linux.img’ ‘/tmp/boot-backup/vmlinuz-linux’ -> ‘/boot/vmlinuz-linux’
Install & configure Syslinux
# pacman -S syslinux --- output not shown here ---
At end of the package installation it shows us the instruction to automate the configuration process, but I'm choosing to do it manually just to have more fun.
Following commands will initialize the Syslinux configuration and install the Syslinux MBR to your disk. (Again be aware that device node names are system dependant).
# extlinux -i /boot/syslinux/ /boot/syslinux/ is device /dev/sda1 # dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda bs=440 count=1 1+0 records in 1+0 records out 440 bytes (440 B) copied, 6.3689e-05 s, 6.9 MB/s
We are almost ready to reboot our system using Syslinux. But before you do make sure you have correct Kernel(s) and parameters specifiled in the /boot/syslinux/syslinux.cfg
Here is a simplest sample you need.
DEFAULT arch
PROMPT 0
TIMEOUT 50
LABEL arch
MENU LABEL Arch Linux
LINUX ../vmlinuz-linux
APPEND root=/dev/sda6 ro
INITRD ../initramfs-linux.img
Wipe out GRUB (optional)
Now since we no longer use GRUB (legacy), it can be removed from the system to make things cleaner. You may keep it if you want to switch back to it in later time, or in case if you need to install GRUB on another disk mounted to this system.
# pacman -Rcnsu grub --- output not shown here ---