Skip to content

Setup Linux machine

I have unified the articles regarding Ubuntu and Fedora setup since they’re very similar. The only difference is the package manager:

  • apt for Ubuntu,
  • dnf for Fedora.

Here is a comprehensive list of pieces of software and tools you need to getting started with an Ubuntu-based Linux machine. Ubuntu uses apt as package manager.

Here is a comprehensive list of pieces of software and tools you need to getting started with a Fedora-based Linux machine. Fedora uses dnf as package manager.

If you came from Ubuntu, take a look at APT vs. DNF commands.

It could happen that the current user has no root privileges. Every Linux machine has at least root user.

Terminal window
# login current terminal as root user ('sudo su' command could not work)
su - root
# add given user to sudo group
usermod -aG sudo <non-sudo-user>
# check which users have sudo permissions
getent group sudo

Running services at boot a common use of systemctl, especially in servers. You can tell a service to run at startup by typing:

Terminal window
sudo systemctl enable yourservice

If you need to disable a service:

Terminal window
sudo systemctl disable yourservice

If the service isn’t found, you may need to point to its direct file path with:

Terminal window
sudo systemctl enable /path/to/yourservice.service

However, this won’t work if the file isn’t on the root file system.

This tool allows you to write bootable SD card or USB drives starting from an .ISO file. It comes in help when working with Raspberry Pi or any Linux distributions.

Terminal window
curl -1sLf 'https://dl.cloudsmith.io/public/balena/etcher/setup.deb.sh' | sudo -E bash
sudo apt update
sudo apt install balena-etcher-electron

Follow the official documentation:

Bash Terminal
# 1) set up the repository
# update the apt package index and install packages to allow apt to use a repository over HTTPS:
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
# add Docker's official GPG key
# note that this command is specifically for Ubuntu
# replace "ubuntu" with "debian" in the string below to install the proper version
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 2) install Docker Engine
sudo apt update # update the apt package index
# if receiving a GPG error when running apt-get update, the default umask may be incorrectly configured, preventing detection of the repository public key file
# try granting read permission for the Docker public key file before updating the package index
sudo chmod a+r /etc/apt/keyrings/docker.gpg
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Take care to follow Docker Engine post-installation steps to manage Docker as non-root user.

Many modern Linux distributions use systemd to manage which services start when the system boots. To automatically start docker and containerd on boot, run the following commands:

Terminal window
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
# disable the "start on boot" behaviour
sudo systemctl disable docker.service
sudo systemctl disable containerd.service

Create the docker group and add your user:

Terminal window
sudo groupadd docker
sudo usermod -aG docker $USER

Log out and log back in so that your group membership is re-evaluated. You can also run the following command to activate the changes to groups:

Terminal window
newgrp docker

git is a VCS (Version Control System) created by Linus Torvalds, the same software engineer who developed the Linux kernel!

Version control systems is used to track changes in a directory over the time. Nowadays, they’re used to maintaining the history of all the software products’ codes. To allow several developer to work on the same code, a VCS must rely on platform like GitHub or GitLab where the code is uploaded and versioned.

The key features that a VCS must provide are:

  1. Maintain independent branches of code for team members
  2. Ease of comparison of code across different branches
  3. Merging of code from several branches of multiple team members
  4. Annotate changes with the name of author and message in a version of the code
  5. Simple comparison across versions
  6. Revert changes made to the code to any state from its history
Bash Terminal
# https://git-scm.com/download/linux
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install -y git
# https://github.com/nvie/gitflow
sudo apt install -y git-flow
# Large File Support extension: https://git-lfs.github.com/
sudo apt install -y git-lfs

Configure global settings like email, name and commands colorization:

Terminal window
# set the email that will be attached to your commits
git config --global user.email "you@example.com"
# set the username that will be attached to your commits
git config --global user.name "Your Name"
# enable helpful colorization for command line output
git config --global color.ui auto
# set merge as git pull default polic
git config --global pull.rebase false
# show the customized values
git config --global --list

It’s better to have a different pair of SSH keys foreach server (i.e. GitHub, GitLab, BitBucket, self-hosted, …) you connect to.

Let’s start:

Terminal window
cd ~/.ssh/
# if the directory does not exist, then create it
mkdir ~/.ssh/
# generate a new key
ssh-keygen -t ed25519 -C "I am the key label"

It will output:

Terminal window
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/$USER/.ssh/id_ed25519):

If you accept the default files location, their names will contain the encryption algorithm name. If you need to use multiple SSH key, it’s better to have the provider’s name inside file names.

Specify the new name after : sign of the line above.

Terminal window
# /home/$USER/.ssh/id_[PROVIDER]
# Example: add GitLab.com SSH key
/home/$USER/.ssh/id_gitlab

You can also rename the files later on. Remind to rename both the private and public keys:

Terminal window
# mv id_[ALGORITHM] id_[PROVIDER]
# mv id_[ALGORITHM].pub id_[PROVIDER].pub

Once you have both private and public keys, you’re read to start ssh-agent in background:

Terminal window
eval "$(ssh-agent -s)"
# add your SSH private key to the ssh-agent
ssh-add id_gitlab
# ssh-add id_[PROVIDER]
# show the content to copy
cat id_gitlab.pub
# cat id_[PROVIDER].pub

Copy the public key and add in the right place inside the website of the server provider.

Here are the most used git providers’ guides:

Create a configuration file foreach server provider you need, even the self-hosted ones.

Terminal window
nano config

My config file looks like

Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_github
IdentitiesOnly yes
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_gitlab
IdentitiesOnly yes
Host bitbucket.org
HostName bitbucket.org
User git
IdentityFile ~/.ssh/id_bitbucket
IdentitiesOnly yes

By default, when Ubuntu is first installed, remote access via SSH is not allowed.

Bash Terminal
sudo apt update -y
# install the package
sudo apt install -y openssh-server
# it should start automatically, check with:
sudo systemctl status ssh
# if the firewall is enabled, make sure to open the SSH port
sudo ufw allow ssh
# should see the port 22 open for a new incoming connections
sudo ss -lt
# connect to a SSH server
# ssh <username>@<ip_address>

You can now move files or directories with rsync utility.

Terminal window
# rsync <file/directory> <username>@<ip_address>:<destination>
# for example
rsync my-file.log remote-pit@192.168.0.100:/home/remote-pit/Downloads

GCC stands for as GNU Compiler Collection. It includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages.

GCC helps you write and execute programs in Linux.

Bash Terminal
sudo apt install -y gcc

NPM is a must-have tool when developing Web applications.

Bash Terminal
sudo apt install -y npm
# update Node.js to latest release
sudo apt-get remove nodejs
sudo apt install -y curl
# download Node.js v18.x:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
# or, download Node.js LTS (Long Term Support)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
# install Node.js
sudo apt-get install nodejs

Useful programming language to build cross-platform desktop application.

Ubuntu-only Bash terminal
# Java Development Kit
sudo apt install -y default-jdk
# Java Runtime Environment
sudo apt install -y default-jre

Java is already installed in Fedora.

Postman is an API platform for building and using APIs. It simplifies each step of the API lifecycle and streamlines collaboration, so you can create better APIs faster.

Go to Download page and download the tar.gz file or use the following commands:

Bash Terminal
sudo apt install -y wget tar
wget https://dl.pstmn.io/download/latest/linux64
tar -xvzf postman-linux-x64.tar.gz
sudo mv Postman /opt/
cd /opt/Postman/
./Postman

Replace Bourne Shell with a more advanced shell, like ZSH:

Terminal window
sudo apt install -y zsh fonts-powerline fzf
zsh --version # check version
zsh 5.8.1 # (...)
echo $SHELL
/bin/bash
chsh -s $(which zsh)

Logout and login to let the change take effect.

Terminal window
echo $SHELL
/usr/bin/zsh

Install Oh-My-ZSH extension to have better code completions:

Terminal window
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Many themes require Powerline Font or Nerd Font. Take a closer look when choosing the shell theme.

Moreover, I suggest you to add the following plugins to .zshrc file:

plugins=(
git
emotty
emoji
zsh-interactive-cd
zsh-autosuggestions
zsh-syntax-highlighting
)

To enable the changes, run:

Terminal window
source ~/.zshrc

Please Note: If you get this error:

[oh-my-zsh] plugin 'zsh-autosuggestions' not found
[oh-my-zsh] plugin 'zsh-syntax-highlighting' not found

Run those commands:

Terminal window
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting
source ~/.zshrc

It’s also suggested to set a default bahaviour for oh-my-zsh update policy. I choose to update automatically without asking:

Terminal window
# Uncomment one of the following lines to change the auto-update behavior
# zstyle ':omz:update' mode disabled # disable automatic updates
zstyle ':omz:update' mode auto # update automatically without asking
# zstyle ':omz:update' mode reminder # just remind me to update when it's time

IDE stands for Integrated Development Environment. They’re tools that helps you while programming and allow you to be more productive, efficient and effective.

Go to software section of official Arduino website. Download the version labelled Linux 32 bits (or 64 bits, if your machine supports it).

Bash Terminal
sudo apt install -y xz-utils # install unzip utility
cd ~/Downloads # navigate to Downloads directory
tar -xvf arduino*.tar.xz # extract the archive contents
rm -rf arduino*.tar.xz # remove the archive
sudo mv arduino* /opt/arduino # move the extracted folder from $HOME/Downloads to /opt/
sudo /opt/arduino/install.sh # complete the installation

Moreover, you need to allow your current user to use the serial communication to communicate with the Arduino boards.

Add yourself to the dialout group:

Terminal window
sudo usermod -a -G dialout $USER

Please Note:

  1. Logout and then log back in for the group changes to take effect (or just sudo restart the machine).
  2. If you accidentally stop the sketch from uploading, you just need to double-click the reset button (reference).

Download the Arduino IDE 2.0 from the official software page.

Then, follow the steps below:

Terminal window
cd ~/Downloads # navigate to Downloads directory
# extract the archive contents to the right sub-directory in /opt/
sudo unzip arduino-ide_2*.zip -d /opt/arduino2
# remove the archive
rm -rf arduino*.zip
# run the IDE (mandatory without sudo)
/opt/arduino2/arduino-ide
# Hit Ctrl + C to stop the execution of the IDE

Depending on your shell type, open the configuration file (.bashrc, .zshrc, …) and add the following alias:

alias arduino2="/opt/arduino2/arduino-ide"

You can now run Arduino IDE 2.x by using the command:

Terminal window
arduino2

MATLAB (abbreviation of “MATrix LABoratory”) is a proprietary multi-paradigm programming language and numeric computing environment developed by MathWorks. MATLAB allows matrix manipulations, plotting of functions and data. It allows algorithms’ implementation, creation of UIs and interfacing with programs written in other languages.

Simulink is a MATLAB-based graphical programming environment for modeling, simulating and analyzing multi-domain dynamical systems.

You need to have a MathWorks account to install MathWorks’ products. Go to Download page and download the .zip Linux installer.

Terminal window
cd ~/Downloads
# create a folder to extract files
mkdir matlab
# unzip the MATLAB file
unzip -qq matlab*.zip -d matlab
cd matlab
# launch installer with sudo permissions
sudo ./install
# if the graphical installer does not starts
xhost +SI:localuser:root && sudo ./install

Once the graphical installer starts, follow the steps below:

  • Login with MathWorks Account
  • Select the available License
  • Select Matlab Products or Toolbox to install
  • Select the Destination address

The default is:

/usr/local/MATLAB/R2023a/bin

Where R2023a refers to the release year and version (usually a and b).

Please Note: Set as username the actual name of the user logged-in in the computer. You can find you name by launching this command in a Terminal window:

Terminal window
echo $USER

Create MATLAB Symbolic link with:

Terminal window
sudo ln -s /usr/local/MATLAB/R2023a/bin/matlab /usr/local/bin/matlab

Create Matlab Desktop Shortcut Linux with:

Terminal window
nano ~/Desktop/Matlab.desktop

Edit the file as follows:

[Desktop Entry]
Version=1.0
Type=Application
Name=MATLAB
Exec=/usr/local/MATLAB/R2023a/bin/matlab
Icon=/usr/local/MATLAB/R2023a/resources/coreui/matlab/splash.png
Terminal=false

Save the Desktop Shortcut file by pressing Ctr + X and the type Y followed by the Enter Key. Go to the Desktop, right-click on the created file and select the “Allow Launching” option for the desktop entity. You can now launch MATLAB by double-clicking the desktop icon.

Once the installation is complete, remind to clear the Downloads directory:

Terminal window
cd ~/Downloads
rm -rf matlab*.zip matlab

If you try to install new toolboxes using Add-Ons manager, it will throw errors since you have not write access to /usr/local/MATLAB/. If you launch MATLAB as root user, it will throw a License Manager Error -9 Your username does not match the username in the license file.

The correct solution is to set the permission for the current user:

Terminal window
sudo chown -R $USER /usr/local/MATLAB/

Now the user has write access: use the Add-Ons manager carefully! After installing the desired toolboxes, revert the permission change for security reason:

Terminal window
sudo chown -R root /usr/local/MATLAB/

Typora is one of the most powerful Markdown and LaTeX editor I’ve ever seen.

Bash Terminal
# sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE
wget -qO - https://typora.io/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.asc
# add Typora's repository
sudo add-apt-repository 'deb https://typora.io/linux ./'
sudo apt update
# install typora
sudo apt install -y typora

Take a look at Theme Gallery and don’t forget to activate inline math support to start write LaTeX inside .md files!

For Debian and Ubuntu based distributions, the easiest way to install Visual Studio Code is to download and install the .deb package (64-bit), either through the graphical software center if it’s available, or through the command line with:

Bash Terminal
# download .deb file from https://code.visualstudio.com/
sudo apt install -y ./<file>.deb

Note that other binaries are also available on the VS Code download page.

Here is the list of guides and tutorials I used to write this article: