The Linux Terminal

September 14, 2017 in shell (Command line)

Introduction To Linux Terminal


1.1.The magic of Linux Terminal.


The Linux shell exists since Linux invented and it is still one of the most powerful ways for a user to interact with a system. There are thousands of different Linux distributions out there but if you look all of them from the command line perspective you will find out that all of them are almost the same. The Linux Terminal is fast, light, fully customizable, can be accessed remotely and so much more.

For most of the user at the beginning Linux terminal is just a black window that seems a bit unfriendly but after you get used to it you will love it.


I use Ubuntu on all my examples presented here but the magic of Linux Terminal is that you can use your favorite Linux distribution and still be able to follow.

There are several terminal instances running at the same time in Linux O.S. and most of the times you can access them by using key combinations. In Ubuntu you can use ctrl+alt+F1 to access the first command line instance ctrl+alt+F2 for the second and so on until the 6th. with ctrl+alt+F7 you can access the Graphic User Interface. From there you can open as many terminal emulators as you wish. those terminals can be started from the menu of the O.S. or in Ubuntu you can use ctrl+alt+t.


At that point i assume that you already have a running system and that you are able to open a terminal. If not then now it’s a good time to install a Linux system. You can either use a physical machine or a virtual.


But let’s get started!

1.2.Who am I? Where am I? what time is it???


A Linux terminal emulator in Ubuntu is look like the image 1.1. Even without giving any commands you are still able to get some information out of this.

Image 1.1

This is what you get




user1: is the user-name of the current user

@: the at sign between user-name and computer-name

allaboutlinuxeu: is the computer-name or host-name

So altogether it says that user1 is connected to allaboutlinuxeu

the “:” indicates that the disk path is starting here.

the “~” indicates that I am currently in my home directory

the “$” indicates that I am logged in as normal user (if i logged in as root this symbol will change to “#”)

Note! This string user1@allaboutlinuxeu:~$ is not standard. Other Linux distribution might give less or more info. You can also customize that to fit your need but we will check that on a next chapter.

Let’s start with first question: Who am I?

At that point i want to mention that all text with gray background are commands or outputs from a terminal.

So now just type “whoami”


user1@allaboutlinuxeu:~$ whoami


After “$” you can type the command “whoami” and in the next line is coming the output of that command and then the Shell is going back to idle and it is just waiting for the next command. So I have successfully verify that I am “user1”.


But where am I? go ahead and type “pwd”


user1@allaboutlinuxeu:~$ pwd


pwd stands for: Print current/Working Directory. I will not go deep into the file structure on a Linux machine right now but I will explain that later. for now, I know that “I am at /home/user1”.


And what about time, date, year? for that just type “date”


user1@allaboutlinuxeu:~$ date
Tue Jul 11 23:18:09 UTC 2017


This output is pretty much self explained so i will not go any farther with that.


At any point you want to quit a terminal then you just need to type “exit”.

1.2.What is a Linux command?

A Linux command can be a single word following by some parameters some files or Directories or even some variable and inputs from user. We already went through some basic single word commands like whoami, pwd and date. But how can the O.S. understands what to do?

Most of the commands are actually small binaries (small programs) that was installed in your computer during the O.S. installation process. The binary whoami for example is in the directory /usr/bin . Normally in order to execute that binary you need to provide the full path. In that case /usr/bin/whoami . Try that:


user1@allaboutlinuxeu:~$ /usr/bin/whoami


As you can see the output is exactly the same since in both cases the same binary executed.

But how the system knows where to look for those binaries?


There are a few directories that contain binaries and and the O.S. is searching in those to check if a command provided in the terminal has a binary in those directories. If you want to see the list of those directories type the following command:


user1@allaboutlinuxeu:~$ echo $PATH


This is the full list of directories that the O.S. is looking for binaries for the current user.

Tip: The $PATH can also be modified to include or exclude some paths.

Since the /usr/bin is in that list the O.S. is executing binaries within that directory even without the /usr/bin so in that case only the command whoami is enough. This might be a bit confusing right now but it will be more clear later on.

1.3 The Main Linux Directories.


Linux have a hierarchical directory structure like the most Operating Systems. This system is a like a tree and it has a root directory that includes everything then there are some directories and files under that:

├── bin
├── boot
├── cdrom
├── dev
├── etc
├── home
├── lib
├── lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var
   ├── backups
   ├── cache
   ├── crash
   ├── lib
   ├── local
   ├── lock -> /run/lock
   ├── log
   ├── mail
   ├── metrics
   ├── opt
   ├── run -> /run
   ├── spool
   └── tmp


In that example i have only expanded the subdirectories in /var and only in 1 level. There are  many more subdirectories but the list wouldn’t easily fit here.


Let’s take a brief look on the main directories in Ubuntu.

/bin this is the first in the list and contains binaries that system needs to boot but many of those are also usable by users like the date command we used before.

/boot that is maybe the most important directory in a linux system. it contains the kernel (this is the heart of a linux O.S.) and important information for booting the system.

/dev here is a list of devices that the O.S. can access like hard drives partitions cd roms serial ports etc.

/etc one of the core directories of the system since it contains all the configurations of the system, scripts that are running during the boot usernames groups almost everything you can imagine that can be configured in a system.

/home this contains the home directories for each user and users can store their files and directories here.

/lib this is the library directory that is used by programs

/lost+found In case of an abnormal shutdown or if something is going wrong into your file system the O.S. will try to recover files  and place them into that directory. Generally if this directory is empty is a good sign!

/media USB disks, USB sticks, CD-ROMS and other removable devices are mounted inside that directory. (that is not true for all Linux O.S.)

/mnt Generally that directory is empty but this is good place if you want to manually add shared/network directory or manually mount a device

/opt that is also kinda new in Linux and it is used to hold “optional Software” software that users install or anything that is not part of the main O.S. in the past that directory was under /usr/local and some programs are still prefer that directory.

/proc that is an interesting Directory since it hold files that used mainly by the system to identify hardware parts but in most cases those files are human readable and you can get some interesting information out of that.

/root that is the home directory for user root. This is a special user that have permissions to do anything in a Linux machine

/sbin this one is like /bin and hold some binaries that can be executed by root or any super user.

/tmp A temporary directory that programs are storing temporary info while programs executed in your system.

/usr This folder contains most of the binaries used by users and sometimes by system. There are many interesting subdirectories in this one.

/var That directory holds dynamically changed files like log files, databases and generally is the most active directory in the system.

1.4 Navigate into Linux File system.


the main command to jump from one directory to another is the “cd” and this one stands for “Change Directory”.  Let’s navigate to the root. This is the main directory that holds all others and it is represented by the “/” slash symbol.


user1@allaboutlinuxeu:~$ cd /


As you can see the “~” tilde symbol that represents the home directory of the user changed to “/”

Tip: at anytime if you want to check the path to the current working directory you can issue the “pwd” command.


Now that we are at the root of our file system we can navigate to any directory that we have permissions to read. We will talk about permissions in a later chapter. let’s go to “usr” directory and from there inside the “games” directory. This can be done step by step like:


user1@allaboutlinux:/$ cd usr
user1@allaboutlinux:/usr$ cd games

or with one command like:


user1@allaboutlinux:/$ cd usr/games


You may have already noticed that the directories are separated by “/” and also the command prompt string changed from “user1@allaboutlinux:/$” to “user1@allaboutlinux:/usr/games$” in that way you can always check the current working directory that starts after the “:”

In order to move back one directory then we can use the command “cd ..”:


user1@allaboutlinux:/usr/games$ cd ..


The “..” two dots are standing for the parent directory while the “.” one dot stands for the current directory there is no point to change to current directory but that is important on some other occasions.


1.4.1 Absolute path vs Relative path.


The absolute path.

Every directory or file in our file system have its own unique path. This address starts from “/” and ends at the directory or the file that we want to reach. For example if we want to play gnome-sudoku we need to know the path to that game.

Note! Ubuntu and some other debian based Linux are coming with that game. This may not be available in other Linux distributions.

The absolute path for that game is /usr/games/gnome-sudoku

As you can see that path starts with “/” following by some subdirectories and ends at the filename. Some other O.S. used to have an extension to every file and with that the file is identified. In Linux, extensions are not mandatory. So now if i want to play that game all i have to do is to provide the absolute path to that game and i can do that from any location. It doesn’t matter if i am in /var or in /home/user1. Since i am providing the absolute path the system will just go there and execute the file. that is the meaning of the absolute path.

let’s have some fun:

user1@allaboutlinux:/usr$ /usr/games/gnome-sudoku


At that point a new window will open and sudoku will run. Once you close the window the command line will become again available.


Relative path.

There is also another way to navigate through file system by providing the relative path. instead of starting from “/” you can start from any other location and that path will be relative to your current working directory. Right now you are at “/usr” and if you want to start again the same game that is in a subdirectory of usr then you need to provide the relative path from “/usr” to the executable. as we said before the “.” one dot stands for the current directory. So if i am in “/usr” and type “.” then in essence I am saying /usr/ and from there i can continue like “./games/gnome-sudoku” or if i was already inside the games directory (so my current working directory was /usr/games/) then i would be able to execute the same game by typing ./gnome-sudoku


It might sound a bit complicated at that point but we will see many examples of that later on and it will become much more clear. But for now just remember that when i’m providing the full path starting from root “/” to the file or directory i’m using the absolute path and when I am providing a path related to my current working directory I am using a Relative path. There is no right and wrong way to do something we just use whatever is more convenient.


1.5 List the contents of a directory “ls”


Let’s list the contents in the root directory. For that you will need the ls command.

ls stands for “list”


user1@allaboutlinuxeu:/$ ls
bin    dev   initrd.img      lib64       mnt   root  srv  usr      vmlinuz.old
boot   etc   initrd.img.old  lost+found  opt   run   sys  var
cdrom  home  lib             media       proc  sbin  tmp


Those 2 commands are the most basic in order to navigate to a directory  and list all the files in that directory. if we want for example to check the contents of /usr then we can first go inside /usr and then list the contents.


user1@allaboutlinux:/$ cd usr
user1@allaboutlinux:/usr$ ls
bin  games  include  lib  local  locale  sbin  share  src


“ls” by default is listing the contents of the current working directory but you can also provide the path of the directory that you want to list the contents and run the command from everywhere without going directly into the specific directory. In the same scenario where I am in root directory “/” and i was to check the contents of /usr instead of moving in i run directly the “ls” command and providing the absolute path of the directory.


user1@allaboutlinux:/$ ls /usr/
bin  games  include  lib  local  locale  sbin  share  src

In this directory you can see the full list of files and directories that you have in your Linux but as a normal user you do not have access to all of them. Every user have his own directory where he/she have full control to read write and execute. Now its time to go back to owr home directory and create a subdirectory and a file inside that directory. there are many ways to do that but the easiest is by typing “cd ~/” that is equal to “cd /home/user1” where user1 is the name of current user.


method 1:

user1@allaboutlinux:/$ cd ~/


method 2:

user1@allaboutlinux:/$ cd /home/user1/


1.6 Creating and deleting files and directories

Now we are in our Home directory. With the following command we can create a directory named “working_directory”


user1@allaboutlinux:~$ mkdir working_directory

Tip: By default this command will not return any output. in case that there is a problem during creating the directory an output will be generated and you will be able to check what went wrong. A common issue is when you are trying to create a sub-directory inside a directory that you don’t have write permission. We will talk about permissions in a next chapter.


Note you should not use “space” in files or directories names. the command “mkdir working directory” will actually create 2 directories one named “working” and one named “directory”


ok now that we have a test directory we can go in and create a file with name test_file. again here I am using an underscore otherwise the system will generate 2 file one named test and one named file. the command to create an empty file is the "touch". so lets do that.


user1@allaboutlinuxeu:~$ cd working_directory/
user1@allaboutlinuxeu:~/working_directory$ touch test_file


now lets list the contents of this directory


user1@allaboutlinuxeu:~/working_directory$ ls

Great so we have our first file inside our first directory. Now lets move on and delete this file. The command that we need to use is the "rm" which stands for remove and it can be used for both files and directories. lets delete the file by issuing the "rm" followed by the file name and list the contents of directory to make sure that the file is deleted.


user1@allaboutlinuxeu:~/working_directory$ rm test_file 
user1@allaboutlinuxeu:~/working_directory$ ls


Note Linux will never ask by default for a confirmation when you are deleting a file and will not produce any output if the operation was successful. It will always assume that you know what are you doing. You also need to have in mind that the file is not going into a trash can or anything similar. So you should say good-bye to your file for good.


Now lets try to remove the directory that we created before. We will need to navigate to the parent directory and then issue the rm command again followed by the directory name. But since this is a directory we need to use the option "-d". The -d is saying to rm to remove an empty directory. so lets do that.

user1@allaboutlinuxeu:~/working_directory$ cd ..
user1@allaboutlinuxeu:~$ rm -d working_directory/


To be continue…

Stay tuned 😉







DNS Server in Ubuntu / Debian

December 4, 2015 in Services

Local DNS Server in Ubuntu Debian

What is a DNS

DNS stands for Domain Name System and its a service that associates domain names with ip addresses. Let me try to explain this a bit more.Since you are reading this article it means that you have typed my domain name (www.allaboutlinux.eu) or you found that link on another website. but when you are typing www.allaboutlinux.eu, your computer is not really able to know where this website is hosted and of course  computers are only good with numbers. So your computer will ask the DNS server about a domain name and the DNS server will reply with an ip address. Then your computer will contact that ip and hopefully the server behind that ip will reply. Enough with that lets start with the setup of the DNS server.

What you will need:

bind9 will be used in this tutorial and this one is the most widely used DNS in the world. BIND stands for Berkeley Internet Name Domain and was initially a project of 4 graduate students at the Computer Research Group at the University of California, Berkeley. Lets say now now that i have my DNS server (the one that we create now) at, my sql server at "″, my Apache server at "″, my file server at "″, my router at "″ and my computer at all of them are at /24. so my network is working but i have to remember all the ips in order to connect to each server. and as my company growth i will have more servers and more workstations and that is making things more complicated. it would be easier if I had a way to connect to my sql server by just providing the name and not the ip and that is exactly what we will do here. Open a terminal and type the following commands.

sudo apt-get update

sudo apt-get install bind9

Now we need to define a name for our local zone. I will name this one "allaboutlinux.local" but you can choose whatever you want. more zones are also possible. All files that you will need to configure are in "/etc/bind/". lets define the new zone. Open the /etc/bind/named.conf.default-zones

sudo gedit /etc/bind/named.conf.default-zones

and add the following lines at the end of the document:


Install Google Chrome in Debian 8

October 10, 2015 in software

Install Google Chrome in Linux Debian

chromeGo to official website of Google Chrome and click on the "Download now" button.
Select the "64 bit .deb (For Debian/Ubuntu)", read the agreement and if you agree click on "Accept and Install" to download the installation package. Save the file to the default location ~/Downloads/.
the filename should look like that: "google-chrome-stable_current_amd64.deb"
after that open a terminal go to Downloads directory and try to install the package.

cd ~/Downloads/

sudo dpkg -i google-chrome-stable_current_amd64.deb

if you get an error like: "Errors were encountered while processing: google-chrome-stable" it is because some dependencies are missing. To fix that enter the following command:

sudo apt-get -f install

Then you should be able to run the installation without problems:

sudo dpkg -i google-chrome-stable_current_amd64.deb

To run Google Chrome type in terminal "google-chrome" or click the icon in the menu.


install latest Darktable in Debian 8

September 17, 2015 in software, Web Server

install Darktable in Debian 8

There is an easy way to install darktable in Debian by issuing the command "sudo apt-get install Darktable" but this one will install an old version of Darktable.
If you need the latest stable one then you need to follow those steps:
open a terminal and type:

sudo apt-get update

sudo apt-get build-dep darktable

sudo apt-get install libglew-dev libcanberra-gtk-module mesa-opencl-icd mesa-utils-extra

Now go to the official website http://www.darktable.org/ and download Darktable. you should get a file with a name like darktable-x.x.x.tar.xz where x is the version of Darktable.

go to Downloads directory and extract that file.

cd ~/Downloads/

tar xvf darktable-1.6.8.tar.xz

now go into darktable directory and start the build process by typing:

cd darktable


Then issue the following command to install it.


Install Thunderbird in Debian 8

September 17, 2015 in software, Web Server

Install Thunderbird in Debian 8

Lets begin by downloading Thunderbird.

Visit the official Thunderbird site https://www.mozilla.org/thunderbird/ and click on Download button.

This will download a file like thunderbird-xx.x.x.tar.bz2 where "x" is the current version of Thunderbird.

Lets move that file in /usr directory.

sudo mv ~/Downloads/thunderbird-xx.x.x.tar.bz2 /usr/

Go to /usr and decompress Thunderbird:

cd /usr

sudo tar xvf thunderbird-xx.x.x.tar.bz2

Remove the compressed file:

sudo rm thunderbird-xx.x.x.tar.bz2

lets create the launcher. Press the "Super Key" (this one is located on your keyboard between "ctrl" and "alt". In windows world is also called "Windows Key")

then type "main menu"



Install Filezilla in Debian 8

September 16, 2015 in Web Server

Install Filezilla in Debian 8

Lets begin by downloading Filezilla.

Visit the official Filezilla site https://filezilla-project.org/download.php?type=client and click on Download button.

This will download a file like FileZilla_x.xx.x_x86_64-linux-gnu.tar.bz2 where "x" is the current version of Filezilla.

Lets move that file in /usr directory.

sudo mv ~/Downloads/FileZilla_x.xx.x_x86_64-linux-gnu.tar.bz2 /usr

Go to /usr and decompress filezilla:

cd /usr

sudo tar xvf FileZilla_x.xx.x_x86_64-linux-gnu.tar.bz2

Remove the compressed file:

sudo rm FileZilla_x.xx.x_x86_64-linux-gnu.tar.bz2

lets create the launcher. Press the "Super Key" (this one is located on your keyboard between "ctrl" and "alt". In windows world is also called "Windows Key")

then type "main menu"



install Firefox in Debian 8

September 16, 2015 in software

Install Firefox in Debian 8

Lets begin by downloading Firefox.

Visit the official Firefox site https://www.mozilla.org/en-US/firefox/ and click on Download button.

This will download a file like firefox-xx.x.x.tar.bz2 where "x" is the current version of Firefox.

Lets move that file in /usr directory.

sudo mv ~/Downloads/firefox-xx.x.x.tar.bz2 /usr

Go to /usr and decompress firefox:

cd /usr

sudo tar xvf firefox-xx.x.x.tar.bz2

remove the compressed file:

sudo rm firefox-xx.x.x.tar.bz2

lets create the launcher. Press the "Super Key" (this one is located on your keyboard between "ctrl" and "alt". In windows world is also called "Windows Key")

then type "main menu"



Remove nouveau and install nvidia Driver in Ubuntu 15.04

July 6, 2015 in O.S.

Install Nvidia Drivers in Ubuntu 15.04


Lets remove first everything that point to any existing nvidia installation.

open a terminal (ctrr+alt+t) and type:

sudo apt-get remove nvidia*

sudo apt-get autoremove

update and download a few tools that we will need:

sudo apt-get update

sudo apt-get install dkms build-essential linux-headers-generic

Now its time to blacklist the nouveau driver.

sudo nano /etc/modprobe.d/blacklist-nouveau.conf

and add the following lines:

blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

Disable the Kernel nouveau by typing the following commands:

echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf

sudo update-initramfs -u

Now go to nvidia.com and download the driver for your graphic card.

The file name should be something like that "NVIDIA-Linux-x86_64-352.21.run" depends on the architecture of your machine and the version of the driver.


install Java in Ubuntu

October 20, 2013 in software

Install Java for firefox in Ubuntu

java_logoLets begin with verifying if Java is already installed in your computer.

Visit the official Java site www.java.com/en/ and click on Do I Have Java?

If you don’t have please keep reading.

Lets download Java:

Go back to the official website www.java.com/en/ and click on Free Java Download.

Now download the package fitting on your version of Linux (32 or 64 bit)

If you are not sure what kind of version you are running open a terminal and type:

uname -m

If the output is i686 it means that you are running on 32bit O.S. If you get x86_64 then you are running on a 64bit O.S.

Now that you have the correct package you need to extract the content into /usr/java. But first you need to create the folder. For that you will need root access

sudo mkdir -p /usr/java

Then move the java package into that folder

sudo mv ~/Downloads/jre-7u45-linux-i586.tar.gz /usr/java

Note. You need to change jre-7u45-linux-i586.tar.gz with the name of the package you download before

Now lets extract the package

cd /usr/java/

sudo tar xvf jre-7u45-linux-i586.tar.gz

Create a folder for firefox plugins

cd ~/.mozilla

mkdir plugins

At the end you need to create a symbolic link for the firefox plugins

for 32bit:

ln -s /usr/java/jre1.7.0_45/lib/i386/libnpjp2.so ~/.mozilla/plugins/

or for 64bit

ln -s /opt/java/jre1.7.0_45/lib/amd64/libnpjp2.so ~/.mozilla/plugins/

Note. You need to change jre1.7.0_45 with the directory name you create when you extract the package.

Restart Firefox and check again if java is working like you did on the beginning of this article.

A video tutorial is coming soon.



fstab in ubuntu

July 11, 2013 in Web Server

How to configure fstab in Ubuntu

what is fstab?

In fstab or FileSystemTABle,you will be able to find informations regarding all your mount points in your computer.

In other words is a list of disks and partitions and also include information regarding where they are mounted in your Operating System.

It maybe sounds a bit complicat right now but i think that you will be able to understand if you see an example.

I will post here an fstab file (you can find yours under /etc/fstab)


# <file system> <dir>         <type> <options>       <dump> <pass>
/dev/sda1         /                   ext4      defaults             1           1
/dev/sda2        /usr              ext4      defaults              1           1

/dev/sda4        /home         ext4       defaults             0            0
/dev/sda5         swap          swap    defaults              0           0
/dev/sdc1         /data2         ext4      defaults,auto     0           2
/dev/sdb1         /data            auto     defaults,auto     0           2

Lets check this table:

on the first column:

Here you can find informations regarding the hard drives and partitions. In this computer there are 3 Hard Drives sda1, sda2, sda3 . On the first hard drive the OS is installed and the other 2 hdds are there for some additional storage. The first hard drive is divided into partitions but the other hard drives are not in this example.

On the second column:

Here you can see where in your file system are mounted your hard drives and your partitions

On the third column:

You can specify here what is the file system of your partitions. Some of the options are: ext2, ext3, ext4, nfs, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap, and auto. the auto   is my favourite because in that mode you let the O.S. decide what kind of file system is your partition. This is very useful for CD and DVD ROMS.

On the forth Column:

Here you can specify how the system will mount your drives and partitions. You can add more than 1 option with ","

auto -- file system will mount automatically at boot.

noauto -- the filesystem is mounted only when you want to mount it (you can the mount command)

exec -- allow the execution binaries that are on that partition (default).

noexec -- do not allow binaries to be executed on the filesystem.

ro -- mount the filesystem read only.

rw -- mount the filesystem read-write.

user -- permit any user to mount the filesystem

nouser -- only allow root to mount the filesystem (default).

suid -- allow the operation of suid, and sgid bits.

nosuid -- block the operation of suid, and sgid bits.

noatime -- do not update inode access times on the filesystem. Can help performance.

nodiratime -- do not update directory inode access times on the filesystem. Can help performance.

relatime -- update inode access times relative to modify or change time. Access time is only updated if the previous access time was earlier than the current modify or change time (similar to noatime, but doesn’t break mutt or other applications that need to know if a file has been read since the last time it was modified). Can help performance.

sync -- I/O should be done synchronously.

async -- I/O should be done asynchronously.

defaults -- this is the most used and it includes the default mount settings (equivalent to rw,suid,dev,exec,auto,nouser,async). I also like this one 😉

Fifth Column

This is where you tell to dump utility if it needs to be backuped or not. if its 0 the dump will ignore this one. if it is 1 the dump will include this drive in the backup process.

Sixth Column.

this is the priority on check disk and can be 0,1,2. the root file system must have 1 and that means high priority on check. the other can be 0 no check or 2 check after file system.