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:
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: 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: 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: 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.