I’m attending Sketching in Hardware this weekend and there was a fair bit of discussion regarding how long it takes to boot Linux and barriers it makes to understanding a system. My assertion was that booting Linux on a computer, like PocketBeagle, doesn’t take very long at all and that it generally only gets in the way when you want it.
Here’s what I hacked up in about 10 minutes to show off how we can get a whole lot of distribution code out-of-the-way.
In /boot/uEnv.txt, I edited the cmdline:
cmdline=coherent_pool=1M net.ifnames=0 rng_core.default_quality=100 quiet **modules-load=g_serial**
The point of this is that our boot script that configures the USB gadget won’t be loaded anymore. This causes the Linux kernel to emulate a serial port, providing a way to get to the Python REPL.
In /etc/passwd, I edited the shell for the ‘debian’ user:
debian:x:1000:1000:Demo User:/home/debian:**/usr/bin/python3**
This makes python3 the default shell for the ‘debian’ user, so whenever a user logs in as ‘debian’, they get a python3 REPL.
In /lib/systemd/system/serial-getty@.service, I enabled a bypass for the user login password request:
ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM **-a debian**
This totally insecure, but on PocketBeagle without any augmentation, this just gives access over the USB port. Seems pretty reasonable to me.
I executed the following commands to reduce the applications running at startup and enable the terminal on the virtual serial port:
sudo systemctl set-default rescue.target
sudo ln -s /lib/systemd/system/serial-getty@.service /etc/systemd/system/default.target.wants/serial-getty@ttyGS0.service
When you do the above, a reboot will no longer bring up things like the Cloud9 IDE, so be sure to run both commands before rebooting. Use ‘sudo shutdown -r now’ to reboot.
Seems like there’s still a fair amount of optimization that can be done, but here’s the behavior I saw when pulling and re-inserting the USB cable after making these changes:
jkridner@tupper:~$ **journalctl -f**
Sep 28 13:55:52 tupper kernel: usb 1-4: USB disconnect, device number 26
Sep 28 13:55:52 tupper upowerd[2124]: unhandled action 'unbind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:2.1
Sep 28 13:55:52 tupper upowerd[2124]: unhandled action 'unbind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:2.0
Sep 28 13:55:52 tupper upowerd[2124]: unhandled action 'unbind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4
Sep 28 13:56:08 tupper kernel: usb 1-4: new high-speed USB device number 27 using xhci_hcd
Sep 28 13:56:08 tupper kernel: usb 1-4: New USB device found, idVendor=0525, idProduct=a4a7
Sep 28 13:56:08 tupper kernel: usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Sep 28 13:56:08 tupper kernel: usb 1-4: Product: Gadget Serial v2.4
Sep 28 13:56:08 tupper kernel: usb 1-4: Manufacturer: Linux 4.14.108-ti-r113 with musb-hdrc
Sep 28 13:56:08 tupper kernel: cdc_acm 1-4:2.0: ttyACM0: USB ACM device
So, without any other tweaking, it seems to still be taking about 16 seconds. I’m not very happy with this, so I’ll be hooking up a serial cable and figuring out where the time goes soon.
jkridner@tupper:~$ **tio /dev/ttyACM0**
[tio 14:02:10] tio v1.29
[tio 14:02:10] Press ctrl-t q to quit
[tio 14:02:10] Connected
File "", line 0
^
SyntaxError: 'utf-8' codec can't decode byte 0xf0 in position 2: invalid continuation byte
>>> quit()
Debian GNU/Linux 9 beaglebone ttyGS0
BeagleBoard.org Debian Image 2019-08-03
Support/FAQ: [http://elinux.org/Beagleboard:BeagleBoneBlack_Debian](http://elinux.org/Beagleboard:BeagleBoneBlack_Debian)
default username:password is [debian:temppwd]
beaglebone login: debian (automatic login)
Last login: Sun Aug 4 02:10:35 UTC 2019 on ttyGS0
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> **import os**
>>> **os.system("bash")**
debian@beaglebone:~$
I chose to use ‘tio’, but ‘screen’ and other serial utilities would work fine.
I don’t actually know that the cause of the stray characters is. Someone can probably enlighten me.
I’ll release this as a blog post once I figure out why the boot time is this slow, but I thought this was interesting enough to post here. Enjoy.