Skip to content

raspi-config automated

While I installed the Raspberry Pi with the Raspbee board on it, I had to modify the settings for the serial device. That's done using the raspi-config tool on Raspbian.

However since I'm into automation, I don't want to start "raspi-config" manually, but had to figure out how to do that in an automated way.



Turns out, "raspi-config" can be started with parameters, which basically guide the tool what to do. For every change a new run is necessary, it's not possible to do two changes at once. And there is really no feedback if something was changed or not. Plus there is not much documentation at all for this mode. But oh well, better than nothing.

In my case, I had to enable the serial console, but disable the login over the serial port. The Raspbee is using that channel to communicate with the Pi.

By default, the login over the serial bus is enabled, and that results in one of the two following strings in /boot/cmdline.txt: "console=serial0" or "console=console=ttyAMA0". In my Ansible Playbook, I first read in the file:

- name: Retrieve /boot/cmdline.txt
    src: "/boot/cmdline.txt"
  register: boot_cmdline_txt_retrieve

- name: Extract /boot/cmdline.txt
    boot_cmdline_txt: "{{ boot_cmdline_txt_retrieve.content | b64decode }}"

This fetches the file "/boot/cmdline.txt" from the remote host (the Raspberry Pi) and stores it in a variable. The content is base64 encoded, and needs to be decoded first. The plain text content is then stored in $boot_cmdline_txt. Now I can use the content of that file (variable) and figure out if I have to run raspi-config:

- block:
  - name: Enable hardware serial port
    # "2" will disable the login on the serial port,
    # but will enable the port itself
    shell: raspi-config nonint do_serial 2
      - restart Pi

  when: boot_cmdline_txt is search("console=serial0") or boot_cmdline_txt is search("console=console=ttyAMA0")

When I find one of the two strings in the file, I run "raspi-config". That was the easy part.

It was more complicated to figure out what exact parameters are required. First "raspi-config" expects "nonint" for "non interactive mode". After that, the command which is to be executed. In my case that's "do_serial" for changing the serial settings. Since it's nowhere documented, I looked into "/usr/bin/raspi-config" - which is just a long shell script. And finally the remaining parameters are used for the command. In this case there are two parameters encoded into one: the setting "2" will first disable the login shell over the serial port, but then enable the serial port itself.

In the same way one can manage the other commands in "raspi-config", but some source code surfing might be necessary.


No Trackbacks


Display comments as Linear | Threaded

No comments

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
To leave a comment you must approve it via e-mail, which will be sent to your address after submission.
Form options