Setup Raspberry Pi 3 Model B+ with Ubuntu server and SSH over wifi
Tags: raspberrypi, linux, ubuntu, cloudinit
Published: 2019-09-12 00:49:47

---
title: Setup Raspberry Pi 3 Model B+ with Ubuntu server and SSH over wifi
published: true
description: Get Ubuntu up and running on rasp 3 in 6 easy steps. no cables needed.
tags: raspberrypi, linux, ubuntu, cloudinit
cover_image: https://i.imgur.com/ndtPkMs.png
---


Some things to say first:

- At moment of testing the commands and writing this, I am using a ubuntu 18.04.3.
- I don't have a Ethernet cable `¯\_㋡_/¯`
- My raspberry is the 3 Model B+ and my sdcard is a SAMSUNG EVO Select microSDXC 128 GB
- This is my first post _(treating it more like a "shared note")_ on dev.to community 🎉




1. Download the ubuntu image [18.04.3-preinstalled-server-arm64+raspi3.img.xz](http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04.3-preinstalled-server-arm64+raspi3.img.xz) _(link taken found [here](https://wiki.ubuntu.com/ARM/RaspberryPi#Download))_
2. Flash the sdcard using [balenaEtcher](https://www.balena.io/etcher/)
3. `sudo nano /media/wesley/writable/etc/netplan/50-cloud-init.yaml`
    It should contain:

    ```yaml
    network:
        version: 2
        ethernets:
            eth0:
                optional: true
                dhcp4: true
        wifis:
            wlan0:
                optional: true
                access-points:
                    "YOUR-SSID-NAME":
                        password: "YOUR-NETWORK-PASSWORD"
                dhcp4: true
    ```

    > Make sure to have navigated to `writable` partition, otherwise `nano` will complain the folder does not exist.

4. `sudo nano /media/wesley/writable/etc/cloud/cloud.cfg`

    Should be like this:

    ```yaml
    # The top level settings are used as module
    # and system configuration.
    
    # A set of users which may be applied and/or used by various modules
    # when a 'default' entry is found it will reference the 'default_user'
    # from the distro configuration specified below
    users:
       - default
    # If this is set, 'root' will not be able to ssh in and they
    # will get a message to login instead as the default $user
    disable_root: false
    
    # This will cause the set+update hostname module to not operate (if true)
    preserve_hostname: false
    hostname: YOUR-RASPBERRYPI-NAME
    
    # Example datasource config
    # datasource:
    #    Ec2:
    #      metadata_urls: [ 'blah.com' ]
    #      timeout: 5 # (defaults to 50 seconds)
    #      max_wait: 10 # (defaults to 120 seconds)
    
    # The modules that run in the 'init' stage
    cloud_init_modules:
     - migrator
     - seed_random
     - bootcmd
     - write-files
     - growpart
     - resizefs
     - disk_setup
     - mounts
     - set_hostname
     - update_hostname
     - update_etc_hosts
     - ca-certs
     - rsyslog
     - users-groups
     - ssh
    
    # The modules that run in the 'config' stage
    cloud_config_modules:
    # Emit the cloud config ready event
    # this can be used by upstart jobs for 'start on cloud-config'.
     - emit_upstart
     - snap
     - snap_config  # DEPRECATED- Drop in version 18.2
     - ssh-import-id
     - locale
     - set-passwords
     - grub-dpkg
     - apt-pipelining
     - apt-configure
     - ubuntu-advantage
     - ntp
     - timezone
     - disable-ec2-metadata
     - runcmd
     - byobu
    
    # The modules that run in the 'final' stage
    cloud_final_modules:
     - snappy  # DEPRECATED- Drop in version 18.2
     - package-update-upgrade-install
     - fan
     - landscape
     - lxd
     - ubuntu-drivers
     - puppet
     - chef
     - mcollective
     - salt-minion
     - rightscale_userdata
     - scripts-vendor
     - scripts-per-once
     - scripts-per-boot
     - scripts-per-instance
     - scripts-user
     - ssh-authkey-fingerprints
     - keys-to-console
     - phone-home
     - final-message
     - power-state-change
    
    # System and/or distro specific settings
    # (not accessible to handlers/transforms)
    system_info:
       # This will affect which distro class gets used
       distro: ubuntu
       # Default user name + that default users groups (if added/used)
       default_user:
         name: pi
         lock_passwd: True
         gecos: Pi
         groups: [adm, audio, cdrom, dialout, dip, floppy, lxd, netdev, plugdev, sudo, video]
         sudo: ["ALL=(ALL) NOPASSWD:ALL"]
         shell: /bin/bash
         ssh_authorized_keys:
           - "CONTENT-OF-YOUR-SSH-PUB-KEY-HERE"
       # Automatically discover the best ntp_client
       ntp_client: auto
       # Other config here will be given to the distro class and/or path classes
       paths:
          cloud_dir: /var/lib/cloud/
          templates_dir: /etc/cloud/templates/
          upstart_dir: /etc/init/
       package_mirrors:
         - arches: [i386, amd64]
           failsafe:
             primary: http://archive.ubuntu.com/ubuntu
             security: http://security.ubuntu.com/ubuntu
           search:
             primary:
               - http://%(ec2_region)s.ec2.archive.ubuntu.com/ubuntu/
               - http://%(availability_zone)s.clouds.archive.ubuntu.com/ubuntu/
               - http://%(region)s.clouds.archive.ubuntu.com/ubuntu/
             security: []
         - arches: [arm64, armel, armhf]
           failsafe:
             primary: http://ports.ubuntu.com/ubuntu-ports
             security: http://ports.ubuntu.com/ubuntu-ports
           search:
             primary:
               - http://%(ec2_region)s.ec2.ports.ubuntu.com/ubuntu-ports/
               - http://%(availability_zone)s.clouds.ports.ubuntu.com/ubuntu-ports/
               - http://%(region)s.clouds.ports.ubuntu.com/ubuntu-ports/
             security: []
         - arches: [default]
           failsafe:
             primary: http://ports.ubuntu.com/ubuntu-ports
             security: http://ports.ubuntu.com/ubuntu-ports
       ssh_svcname: ssh
    ```
5. Eject from your computer, inject the sdcard on the raspberry, connect the power and wait for about one minute.
6. `ssh pi@YOUR-RASPBERRYPI-NAME`

> ℹ️ first time you login it will ask for a password (type `ubuntu`) and then to change to a new password.



Many thanks to [l --marc l](https://askubuntu.com/users/478540/l-marc-l) user on stackoverflow. Steps on this post are 90% from his answer [here](https://askubuntu.com/a/1143594). The other 10% comes from the [cloud-init docs](https://cloudinit.readthedocs.io/)