Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I managed to create a small and fully functional live Linux CD which contains only kernel (compiled with default options) and BusyBox (compiled with default options + static, all applets present, including /sbin/init). I had no issues to create initrd and populate /dev, /proc and /sys and also I had no issues at all with my /init shell script.

Recently I read that BusyBox supports /etc/inittab configurations (at least to some level) and I very much would like to do either of the following:

  • Forget about my /init shell script and rely entirely on /etc/inittab configuration.
  • Use both /init shell script and /etc/inittab configuration.

Now the actual problem - it seems that /etc/inittab is completely ignored when my distro boots up. The symptoms are:

  • When I remove /init and leave only /etc/inittab I end up with kernel panic. My assumption is that kernel doesn't execute /sbin/init at all, or that /sbin/init doesn't find (or read) /etc/inittab.
  • I read that BusyBox should work fine even without /etc/inittab. So, I removed both /init and /etc/inittab and guess what - kernel panic again.
  • I tried to execute /sbin/init from my shell and after several guesses which included exec /sbin/init, setsid /sbin/init and exec setsid /sbin/init I ended up with kernel panic. Both with and without /etc/inittab being present on the file system.

Here is the content of my /init shell script:

#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh

At this point I don't care what the content of the /etc/inittab would be, as long as I have a way to know that the configuration there actually works. I tried several /etc/inittab configurations, all based on the information which I found here.

As a bare minimum my /etc/inittab contained just this one line:

::sysinit:/bin/sh

Again - I ended up with kernel panic and it seems that /etc/inittab was ignored.

Any suggestions how to force my little live distro to work fine with BusyBox's /etc/inittab are highly appreciated!

Update:

  • Just to make it clear - I do not have kernel panic troubles with my current /init shell script both with and without /etc/inittab. It all works fine, my /bin/ash console works great and I don't experience any unexpected troubles. The only issue is that /etc/inittab is completely ignored, as I described above.
  • I examined 3 different live Linux distributions: Slax, Finnix and SysResCD. All of them have /init and none of them have /etc/inittab. In addition this Wiki article concludes my suspicion that /sbin/init is not invoked at all.
share|improve this question

1 Answer 1

up vote 0 down vote accepted

OK, I did a lot of extensive research and I found out what was wrong. Let's start one by one:

  • When we use initramfs boot scheme the first process which the kernel invokes is the /init script. The kernel will never try to execute /sbin/init directly.
  • /init is assigned process identifier 1. This is very important!
  • The problem now is that /sbin/init can only be started as PID 1 but we are already running /init as PID 1.
  • The solution is to execute the command line exec /sbin/init while we are still inside /init. In this way the new process (which is /sbin/init) will inherit the PID from it's parent (/init with PID 1) and that's all we have to do.

The problem I experienced with my initial configuration (see the question) was due to the fact that the last thing my /init script does is to spawn new /bin/sh process which is assigned brand new PID. From this point it's impossible to run /sbin/init directly from interactive console because even when we execute the command line exec /sbin/init, the best we achieve is to assign the same PID which has already been assigned to the shell and this PID is definitely not PID 1.

Long story short - execute the command line exec /sbin/init directly from /init and that's all.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.