How to login automatically without typing the root username or password in Buildroot BusyBox init?

If I do:

git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2016.05
make qemu_x86_defconfig
make BR2_JLEVEL=2
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user

I have to type root into QEMU before I can use the shell.

How to configure buildroot to skip that and login directly?

Tested on Ubuntu 16.04.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

::respawn:-/bin/sh

Using BR2_ROOTFS_OVERLAY, modify the guest /etc/inittab to contain:

::respawn:-/bin/sh

instead of the default line of form:

console::respawn:/sbin/getty -L console 0 vt100

You can copy the default inittab from output/target/etc/inittab after the build to modify the above line from it.

I found this while studying the examples/inittab in Busybox 1_28_3 and found this, tried it out, and it worked, so it is the best solution I’ve found so far.

Don’t forget the leading dash -, or job control actions such as Ctrl + C don’t work as mentioned below.

The leading dash - gets magically parsed by BusyBox’ init: https://github.com/mirror/busybox/blob/1_28_3/init/init.c#L439 and sets up the TTY for the command that follows.

BusyBox also appends the - to the beginning or arg[0], which /bin/sh interprets as indicating a login shell, which makes it source some init files such as /etc/profile. See also: https://stackoverflow.com/a/42291142/895245

The following is equivalent since console is the default value:

console::respawn:-/bin/sh

To login as another user by default, you can use instead:

::respawn:-/bin/login -f user0

Here is a sample setup.

Previous answer: getty -l

After almost two years, I’ve found it! 🙂

Using BR2_ROOTFS_OVERLAY, override / create the following files:

/etc/inittab: start from https://github.com/buildroot/buildroot/blob/2018.02/package/busybox/inittab and edit the console line to be:

console::respawn:/sbin/getty -n -L -l /loginroot.sh console 0 vt100

/loginroot.sh:

#!/bin/sh
exec /bin/login root

/bin/login is the default executable if -l is not given. What we did it to create an executable that calls /bin/login with the user root already specified.

This makes init try to log in as the root user by default, and then since the default password is empty (BR2_TARGET_GENERIC_ROOT_PASSWD), it automatically logs in.

This technique basically re-implements the -a <user> option present in Ubuntu 14.04’s getty, which BusyBox’ implementation doesn’t have.

Then, to login as a different user, just run:

/bin/login

Here is a sample setup.

Previous previous answer: console::respawn:/bin/sh

I’ve asked on the mailing list and Thomas Petazzoni replied that the:

/etc/inittab

should contain:

console::respawn:/bin/sh

instead of:

console::respawn:/sbin/getty -n -L  console 0 vt100 # GENERIC_SERIAL

With qemu_x86_defconfig, the inittab is being used by Busybox’ init system, due to BR2_INIT_BUSYBOX=y.

This method does have a downside however: just after login, the message shows:

/bin/sh can't access tty; job control turned off

and as advertised, things like Ctrl+C will have no effect.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x