5

The iniramfs is like a small os which mount root file system and hand over control to systemd. So, how does initramfs work internally? Is there any scripts executed to mount the root in linux?

2
  • 2
    like this wiki.gentoo.org/wiki/Custom_Initramfs#Init (read the intro for explanation) Oct 10, 2019 at 11:48
  • 2
    This is too broad. Basically, if initramfs is used, it becomes the very first filesystem mounted (the / of the init mount namespace). Then kernel would execute the init program in it (from specific path), which is the PID=1 of the init pid namespace. As such, the useespace of the OS begins. Mounting the real on-disk root filesystem and pivot_root to it is just a common user-defined behavior of most linux OS, but it's not a must(not a definite behavior of the kernel), because initramfs can be fully customized. Oct 10, 2019 at 11:57

1 Answer 1

8

After that initrd/initramfs (only historical difference) is extracted and mounted, it is the script /init that is run. Mostly it only mounts the real root with help of the modules from the initramfs.

And then it has to pivot/switch root to that new partition, a thing that is only possible as pid 1.

Here is a minimal /init script:

mkdir /newroot
mount /dev/sda2 /newroot
mount --move /sys /newroot
mount --move /dev /newroot
mount --move /proc /newroot

switch_root /newroot /bin/bash

(or /sbin/init for a normal continuation)

The thing is the kernel cannot mount /dev/sda2 without the necessary modules built in. Having the modules on sda2 does not help: egg-and-hen problem.

So the kernel gets a cpio archive with a root filesystem containing modules and scripts. The kernel simply hands over to /init and is done with it's own startup.


That gentoo link starts with:

initramfs is a root filesystem that is embedded into the kernel...

What should that mean?


This is a minimal kernel command line:

vmlinuz root=/dev/sdaX

telling the boot loader to load kernel "vmlinuz" and telling the kernel to mount /dev/sdaX.

And this:

vmlinuz initrd=initramfs.img root=/dev/sdaX

makes the boot loader also load an initrd, which the kernel will find and mount as root, and tells the (default) /init script to pivot/switch to /dev/sdaX (and then run default /sbin/init).

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .