Als het systeem wordt opgestart, leest de BIOS sector 0 in (bekend als de MBR - de Master Boot Record) vanaf de eerste disk (of vanaf diskette of CDROM), en springt naar de daar gevonden code - meestal een bootstrap loader. Deze kleine bootstrap programma's die daar worden gevonden hebben kenmerkend geen eigen diskdrivers en gebruiken BIOS services. Dit betekent dat een Linux kernel slechts kan worden geboot als het zich volledig binnen de eerste 1024 cylinders bevindt.
Dit probleem kan makkelijk worden opgelost: zorg ervoor dat de kernel (en misschien andere bestanden die tijdens het opstarten worden gebruikt, zoals LILO map bestanden) zich op een partitie bevinden die zich volledig binnen de eerste 1024 cylinders bevindt van een disk waartoe de BIOS toegang heeft - waarschijnlijk betekent dit de eerste of tweede disk.
Dus: maak een kleine partitie aan, laten we zeggen ter grootte van 10 MB,
zodanig dat er ruimte is voor een handjevol kernels, ervoor zorgend
dat het zich volledig bevindt binnen de eerste 1024 cylinders van de
eerste of tweede disk. Mount het op /boot
zodat LILO zijn
zaken hier neer zal zetten.
Een ander punt is dat de boot loader en de BIOS het eens moeten
zijn over de diskgeometrie. LILO ondervraagt de kernel naar de geometrie,
maar meer en meer auteurs van diskdrivers volgen de slechte gewoonte
een geometrie vanuit de partitietabel af te leiden, in plaats van
LILO te vertellen wat de BIOS zal gebruiken. Dus vaak is de geometrie,
waarin door de kernel is voorzien, waardeloos. In dergelijke gevallen helpt het
om aan LILO de `linear
' optie mee te geven.
Het effect hiervan is dat LILO geen geometrie informatie nodig heeft
op het moment dat de bootloader zich installeert
(het bewaart lineaire adressen in de maps) maar doet de conversie
van lineaire adressen niet tijdens het booten. Waarom is dit niet de standaard?
Er is één nadeel: met de `linear' optie, is LILO niet
langer bekend met cylindernummers, en
kan je daarom niet waarschuwen als een deel van de kernel boven de
1024 cylinder limiet is opgeslagen, en zou je kunnen eindigen met
een systeem dat niet boot.
Met LILO versies lager dan v21 is er nog een ander nadeel: de adresconversie die tijdens de systeemstart wordt uitgevoerd bevat een bug: als c*H gelijk is aan 65536 of meer, vindt in de berekening overflow plaats. Bij H groter dan 64 zorgt dit voor een strictere limiet voor c dan de bekende c < 1024; met bijvoorbeeld H=255 en een oude LILO moet men een c < 258 hebben (c=cylinder waar de kernel-image voorkomt, H=nummer van diskkoppen).
Tim Williams schrijft: `Ik had mijn Linux partitie binnen de eerste 1024 cylinders en nog steeds wilde het niet booten. Toen ik het eerst onder de 1 GB verplaatste werkte het.' Hoe kan dat? Dit was een SCSI disk met AHA2940UW controller die of H=64, S=32 gebruikt (dat wil zeggen, cylinders van 1 MiB = 1.05 MB), of H=255, S=63 (dat wil zeggen, cylinders van 8.2 MB), afhankelijk van setup opties in firmware en in de BIOS. Geen twijfel dat de BIOS van het eerste uitging, zodat de 1024 cylinder limiet werd gevonden op 1 GiB, terwijl Linux de laatste gebruikte en LILO dacht dat deze limiet op 8.4 GB zat.