It is recommended to boot Batocera off of a USB/other external drive and to use your BIOS boot selection menu to switch between Batocera and other operating systems that may already be on other drives. You can still use drives with other operating systems on them to host your userdata such as ROMs, BIOS files, saves, etc. This is the far simpler option to do instead of what you'll have to do if you only want to do everything from one drive. However, some people prefer to have Batocera directly installed on the main hard drive alongside another pre-existing OSes, this page is for that.
Before attempting any of this, make a backup of your data. There is a chance that the following actions (shrinking partitions, replacing boot loaders, etc.) can render the storage devices inoperable.
If this sounds too spooky to you, just flash Batocera to a USB drive as is recommended and use that instead.
Ordinarily, Batocera utilizes Syslinux to boot, which is configured to only boot Batocera. Thus, for most dual boot setups we will be utilizing GRUB to show a boot selection menu after BIOS has loaded instead.
In case you install Batocera on your hard-drive, you may want to rename the BATOCERA partition to something unique like BATOPC. If you do, edit the grub.cfg file below to have label=BATOPC instead of label=BATOCERA. This allows you to still boot using Batocera installed on a USB without worry that the hard-drive will always take priority due to sharing the same label.
For those that prefer video guides (there is… no actual need to flash a spare USB drive, just download the boot.tar.xz): Pleilleur's Choice #1 Dualboot Windows 10 and Batocera
This guide is assuming Windows is being booted from an EFI partition. If it isn't, or you don't know, proceed at your own risk.
Partition the drive, having a 8 GB FAT32 partition after the Windows drive immediately followed by the “userdata” partition, which can be any compatible filesystem. If preferred, it is also possible to have Batocera to use the Windows partition as its userdata, however that requires manually setting it up before the rest of the installation so for first-timers this is not recommended.
Extract and copy the latest Batocera ''boot.tar.xz'' (can be extracted with 7-zip) to the root of the FAT32 partition. Its contents should look similar to the following:
D:\ ├─ boot\ ├─ EFI\ ├─ tools\ └─ batocera-boot.conf
Download and install grub2win. It may come up as a false positive on anti-virus software, we are going to be overiding the boot manager which could potentially prevent Windows from booting so maybe they are right in that regard. Either way, just let it through to continue.
setup.exe. set efibootmgr=/EFI/batocera/bootx64.efi
getpartition file $efibootmgr root
if [ ! -z $reviewpause ] ; then
echo GNU Grub will load the Batocera EFI Boot Manager at disk address $root
g2wsleep
fi
echo GNU Grub is now loading the Batocera EFI Boot Manager
chainloader $efibootmgr
savelast 1 'Batocera'
For Batocera v38 and lower:
set efibootmgr=/EFI/BOOT/bootx64.efi
getpartition file $efibootmgr root
if [ ! -z $reviewpause ] ; then
echo GNU Grub will load the Batocera EFI Boot Manager at disk address $root
g2wsleep
fi
echo GNU Grub is now loading the Batocera EFI Boot Manager
chainloader $efibootmgr
savelast 1 'Batocera'
Pleillear keeps an updated copy of the file at this Google Drive link, so check that if this page hasn't been updated for a while. Note that the file at this Google Drive link is not up to date for v39, and would need set efibootmgr=/EFI/BOOT/bootx64.efi changed to set efibootmgr=/EFI/batocera/bootx64.efi
Although Windows can be hostile towards other operating systems (erasing their bootloaders on an update, clearing the master boot record without warning, etc.), Macs can be even more hostile. Keep this in mind and definitely have a secure method of restoring a backup when playing with the Mac's bootloader.
For “Hackintosh” builds, this is usually safer.
Before installing rEFInd, be sure to read and understand the entire contents of its documentation first. Being negligent in this regard can result in an unbootable system if no flashing method is prepared earlier. To quote the author of rEFInd: “Note: I consider rEFInd to be beta-quality software! That said, rEFInd is a usable program in its current form on many systems.”
Install rEFInd Boot Manager and check that the system is still booting. Batocera might be automatically detected (but with a generic name); if so lucky you! Otherwise, Batocera can be added manually by adding the following to the refind.conf file.
menuentry "Batocera" {
icon EFI/boot/icons/os_linux.png
loader /boot/linux
initrd /boot/initrd.gz
options "label=BATOCERA console=tty3 quiet loglevel=0 vt.global_cursor_default=0"
}
Here are some examples on how to dual boot Batocera with popular Linux distributions like Ubuntu or Linux Mint.
Follow your favorite method for the initial Ubuntu install, leaving extra unpartitioned space for Batocera and its userdata.
After the Ubuntu partition, create two consecutive partitions:
fat32, name = BATOCERAext4, no special labels or flags required, it must be created and placed right after the BATOCERA partition
Then download boot.tar.xz and unzip it on the BATOCERA partition.
/etc/grub.d/50_batocera with the following content: #!/bin/bash
cat << EOF
menuentry "batocera.linux" {
search --set=root --label BATOCERA
linux /boot/linux label=BATOCERA console=tty3 quiet loglevel=0 vt.global_cursor_default=0
initrd /boot/initrd.gz
}
EOF
sudo chmod +x /etc/grub.d/50_batocerasudo update-grubYou will now be presented with the GRUB menu upon booting, allowing you to select either Batocera or Ubuntu to boot into.
Older versions of Ubuntu may need grub-customizer to do the above. More info on this earlier version of the page.
Alternatively, try the Linux Mint section below.
For other distributions like Linux Mint 19.03, you can use the following method. It also works for MX Linux, all mentions of Linux Mint also refer to MX Linux in this section.
Follow your favorite method for the initial Mint install, leaving extra unpartitioned space for Batocera and its userdata.
Create 2 consecutive partitions on your hard drive:
BATOCERABATOCERA partition.
Then download boot.tar.xz and unzip it on the BATOCERA partition.
Since it's been set up manually, you can remove the autoresize flag from batocera-boot.conf. It may interfere with booting if it's still on and there's no more space to expand to.
/etc/grub.d/15_batocera: #! /bin/sh
BATOCERA_UUID=$(lsblk --fs --noheadings --pairs -o TYPE,LABEL,UUID |
grep -E '^TYPE="part" LABEL="BATOCERA" UUID="[^"]*"$' |
sed -e s+'^TYPE="part" LABEL="BATOCERA" UUID="\([^"]*\)"$'+'\1'+ | head -1)
if test -n "${BATOCERA_UUID}"
then
echo "Image batocera found on ${BATOCERA_UUID}" >&2
cat <<EOF
menuentry "batocera.linux" {
insmod fat
search --no-floppy --fs-uuid --set=root ${BATOCERA_UUID}
linux /boot/linux label=BATOCERA console=tty3 quiet loglevel=0 vt.global_cursor_default=0
initrd /boot/initrd.gz
}
EOF
fi
sudo wget 'https://wiki.batocera.org/_export/code/dual_boot_ubuntu_batocera.linux?codeblock=4' -O /etc/grub.d/15_batocera
sudo chmod a+x /etc/grub.d/15_batocera sudo update-grub
Eventually, it will output the following:
[...] Image batocera found on 3377-44C4 [...]
You will now be presented with the GRUB menu upon booting, allowing you to select either Batocera or Linux Mint to boot into.
https://www.ventoy.net/en/index.html
Technically, this isn't really dual-booting, but booting a static image already loaded onto your drive's filesystem as its own mounted filesystem. It can ease the process of updating the image, however this is probably unnecessary as Batocera itself has its own updating tool. Nonetheless it could be useful for machines that otherwise don't have an internet connection and have to rely on another one to update or machines that absolutely refuse to boot via conventional manners.
By default, Batocera's userdata partition is only 512MB before expanding, obviously not large enough to do anything. Ventoy uses the booted image file as a virtual hard disk, so with a factory-provided image, the userdata partition can't be auto-expanded beyond the baseline 512MB at first boot. This can be solved by either only mounting Batocera's boot partition (thus making the next immediate partition the userdata partition, whatever that may be) or by running the following (replace # with the number of GB you want in total, including the boot partition):
qemu-img resize batocera.img +#G sudo losetup --find --show batocera.img
and expanding the userdata partition with Gparted or something similar.
If you want to keep using the command line for Gparted:
gparted /dev/loop *
If you prefer using a script instead of manual procedures, this will add a specified amount of space to a Batocera image file, and will expand the /userdata SHARE partition to fill the added space:
#!/bin/bash # batocera-ventoy-resize.sh 20240921 n2qz/maximumentropy # Expand a Batocera installation image file to make storage space # available in SHARE when booting the image from Ventoy. # # Tested on Ubuntu 24.04.1 LTS with e2fsprogs 1.47.0. May not work on # older versions of linux, as current Batocera images (v41+) use newer # ext4 features not available with older ext4 utilities err () { exitcode=$? echo "... Exit code $exitcode on line ${BASH_LINENO[0]} while executing command: $BASH_COMMAND" exit $exitcode } trap err ERR growsize="$1" inputimage="$2" outputimage="$3" if [ -z "${growsize}" -o -z "${inputimage}" -o "${inputimage}" = "${outputimage}" -o "${outputimage}" != "$(basename "${outputimage}" .gz)" ] then echo "Usage: $0 growsize inputimage[.gz] [outputimage]" echo "Example: $0 32G batocera.img ventoy.img" exit 2 fi image=$(basename "${inputimage}" .gz) if [ -z "${outputimage}" ] then outputimage="ventoy-${image}" fi if [ "${inputimage}" = "${image}" ] then echo "... Copy ${inputimage} to ${outputimage}" cp "${inputimage}" "{$outputimage}" else echo "... Decompress ${inputimage} to ${outputimage}" gzip -vkcd "${inputimage}" > "${outputimage}" fi echo "... Grow image ${outputimage}" truncate -s "+${growsize}" "$outputimage" echo "... Set up loopback device" lodev=$(sudo losetup --find --show --partscan "${outputimage}") echo "... Loopback device is: ${lodev}" sharepart=2 sharepartdev="${lodev}p${sharepart}" echo "... Adjust GPT on ${lodev}" sudo sgdisk -e "${lodev}" echo "... Show free space on ${sharepartdev}" sudo dumpe2fs "${sharepartdev}" | grep '^Free blocks' echo "... Resize SHARE partition ${sharepartdev}" sudo parted -s "${lodev}" "resizepart ${sharepart} 100%" echo "... Check ${sharepartdev}" sudo fsck -f "${sharepartdev}" echo "... Grow ${sharepartdev}" sudo resize2fs "${sharepartdev}" echo "... Show free space on ${sharepartdev}" sudo dumpe2fs "${sharepartdev}" | grep '^Free blocks' echo "... Detach loopback device ${lodev}" sudo losetup -d "${lodev}" echo "... Successfully completed"