LIMINE-SYNC(8) System Manager's Manual man.rawnix.org

limine-sync — write the boot menu from what is in /boot

limine-sync [-n] [-q]

limine-sync reconciles the EFI system partition with /boot and writes the Limine boot menu. It takes no argument that changes what it does: the result is a function of three directory listings.

/boot
what the packages staged: kernels, the initramfs, microcode.
/lib/modules
the module trees, which decide whether a kernel is usable.
/boot/efi
the current state of the ESP, which is made to match.

mkpkg(8) runs it through the boot/ trigger whenever a package adds or removes something there, so installing or removing a kernel updates the menu by itself. Running it by hand at any time is safe and changes nothing that is already correct.

A kernel in /boot is only offered if /lib/modules/version exists: a kernel whose modules were removed, or whose install was interrupted, would boot into a system that cannot load a single driver. Such a kernel is reported and left out. Every kernel, initramfs and microcode image on the ESP that no longer has a counterpart in /boot is deleted. Files limine-sync did not put there are left alone.

The options are as follows:

Dry run: print what would change and touch nothing. Worth doing after editing the configuration.
Quiet: do the work without printing what changed.

The menu has two halves. /etc/limine.conf.in is written by hand and holds the global settings; limine-sync replaces the line @KERNELS@ in it with an entry per usable kernel, newest first, and writes the result to /boot/efi/limine.conf. That file is generated: edit the template, never it.

default_entry must not appear in the template. It is a one-based index, so it moves to a different kernel every time one is added or removed; limine-sync refuses a template that sets it. To boot something other than the newest kernel, use remember_last_entry: yes, which follows the entry rather than its position.

Each generated entry gets the command line from CMDLINE, and up to two module_path lines: the microcode first, because the kernel only applies an early update from the head of the initrd chain, then the initramfs.

/etc/limine-sync.conf supplies the few things a directory listing cannot: one KEY=value per line, keys uppercase, surrounding quotes stripped, and ‘#’ starting a comment anywhere on the line. An unknown key is reported and ignored. /etc/limine-sync.conf.example documents every key at its default.

The kernel command line, used verbatim for every entry. . The root device is the one setting that differs on every machine, and a compiled-in guess would write a bootable-looking menu pointing at the wrong disk and report success. setup-boot(8) writes this line on an install target.
The menu label; entries read “TITLE version”. Default: rawnix.
The initramfs in /boot. tinyrd carries no modules and takes the LUKS UUID from the command line, so one image serves every kernel and the name has no version in it. Empty boots without one, which an encrypted root cannot do. Default: tinyrd.img.
The early microcode image in /boot, emitted as the first module_path and only if the file is on the ESP.

Unset, the default, limine-sync uses whichever of amd-ucode.img and intel-ucode.img is on the ESP: a machine has one CPU vendor and installs one microcode package, so the file that is there is the answer. Set, that name is used and its absence is reported, since an omitted microcode line is otherwise invisible until the next boot applies no early update. none emits none at all.

, XEN_CMDLINE, XEN_OPTIONS, XEN_UCODE
Only relevant when a xen-*.efi is on the ESP; the newest one always gets a chainload entry. These additionally generate /boot/efi/xen.cfg, which picks dom0's kernel. XEN_KERNEL pins a series, not a version: 6.12 selects the newest 6.12.x that has a module tree. Empty leaves xen.cfg alone.

/etc/limine-sync.conf
Settings; required, for CMDLINE.
/etc/limine-sync.conf.example
Every key, documented at its default.
/etc/limine.conf.in
The hand-written half of the menu, with @KERNELS@.
/boot/efi/limine.conf
The generated menu.
/boot/efi/EFI/BOOT/BOOTX64.EFI
Limine itself, copied from /usr/share/limine/.
/boot/efi/limine-bios.sys
Limine's BIOS stage on a legacy-boot machine. Copied there by hand, and never touched by limine-sync.

The limine-sync utility exits 0 on success, and >0 if an error occurs. It refuses to run, changing nothing, when CMDLINE is missing, when /boot/efi is not a mount point, or when the template sets default_entry.

After editing the configuration, look before you leap:

# limine-sync -n
# limine-sync

A machine with an encrypted root; the UUID is the LUKS partition's, from cryptsetup luksUUID, and the mapping name in root= is the one tinyrd creates:

CMDLINE=cryptroot=UUID=xxxxxxxx-... root=/dev/mapper/croot ro quiet

bootloader(7), rawnix(7), mkpkg(8), setup-boot(8), tinyrd(8)

zorz <zorz@rawnix.org>

limine-sync writes the UEFI half of the boot chain: it requires a FAT partition mounted at /boot/efi and installs BOOTX64.EFI.

On a machine that boots legacy BIOS it still writes the menu and the kernels, and the firmware reads limine.conf from the same partition, but the BIOS half is installed by hand: limine bios-install writes stage 1 to the disk and limine-bios.sys is copied onto the partition. limine-sync removes neither, so the copy survives every later run; after upgrading limine, redo both together. See rawnix(7).

October 17, 2026 limine-sync 1.2