# learning-linux

This is the repository for the training Learning Linux

### Instructor

**Pierre-Yves Barriat**

###### ACELI Training Sessions

---

# What is UNIX ?

- Operating System
  > Windows 10 (Microsoft), MacOSX (Apple), Android (Google), etc
- UNIX is a (family of) Operating System
- Invented by AT&T Bell Labs in late 60's
- Currently there are different versions and variants of UNIX 
  > Solaris, AIX, HP-UX, etc.
- UNIX is **not** free or Open Source: "GNU is Not UNIX"

---

# What is Linux ?

- GNU (80's) is a free, open source version of the UNIX OS, but without the most important element: the **kernel**
- Linux kernel was developed in 1991 by Linus Torvalds, a Finnish graduate student
- The association GNU/Linux is an operating system (say just "Linux") and provides an alternative to commercial operating systems
- Linux exists without GNU (eg Android) : used to power a multitude of systems... from your phone to your smart fridge

---

# What is a Linux distribution ?

- Many versions of Linux
  > Red Hat, Debian, Suse, etc

- But one common linux kernel: **kernel** is like an **engine**. A distribution is an actual car that hosts the engine

- Distributions differ from
  - the application/management layer
  - GUI (Graphical User Interface = desktop environment)
  - software packages
  - help-desk, support, language

---

# Why Linux ?

- **Linux is free**
- Linux is supported on older computers (perf & updates)
- Linux has many more free applications

`Security`: there are very few viruses for Linux
`Privacy`: most Linux distributions don't collect your data at all
`Reliability`: if you want to stop something, you really can
`Updates`: package manager
`Customisation`: you can make Linux look, feel and behave as you want it to
`Command Line Interface:` faster & efficient 

---

# Linux Statistics

![bg right 100%](assets/OS_developers.png)

- 47% of professional **developers** use Linux-based operating systems (Statista)
- Linux powers 39.2% of **websites** whose operating system is known (W3Techs)
- Linux powers 85% of **smartphones** (Hayden James)

---

# Why not Linux ?

1. Hardware compatibility (printers, etc)
2. Missing famous software (MS Office, Adobe, CAO, etc)
3. Gaming

### Workarounds

1. Many devices "Linux compatible"
2. Emulation (eg virtualbox), online usage, alternatives (GIMP)
3. Difficult, but it exists emulation and Steam

---

# Distribution: why Ubuntu ?

- easy to install and easy to use
- easy to maintain and update
- useful applications
- looks nice
- wide variety of supported applications
- strong community support
- better driver support
- LTS and staging releases available as per user needs

> get the latest Ubuntu LTS : [ubuntu-22.04.2-desktop-amd64.iso](https://releases.ubuntu.com/jammy/ubuntu-22.04.2-desktop-amd64.iso)

---

# Test Linux inside Windows: how ?

Using a virtual machine: test Linux without changing anything to your computer

You need to install a VM and then install the Linux inside

- Get a Virtual Machine: https://www.virtualbox.org/wiki/Downloads
  > VirtualBox + Extension Pack

- Install Linux in a VM: [Install Linux Inside Windows Using VirtualBox](https://itsfoss.com/install-linux-in-virtualbox/)
  > Step by Step Guide

---

# Linux GUI

![bg right 95%](assets/GUI.png)

A Linux distribution contains a [display server](https://www.google.com/search?tbm=isch&q=display+manager), a [window manager](https://www.google.com/search?tbm=isch&q=windows+manager) (manage windows, panel, menus, dash interfaces and core applications), and a [desktop environment](https://www.google.com/search?tbm=isch&q=graphical+interface) (eg status bars, drag-and-drop capabilities, etc)

These 3 items are **bundled together** to make what is known as a `GUI environment`

---

# Using Linux

**Using Linux through a GUI environment is similar to Windows or MacOSX**

Linux users do not install software the same way that Windows users do: Linux has a tool known as a `package manager`

A package manager provides a way to search for software, install software, keep the software up to date and remove the software
> Similar to Google or Apple store

---

# Linux CLUI

Using Linux with GUI, it's already great ! 
**Using CLUI = unlock the power of Linux !**

Each Linux system contains a terminal

A terminal is where you enter Linux commands

It's called the **C**ommand **L**ine **U**ser **I**nterface

CLUI is one of the many strengths of Linux and can be more efficient than using the GUI

---

# Linux CLUI

- CLUI allows users to be independent of distros (or UNIX systems like OSX)
- CLUI saves system resources which are consumed by GUIs
- CLUI allows users to easily work at distance (SSH)
- CLUI allows developers to join together simple (and less simple) commands to do complex things and automate... whatever you want to

> People tend to think command line is difficult. It's not.

---

# Linux Shell

A **shell** is a program that takes commands from the keyboard and gives them to the operating system to perform

The main function is to interpret your commands **= language**

The **bash** shell is one of several shells available for Linux

Learning the shell:

> *"When you are a child you use a computer by looking at the pictures. When you grow up, you learn to read and write"*

It's more or less like SMSing to your PC, telling it what to do

---

# Linux Shell

Shells have some built-in commands

A shell also supports programming constructs, allowing complex commands to be built from smaller parts **= scripts**

Scripts can be saved as files to become new commands
> many commands on a typical Linux system are scripts

An open terminal show you a **PROMPT** waiting for your commands

Commands can have **options** and parameters

All your commands are saved in a **history**

---

# Linux Shell Demo

Rename many files at once ? 

```bash
mmv '*.JPG' '#1.jpg'
```

Download a youtube video ?

```bash
youtube-dl https://www.youtube.com/watch?v=G7KNmW9a75Y&ab_channel=MileyCyrusVEVO
```

Convert color pictures in BW at once ? 

```bash
#!/bin/bash
for file in *.jpg
do
  convert ${file} -colorspace Gray "${file%.*}_bw.jpg"
  echo "${file}... converted"
done
```

---

# What you'll learn

- Navigating the File System
  > Get up and running with the CLUI by navigating directories and files

- Viewing and Changing Files and Directories
  > Learn to manipulate directories and files from the CLUI

- Configuring the Environment
  > Learn to configure the environment using the CLUI

- Accessing Linux remotely
  > Learn to use SSH  (basics)

---

# Navigating the File System

A file system is a section of hard disk that has been allocated to contain files
> it's arranged like hierarchical tree structure

Files are grouped in the directory structure

The top of the tree is called `root` and `/` is used to present the `root`

![h:280](assets/arbo.png)

---

### Absolute paths

In the tree `/users/usern/file1` is an absolute pathname

### Relative paths

If you are already in the `users` directory, the relative pathname for `file1` is `usern/file1`

- `~` (tilda) points to the user's **home directory**. Useful if you are logging into a workstation with many users. It's the **default working directory** when you log in. If you are user `usern`, then `/users/usern/file1` is the same as `~/file1`

- `.` refers to the current directory
- `..` refers to the parent directory

---

# Basic commands

- `ls` : lists folders/files in a directory
- `cd` : change directory
  > use `cd name` to navigate to directory name
- `pwd` : print working directory.  Prints the path of the current directory
- `du` : disk usage. Shows the disk usage of the current directory
- `man` : manual  
  > use `man name` to bring up a manual entry for command or program called `name`

---

### Creation

- `mkdir` : use `mkdir name` to create a new directory named `name` in the current directory
- `cp` : use ```cp file1 file2``` to create `file2` which is a copy of `file1`
  > can also use `cp -r` to copy whole directories
- `mv` : move = same as copy, but deletes the original file

### Deletion

- `rm` : delete files ( cannot recover your files after removed them ! )
  > can also use `rm -rf` to remove whole directories

**Be careful : there is no trash in CLUI**

---

- `tab` is used for auto-complete ![h:80](assets/tab.png)
  > If a file/directory name was partly typed in, **tab will auto-complete** it

  > If there are multiple options, tab will auto-complete up to the point where the options branch and show you a list of possible options

- `*` is used as a wild card
  > `rm blah*` removes all files which start with `blah`: eg `blah1`, `blah2`, and `blahblah` would all be removed
     
  > using `cp public/* private/` copies all files in a `public` directory into a `private` directory, and keeps all file names intact

---

# File permissions

### Groups

Each file and directory has three user based permission groups

- **owner** :the `owner` permissions apply only the owner of the file or directory, they will not impact the actions of other users
- **group** : the `group` permissions apply only to the group that has been assigned to the file or directory, they will not effect the actions of other users
- **all users** : the `all users` permissions apply to all other users on the system, this is the permission group that you want to watch the most

---

### Types

Each file or directory has three basic permission types

- **read** : the `read` permission refers to a user's capability to read the contents of the file
- **write** : the `write` permission refer to a user's capability to write or modify a file or directory
- **execute** : the `execute` permission affects a user's capability to execute a file or view the contents of a directory

---

The following command :

```bash
ls -l
```
gives :

|  1  |  2 |   3  | 4  | 5 |   6   | 7        |
| --------------- | --------------- | ------------ | ------- |----------- | ------- | ---------- |
|  `-rwxr-xr-x`  |  `1`  |  `dupont`  |  `grpelic` | `3528`  |  `2022-08-04`   |  `file_1` |
|  `drwxr-xr-x`  |  `3`  |  `dupont`  |  `grpelic` | `512`  |  `2022-01-02`   |  `dir_1` |
|  `lrwxr-xr-x`  |  `2`  |  `dupont`  |  `grpelic` | `210`  |  `2020-12-16`   |  `short -> /data` |
|  `-rw-------`  |  `1`  |  `dupont`  |  `grpelic` | `4587`  |  `2022-12-04`   |  `file_2` |

---

# Linux privileges

![bg right 70%](assets/sandwich.png)

Linux has a robust permissions system: this is a very good thing, as it enables a **clear separation** of roles among users

Especially between the `root` user and your `standard` user

Sometimes, though, you might want your standard user to have **some** or **all** of root's privileges : this is accomplished with `sudo`

---

# Shell syntax rules

Shells use three **"standard I/O streams"**

- `stdin` is the standard input stream, which provides input to commands.
- `stdout` is the standard output stream, which displays output from commands.
- `stderr` is the standard error stream, which displays error output from commands.

Shell has several **meta-characters** and **control operators** 

> `|`, `&`, `>`, `;` , etc.

---

# Environment

In a bash shell many things constitute your environment

- the form of your prompt
- your home directory and your working directory
- the name of your shell
- functions that you have defined
- etc.

Environment includes many variables that may have been set **by bash** or **by you**
> Access the value of a variable by prefixing its name with `$`

---

# Environment variables

- `USER` : 	the name of the logged-in user
- `UID` 	: the numeric user id of the logged-in user
- `HOME` : 	the user's home directory (similar to `~` )
- `PWD` 	: the current working directory
- `SHELL` :  the name of the shell

Set a shell variable : typing a name followed immediately by an equal sign ( `=` )
> if the variable exists, you will modify it to assign the new value

You can use special files to control bash variables : `$HOME/.bashrc`

---

# Remote Linux Access

`SSH` (or **S**ecure **SH**ell) is a **protocol** used to securely log onto remote systems
> the most common way to access remote Linux and Unix-like servers

`VNC` (or **V**irtual **N**etwork **C**omputing) is a **software** that allows a personal computer's desktop environment to be run 

Aside from bandwidth, latency and security issues (which can vary a bit), the big differences are the functionality
- VNC exports a whole session, desktop and all (GUI)
- SSH runs a single program (CLUI) and show its windows on your machine

---

# Remote Linux using SSH

You need:
- an access to the distant machine : login/password 
  > or a login with SSH keys (with passphrase)
- the hostname or the IP address of the distant machine
- and (of course) a UNIX terminal

```bash
ssh -X pbarriat@coriolis.elic.ucl.ac.be

ssh -X -i ~/.ssh/id_rsa.ceci pbarriat@gwcism.cism.ucl.ac.be
```

---

# Remote Linux from Windows

Using a SSH client to reach a distant Linux Workstation

**mobaXTerm** is free and easy to use
> allow you to test a Linux environmment but in CLUI only

Get a SSH client
https://mobaxterm.mobatek.net/download-home-edition.html

How to use a SSH client
https://support.ceci-hpc.be/doc/_contents/QuickStart/ConnectingToTheClusters/MobaXTerm.html

---

# Scripting

How to do a backup ?
- with Dropbox or Google Drive ?
- with a private cloud such as Nextcloud ?
- with an other drive and/or an external drive ?

Backup on external drive ?
- manually ?
- with Windows tools ? 
- with external softwares ?

**Why don't do that with a simple linux script ?**

---

# Conclusions

|  Advantages of Linux  |  Disadvantages of Linux |
| --------------------- | ---------------------------------- |
|  Cost                 | Not easy to master ( **CLUI only** )  |
|  Security and robustness | Hardware compatibility issues ( sometimes ) |
|  Freedom | Not compatible with some Windows software |
|  Software ||
|  Development ||

---

### Need to know more about available Linux applications ?

[Check out the list of the best Linux software](https://www.makeuseof.com/tag/best-linux-software/)

### Need help with bash scripting ?

- [Bash Scripting Tutorial for Beginners](https://linuxconfig.org/bash-scripting-tutorial-for-beginners)
- [Bash scripting cheatsheet](https://devhints.io/bash)

### Need help with Ubuntu ?

The massive community is one of Ubuntu's biggest strengths
> Visit https://askubuntu.com/ or https://answers.launchpad.net/
