## <> ## <> ## <> ||<>|| = Create a Custom Grub2 Screen that is maintenance free = == Introduction == This guide will work with any version of Ubuntu and other distros of Linux. It is great for dual booting with Windows as well as multi-booting. You can have a background picture, colored fonts of your choosing, a timeout before the default is selected and you choose which Operating System will be the default. No further changes will be necessary even when new kernels are installed. The only time any change will be needed is if you want to change the background picture, the font colors, the default Operating System or if you delete or add an Operating System. The only other time you might have to make a change is if one of the grub files gets updated, but that occurs rarely. When you make a change to any grub file it is imperative that you enter '''sudo update-grub''' or else the changes will not take effect. This was originally written for '''Legacy/MBR partitioned systems''', but a section for '''UEFI/GPT partitioned systems''' is now included for the menuentry parts and the install grub commands; everything else is the same. Thanks to '''Ranch Hand''', '''Drs305''' and '''oldfred''' for the help with grub. <
> <
> <
> == Labeling the partitions == Labeling the partitions makes them much easier to identify and use. <
> Example: '''sudo tune2fs -L {label} {devicename}''' <
> You only need quotes if you have spaces in the name but, you will not be able to use CLI to copy files to and from that partition with a space. <
> You do not need to label anything other than ext4 file systems. <
> '''sudo tune2fs -L Arch-Linux /dev/sda2''' <
> '''sudo tune2fs -L "Focal Fossa" /dev/sda4''' <
> '''sudo tune2fs -L Eoan /dev/sda6''' <
> '''sudo tune2fs -L Bionic /dev/sda7''' <
> Or you can just label the partitions with Gparted. == Possible Grub font colors == '''You can use black/black and it will produce a black color with a transparent background.''' <
> __'''However you only want to use this on a very light picture or it will appear invisible.'''__ <
> {{attachment:Grub2-colors-possibile.png}} <
> == For All Ubuntu versions. == You can use '''sudo nano ''' ; or whichever editor you feel most comfortable with. <
> In these examples I use '''sudo nano ''' because it is the easiest way I know. You can paste into the file pressing '''Cntl+Shft+v'''. <
> === Setting up a Grub background picture === You need to move 1 picture that is the same size as your screen resolution to '''/boot/grub/''' e.g. '''sudo cp xxxx.png /boot/grub/xxxx.png'''. <
> The manual says accepted picture types are '''*.jpg''', '''*.jpeg''', '''*.png''' and '''*.tga''' pictures. <
> However, I suggest you use '''png''' pictures because they always seem to work. <
> If you change the picture be sure and remove the previous one because it looks for the first one it finds. <
> To remove the picture you would enter '''sudo rm /boot/grub/xxxx.png'''. <
> It is because of the existence of the picture that grub uses the font colors in '''/etc/grub.d/05_debian_theme'''. <
> === Editing /etc/grub.d/05_debian_theme === You can have 3 font colors: a menu color, menu highlight color and a normal color. The normal color will appear above and below the box. The menu color will appear as the box and the regular line color, while the menu highlight line will appear where the cursor is as the selected line. <
> Enter '''sudo nano /etc/grub.d/05_debian_theme''' <
> At line '''122''' where you see this line: <
> '''echo "if background_image `make_system_path_relative_to_its_root "${1}"`; then"''' <
> add these three lines below with your color choices after line 122 and save the file: <
> '''{{{ echo " set color_normal=cyan/black" echo " set menu_color_normal=yellow/black" echo " set menu_color_highlight=red/black" }}}''' [[https://help.ubuntu.com/community/MaintenanceFreeCustomGrub2Screen#Top|Back to top]] === Making the custom Grub2 Menu entries for Legacy/MBR partitioned systems === In Terminal enter '''sudo blkid''' to get the partitions to work with. <
> '''{{{ /dev/sda1: LABEL="C:" UUID="1CFC7A8DFC7A60C6" TYPE="ntfs" PARTUUID="a55f55ec-01" /dev/sda2: UUID="97ce09d6-b701-499e-b838-93762e3b005c" TYPE="ext4" PARTUUID="a55f55ec-02" /dev/sda4: UUID="09320a63-c5e5-4e47-afab-dfa5f9a5d8dc" TYPE="ext4" PTTYPE="dos" PARTUUID="a55f55ec-04" /dev/sda5: UUID="3e98ebb1-3a5e-46d2-9302-6e4a811e644b" TYPE="swap" PARTUUID="a55f55ec-05" /dev/sda6: UUID="c1549566-ed28-48f2-a546-b8a5b39729d6" TYPE="ext4" PARTUUID="a55f55ec-06" /dev/sda7: UUID="1426326a-e0a8-4e19-86a2-0019148b3ac9" TYPE="ext4" PARTUUID="a55f55ec-07" }}}''' You can see Windows is on sda1 and the rest of the labels have been removed. <
> Labeling the partitions is very useful at this point. <
> Arch Linux is on sda2 which is drive 1 (a) partition 2, which will be depicted as (hd0,2) as the disk drive numbers start with zero.<
> If you have Windows installed, make note of the UUID for use in the custom entry. <
> Enter '''sudo nano /etc/grub.d/40_custom''' in Terminal. <
> All you will see is 5 lines: '''{{{ #!/bin/sh #!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. }}}''' Although it says not to, you '''__will__''' need to change <
> '''exec tail -n +3 $0''' to <
> '''exec tail -n +4 $0''' <
> As well as adding the 2nd line below listing your Operating systems: <
> '''{{{ #!/bin/sh #!/bin/sh echo 1>&2 "Adding Bionic Beaver 18.04 LTS, Ubuntu Version name nn.nn and Windows 10" exec tail -n +4 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. }}}''' Whatever you put between the quotes is totally up to you. This is what will display when you enter '''sudo update-grub''' <
> What you put between the double quotes beside each menuentry line is what will display on the Grub2 screen at boot time. Here is what the first entry will look like (copied and pasted below the 6 lines above) <
> '''{{{ menuentry 'Xubuntu (18.04) LTS' { set root=(hd0,3) linux /vmlinuz root=/dev/sda3 ro quiet splash initrd /initrd.img } }}}''' '''{{{ menuentry "Xubuntu (18.04) LTS (backup kernel)" { set root=(hd0,3) linux /vmlinuz.old root=/dev/sda3 ro quiet splash initrd /initrd.img.old } }}}''' '''{{{ menuentry "Xubuntu (18.04) LTS (Recovery Mode)" { set root=(hd0,3) linux /vmlinuz root=/dev/sda3 ro recovery nomodeset initrd /initrd.img } }}}''' Add as many of the triple entries above one for regular boot, one to boot into the backup kernel and one for recovery as you have systems on your computer. It is up to you if you want to have the ability to boot into the backup kernel. If you chose not to just omit that part. Entry for Windows - match your UUID to what is beside '''--set''' (if you have Windows): All Windows versions work the same. '''{{{ menuentry "Windows 10" { insmod ntfs set root='(hd0,1)' search --no-floppy --fs-uuid --set 1CFC7A8DFC7A60C6 chainloader +1 } }}}''' Add these if you want the ability to restart and shutdown: '''{{{ menuentry "System restart" { echo "System rebooting..." reboot } }}}''' '''{{{ menuentry "System shutdown" { echo "System shutting down..." halt } }}}''' [[https://help.ubuntu.com/community/MaintenanceFreeCustomGrub2Screen#Top|Back to top]] === Making the custom Grub2 Menu entries for UEFI/GPT partitioned systems === In Terminal enter '''sudo blkid''' to get the partitions to work with. <
> You will need the UUID of the system partition and the UUID of the swap partition. <
> '''{{{ /dev/sda1: UUID="688D-126B" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="15661847-bc65-401a-84b0-97a157f3949f" /dev/sda2: PARTLABEL="Microsoft reserved partition" PARTUUID="6b26da12-6fdc-4ce5-bde3-c990cdfc081b" /dev/sda3: LABEL="C:" UUID="C4968A52968A44C0" TYPE="ntfs" PARTLABEL="Windows_10" PARTUUID="a76c4894-4d85-457e-8bc6-9d5308bef571" /dev/sda4: UUID="bbc771f8-ba61-4e50-aeca-d2754b112aee" TYPE="swap" PARTLABEL="swap" PARTUUID="dc354366-1300-48d4-8a60-133aa2e2ca57" /dev/sda5: LABEL="ArchLinux" UUID="bbca28b2-503e-4dc8-9850-c54bd0492da8" TYPE="ext4" PARTLABEL="Arch_Linux" PARTUUID="ea32dc7f-6d56-4a5c-b544-008abb8026e4" /dev/sda6: LABEL="Media" UUID="840ac879-510a-4b8d-be01-9d3a5f37dbb2" TYPE="ext4" PARTLABEL="Media" PARTUUID="7af1d6dd-bfac-4c24-90ef-8da3d218898d" /dev/sda7: LABEL="openSUSE" UUID="2c4c249d-f188-4236-97f6-99129537a5c2" TYPE="ext4" PARTLABEL="openSUSE" PARTUUID="dcaa5edb-0510-4bab-93e4-b238b329dbf7" /dev/sda8: LABEL="Fedora" UUID="0991ec51-8d49-4a72-a760-d3dc321f6489" TYPE="ext4" PARTLABEL="Fedora" PARTUUID="ee5e61eb-eab9-4794-aabe-a84a910fe9a0" /dev/sda9: LABEL="Bionic" UUID="833501fb-4f83-4d51-9903-685d56cb6891" TYPE="ext4" PARTLABEL="Bionic" PARTUUID="4f579967-b025-47dc-b080-64a0865d7165" /dev/sda10: LABEL="MX_Linux_18.1" UUID="1cb06a9e-c0dd-467a-bef5-2ad3d1b0e494" TYPE="ext4" PARTLABEL="MX_Linux" PARTUUID="72c20ec4-11ed-4a0e-ba9d-6ce390cbe549" }}}''' The UUID of Xubuntu is used twice in the menuentry and to resume the swap UUID is used too. <
> This will ensure your system wakes from suspend. <
> '''{{{ menuentry 'Xubuntu Bionic Beaver 18.04 LTS' { search --no-floppy --fs-uuid --set=root 833501fb-4f83-4d51-9903-685d56cb6891 linux /vmlinuz root=UUID=833501fb-4f83-4d51-9903-685d56cb6891 ro quiet resume=/dev/disk/by-uuid/bbc771f8-ba61-4e50-aeca-d2754b112aee splash initrd /initrd.img } }}}''' This entry is for recovery and only uses the system UUID. <
> '''{{{ menuentry 'Xubuntu Bionic Beaver 18.04 LTS (recovery mode)' { search --no-floppy --fs-uuid --set=root 833501fb-4f83-4d51-9903-685d56cb6891 linux /vmlinuz root=UUID=833501fb-4f83-4d51-9903-685d56cb6891 ro recovery nomodeset initrd /initrd.img } }}}''' Windows 10 uses the EFI System partition's UUID. Here is the menuentry for Windows 10: <
> '''{{{ menuentry 'Windows 10' { set root='hd0,gpt1' search --no-floppy --fs-uuid --set=root 688D-126B chainloader /EFI/Microsoft/Boot/bootmgfw.efi } }}}''' '''DO NOT CLICK SAVE!''' Click '''file''', '''save as''' and save it as '''06_custom''' and '''''not''''' '''40_custom'''. <
> This way the custom entries will be display at the top which is the goal. <
> Find where it is saved. If it is saved in '''/etc/grub.d/''' you are good to go. <
> If it is in the home directory, enter this in Terminal '''sudo cp ~/06_custom /etc/grub.d/''' and enter your password if asked. <
> Enter '''sudo chmod +x /etc/grub.d/06_custom''' to make it executable. <
> Then __always__ remember to enter '''sudo update-grub''' or '''sudo update-grub2''' and reboot to view the changes. <
> If you forget to enter '''sudo update-grub''' your changes will not "stick" and you will see that when you reboot. In the '''06_custom''' file there are no blanks between the lines. <
> [[https://help.ubuntu.com/community/MaintenanceFreeCustomGrub2Screen#Top|Back to top]] === Editing /etc/default/grub === Now change the default line number, the timeout and the timeout style. To determine which number to put in '''GRUB_DEFAULT=''' You can enter this command in terminal and use the number you want: <
> '''grep -e "menuentry " -e "submenu" /boot/grub/grub.cfg | sed 's/^[ \t]*//' | cut -d "{" -f1 | nl --starting-line-number=0''' <
> This will list all menu entries that grub will see. <
> Then enter this in terminal '''sudo nano /etc/default/grub''' <
> '''GRUB_DEFAULT=0 '''means to default on the 1st line at the top. The numbering starts with 0. <
> If you only have one Ubuntu installation, this should already be set to 0. <
> If you dual boot, or multi-boot set the number to which ever line you want to be default. <
> The default will never change unless you change it. <
> If you see this: <
> '''GRUB_TIMEOUT_STYLE=hidden''' "hidden" needs be changed to "menu" like this. <
> '''GRUB_TIMEOUT_STYLE=menu''' <
> '''GRUB_TIMEOUT=60''' means Grub2 screen displays for 60 seconds before defaulting. Set this to whatever number you want. [[https://help.ubuntu.com/community/MaintenanceFreeCustomGrub2Screen#Top|Back to top]] == Example pictures == Picture of Xenial Xerus 16.04 LTS and Windows 10: <
> {{attachment:Xenial-1024x768.png}} <
> Picture of Zesty Zapus 17.04, Xenial Xerus 16.04 LTS, Arch Linux and Windows 10: <
> {{attachment:Zesty-1024x768.png}} <
> Picture of Artful Aardvark 17.10, Zesty Zapus 17.04, Xenial Xerus 16.04 LTS, Arch Linux and Windows 10: <
> {{attachment:Artful-1024x768.png}} <
> [[https://help.ubuntu.com/community/MaintenanceFreeCustomGrub2Screen#Top|Back to top]] == Final changes == Once you are confident that all of the custom entries work as they should. You can eliminate the other menu entries below these custom entries. <
> '''sudo chmod -x /etc/grub.d/20_memtest86+''' will make memtest unexecutable and will not show in the menu. <
> '''sudo chmod -x /etc/grub.d/10_linux''' will make the list of kernels not display. <
> '''sudo chmod -x /etc/grub.d/30_os-prober''' will make any other Linux systems and Windows entries not display. <
> Then always enter '''sudo update-grub''' when finished making changes. <
> Only having the custom menu displayed (as displayed in the example picture above), this is the output of '''sudo update-grub''': '''{{{ Generating grub configuration file ... Found background image: blueeyedcat.png Adding Arch Linux, Xubuntu Xenial Xerus 16.04 LTS, Xubuntu Zesty Zapus 17.04, Artful Aardvark 17.10 and Windows 10 done }}}''' [[https://help.ubuntu.com/community/MaintenanceFreeCustomGrub2Screen#Top|Back to top]] == Installing or re-installing more than one Ubuntu system on either Legacy/MBR or UEFI/GPT == <
> '''Legacy/MBR systems grub is installed in the following way:''' <
> You should first make sure that Grub2 is not installed on the system that you are removing or re-installing as you may be looking at grub rescue if so. I recommend installing Grub2 on another system if you have one by booting into that system and entering <
> '''sudo grub-install /dev/sdx''' where x is the hard drive (e.g. sda). If you install a 2nd or 3rd system etc. or if you re-install one you ''may'' need to edit '''fstab''' for that system. Boot into the new or re-installed Ubuntu and enter '''sudo blkid''' and then '''cat /etc/fsab'''. <
> What appears in '''fstab''' should match the output of '''sudo blkid'''. <
> If it does not enter '''sudo nano /etc/fstab''' make any changes to UUID and delete any extra lines then save the file. <
> <
> '''UEFI/GPT systems grub is installed in the following way:'''<
> '''{{{ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi/EFI/ubuntu --bootloader-id=ubuntu }}}''' == If you multiboot mutiple Linux installs and want one Grub to control all of your OSs == The MBR (Master Boot Record) is where your system boots from. Each partition has what is called a PBR (Partition Boot Record) <
> When you add a 2nd or 3rd Linux system you can opt to install the grub to the PBR instead of the MBR. <
> This way your grub will not move from one partition to another each time any grub is updated on other partitions. <
> Select manual partitioning to install grub to the PBR (e.g. '''sda2''') instead of the MBR (e.g. '''sda'''). <
> If you have already installed each grub on the MBR you can fix it as above with these commands: <
> For non efi systems: <
> '''{{{ sudo dpkg-reconfigure grub-pc }}}''' Or on efi systems use this command: <
> '''{{{ sudo dpkg-reconfigure grub-efi-amd64 }}}''' Enter thru first pages, spacebar to choose/unchoose drive, enter to accept. <
> Just make sure you remember which install (MBR) your grub is installed on. <
> If you ever change your mind, get on that system and enter: <
> '''sudo grub-install /dev/sdx''' where x is the drive (e.g. sda,sdb,sdc,). <
> [[https://help.ubuntu.com/community/MaintenanceFreeCustomGrub2Screen#Top|Back to top]] == Undo the changes made by this tutorial == Enter the following commands in terminal: <
> '''sudo chmod +x /etc/grub.d/20_memtest86+''' <
> '''sudo chmod +x /etc/grub.d/30_os-prober''' <
> '''sudo chmod +x /etc/grub.d/10_linux''' <
> Then you can either make the custom file unexecutable if you think you will use it in the future: <
> Enter in terminal '''sudo chmod -x /etc/grub.d/06_custom''' <
> Or you can simply delete the file: '''sudo rm /etc/grub.d/06_custom''' <
> Delete any picture(s) in /boot/grub/. '''sudo rm /boot/grub/blue-sea.jpg''' <
> Enter '''sudo nano /etc/default/grub''' in terminal and change the '''GRUB_DEFAULT=''' to 0. <
> Then enter '''sudo update-grub''' in terminal, reboot and you are back to normal. = Where to post questions, problems, etc = [[http://ubuntuforums.org/showthread.php?t=2076205|How to have a custom Grub2 menu that is maintenance free]] = Reference = Original post [[http://ubuntuforums.org/showthread.php?t=1542338|The Ubuntu Forums (ubuntuforums.org)]] ---- = Links = 1. [[https://help.ubuntu.com/community/Grub2|Grub2]] <
> 2. [[http://www.gnu.org/software/grub/manual/|GNU GRUB2 Manual]]