Grub for Dual-Boot of Different Linux Distros Falty

fotafm

New Member
Joined
Dec 1, 2025
Messages
2
Reaction score
0
Credits
33
My primary Linux distribution is Q4OS. I've posted this question on the Q4OS forum with lots of views and no replies.

I am a Linux novice.

I set up Wary Puppy 5.5 alongside Q4OS Aquarius 5.8. Both are 32-bit, as the computer is an old Dell Precision 420 desktop with a Pentium III 1 GHz CPU, NVidia GeForce 6200 GPU, and 2 GB ECC RDRAM. Wary Puppy ran fine from the installation DVD and after installation, but after installing on an SCSI drive, the Grub Menu entry for Wary Puppy is listed as unknown and apparently points to the wrong drive or is otherwise faulty. I installed Grub Customizer.

Can someone suggest how to modify the Q4OS Grub menu so I can choose Wary Puppy from the boot menu and start the boot process for Wary Puppy?

I've attached "lsblk -f" output. I am limited to three attachments. I cannot use a modern browser on the Dell Precision 420 to cut and paste from the Grub. I will try to attach the necessary ones. Let me know if you need something else


"Any sufficiently advanced technology is indistinguishable from magic." -- Arthur C. Clarke



Powered by FluxBB
 

Attachments

  • Z-Q4OS Aquarius 5_8 with Wary Puppy 5_5_a.jpg
    Z-Q4OS Aquarius 5_8 with Wary Puppy 5_5_a.jpg
    183.8 KB · Views: 118
  • PXL_20251129_021230027.jpg
    PXL_20251129_021230027.jpg
    193.1 KB · Views: 91
  • PXL_20251128_001733852.MP.jpg
    PXL_20251128_001733852.MP.jpg
    292.8 KB · Views: 95


Welcome to the forums

Q4OS is based on Debian, so from Q4OS open a terminal and enter sudo update-grub or if that doesn't work sudo apt update && apt upgrade -y
 
From your 2nd picture I am assuming your puppy is in root(hd1,0) (2nd disk 1st partition)

I am assuming it's under folder wary550 ( you need to change this with actual folder)

You can try this menu entry

root(hd1,0)
kernel /wary550/vmlinuz psubdir=wary550 pmedia=atahd pfix=fsck

initrd /wary550/initrd.gz
 
Well, for a start, GRUB2's 'os-prober' won't detect the Puppy install no matter WHAT you try. It doesn't understand Puppy's layout, and is looking for, and expecting to find, a directory marked '/boot'.

This is a long-standing problem, multibooting Puppies with mainstream distros......and has been well-documented over the years.

For a Puppy install to launch, all that is required is the 'vmlinuz', the initrd.gz, and the Puppy 'base' SFS.....in this case, 'puppy_wary_5.5.sfs'.

It's also best if the 'boot' partition is identified by the UUID.

How has Puppy been installed? The recommended 'frugal'.....or the last resort "full" install (which is NOT normal for Puppies)?


Mike. :confused:
 
Last edited:
You will find this information late but if you have the chance you should do this for multiboot on a desktop. Takes all the guess work out and creates a highly stable setup.

 
Its not always that easy. depending on which distro's you use.


When you set up multiple Linux distributions on the same machine, GRUB can get confusing because different distros handle boot entries in different ways. Older systems used GRUB (often called GRUB Legacy), which relied on a simple static file called menu.lst, but almost all modern distros use GRUB2, which is modular and dynamically generates its configuration from scripts and templates. On Debian and Ubuntu, the tool update-grub regenerates the GRUB2 config and calls os-prober to detect other operating systems, but Fedora and RHEL disable os-prober by default for security reasons, so they won’t automatically add other distros unless you enable it. Fedora also uses the Boot Loader Specification (BLS), which stores boot entries as individual files in /boot/loader/entries and uses the blscfg command to read them, instead of writing full menu entries into grub.cfg like Ubuntu does. This means if Fedora controls GRUB, it may ignore other distros unless you enable os-prober or add custom entries, and if Ubuntu controls GRUB, it won’t understand Fedora’s BLS unless you manually configure it or chainload Fedora’s GRUB. These differences—GRUB vs GRUB2, os-prober vs update-grub, and BLS—are the main reasons multi-boot setups can be tricky.


Here are the most common solutions:

  1. Enable OS detection in Fedora:
    Code:
    sudo nano /etc/default/grubGRUB_DISABLE_OS_PROBER=falsesudo 
    [*]grub2-mkconfig -o /boot/grub2/grub.cfg
  2. Add custom entries manually:
    Code:
    menuentry "Ubuntu on /dev/sda1" {set root=(hd0,1)linux /boot/vmlinuz-6.8 root=UUID=250d2241-147e-4528-b361-6ae0a806a34d ro quietinitrd /boot/initrd.img-6.8}
  3. Chainload another distro’s GRUB:
    Code:
    menuentry "Chainload Ubuntu GRUB" {set root=(hd0,1)chainloader +1}
  4. EFI boot management:Use efibootmgr to manage boot entries and set priorities if you prefer firmware-level control.

Example partition layout from lsblk:
Code:
nvme1n1p1 vfat   FAT32 EFI      UUID: 4775-F140nvme1n1p2 ext4   /boot          UUID: 2a511d6f-084e-4b9d-9bda-f6f6cdf58221nvme1n1p3 btrfs  root/home      UUID: 060e221b-1b89-47d4-a3bd-cd96e48ef089


Multi-booting Linux isn’t hard once you understand GRUB’s quirks. Decide on a primary bootloader, enable OS detection, or use chainloading for maximum compatibility.

Here is my grub.cfg (the UIDs have been changed)

Code:
cat grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -f ${config_directory}/grubenv ]; then
  load_env -f ${config_directory}/grubenv
elif [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
export tuned_params
set tuned_initrd=""
export tuned_initrd
### END /etc/grub.d/00_tuned ###

### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
  source ${prefix}/user.cfg
  if [ -n "${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
fi
### END /etc/grub.d/01_users ###

### BEGIN /etc/grub.d/08_fallback_counting ###
insmod increment
# Check if boot_counter exists and boot_success=0 to activate this behaviour.
if [ -n "${boot_counter}" -a "${boot_success}" = "0" ]; then
  # if countdown has ended, choose to boot rollback deployment,
  # i.e. default=1 on OSTree-based systems.
  if  [ "${boot_counter}" = "0" -o "${boot_counter}" = "-1" ]; then
    set default=1
    set boot_counter=-1
  # otherwise decrement boot_counter
  else
    decrement boot_counter
  fi
  save_env boot_counter
fi
### END /etc/grub.d/08_fallback_counting ###

### BEGIN /etc/grub.d/10_linux ###
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root 2a511d6f-084e-4b9d-9bda-f6f6cdf58221
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=boot 4775-F140

# This section was generated by a script. Do not modify the generated file - all changes
# will be lost the next time file is regenerated. Instead edit the BootLoaderSpec files.
#
# The blscfg command parses the BootLoaderSpec files stored in /boot/loader/entries and
# populates the boot menu. Please refer to the Boot Loader Specification documentation
# for the files format: https://systemd.io/BOOT_LOADER_SPECIFICATION/.

# The kernelopts variable should be defined in the grubenv file. But to ensure that menu
# entries populated from BootLoaderSpec files that use this variable work correctly even
# without a grubenv file, define a fallback kernelopts variable if this has not been set.
#
# The kernelopts variable in the grubenv file can be modified using the grubby tool or by
# executing the grub2-mkconfig tool. For the latter, the values of the GRUB_CMDLINE_LINUX
# and GRUB_CMDLINE_LINUX_DEFAULT options from /etc/default/grub file are used to set both
# the kernelopts variable in the grubenv file and the fallback kernelopts variable.
if [ -z "${kernelopts}" ]; then
  set kernelopts="root=UUID=060e221b-1b89-47d4-a3bd-cd96e48ef089 ro rootflags=subvol=root rhgb quiet "
fi

insmod blscfg
blscfg
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/10_reset_boot_success ###
# Hiding the menu is ok if last boot was ok or if this is a first boot attempt to boot the entry
if [ "${boot_success}" = "1" -o "${boot_indeterminate}" = "1" ]; then
  set menu_hide_ok=1
else
  set menu_hide_ok=0
fi
# Reset boot_indeterminate after a successful boot
if [ "${boot_success}" = "1" ] ; then
  set boot_indeterminate=0
# Avoid boot_indeterminate causing the menu to be hidden more than once
elif [ "${boot_indeterminate}" = "1" ]; then
  set boot_indeterminate=2
fi
# Reset boot_success for current boot
set boot_success=0
save_env boot_success boot_indeterminate
### END /etc/grub.d/10_reset_boot_success ###

### BEGIN /etc/grub.d/12_menu_auto_hide ###
if [ x$feature_timeout_style = xy ] ; then
  if [ "${menu_show_once}" ]; then
    unset menu_show_once
    save_env menu_show_once
    set timeout_style=menu
    set timeout=60
  elif [ "${menu_auto_hide}" -a "${menu_hide_ok}" = "1" ]; then
    set orig_timeout_style=${timeout_style}
    set orig_timeout=${timeout}
    if [ "${fastboot}" = "1" ]; then
      # timeout_style=menu + timeout=0 avoids the countdown code keypress check
      set timeout_style=menu
      set timeout=0
    else
      set timeout_style=hidden
      set timeout=1
    fi
  fi
fi
### END /etc/grub.d/12_menu_auto_hide ###

### BEGIN /etc/grub.d/14_menu_show_once ###
if [ x$feature_timeout_style = xy ]; then
  if [ "${menu_show_once_timeout}" ]; then
    set timeout_style=menu
    set timeout="${menu_show_once_timeout}"
    unset menu_show_once_timeout
    save_env menu_show_once_timeout
  fi
fi
### END /etc/grub.d/14_menu_show_once ###

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/25_bli ###
if [ "$grub_platform" = "efi" ]; then
        if [ ! insmod bli ]; then
                echo "bli module not available"
        fi
fi
### END /etc/grub.d/25_bli ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
if [ "$grub_platform" = "efi" ]; then
 if [ fwsetup --is-supported ]; then
 menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
 fwsetup
 }
 fi
fi
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/35_fwupd ###
### END /etc/grub.d/35_fwupd ###

### BEGIN /etc/grub.d/40_custom ###
# 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.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg
fi
### END /etc/grub.d/41_custom ###
 
Last edited:
@dos2unix :-

Puppies have mostly used Grub4DOS until recent years, Ray. This is/was a development of the older GRUB 'Legacy', except where Grub4DOS has been deprecated, and is no longer under active development, we maintain our own updated/'modified' fork at Woof-CE, over on Github.

Puppy's modified version has the ability to search TWO 'layers' deep for a bootable kernel. This is what supports the ability to run multiple Puppies from uniquely-named sub-directories on the same partition.

In the last few years, our Japanese member Shinobar - who wrote the original Grub4DOS bootloader installer utility for Puppy - has taken his original and rewritten it into Grub2Config. This now uses GRUB2 under the hood, and simultaneously enables legacy/UEFI auto-boot selection, depending on what is found at boot-time.

At long last, it's possible to install a single bootloader utility, that only needs installing once, that will work on ALL machines, regardless of whether they are BIOS or UEFI.

It also incorporates a 'refresh' facility, that allows for re-evaluating if any new Puppies have been added since it was last run, and re-runs it again if necessary.

It works extremely well!

~~~~~~~~~~~~~~~~~~~~~~​

With regard to standard Grub2, I believe the simplest workaround for Puppies is usually to add a 'custom' boot stanza to Grub2. I have no idea how this is accomplished - never needed to find this out for myself - but I understand it's easy enough to do.

Somebody else would need to help the OP to figure one out. It's rather beyond my experience, I'm afraid....

(shrug...)


Mike. ;)
 
Well, for a start, GRUB2's 'os-prober' won't detect the Puppy install no matter WHAT you try. It doesn't understand Puppy's layout, and is looking for, and expecting to find, a directory marked '/boot'.



Mike. :confused:
@MikeWalsh , looking at the grub output of the third image of post #1, grub does appear to have detected puppy on (hd2,msdos1), the first partition on the third disk.

@tpkusr wrote:
From your 2nd picture I am assuming your puppy is in root(hd1,0) (2nd disk 1st partition)
The grub output on the third image in post #1 looks like grub2 output in which the partition numbers begin as 1. It was in the legacy grub that partition numbers began at 0. The drive numbers begin at 0 in both grubs. The grub in use is yet to be confirmed, but it's how it looks to me.
 
@dos2unix , Ray (good to see Marvin back), you just need to adjust the bit between the commands (falsesudo)
sudo nano /etc/default/grubGRUB_DISABLE_OS_PROBER=falsesudo grub2-mkconfig -o /boot/grub2/grub.cfg

Cheers

Chris
 
From your 2nd picture I am assuming your puppy is in root(hd1,0) (2nd disk 1st partition)

I am assuming it's under folder wary550 ( you need to change this with actual folder)

You can try this menu entry

root(hd1,0)
kernel /wary550/vmlinuz psubdir=wary550 pmedia=atahd pfix=fsck

initrd /wary550/initrd.gz
Thanks for your response and the responses of others. I will eventually figure this out. However, I need to get the nomenclature correct.

There is no Wary550 folder, and vmlinuz is (as I recall) in the boot folder. I have an initrd.img file in the root or base directory of sdb1 (HD1). I have Q4OS loaded on an 80GB IDE drive and Wary Puppy 5.5 loaded on one of two true SCSI drives. I have no internet search or display capabilities on this Pentium III computer, as it cannot run a modern browser. I would otherwise paste from the Grub Customizer screen.

The Grub commands you provided are not recognized by Grub 2.0. Both root and kernel are flagged as invalid commands. I suspect that this has to do with the distributions I am using. It would be helpful if someone could compile a Grub string for me to try, using commands that Grub 2.0 in Q4OS understands.

I could disable the IDE drive to see if Wary Puppy 5.5 would boot from the SCSI drives. I am uncertain whether Wary Puppy created a Grub file.

I intend to devote more attention to modifying the Grub tomorrow. Your advice is appreciated.
 
Last edited:
The Grub commands you provided are not recognized by Grub 2.0. Both root and kernel are flagged as invalid commands. I suspect that this has to do with the distributions I am using. It would be helpful if someone could compile a Grub string for me to try, using commands that Grub 2.0 in Q4OS understands.
My first boot menu entry was for grub. For grub 2 as @osprey rightly pointed out
root(hd2,1) and without any folder you just need '/'. So the modified grub 2 menu entry will be like
Code:
root(hd2,1)
kernel /vmlinuz pmedia=atahd pfix=fsck
initrd /initrd.gz
You can try this, let's see whether it works or not.
 
I have no internet search or display capabilities on this Pentium III computer, as it cannot run a modern browser.
@fotafm :-

Mm. Strictly-speaking, that's not true.

Most modern browsers used to require a minimum of the SSE2 instruction set. Some time back, this was uprated to SSE3 minimum.

The Pentium III only has the original SSE. The same goes for the K7-gen AMD Athlon XP. Since Puppy - in addition to a few other distros - is intended for keeping ancient hardware still "alive" & useful, certain individuals have compiled several SSE-only builds of the 'zilla-based Pale Moon browser. These will run on a Pentium III.

You can find some of these here:-


"Fenyo" never religiously kept on top of every release of these, and appears to have now quit building them.....I believe changes in the build-environment, along with the requirement for a much newer GCC 'toolchain' have forced this on him.

The last build was v33.8.1.2, released on the 17th of August this year. Goes without saying, you use these at your own risk.....but they do work very well, and several 'Puppians' confirm that they run happily on Pentium III / Athlon XP machines. I see no reason why this wouldn't run in Q4OS, too.

These are tarballs. You download the tarball, unzip it, place the 'palemoon' directory you will find inside in an appropriate location (/opt is usually a good choice), then launch it by clicking on the 'palemoon' binary within.

Hope that helps.


Mike. ;)
 
Last edited:


Follow Linux.org

Members online

No members online now.

Top