On Sat, Apr 18, 2015 at 12:02:23PM -0400, Steve Litt wrote: > On Sat, 18 Apr 2015 00:08:54 -0400 > Jude Nelson <jud...@gmail.com> wrote: > > > > The init program in example/initramfs/init goes into > > /usr/share/initramfs-tools/init, not /sbin/init :) The initramfs's > > init script is fundamentally different from the init program > > in /sbin. That also explains your inability to reboot. > > > > Basically, when the bootloader loads the initramfs, the kernel mounts > > it as the root device and starts /sbin/init. /sbin/init, in turn, > > runs the script at /init (which you can see from the initramfs shell > > with "ls /"), which is copied into the initramfs image by the > > update-initramfs and mkinitramfs tools from the > > file /usr/share/initramfs-tools/init. > > Hi Jude, > > Your description above differs from what I thought happens at boot. > Until reading your description, I had thought: > > 1) Boot loader runs kernel via the kernel device/path/name, passing it > the root partition device, and device/path/name locations of the > init program and the initramfs (if any).
This is incorrect; the bootloader loads kernel and initrd/initramfs into memory, passing along any extra kernel options and a pointer to the initrd/initramfs. For initramfs, the kernel mounts a ramfs or tmpfs filesystem on /, decompresses and extracts the initramfs onto it (which *apparently* involves a loop so that multiple initramfs archives can be concatenated). The initramfs archive is a cpio 'newc' archive, typically compressed with gzip (though the kernel supports xz, bzip2, and I think a couple other formats). For initrd, what was loaded was a raw ext2 filesystem, set up as a ramdrive, so the kernel need not do anything. > 2) Using the passed info, the kernel mounts the initramfs (if any) as > /, and then runs the initramfs' /sbin/init. Any processes started by > the initramfs init program are kernel process surrounded by square > brackets in the ps command. No, they are regular processes. Kernel processes are *part* of the kernel, not userland processes that got started at the right time. I'm not sure exactly what the priority is, but the kernel searches /sbin/init, /init, and /linuxrc at least. /init is tried *before* /sbin/init, a fact which I know due to some experiments with toybox. I've seen a reference to a kernel option that changes the "init" on the initramfs recently on this list; I'm not positive what it is, but it may be rdinit. > 3) If the initramfs init program completes, the kernel runs the init > program whose location was passed to it by the bootloader. However, > in Manjaro's initramfs init, the last line of the initramfs' init > program runs the on-disk init program whose location was passed to > the kernel by the bootloader. When the init program whose location > was passed to the kernel runs, it runs as PID 1, and can spawn (or > manage if desired) other programs. As far as I know, if the initramfs init program completes, the kernel panics. It needs to mount the new / on a mountpoint (traditionally /mnt), move /dev to /mnt/dev if using a dynamic /dev, change the root (pivot_root() is the typical syscall, usually used via switch_root or pivot_root commands), and exec the new init. HTH, Isaac Dunham _______________________________________________ Dng mailing list Dng@lists.dyne.org https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng