Setup Linux machine
Introduction
Section titled “Introduction”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.
Add user to sudo
Section titled “Add user to sudo”It could happen that the current user has no root privileges.
Every Linux machine has at least root
user.
# login current terminal as root user ('sudo su' command could not work)su - root
# add given user to sudo groupusermod -aG sudo <non-sudo-user>
# check which users have sudo permissionsgetent group sudo
Run a Service at boot with systemctl
Section titled “Run a Service at boot with systemctl”Running services at boot a common use of systemctl
, especially in servers.
You can tell a service to run at startup by typing:
sudo systemctl enable yourservice
If you need to disable a service:
sudo systemctl disable yourservice
If the service isn’t found, you may need to point to its direct file path with:
sudo systemctl enable /path/to/yourservice.service
However, this won’t work if the file isn’t on the root file system.
Balena Etcher
Section titled “Balena Etcher”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.
curl -1sLf 'https://dl.cloudsmith.io/public/balena/etcher/setup.deb.sh' | sudo -E bashsudo apt updatesudo apt install balena-etcher-electron
# update the systemsudo dnf upgrade --refresh
# (optional) install curl utilitysudo dnf install -y curl
# import the repositorycurl -1sLf 'https://dl.cloudsmith.io/public/balena/etcher/setup.rpm.sh' | sudo -E bash
# install balenaEtchersudo dnf install balena-etcher
Docker Engine
Section titled “Docker Engine”Follow the official documentation:
# 1) set up the repository# update the apt package index and install packages to allow apt to use a repository over HTTPS:sudo apt updatesudo 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 versionsudo mkdir -p /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho "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 Enginesudo 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 indexsudo chmod a+r /etc/apt/keyrings/docker.gpgsudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 1) Uninstall old versionssudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
# 2) Install using the repository# 2.1) set up the repositorysudo dnf -y install dnf-plugins-coresudo dnf config-manager \ --add-repo \ https://download.docker.com/linux/fedora/docker-ce.repo
# 3) Install Docker Enginesudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Take care to follow Docker Engine post-installation steps to manage Docker as non-root user.
Start Docker on boot
Section titled “Start Docker on boot”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:
sudo systemctl enable docker.servicesudo systemctl enable containerd.service
# disable the "start on boot" behavioursudo systemctl disable docker.servicesudo systemctl disable containerd.service
Manage Docker as a non-root user
Section titled “Manage Docker as a non-root user”Create the docker
group and add your user:
sudo groupadd dockersudo 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:
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:
- Maintain independent branches of code for team members
- Ease of comparison of code across different branches
- Merging of code from several branches of multiple team members
- Annotate changes with the name of author and message in a version of the code
- Simple comparison across versions
- Revert changes made to the code to any state from its history
# https://git-scm.com/download/linuxsudo add-apt-repository ppa:git-core/ppasudo apt updatesudo apt install -y git
# https://github.com/nvie/gitflowsudo apt install -y git-flow
# Large File Support extension: https://git-lfs.github.com/sudo apt install -y git-lfs
# https://git-scm.com/download/linuxsudo dnf install -y git# should be already installed
# https://copr.fedorainfracloud.org/coprs/elegos/gitflow/# enable the copr repositorysudo dnf copr enable elegos/gitflow
# install gitflowsudo dnf install -y gitflow
# Large File Support extension: https://git-lfs.github.com/sudo dnf install -y git-lfs
Configure global settings like email, name and commands colorization:
# set the email that will be attached to your commitsgit config --global user.email "you@example.com"
# set the username that will be attached to your commitsgit config --global user.name "Your Name"
# enable helpful colorization for command line outputgit config --global color.ui auto
# set merge as git pull default policgit config --global pull.rebase false
# show the customized valuesgit config --global --list
Configure SSH client
Section titled “Configure SSH client”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:
cd ~/.ssh/
# if the directory does not exist, then create itmkdir ~/.ssh/
# generate a new keyssh-keygen -t ed25519 -C "I am the key label"
It will output:
# 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.
# /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:
# 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:
eval "$(ssh-agent -s)"
# add your SSH private key to the ssh-agentssh-add id_gitlab# ssh-add id_[PROVIDER]
# show the content to copycat 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.
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
Configure SSH remote access
Section titled “Configure SSH remote access”By default, when Ubuntu is first installed, remote access via SSH is not allowed.
sudo apt update -y
# install the packagesudo 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 portsudo ufw allow ssh
# should see the port 22 open for a new incoming connectionssudo ss -lt
# connect to a SSH server# ssh <username>@<ip_address>
# it should already be installedsudo dnf install -y openssh-server
# check the versionrpm -qa | grep openssh-server
# allow SSH daemon to start at bootsudo systemctl enable sshd
# manually start SSH daemon to avoid rebooting the computersudo systemctl start sshd
# check the status of SSHsudo systemctl status sshd
# should see the port 22 open for a new incoming connectionssudo ss -lt
# connect to a SSH server# ssh <username>@<ip_address>
You can now move files or directories with rsync
utility.
# rsync <file/directory> <username>@<ip_address>:<destination># for examplersync 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.
sudo apt install -y gcc
sudo dnf install -y gcc
Node Package Manager
Section titled “Node Package Manager”NPM is a must-have tool when developing Web applications.
sudo apt install -y npm
# update Node.js to latest releasesudo apt-get remove nodejssudo 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.jssudo apt-get install nodejs
sudo dnf install -y nodejs
Useful programming language to build cross-platform desktop application.
# Java Development Kitsudo apt install -y default-jdk
# Java Runtime Environmentsudo apt install -y default-jre
Java is already installed in Fedora.
Postman
Section titled “Postman”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:
sudo apt install -y wget tarwget https://dl.pstmn.io/download/latest/linux64tar -xvzf postman-linux-x64.tar.gzsudo mv Postman /opt/cd /opt/Postman/./Postman
# should already be installedsudo dnf install -y wget tar
# download the archivewget https://dl.pstmn.io/download/latest/linux_64
# I don't like the way it has installed the archive (need to investigate)tar -xvzf linux_64 # will create a Postman directory
# move to the appropriate directorysudo mv Postman /opt/cd /opt/Postman/./Postman
ZSH Shell & Oh-My-ZSH
Section titled “ZSH Shell & Oh-My-ZSH”Replace Bourne Shell with a more advanced shell, like ZSH:
sudo apt install -y zsh fonts-powerline fzf
zsh --version # check versionzsh 5.8.1 # (...)echo $SHELL/bin/bash
chsh -s $(which zsh)
Logout and login to let the change take effect.
echo $SHELL/usr/bin/zsh
Install Oh-My-ZSH extension to have better code completions:
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:
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:
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestionsgit clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlightingsource ~/.zshrc
It’s also suggested to set a default bahaviour for oh-my-zsh update policy. I choose to update automatically without asking:
# Uncomment one of the following lines to change the auto-update behavior# zstyle ':omz:update' mode disabled # disable automatic updateszstyle ':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.
Arduino IDE 1.x
Section titled “Arduino IDE 1.x”Go to software section of official Arduino website. Download the version labelled Linux 32 bits (or 64 bits, if your machine supports it).
sudo apt install -y xz-utils # install unzip utilitycd ~/Downloads # navigate to Downloads directorytar -xvf arduino*.tar.xz # extract the archive contentsrm -rf arduino*.tar.xz # remove the archivesudo mv arduino* /opt/arduino # move the extracted folder from $HOME/Downloads to /opt/sudo /opt/arduino/install.sh # complete the installation
# navigate to Downloads directorycd ~/Downloads
# extract the archive contentstar -xvf arduino*.tar.xz
# remove the archiverm -rf arduino*.tar.xz
# move the extracted folder from $HOME/Downloads to /opt/sudo mv arduino* /opt/arduino
# complete the installationsudo /opt/arduino/install.sh
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:
sudo usermod -a -G dialout $USER
Please Note:
- Logout and then log back in for the group changes to take effect (or just
sudo restart
the machine). - If you accidentally stop the sketch from uploading, you just need to double-click the reset button (reference).
Arduino IDE 2.x
Section titled “Arduino IDE 2.x”Download the Arduino IDE 2.0 from the official software page.
Then, follow the steps below:
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 archiverm -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:
arduino2
MATLAB & Simulink
Section titled “MATLAB & Simulink”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.
cd ~/Downloads
# create a folder to extract filesmkdir matlab
# unzip the MATLAB fileunzip -qq matlab*.zip -d matlabcd matlab
# launch installer with sudo permissionssudo ./install
# if the graphical installer does not startsxhost +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:
echo $USER
Create MATLAB Symbolic link with:
sudo ln -s /usr/local/MATLAB/R2023a/bin/matlab /usr/local/bin/matlab
Create Matlab Desktop Shortcut Linux with:
nano ~/Desktop/Matlab.desktop
Edit the file as follows:
[Desktop Entry]Version=1.0Type=ApplicationName=MATLABExec=/usr/local/MATLAB/R2023a/bin/matlabIcon=/usr/local/MATLAB/R2023a/resources/coreui/matlab/splash.pngTerminal=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:
cd ~/Downloads
rm -rf matlab*.zip matlab
Install new toolboxes after installation
Section titled “Install new toolboxes after installation”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:
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:
sudo chown -R root /usr/local/MATLAB/
Typora
Section titled “Typora”Typora is one of the most powerful Markdown and LaTeX editor I’ve ever seen.
# sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAEwget -qO - https://typora.io/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.asc
# add Typora's repositorysudo add-apt-repository 'deb https://typora.io/linux ./'sudo apt update
# install typorasudo apt install -y typora
wget https://download.typora.io/linux/Typora-linux-x64.tar.gz# estract the archivetar -zxvf Typora-linux-x64.tar.gz
# it will estract everything in a directory called bin/# move its content in /opt/sudo mv bin/Typora-linux-x64 /opt/typora
# remove unnecessary filesrm -rf Typora-linux-x64.tar.gz ./bin
# run Typora/opt/typora/./Typora
You can also ad an alias to your configuration file. The alias below launches typora in the background and silenced. The terminal is detached, and you don’t have to open another one to work:
alias typora="/opt/typora/./Typora </dev/null &>/dev/null &"
You can also add the application entry for the App Menu:
# create the entrycd ~/.local/share/applications/touch Typora.desktop
# change permission to filechmod 744 Typora.desktop
Fill Typora.desktop
file with:
[Desktop Entry]Name=TyporaComment=Official Typora applicationTryExec=/opt/typora/TyporaExec=/opt/typora/Typora -- %uIcon=/opt/typora/resources/assets/icon/icon_256x256.pngTerminal=falseStartupWMClass=TyporaType=ApplicationCategories=Text;Qt;MimeType=x-scheme-handler/tg;Keywords=tdesktop;Actions=quit;SingleMainWindow=trueX-GNOME-UsesNotifications=trueX-GNOME-SingleWindow=true
Take a look at Theme Gallery and don’t forget to activate inline math support to start write LaTeX inside .md
files!
Visual Studio Code
Section titled “Visual Studio Code”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:
# download .deb file from https://code.visualstudio.com/sudo apt install -y ./<file>.deb
cd ~/Downloads
# use wget utility only for downloading a package at a specific version# wget https://az764295.vo.msecnd.net/stable/6a995c4f4cc2ced6e3237749973982e751cb0bf9/code-1.78.1-1683194632.el7.x86_64.rpm
# install the packagesudo dnf install -y code*.rpm
# remove unnecessary filerm code*.rpm
Note that other binaries are also available on the VS Code download page.
Conclusion
Section titled “Conclusion”Documentation
Section titled “Documentation”Here is the list of guides and tutorials I used to write this article:
- freeCodeCamp - How to Manage Multiple SSH Keys
- Adding a new SSH key to your GitHub account
- GitLab and SSH keys
- Set up an SSH key
- Visual Studio Code on Linux
- Install ZSH
- Update Node.js
- How to install MATLAB in Ubuntu 22.04
- Beginner guite to systemctl
- Linux : Installing new toolboxes on an existing installation
- elegos/gitflow
- Nodejs fedoraproject.org