This is the start of a series where I'll share everything I'm learning about DevOps technologies. Understanding the basics of Linux is essential for anyone in DevOps, so this guide will serve as the foundation for all the upcoming posts.
Linux File System Structure
Understanding the Linux filesystem hierarchy is crucial for DevOps work. Here's the essential directory structure:
/
├── home/ # User home directories
├── root/ # Root user's home directory
├── bin/ # Essential system binaries
├── sbin/ # System administration binaries
├── lib/ # Shared libraries for system programs
├── usr/ # User programs and data
│ ├── bin/ # User binaries
│ ├── sbin/ # Non-essential system binaries
│ ├── lib/ # Libraries for user programs
│ └── local/ # Locally installed software
├── etc/ # Configuration files
├── opt/ # Optional/third-party software
├── tmp/ # Temporary files
├── boot/ # Boot loader files
├── dev/ # Device files
├── var/ # Variable data (logs, cache, etc.)
│ ├── log/ # System and application logs
│ └── cache/ # Application cache data
├── media/ # Removable media mount points
└── mnt/ # Temporary mount points
Why does /usr
duplicate directories? Historical reasons. Originally, /usr
was a separate partition for user data. Over time, it became a secondary hierarchy for non-essential programs.
Essential CLI Commands
Master these commands for efficient system navigation and administration:
System Information
# CPU information
lscpu
# Memory information
lsmem
# Complete system information
uname -a
# OS release information
cat /etc/os-release
Navigation and History
# Reverse search through command history
Ctrl+R
# Execute command by history number
!123
# List files recursively
ls -R
User Management
# Switch to specific user (with environment)
su - username
# Switch to root user
su -
# Add new user (interactive)
sudo adduser username
# Add new group
sudo addgroup groupname
Package Management
Ubuntu uses multiple package management systems:
APT (Advanced Package Tool)
# Search for packages
apt search packagename
# Install package
sudo apt install packagename
# Remove package
sudo apt remove packagename
# Package sources configuration
/etc/apt/sources.list
APT vs APT-GET: apt
is newer, more user-friendly, and combines common apt-get
and apt-cache
functions.
Alternative Installation Methods
- Ubuntu Software Center: GUI package manager
- Snap packages: Universal Linux packages
- PPA (Personal Package Archives): Third-party repositories
# Add PPA repository
sudo add-apt-repository ppa:repository-name
# Install snap package
sudo snap install packagename
Vim Text Editor
Essential for editing configuration files on servers:
Basic Operations
Command | Action |
---|---|
i |
Enter insert mode |
Esc |
Exit insert mode |
:wq |
Save and quit |
:q! |
Quit without saving |
Text Manipulation
Command | Action |
---|---|
dd |
Delete current line |
d10d |
Delete 10 lines |
u |
Undo last change |
2u |
Undo last 2 changes |
Navigation
Command | Action |
---|---|
A |
Go to end of line (insert mode) |
0 |
Go to beginning of line |
$ |
Go to end of line |
10G |
Go to line 10 |
Search and Replace
/searchterm # Search forward
n # Next match
N # Previous match
:%s/old/new # Replace first occurrence in each line
:%s/old/new/g # Replace all occurrences
:%s/old/new/gc # Replace all with confirmation
User Accounts and Groups
User Types
- Root user: System administrator (UID 0)
- Regular users: Standard user accounts (UID 1000+)
- Service users: System service accounts (UID < 1000)
User Management Commands
# View user information
cat /etc/passwd
# Change password
passwd username
# Add user to group
usermod -aG groupname username
# View user's groups
groups username
# Remove user from group
sudo gpasswd -d username groupname
Group Management
# View all groups
cat /etc/group
# Change user's primary group
usermod -g groupname username
# Add user to multiple groups
usermod username -G group1,group2
File Ownership and Permissions
Understanding Permissions
ls -l filename
# Output: -rwxrw-r-- owner group
# │││││││││
# │││└┴┴┴┴┴─ Others permissions (r--)
# ││└┴┴─────── Group permissions (rw-)
# │└────────── Owner permissions (rwx)
# └─────────── File type (- for file, d for directory)
Changing Ownership
# Change owner and group
chown username:groupname filename
# Change only owner
chown username filename
# Change only group
chgrp groupname filename
Changing Permissions
Symbolic Method
chmod u+x filename # Add execute for owner
chmod g-w filename # Remove write for group
chmod o+r filename # Add read for others
chmod a+x filename # Add execute for all
Numeric Method
Permission | Value |
---|---|
Read (r) | 4 |
Write (w) | 2 |
Execute (x) | 1 |
# rwx = 4+2+1 = 7
chmod 755 filename # rwxr-xr-x
chmod 644 filename # rw-r--r--
Pipes and Redirection
Standard Streams
- stdin (0): Standard input
- stdout (1): Standard output
- stderr (2): Standard error
Common Operations
# Pipe output to less for pagination
history | less
# Search through command output
history | grep "sudo"
# Redirect output to file (overwrite)
history | grep sudo > commands.txt
# Redirect output to file (append)
history | grep sudo >> commands.txt
Less Navigation
Key | Action |
---|---|
Space |
Next page |
b |
Previous page |
q |
Quit |
Shell Scripting Basics
Script Structure
#!/bin/bash
# Variables
file_name=config.yaml
echo "Processing $file_name"
# Command substitution
config_files=$(ls config)
Conditional Statements
# Directory check
if [ -d "config" ]; then
echo "Directory exists"
else
echo "Creating directory"
mkdir config
fi
# File check
if [ -f "config.yaml" ]; then
echo "File exists"
fi
# Numeric comparisons: -eq, -ne, -gt, -ge, -lt, -le
if [ $num -eq 10 ]; then
echo "Number is 10"
fi
# String comparisons
if [ "$var" == "string" ]; then
echo "Strings match"
fi
Script Parameters and User Input
# Script parameters
first_param=$1
second_param=$2
all_params=$*
param_count=$#
# User input
read -p "Enter value: " user_input
echo "You entered: $user_input"
Loops
# For loop
for param in $*; do
echo $param
done
# While loop
sum=0
while true; do
read -p "Enter number (q to quit): " input
if [ "$input" == "q" ]; then
echo "Sum: $sum"
break
fi
sum=$(($sum + $input))
done
Functions
# Simple function
function process_file() {
echo "Processing $1"
return 0
}
# Call function
process_file "config.yaml"
result=$? # Get return value
Environment Variables
Viewing Variables
# List all environment variables
printenv | less
# View specific variable
printenv USER
echo $USER
# Search for variables
printenv | grep USER
Setting Variables
# Temporary (current session only)
export MY_VAR="value"
# Permanent (user-specific)
echo 'export MY_VAR="value"' >> ~/.bashrc
source ~/.bashrc
# System-wide
sudo echo 'MY_VAR="value"' >> /etc/environment
PATH Management
# Add directory to PATH
export PATH=$PATH:/custom/location
# Make permanent
echo 'export PATH=$PATH:/custom/location' >> ~/.bashrc
Networking Fundamentals
Network Components
- LAN: Local Area Network (switch)
- WAN: Wide Area Network (router/gateway)
- Subnet: Network segment with same IP range
- CIDR: Classless Inter-Domain Routing notation
IP Addressing
192.168.1.0/24
│ │
│ └─ Subnet mask (255.255.255.0)
└─ Network address
Network Services
- NAT: Network Address Translation
- DNS: Domain Name System
- Firewall: Network security filtering
- Port: Communication endpoint
Network Commands
# Network interface information
ifconfig
ip addr show
# Network connections
netstat -tulpn
# DNS lookup
nslookup domain.com
# Test connectivity
ping hostname
# Running processes
ps aux
SSH (Secure Shell)
Key-Based Authentication Setup
- Generate key pair on client:
ssh-keygen -t rsa
# Creates ~/.ssh/id_rsa (private) and ~/.ssh/id_rsa.pub (public)
- Copy public key to server:
# Method 1: Manual copy
cat ~/.ssh/id_rsa.pub
# Paste into ~/.ssh/authorized_keys on server
# Method 2: Using ssh-copy-id
ssh-copy-id username@hostname
SSH Usage
# Connect with password
ssh username@hostname
# Connect with specific key
ssh -i ~/.ssh/id_rsa username@hostname
# Copy files over SSH
scp localfile username@hostname:/remote/path
scp username@hostname:/remote/file ./local/path
SSH Security Best Practices
- Use key-based authentication over passwords
- Keep private keys secure (600 permissions)
- Use strong passphrases for keys
- Disable root SSH access in production
Top comments (0)