PXE multi-boot server using grub2 on Mikrotik RouterOS ( bios and efi support )

This article describes how to setup a network multi-boot environment which works for EFI and BIOS netboot clients with example application for:

  1. Configure GRUB to boot from network
  2. Configure GRUB as standalone (all-in-one) EFI image ( alternative approach )
  3. Mikrotik configuration

Configure GRUB to boot from network

In order to use grub you need to use at least grub in version 2.00 beta3. Using virtual machine from VMWare I was not able to boot R-Drive image. What’s more, using http://tftpd32.jounin.net/ tftp server even grub was not booting properly ( can not load some modules ).  Grub bugtracker

 

insmod net
insmod efinet
insmod tftp
insmod efi_gop
insmod efi_uga
insmod chain

menuentry 'Debian net install' --class os  {
    set background_color=black

  echo 'Loading linux...'
    linux    /#debiannet/linux
  
  echo 'Loading initrd.gz...'
    initrd   /#debiannet/initrd.gz
  
  echo 'Finished.'
}

menuentry 'Memtest86(EFI)' --class os  {
    set background_color=black

  echo 'Loading BOOTX64.EFI...'
  chainloader	/#memtest/BOOTX64.EFI
  
  echo 'Finished.'
}

menuentry 'Memtest86(Legacy)' --class os  {
    set background_color=black

  echo 'Loading MEMTEST...'
  linux16	/#memtest/MEMTEST
  
  echo 'Finished.'
}


menuentry 'R-Drive(EFI)' --class os  {
  set background_color=black
  
  echo 'Loading kernel64...'
  linux /#rdrive/kernel64 rw acpi_osi=Linux acpi_backlight=vendor 

  echo 'Loading initrd...'
  initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b64 /#rdrive/rm_scsi.b64 /#rdrive/rm_pcard.b64  /#rdrive/rm_other.b64 /#rdrive/rm_usb.b64 /#rdrive/rm_video.b64 /#rdrive/rootgui /#rdrive/rmconfig.bin
  
  echo 'Finished.'
}	

menuentry 'R-Drive(EFI)(Safe VGA Mode)' --class os  {
  set background_color=black
  
  echo 'Loading kernel64...'
  linux /#rdrive/kernel64 rw acpi_osi=Linux acpi_backlight=vendor rgui_video_mode_ask rgui_vesa_only rgui_video_mode=800x600@60

  echo 'Loading initrd...'
  initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b64 /#rdrive/rm_scsi.b64 /#rdrive/rm_pcard.b64 /#rdrive/rm_other.b64 /#rdrive/rm_usb.b64 /#rdrive/rootgui /#rdrive/rmconfig.bin
  
  echo 'Finished.'
}	

menuentry 'R-Drive(EFI)(Text Mode)' --class os  {
  set background_color=black
  
  echo 'Loading kernel64...'
  linux /#rdrive/kernel64 rw acpi_osi=Linux acpi_backlight=vendor 

  echo 'Loading initrd...'
  initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b64 /#rdrive/rm_scsi.b64 /#rdrive/rm_pcard.b64 /#rdrive/rm_other.b64 /#rdrive/rm_usb.b64 /#rdrive/rootfs /#rdrive/rmconfig.bin
  
  echo 'Finished.'
}	


menuentry 'R-Drive(Legacy)' --class os  {
  set background_color=black
  
  echo 'Loading kernel32...'
  linux /#rdrive/kernel32 rw acpi_osi=Linux acpi_backlight=vendor 
  
  echo 'Loading initrd...'
  initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b32 /#rdrive/rm_scsi.b32 /#rdrive/rm_pcard.b32  /#rdrive/rm_other.b32 /#rdrive/rm_usb.b32 /#rdrive/rm_video.b32 /#rdrive/rootgui /#rdrive/rmconfig.bin
  
  echo 'Finished.'
}	

menuentry 'R-Drive(Legacy)(Safe VGA Mode)' --class os  {
  set background_color=black
  
  echo 'Loading kernel32...'
  linux /#rdrive/kernel32 rw acpi_osi=Linux acpi_backlight=vendor rgui_video_mode_ask rgui_vesa_only rgui_video_mode=800x600@60
  
  echo 'Loading initrd...'
  initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b32 /#rdrive/rm_scsi.b32 /#rdrive/rm_pcard.b32  /#rdrive/rm_other.b32 /#rdrive/rm_usb.b32 /#rdrive/rootgui /#rdrive/rmconfig.bin
  
  echo 'Finished.'
}	

menuentry 'R-Drive(Legacy)(Text Mode)' --class os  {
  set background_color=black
  
  echo 'Loading kernel32...'
  linux /#rdrive/kernel32 rw acpi_osi=Linux acpi_backlight=vendor 
  
  echo 'Loading initrd...'
  initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b32 /#rdrive/rm_scsi.b32 /#rdrive/rm_pcard.b32  /#rdrive/rm_other.b32 /#rdrive/rm_usb.b32 /#rdrive/rootfs /#rdrive/rmconfig.bin
  
  echo 'Finished.'

BIOS image

Create grub efi image ( booti386 ).

grub-mkimage -d /usr/lib/grub/i386-pc/ -O i386-pc-pxe -o ./booti386 -p ‘(tftp)/grub’ pxe tftp

Place booti386 in root of tftp server and set it as ‘boot file name’ in dhcp server

grub.cfg should be place in tftp:grub/directory. Copy also efi module to tftp:grub/i386-pc  from /usr/lib/grub/i386-pc

|   booti386
\---grub
    |   grub.cfg
    \---i386-pc-pxe

EFI image

Create grub efi image ( bootx64.efi ).

grub-mkimage -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi -o ./bootx64.efi -p ‘(tftp)/grub’ efinet tftp

If You are using i386 arch then install missing files:

apt-get install grub-efi-amd64-bin

Place bootx64.efi in root of tftp server and set it as ‘boot file name’ in dhcp server

grub.cfg should be place in tftp:grub/directory. Copy also efi module to tftp:grub/x86_64-efi  from /usr/lib/grub/x86_64-efi

|   bootx64.efi
\---grub
    |   grub.cfg
    \---x86_64-efi

Configure GRUB as standalone (all-in-one) EFI image ( alternative approach )

Standalone grub file contains build in configuration and module files.

Efi image:

grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi –fonts=”unicode” -o ./bootx64.efi “boot/grub/grub.cfg=./grub_buildin.cfg

grub_efi_standalone.cfg used to make standalone efi image:

insmod net
insmod efinet
insmod tftp
insmod efi_gop
insmod efi_uga
insmod chain

net_bootp
set net_default_server=192.168.1.1
set root='(tftp)'

menuentry 'Debian net install' --class os  {
    set background_color=black

	echo 'Loading linux...'
    linux    /#debiannet/linux
	
	echo 'Loading initrd.gz...'
    initrd   /#debiannet/initrd.gz
	
	echo 'Finished.'
}

menuentry 'Memtest86(EFI)' --class os  {
    set background_color=black

	echo 'Loading BOOTX64.EFI...'
	chainloader	/#memtest/BOOTX64.EFI
	
	echo 'Finished.'
}

menuentry 'Memtest86(Legacy)' --class os  {
    set background_color=black

	echo 'Loading MEMTEST...'
	linux16	/#memtest/MEMTEST
	
	echo 'Finished.'
}


menuentry 'R-Drive(EFI)' --class os  {
	set background_color=black
	
	echo 'Loading kernel64...'
	linux /#rdrive/kernel64 acpi_osi=Linux acpi_backlight=vendor 

	echo 'Loading initrd...'
	initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b64 /#rdrive/rm_scsi.b64 /#rdrive/rm_pcard.b64  /#rdrive/rm_other.b64 /#rdrive/rm_usb.b64 /#rdrive/rm_video.b64 /#rdrive/rootgui /#rdrive/rmconfig.bin
	
	echo 'Finished.'
}	

menuentry 'R-Drive(Legacy)' --class os  {
	set background_color=black
	
	echo 'Loading kernel32...'
	linux /#rdrive/kernel32 acpi_osi=Linux acpi_backlight=vendor 
	
	echo 'Loading initrd...'
	initrd /#rdrive/lrfsbase.bin /#rdrive/rm_pata.b32 /#rdrive/rm_scsi.b32 /#rdrive/rm_pcard.b32  /#rdrive/rm_other.b32 /#rdrive/rm_usb.b32 /#rdrive/rm_video.b32 /#rdrive/rootgui /#rdrive/rmconfig.bin
	
	echo 'Finished.'

In case of problem with ‘net_bootp’ module please ensure, that mikrotik dhcp for ‘Bootp support’ is set do ‘dynamic’


Mikrotik configuration

DHCP server

To use ‘net_bootp’ module from grub standalone build you need to set “Bootp support” in mikrotik dhcp configuration to ‘dynamic’.

TFTP server

Point tftp server where to search for files requested by client.

BIOS and UEFI Co-Existence

At the time of writing this text, it’s not possible to set different boot file depend of client platform: Mikrotik forum. Alternative you can use linux wiki.fogproject.org as dhcp server