====== Ubuntu on Raspberry Pi ====== Notes for configuring Ubuntu 20.04.1 LTS on Raspberry Pi. ===== Custom Ubuntu image ===== I currently use a customized Ubuntu image that includes the following modifications: * Disabled resizing of partitions and filesystems to use entire SD card on first boot in cloud-init * Disabled automatic patching of Ubuntu on first boot via cloud-init * Add users, SSH keys, and sudo configuration for [[:ansible|Ansible]] ===== First boot ===== On first boot you can find the Pi on the network from a DHCP server (or any other host that has an ARP cache for the subnet including this host) using the following: #!/bin/bash echo "The following Raspberry Pi 4 devices have been found:" arp -a | grep dc:a6 # add MAC for other models... ==== Grow filesystem and disable cloud-init ==== After logging in you should reconfigure the filesystem and disable cloud-init to ensure that it does not automatically modify the filesytem or partitions in future updates. # disable touch /etc/cloud/cloud-init.disabled # manually modify the partition table and grow the filesystem parted /dev/mmcblk0 resizepart # configure partition 2 as desired quit resize2fs /dev/mmcblk0p2 # optional: remove cloud-init completely apt-get purge cloud-init # if you do not remove cloud-init be sure not to allow your # configuration to be overwritten in future updates to the package Another option is to create a small 1Mb partition after your root partition to ensure that it can never be grown into the empty space on your SD card. Next do the following: # disable the unattended upgrades service (you can re-enable later if you prefer) systemctl disable unattended-upgrades # install python for Ansible apt install python # set editor to Vim (optional) update-alternatives --config editor # set a hostname echo "$MYHOSTNAME" > /etc/hostname # don't forget to update /etc/hosts Configure network interface for static use: # /etc/netplan/99-static.yaml network: version: 2 renderer: networkd ethernets: eth0: addresses: - 10.1.2.3/24 gateway4: 10.1.2.1 link-local: [ ] nameservers: search: [subnet.quay.net, quay.net] addresses: - 10.1.2.53 Test netplan configuration: netplan try # if that works, remove any other config files and run: netplay apply # once successfully tested you should also remove the default config from cloud-init # (add to Ansible playbook in future) rm -f /etc/netplan/50-cloud-init.yaml ==== Ansible playbooks ==== # standard configuration for all Raspberry Pi systems # this playbook does the following: # - base configurations (raspi_ubuntu) # - time service config (chrony) # - firewall config (nftables) ansible-playbook -l raspi.in.quay.net raspi_ubuntu.yml # regenerate SSHD keys on host after build # NOTE: Ubuntu ships with a default set of SSHD keys ansible-playbook -l raspi.in.quay.net regen_sshd_keys.yml Add the following to Ansible plays in the future: * default editor * prune packages * configre motd * apt install lm-sensors ===== Hardware notes ===== Quick reference for Raspberry Pi hardware tools on Ubuntu. ==== Configuring RTC on Ubuntu 20.04 LTS ==== # Install the I2C tools to access the bus and configure your RTC apt install i2c-tools # Enable your RTC in the Pi boot config RTCMODEL=ds3231 echo "dtoverlay=i2c-rtc,$RTCMODEL" >> /boot/firmware/usercfg.txt # show I2C bus config # - 68 = hardware detected # - UU = dtoverlay configured correctly and driver is loaded i2cdetect -y 1 //Reference: [[https://pimylifeup.com/raspberry-pi-rtc/|Raspberry Pi RTC: Adding a Real Time Clock// ===== Reference ===== //See also: [[pi|Raspberry Pi]]// * [[https://wiki.ubuntu.com/ARM/RaspberryPi|Ubuntu Wiki: ARM/RaspberryPi]] * [[https://elinux.org/RPiconfig|RPiconfig]] * [[https://ubuntu.com/download/raspberry-pi|Ubuntu Raspberry Pi Downloads]] * [[https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview|How to install Ubuntu Server on your Raspberry Pi]] * [[https://netplan.io/examples/|Netplan configuration examples]]