I was being silly. Found the answer myself: if [ -n "$earlymodules$MODULES" ]; then modprobe -qab ${earlymodules//,/ } $MODULES fi in base hook init. On 10 June 2015 at 10:30, Tom Yan <tom.ty89@xxxxxxxxx> wrote: > For my current system, I need the following modules (and their > dependencies) to boot (mount the real root): > > ahci, sd_mod, btrfs > > (which are drivers for the sata controller, disk, and the root > filesystem respectively.) > > If I specify these three in the MODULES array of mkinitcpio.conf, the > only hook I need is the base hook. > > However, if I make use of the block hook and filesystem hook instead > of the MODULES array to include the modules I need, I can't boot > successfully without the udev hook: > > Unable to find root device 'UUID=c47a3e43-fed6-4f8a-8e52-71bae7a9f893' > > So, what is the purpose of the udev hook? What so special is the MODULES array? > > I even tried to include all modules which are included by the block > hook and filesystem hook (with autodetect) explicitly with the MODULES > array, to see whether the extra modules were adding factors to cause > the failure, yet it still boots fine without the udev hook.