The raspi-config utility is the Raspberry Pi‘s central configuration tool for adjusting system-wide software and hardware settings. This comprehensive 2600+ word guide aims to make you a power user of raspi-config by covering key configuration scenarios, customization options, performance tuning, automation possibilities, and even diving into the source code to understand how raspi-config modifies the Linux environment under the hood.
Introduction to raspi-config
The user-friendly text-based UI of raspi-config partitions configuration options into categories like System, Interfaces, Performance, and Localization. According to lead Raspberry Pi developer Simon Long, raspi-config‘s goal is to "hide some of the complexity from users and provide a nice, simple, consistent interface for performing a number of key tweaks and customizations."
To launch raspi-config, open a terminal and type:
$ sudo raspi-config
Below I elaborate on critical configuration groups and analyze the inner workings of raspi-config from an advanced Linux perspective.
Configuration Use Cases
While raspi-config handles generic preferences like timezone locale, keyboard layouts, etc, it truly shines for tailoring Pi‘s to specific use cases:
Media Centers
Enabling HDMI hotplug detect, expanding GPU memory, forcing HDMI output even without cable connected, and selecting the correct overscan mode are key for home theater Pi setups:
$ sudo raspi-config nonint do_hdmi_boost 1 # Enable hotplug
$ sudo raspi-config nonint do_memory 256 # Set GPU to 256 MB
Smart Home/IoT
For home automation with sensors, actuators, etc enable interfaces like camera, 1-Wire, I2C, SPI, serial port:
$ sudo raspi-config nonint do_camera 0 # Enable camera
$ sudo raspi-config nonint do_i2c 0 # Enable I2C
Kiosks/Digital Signage
Auto-login to desktop on boot, disable screen blanking, set highest resolution, and prevent user from accessing shell are key for public displays:
$ sudo raspi-config nonint do_boot_behaviour B2 # Boot to desktop w/ auto-login
$ sudo raspi-config nonint do_resolution_setup 1 # Set max resolution
Network Configuration
Setting up WiFi is essential on most Raspberry Pis for pulling application updates, installing software, and enabling remote access.
Scan Available Networks
$ sudo raspi-config
Navigate to 2 Network Options -> N1 Wi-fi to scan APs and enter your SSID and passphrase.
Connect on Boot
To configure the Pi to automatically connect to your wireless network without logging on:
$ sudo raspi-config nonint do_wifi_country US # Your 2-digit country code
$ sudo raspi-config nonint do_wifi 1 # Select SSID from list
$ sudo raspi-config nonint do_wifi_ssid YourSSID # Set SSID
$ sudo raspi-config nonint do_wifi_pw YourPasswd # Enter passphrase
Change Hostname
I also modify default ‘raspberrypi‘ hostnames via:
$ sudo raspi-config nonint do_hostname MyPi
Making hostnames descriptive helps identify Pi‘s on your network.
Remote Access with SSH
Enabling SSH allows securely connecting from other machines to run commands, transfer files, and access the Linux terminal without attaching peripherals:
Activate SSH Server
$ sudo raspi-config nonint do_ssh 0 # Enable SSH Server
$ sudo systemctl enable ssh # Start SSH on boot
Permit Root Login
Some applications like ansible may also require direct root access:
$ sudo sed -i ‘s/^PermitRootLogin.*/PermitRootLogin yes/‘ /etc/ssh/sshd_config
$ sudo systemctl restart sshd
Serial Console Access
Connecting via serial console retains terminal access even if the Pi OS crashes or networking fails. This is vital for diagnosing kernel panics and boot issues.
Enable Serial Port
First ensure serial communication hardware is connected properly. Then in raspi-config:
$ sudo raspi-config nonint do_serial 0 # Enable serial port
Edit Boot Configuration
Append the following to /boot/cmdline.txt:
console=serial0,115200 console=tty1
This passes boot messages to serial. Finally install piping software like screen on the host machine to connect over serial cable and monitor output.
Improving Performance
Optimizing memory splits, governor settings, clock speeds, throttling behavior, and enabling active cooling solutions can greatly boost Pi performance.
Memory Split
By default GPU memory is allocated dynamically from the shared system pool:
| Setting | GPU Memory |
|---|---|
| Dynamic | 16-256 MB |
| 192 | 192 MB |
| 224 | 224 MB |
| 240 | 240 MB |
| 256 | 256 MB |
| 272 | 272 MB |
| 320 | 320 MB |
| 384 | 384 MB |
| 448 | 448 MB |
| 512 | 512 MB |
Higher GPU memory benefits graphics processing and high resolution playback. But it leaves less available for system services.
Adjust CPU Governor
CPUfreq governer profiles dynamically scale clock speed based on workload and thermals:
| Governor | Description |
|---|---|
| Performance | Max speed regardless of load/temp |
| Ondemand | Default. Clock ramps with demand |
| Conservative | Scale up slower/down faster |
| Powersave | Low power consumption. Low performance |
| Schedutil | New default. Performance orientated |
| Userspace | Custom external frequency scaler |
Overclocking
For intensive workloads like media processing or data analysis, overclocking can dramatically speed up operations.
Configure Cooling
Adding heatsinks, fans, thermal tape, or even DIY liquid cooling allows driving Pi hardware faster by mitigating thermal throttling. Ensure cooling solutions are hooked up and tuned properly with raspi-config‘s Fan Control option.
Expanding Storage
Raspberry Pi OS images do not utilize full SD card space by default. Expanding the root filesystem enables accessing all available storage:
Extending Root Partition
$ sudo raspi-config # Run raspi-config
$ Select: Advanced Options > Expand Filesystem
$ Reboot
This safely grows the root partition to fill your SD card. Use df -h to verify space after reboot.
Setting Localization Preferences
Properly configuring localization ensures correct language, date/time formatting, keyboard layout mapping, and WiFi regulatory rules.
Configure Locales
To set system language and region formats:
$ sudo raspi-config # Run raspi config
$ Select: Localization Options > Change Localization > Set Locale
$ Choose your desired locale when prompted
$ Reboot
Locales follow [language_REGION.encoding] convention like en_US.UTF-8.
Keyboard Mapping
Mapping keyboards prevents issues with mislabeled or dead keys:
$ sudo raspi-config
$ Select: Localization > Change Keyboard Layout
$ Choose model of connected keyboard
This auto-selects the best keymap.
Understanding raspi-config Scripts
Now that we‘ve covered actually using raspi-config for system configuration tasks, what happens underneath the hood when we apply various settings?
The scripts and modules behind raspi-config provide valuable examples for engineers/developers looking to customize or enhance Pi‘s programmatically.
Menu Definition
The menu structure and text comes from /usr/lib/raspi-config/raspi-config-men u.sh. Raspi-config loads this file to generate menus.
Command Configuration
Each menu option links to a module located under /usr/lib/raspi-config/init.d/. For example, do_expand_rootfs handles expanding filesystems. These scripts actually run commands to configure systems.
Plugins Architecture
Beyond core modules, 3rd party plugins extending functionality are dynamically loaded from /etc/raspi-config/raspi-plugins. This architecture allows custom user extensions.
Non-Interactive Mode
The raspi-config nonint command applies settings without interactive prompts using numeric menu codes. This enables complete unattended automation.
By analyzing the inner workings as shown, you can learn to directly tap raspi-config‘s capabilities for your own solutions vs needing to use the interactive menus.
Automating with Ansible
Tools like Ansible further simplify automating raspi-config across Raspberry Pi fleets:
- name: Set up Raspberry Pis
hosts: pis
tasks:
- name: Enable serial port
community.general.raspi_config:
args:
serial: 0
- name: Set keyboard layout
community.general.raspi_config:
args:
keyboard: "us"
- name: Expand filesystem
community.general.raspi_config:
args:
expand_rootfs: 1
The raspi_config module abstracts settings as playbook arguments.
Optimizing Config with Docker
For streamlined configuration management, Docker Engine is a popular choice on Raspberry Pis. Optimization settings tuned via raspi-config can be baked into Docker base images:
Dockerfile
FROM raspbian/stretch
RUN sudo apt update && sudo apt install -y raspi-config
# Tweak memory split for GPU performance
RUN sudo raspi-config nonint do_memory 256
# Enable interfaces
RUN sudo raspi-config nonint do_spi 0
RUN sudo raspi-config nonint do_i2c 0
# Set localization preferences
RUN sudo raspi-config nonint do_configure_keyboard us
RUN sudo raspi-config nonint do_change_locale en_US.UTF-8
Here raspi-config builds upon the official Raspbian image, tuning it for container workloads. Any optimizations are now persisted into deployable images.
Going Beyond raspi-config Limits
While extremely useful, raspi-config menus do have some limitations. Certain parameters like GPU core overclock frequency, advanced cpufreq governer tuning, and memory overlocking require manually editing config files.
Tuning Config Files
$ sudo nano /boot/config.txt # Enable overclocking past menu limits
# Set core frequency to medium overclock
over_voltage=6
arm_freq=1300
$ sudo nano /etc/default/cpufrequtils # Custom governer tweaks
GOVERNOR="conservative"
MAX_SPEED=1300
MIN_SPEED=700
So while raspi-config handles the majority of common tuning scenarios, Linux professionals can directly edit config files to unlock additional performance.
Conclusion
In summary, raspi-config makes tailoring default system settings, enabling interfaces, expanding storage, optimizing performance, setting regional preferences, and automating deployments accessible to all Raspberry Pi users through its intuitive text-based interface.
Yet for engineers, hackers, and Linux enthusiasts, studying what happens behind the user-friendly menus provides invaluable examples for programmatically enhancing configurations using the same scripts and modules as raspi-config itself.
Whether your goal is simply connecting to WiFi and enabling SSH, or analyzing raspi-config source code to devise programmatic solutions, I hope this 2600+ word comprehensive guide has made you a Raspberry Pi raspi-config power user equipped to efficiently set up and optimize Raspberry Pi devices with ease. Let me know if you have any other specific questions!


