Linux从入门到精通:系统化学习路线指南

前言

Linux作为开源操作系统的代表,在服务器、云计算、容器化、嵌入式系统等领域占据主导地位。掌握Linux技能不仅是运维工程师的必备技能,也是开发者、架构师等技术岗位的重要加分项。本文将为你提供一个系统化的Linux学习路线,帮助你从零基础成长为Linux专家。

学习前的准备

硬件环境准备

  • 物理机或虚拟机:推荐使用VMware、VirtualBox或云服务器
  • 内存要求:至少2GB RAM,推荐4GB以上
  • 存储空间:至少20GB可用空间
  • 网络环境:稳定的网络连接用于软件包下载

发行版选择建议

  • 初学者推荐:Ubuntu Desktop(用户友好)
  • 服务器学习:CentOS/RHEL、Ubuntu Server
  • 进阶学习:Debian、Arch Linux
  • 企业环境:Red Hat Enterprise Linux、SUSE

第一阶段:Linux基础入门(1-2个月)

1.1 Linux系统概述

核心概念理解

  • 开源软件理念:自由软件与开源许可证
  • Linux发行版:内核与发行版的关系
  • 系统架构:硬件层、内核层、Shell层、应用层
  • 多用户多任务:Linux的核心特性

安装与配置

1
2
3
4
5
6
7
8
9
10
# 查看系统信息
uname -a # 系统内核信息
lsb_release -a # 发行版信息
cat /etc/os-release # 系统版本详情
hostnamectl # 主机名和系统信息

# 基本系统配置
sudo hostnamectl set-hostname new-hostname # 设置主机名
timedatectl # 查看时间设置
sudo timedatectl set-timezone Asia/Shanghai # 设置时区

1.2 文件系统与目录结构

Linux目录树结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/                          # 根目录
├── bin/ # 基本命令二进制文件
├── boot/ # 启动文件
├── dev/ # 设备文件
├── etc/ # 系统配置文件
├── home/ # 用户主目录
├── lib/ # 系统库文件
├── media/ # 可移动媒体挂载点
├── mnt/ # 临时挂载点
├── opt/ # 可选软件包
├── proc/ # 进程信息虚拟文件系统
├── root/ # root用户主目录
├── run/ # 运行时数据
├── sbin/ # 系统管理命令
├── srv/ # 服务数据
├── sys/ # 系统信息虚拟文件系统
├── tmp/ # 临时文件
├── usr/ # 用户程序
└── var/ # 变量数据

文件类型与权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 文件类型识别
ls -la # 详细列出文件信息
file filename # 查看文件类型
stat filename # 查看文件详细状态

# 权限管理
chmod 755 filename # 修改文件权限
chmod u+x filename # 给所有者添加执行权限
chown user:group filename # 修改文件所有者
chgrp group filename # 修改文件所属组

# 权限含义
# r(4) - 读权限
# w(2) - 写权限
# x(1) - 执行权限
# 755 = rwxr-xr-x (所有者读写执行,组和其他用户读执行)

1.3 基础命令操作

文件与目录操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 导航命令
pwd # 显示当前目录
cd /path/to/directory # 切换目录
cd ~ # 切换到用户主目录
cd - # 切换到上一个目录

# 文件操作
ls -la # 列出文件详细信息
cp source destination # 复制文件
mv source destination # 移动/重命名文件
rm filename # 删除文件
rm -rf directory # 强制删除目录
mkdir -p /path/to/dir # 创建目录(包括父目录)
rmdir directory # 删除空目录

# 文件查看
cat filename # 显示文件内容
less filename # 分页查看文件
head -n 10 filename # 查看文件前10行
tail -f filename # 实时查看文件末尾
grep "pattern" filename # 搜索文件内容

文本处理工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 基础文本处理
grep -r "pattern" /path # 递归搜索
grep -i "pattern" file # 忽略大小写搜索
grep -v "pattern" file # 反向搜索(不包含pattern的行)

# 文本统计
wc -l filename # 统计行数
wc -w filename # 统计单词数
wc -c filename # 统计字符数

# 文本排序和去重
sort filename # 排序文件内容
sort -n filename # 按数字排序
uniq filename # 去除重复行
sort filename | uniq # 排序后去重

1.4 进程与系统监控

进程管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看进程
ps aux # 查看所有进程
ps -ef # 另一种格式查看进程
top # 实时查看进程
htop # 增强版top(需要安装)
pgrep process_name # 根据名称查找进程ID

# 进程控制
kill PID # 终止进程
kill -9 PID # 强制终止进程
killall process_name # 根据名称终止进程
nohup command & # 后台运行命令
jobs # 查看后台任务
fg %1 # 将后台任务调到前台

系统资源监控

1
2
3
4
5
6
7
8
# 系统资源查看
free -h # 查看内存使用情况
df -h # 查看磁盘使用情况
du -sh /path # 查看目录大小
lscpu # 查看CPU信息
lsblk # 查看块设备信息
lsusb # 查看USB设备
lspci # 查看PCI设备

第二阶段:系统管理基础(2-3个月)

2.1 用户与权限管理

用户管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 用户操作
sudo useradd -m username # 创建用户并创建主目录
sudo passwd username # 设置用户密码
sudo usermod -aG sudo username # 将用户添加到sudo组
sudo userdel -r username # 删除用户及其主目录
id username # 查看用户信息
whoami # 查看当前用户
who # 查看登录用户
w # 查看用户活动

# 组管理
sudo groupadd groupname # 创建组
sudo groupdel groupname # 删除组
groups username # 查看用户所属组
sudo usermod -G group1,group2 username # 修改用户所属组

高级权限管理

1
2
3
4
5
6
7
8
9
10
11
12
# 特殊权限
chmod +s filename # 设置SUID权限
chmod +t directory # 设置粘滞位
chmod 4755 filename # SUID权限(4000)
chmod 2755 directory # SGID权限(2000)
chmod 1755 directory # 粘滞位权限(1000)

# ACL权限(访问控制列表)
setfacl -m u:username:rwx filename # 设置用户ACL权限
setfacl -m g:groupname:rx filename # 设置组ACL权限
getfacl filename # 查看ACL权限
setfacl -x u:username filename # 删除用户ACL权限

2.2 软件包管理

Debian/Ubuntu系统(APT)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 软件包管理
sudo apt update # 更新软件包列表
sudo apt upgrade # 升级已安装软件包
sudo apt install package_name # 安装软件包
sudo apt remove package_name # 卸载软件包
sudo apt purge package_name # 完全卸载软件包(包括配置文件)
sudo apt autoremove # 清理不需要的依赖包

# 软件包查询
apt search keyword # 搜索软件包
apt show package_name # 显示软件包信息
apt list --installed # 列出已安装软件包
dpkg -l # 查看已安装软件包
dpkg -L package_name # 查看软件包安装的文件

Red Hat/CentOS系统(YUM/DNF)

1
2
3
4
5
6
7
8
9
10
11
12
13
# YUM包管理(CentOS 7及以下)
sudo yum update # 更新系统
sudo yum install package_name # 安装软件包
sudo yum remove package_name # 卸载软件包
yum search keyword # 搜索软件包
yum info package_name # 查看软件包信息
yum list installed # 列出已安装软件包

# DNF包管理(CentOS 8+/Fedora)
sudo dnf update # 更新系统
sudo dnf install package_name # 安装软件包
sudo dnf remove package_name # 卸载软件包
dnf search keyword # 搜索软件包

2.3 服务管理(Systemd)

服务控制

1
2
3
4
5
6
7
8
9
10
11
12
13
# 服务管理
sudo systemctl start service_name # 启动服务
sudo systemctl stop service_name # 停止服务
sudo systemctl restart service_name # 重启服务
sudo systemctl reload service_name # 重新加载服务配置
sudo systemctl enable service_name # 设置开机自启
sudo systemctl disable service_name # 取消开机自启

# 服务状态查看
systemctl status service_name # 查看服务状态
systemctl is-active service_name # 检查服务是否运行
systemctl is-enabled service_name # 检查服务是否开机自启
systemctl list-units --type=service # 列出所有服务

自定义服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建自定义服务文件
sudo vim /etc/systemd/system/myapp.service

# 服务文件内容示例
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=myuser
WorkingDirectory=/path/to/app
ExecStart=/path/to/app/start.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

# 重新加载systemd配置
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service

第三阶段:网络与安全管理(2-3个月)

3.1 网络配置与管理

网络基础配置

1
2
3
4
5
6
7
8
9
10
11
# 网络接口管理
ip addr show # 查看网络接口
ip link show # 查看网络链路状态
sudo ip addr add 192.168.1.100/24 dev eth0 # 添加IP地址
sudo ip route add default via 192.168.1.1 # 添加默认路由

# 传统网络工具
ifconfig # 查看网络接口(需要安装net-tools)
route -n # 查看路由表
netstat -tuln # 查看网络连接
ss -tuln # 现代版netstat

网络诊断工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 连通性测试
ping -c 4 google.com # 测试网络连通性
traceroute google.com # 跟踪路由路径
mtr google.com # 结合ping和traceroute

# DNS诊断
nslookup google.com # DNS查询
dig google.com # 详细DNS查询
dig @8.8.8.8 google.com # 指定DNS服务器查询

# 端口扫描
nmap -p 80,443 target_host # 扫描指定端口
nmap -sS target_host # SYN扫描
telnet host port # 测试端口连通性

3.2 防火墙配置

UFW防火墙(Ubuntu)

1
2
3
4
5
6
7
8
9
10
11
12
# UFW基本操作
sudo ufw enable # 启用防火墙
sudo ufw disable # 禁用防火墙
sudo ufw status # 查看防火墙状态
sudo ufw status verbose # 详细状态

# 规则管理
sudo ufw allow 22 # 允许SSH端口
sudo ufw allow 80/tcp # 允许HTTP端口
sudo ufw allow from 192.168.1.0/24 # 允许特定网段
sudo ufw deny 23 # 拒绝telnet端口
sudo ufw delete allow 80 # 删除规则

Firewalld防火墙(CentOS/RHEL)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Firewalld基本操作
sudo systemctl start firewalld # 启动防火墙
sudo systemctl enable firewalld # 设置开机自启
sudo firewall-cmd --state # 查看防火墙状态

# 区域管理
sudo firewall-cmd --get-zones # 查看所有区域
sudo firewall-cmd --get-default-zone # 查看默认区域
sudo firewall-cmd --set-default-zone=public # 设置默认区域

# 服务和端口管理
sudo firewall-cmd --add-service=http --permanent # 永久允许HTTP
sudo firewall-cmd --add-port=8080/tcp --permanent # 永久允许8080端口
sudo firewall-cmd --reload # 重新加载配置

实践项目建议

项目一:个人服务器搭建

  • 在虚拟机中安装Linux系统
  • 配置SSH远程访问
  • 搭建Web服务器(Apache/Nginx)
  • 配置防火墙和基本安全设置

项目二:自动化脚本开发

  • 编写系统监控脚本
  • 创建自动备份脚本
  • 开发日志分析工具
  • 实现服务健康检查

项目三:容器化环境搭建

  • 安装和配置Docker
  • 创建自定义Docker镜像
  • 使用Docker Compose管理多容器应用
  • 学习Kubernetes基础概念

学习建议与最佳实践

学习方法

  1. 理论与实践结合:每学一个概念都要动手操作
  2. 搭建实验环境:使用虚拟机进行各种实验
  3. 阅读官方文档:养成查阅man手册的习惯
  4. 参与开源项目:通过实际项目提升技能
  5. 持续关注新技术:Linux生态系统发展迅速

常见学习误区

  • 只记命令不理解原理
  • 忽视安全性考虑
  • 不重视脚本编程能力
  • 缺乏系统性学习规划

进阶方向选择

  • 系统运维:监控、自动化、性能优化
  • 云计算:AWS、Azure、阿里云等云平台
  • 容器技术:Docker、Kubernetes、微服务
  • 安全方向:渗透测试、安全加固、合规审计
  • 开发运维:CI/CD、基础设施即代码

第四阶段:Shell编程与自动化(2-3个月)

4.1 Shell脚本基础

Bash脚本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# 这是一个示例脚本

# 变量定义
name="Linux"
version=5.4
readonly PI=3.14159

# 变量使用
echo "Hello, $name!"
echo "Version: ${version}"
echo "Pi value: $PI"

# 命令替换
current_date=$(date)
user_count=`who | wc -l`
echo "Current date: $current_date"
echo "Logged in users: $user_count"

条件判断与循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

# 条件判断
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
elif [ $1 = "start" ]; then
echo "Starting service..."
else
echo "Unknown command: $1"
fi

# 数值比较
num=10
if [ $num -gt 5 ]; then
echo "Number is greater than 5"
fi

# 文件测试
if [ -f "/etc/passwd" ]; then
echo "Password file exists"
fi

# for循环
for i in {1..5}; do
echo "Count: $i"
done

# while循环
counter=1
while [ $counter -le 3 ]; do
echo "Loop iteration: $counter"
((counter++))
done

# 遍历文件
for file in /etc/*.conf; do
if [ -f "$file" ]; then
echo "Config file: $file"
fi
done

函数与参数处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

# 函数定义
backup_file() {
local source_file=$1
local backup_dir=$2

if [ ! -f "$source_file" ]; then
echo "Error: Source file does not exist"
return 1
fi

if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
fi

cp "$source_file" "$backup_dir/$(basename $source_file).$(date +%Y%m%d)"
echo "Backup completed: $source_file"
}

# 参数处理
while getopts "f:d:h" opt; do
case $opt in
f) source_file="$OPTARG" ;;
d) backup_dir="$OPTARG" ;;
h) echo "Usage: $0 -f <file> -d <directory>"; exit 0 ;;
*) echo "Invalid option"; exit 1 ;;
esac
done

# 调用函数
if [ -n "$source_file" ] && [ -n "$backup_dir" ]; then
backup_file "$source_file" "$backup_dir"
else
echo "Please provide both source file and backup directory"
fi

4.2 系统监控脚本

系统资源监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/bash
# 系统监控脚本

LOG_FILE="/var/log/system_monitor.log"
ALERT_EMAIL="admin@example.com"

# 检查CPU使用率
check_cpu() {
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
cpu_usage=${cpu_usage%.*} # 去除小数部分

if [ $cpu_usage -gt 80 ]; then
echo "$(date): HIGH CPU USAGE: ${cpu_usage}%" >> $LOG_FILE
echo "CPU usage is ${cpu_usage}%" | mail -s "CPU Alert" $ALERT_EMAIL
fi
}

# 检查内存使用率
check_memory() {
mem_usage=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100.0)}')

if [ $mem_usage -gt 85 ]; then
echo "$(date): HIGH MEMORY USAGE: ${mem_usage}%" >> $LOG_FILE
echo "Memory usage is ${mem_usage}%" | mail -s "Memory Alert" $ALERT_EMAIL
fi
}

# 检查磁盘使用率
check_disk() {
df -h | awk 'NR>1 {print $5 " " $6}' | while read usage partition; do
usage_num=${usage%?} # 去除%符号
if [ $usage_num -gt 90 ]; then
echo "$(date): HIGH DISK USAGE: $partition $usage" >> $LOG_FILE
echo "Disk usage on $partition is $usage" | mail -s "Disk Alert" $ALERT_EMAIL
fi
done
}

# 检查服务状态
check_services() {
services=("nginx" "mysql" "ssh")

for service in "${services[@]}"; do
if ! systemctl is-active --quiet $service; then
echo "$(date): SERVICE DOWN: $service" >> $LOG_FILE
echo "Service $service is down" | mail -s "Service Alert" $ALERT_EMAIL
fi
done
}

# 主函数
main() {
echo "$(date): Starting system monitoring..." >> $LOG_FILE
check_cpu
check_memory
check_disk
check_services
echo "$(date): System monitoring completed." >> $LOG_FILE
}

# 执行监控
main

4.3 自动化部署脚本

Web应用部署脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash
# Web应用自动部署脚本

APP_NAME="mywebapp"
APP_DIR="/opt/$APP_NAME"
BACKUP_DIR="/backup/$APP_NAME"
GIT_REPO="https://github.com/user/mywebapp.git"
SERVICE_NAME="$APP_NAME"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
}

error() {
echo -e "${RED}[ERROR]${NC} $1" >&2
}

warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}

# 备份当前版本
backup_current() {
if [ -d "$APP_DIR" ]; then
log "Backing up current version..."
backup_name="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
cp -r "$APP_DIR" "$backup_name"
log "Backup created: $backup_name"
fi
}

# 部署新版本
deploy_app() {
log "Starting deployment..."

# 停止服务
log "Stopping service: $SERVICE_NAME"
sudo systemctl stop $SERVICE_NAME

# 备份当前版本
backup_current

# 拉取最新代码
if [ -d "$APP_DIR/.git" ]; then
log "Updating existing repository..."
cd "$APP_DIR"
git pull origin main
else
log "Cloning repository..."
sudo rm -rf "$APP_DIR"
sudo git clone "$GIT_REPO" "$APP_DIR"
fi

# 安装依赖
log "Installing dependencies..."
cd "$APP_DIR"
if [ -f "requirements.txt" ]; then
pip install -r requirements.txt
elif [ -f "package.json" ]; then
npm install
fi

# 构建应用
if [ -f "build.sh" ]; then
log "Building application..."
bash build.sh
fi

# 设置权限
sudo chown -R www-data:www-data "$APP_DIR"
sudo chmod -R 755 "$APP_DIR"

# 启动服务
log "Starting service: $SERVICE_NAME"
sudo systemctl start $SERVICE_NAME

# 检查服务状态
if systemctl is-active --quiet $SERVICE_NAME; then
log "Deployment successful! Service is running."
else
error "Deployment failed! Service is not running."
return 1
fi
}

# 回滚功能
rollback() {
latest_backup=$(ls -t "$BACKUP_DIR" | head -n1)
if [ -z "$latest_backup" ]; then
error "No backup found for rollback"
return 1
fi

warning "Rolling back to: $latest_backup"
sudo systemctl stop $SERVICE_NAME
sudo rm -rf "$APP_DIR"
sudo cp -r "$BACKUP_DIR/$latest_backup" "$APP_DIR"
sudo systemctl start $SERVICE_NAME
log "Rollback completed"
}

# 主函数
case "$1" in
deploy)
deploy_app
;;
rollback)
rollback
;;
*)
echo "Usage: $0 {deploy|rollback}"
exit 1
;;
esac

第五阶段:高级系统管理(3-4个月)

5.1 性能优化与调优

系统性能分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# CPU性能分析
# 查看CPU使用情况
top -p $(pgrep -d',' process_name) # 监控特定进程
htop # 交互式进程查看器
iotop # I/O监控
vmstat 1 # 虚拟内存统计
mpstat 1 # 多处理器统计

# 内存分析
free -h # 内存使用情况
cat /proc/meminfo # 详细内存信息
pmap -x PID # 进程内存映射
valgrind --tool=memcheck program # 内存泄漏检测

# 磁盘I/O分析
iostat -x 1 # I/O统计
iotop # I/O监控
lsof +D /path # 查看目录下打开的文件
fuser -v /path/file # 查看使用文件的进程

内核参数优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看和修改内核参数
sysctl -a # 查看所有内核参数
sysctl vm.swappiness # 查看特定参数
sudo sysctl vm.swappiness=10 # 临时修改参数

# 永久修改内核参数
sudo vim /etc/sysctl.conf
# 添加以下内容:
# 网络优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 内存管理优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 应用配置
sudo sysctl -p

5.2 日志管理与分析

系统日志管理

1
2
3
4
5
6
7
8
9
10
11
12
13
# Systemd日志管理
journalctl # 查看所有日志
journalctl -u service_name # 查看特定服务日志
journalctl -f # 实时查看日志
journalctl --since "2024-01-01" # 查看指定时间后的日志
journalctl --until "2024-01-31" # 查看指定时间前的日志
journalctl -p err # 查看错误级别日志

# 传统日志文件
tail -f /var/log/syslog # 实时查看系统日志
tail -f /var/log/auth.log # 查看认证日志
tail -f /var/log/nginx/access.log # 查看Nginx访问日志
tail -f /var/log/nginx/error.log # 查看Nginx错误日志

日志分析脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash
# 日志分析脚本

LOG_FILE="/var/log/nginx/access.log"
REPORT_FILE="/tmp/log_analysis_$(date +%Y%m%d).txt"

# 分析访问日志
analyze_access_log() {
echo "=== Nginx Access Log Analysis ===" > $REPORT_FILE
echo "Analysis Date: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 统计总请求数
total_requests=$(wc -l < $LOG_FILE)
echo "Total Requests: $total_requests" >> $REPORT_FILE

# 统计独立IP数
unique_ips=$(awk '{print $1}' $LOG_FILE | sort | uniq | wc -l)
echo "Unique IPs: $unique_ips" >> $REPORT_FILE

# 统计状态码
echo "" >> $REPORT_FILE
echo "Status Code Distribution:" >> $REPORT_FILE
awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -nr >> $REPORT_FILE

# 统计访问最多的IP
echo "" >> $REPORT_FILE
echo "Top 10 IPs:" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE

# 统计访问最多的页面
echo "" >> $REPORT_FILE
echo "Top 10 Pages:" >> $REPORT_FILE
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE

echo "Analysis completed. Report saved to: $REPORT_FILE"
}

# 检查异常访问
check_suspicious_activity() {
echo "" >> $REPORT_FILE
echo "=== Suspicious Activity ===" >> $REPORT_FILE

# 检查404错误
echo "404 Errors:" >> $REPORT_FILE
grep " 404 " $LOG_FILE | awk '{print $1, $7}' | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE

# 检查大量请求的IP
echo "" >> $REPORT_FILE
echo "IPs with >1000 requests:" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | awk '$1 > 1000 {print $2, $1}' >> $REPORT_FILE
}

# 执行分析
analyze_access_log
check_suspicious_activity

# 发送报告邮件(如果配置了邮件)
if command -v mail >/dev/null 2>&1; then
mail -s "Daily Log Analysis Report" admin@example.com < $REPORT_FILE
fi

5.3 备份与恢复策略

自动备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/bin/bash
# 系统备份脚本

BACKUP_ROOT="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

# 备份配置
MYSQL_USER="backup_user"
MYSQL_PASS="backup_password"
BACKUP_DIRS=("/etc" "/home" "/var/www")
EXCLUDE_PATTERNS=("*.tmp" "*.log" "cache/*")

# 创建备份目录
create_backup_dir() {
local backup_type=$1
local backup_dir="$BACKUP_ROOT/$backup_type/$DATE"
mkdir -p "$backup_dir"
echo "$backup_dir"
}

# 系统文件备份
backup_system_files() {
local backup_dir=$(create_backup_dir "system")

for dir in "${BACKUP_DIRS[@]}"; do
if [ -d "$dir" ]; then
echo "Backing up $dir..."
tar_file="$backup_dir/$(basename $dir)_$DATE.tar.gz"

# 构建排除参数
exclude_args=""
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
exclude_args="$exclude_args --exclude=$pattern"
done

tar czf "$tar_file" $exclude_args -C "$(dirname $dir)" "$(basename $dir)"

if [ $? -eq 0 ]; then
echo "Successfully backed up $dir to $tar_file"
else
echo "Failed to backup $dir" >&2
fi
fi
done
}

# 数据库备份
backup_databases() {
local backup_dir=$(create_backup_dir "database")

# MySQL备份
if command -v mysqldump >/dev/null 2>&1; then
echo "Backing up MySQL databases..."
databases=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")

for db in $databases; do
echo "Backing up database: $db"
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --single-transaction --routines --triggers "$db" > "$backup_dir/${db}_$DATE.sql"
gzip "$backup_dir/${db}_$DATE.sql"
done
fi
}

# 清理旧备份
cleanup_old_backups() {
echo "Cleaning up backups older than $RETENTION_DAYS days..."
find "$BACKUP_ROOT" -type f -mtime +$RETENTION_DAYS -delete
find "$BACKUP_ROOT" -type d -empty -delete
}

# 备份验证
verify_backup() {
local backup_dir=$1
local total_files=$(find "$backup_dir" -type f | wc -l)
local total_size=$(du -sh "$backup_dir" | cut -f1)

echo "Backup verification:"
echo " Location: $backup_dir"
echo " Files: $total_files"
echo " Size: $total_size"

# 检查备份文件完整性
find "$backup_dir" -name "*.tar.gz" -exec tar -tzf {} >/dev/null \; -print
}

# 主备份流程
main() {
echo "Starting backup process at $(date)"

backup_system_files
backup_databases

# 验证最新备份
latest_backup=$(find "$BACKUP_ROOT" -maxdepth 2 -type d -name "*$DATE*" | head -1)
if [ -n "$latest_backup" ]; then
verify_backup "$latest_backup"
fi

cleanup_old_backups

echo "Backup process completed at $(date)"
}

# 执行备份
main 2>&1 | tee "/var/log/backup_$DATE.log"

第六阶段:容器化与云原生(3-4个月)

6.1 Docker容器技术

Docker基础操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Docker安装(Ubuntu)
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce

# 基本Docker命令
docker --version # 查看Docker版本
sudo systemctl start docker # 启动Docker服务
sudo systemctl enable docker # 设置开机自启
sudo usermod -aG docker $USER # 将用户添加到docker组

# 镜像管理
docker images # 列出本地镜像
docker pull ubuntu:20.04 # 拉取镜像
docker build -t myapp:latest . # 构建镜像
docker rmi image_id # 删除镜像

# 容器管理
docker run -it ubuntu:20.04 bash # 交互式运行容器
docker run -d -p 80:80 nginx # 后台运行容器并映射端口
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器
docker stop container_id # 停止容器
docker rm container_id # 删除容器

Dockerfile编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 示例Dockerfile
FROM ubuntu:20.04

# 设置维护者信息
LABEL maintainer="admin@example.com"

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive
ENV APP_HOME=/app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
nginx \
&& rm -rf /var/lib/apt/lists/*

# 创建应用目录
WORKDIR $APP_HOME

# 复制应用文件
COPY requirements.txt .
COPY app/ ./app/
COPY nginx.conf /etc/nginx/nginx.conf

# 安装Python依赖
RUN pip3 install -r requirements.txt

# 创建非root用户
RUN useradd -m -u 1000 appuser && chown -R appuser:appuser $APP_HOME
USER appuser

# 暴露端口
EXPOSE 8000

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1

# 启动命令
CMD ["python3", "app/main.py"]

Docker Compose配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# docker-compose.yml
version: '3.8'

services:
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
depends_on:
- db
- redis
volumes:
- ./app:/app
- static_volume:/app/static
networks:
- app-network
restart: unless-stopped

db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network
restart: unless-stopped

redis:
image: redis:6-alpine
networks:
- app-network
restart: unless-stopped

nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- static_volume:/static
- ./ssl:/etc/nginx/ssl
depends_on:
- web
networks:
- app-network
restart: unless-stopped

volumes:
postgres_data:
static_volume:

networks:
app-network:
driver: bridge

6.2 Kubernetes基础

Kubernetes集群搭建(使用kubeadm)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装Docker和Kubernetes组件
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker

# 安装kubeadm, kubelet, kubectl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# 初始化集群(在主节点执行)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 安装网络插件(Flannel)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Kubernetes资源配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: myapp:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: app-secrets
key: database-url
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 5

---
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: LoadBalancer

---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
database-url: cG9zdGdyZXNxbDovL3VzZXI6cGFzc3dvcmRAZGI6NTQzMi9teWFwcA==

学习资源与认证

官方文档与资源

推荐书籍

  1. 《鸟哥的Linux私房菜》:Linux入门经典
  2. 《Linux系统管理技术手册》:系统管理权威指南
  3. 《Linux性能优化实战》:性能调优专业指导
  4. 《Docker技术入门与实战》:容器技术学习
  5. 《Kubernetes权威指南》:K8s学习必备

在线课程平台

专业认证

  • LPIC (Linux Professional Institute Certification)
  • RHCSA/RHCE (Red Hat Certified System Administrator/Engineer)
  • CompTIA Linux+
  • SUSE Certified Administrator
  • CKA (Certified Kubernetes Administrator)

实践环境

  • VirtualBox/VMware: 本地虚拟化环境
  • AWS/Azure/GCP: 云服务器实践
  • Docker Desktop: 容器化学习环境
  • Vagrant: 开发环境管理
  • GitHub Codespaces: 云端开发环境

职业发展路径

Linux运维工程师(0-2年)

  • 掌握Linux基础操作和系统管理
  • 熟悉Shell脚本编程
  • 了解网络配置和安全基础
  • 能够处理常见系统问题

高级运维工程师(2-5年)

  • 精通系统性能优化和故障排查
  • 掌握自动化运维工具
  • 熟悉容器技术和云平台
  • 具备架构设计能力

运维架构师/DevOps工程师(5年以上)

  • 设计和实施大规模基础设施
  • 推动DevOps文化和实践
  • 掌握云原生技术栈
  • 具备团队管理和技术决策能力

技术专家/平台工程师

  • 深入理解Linux内核和系统原理
  • 开发运维平台和工具
  • 制定技术标准和最佳实践
  • 推动技术创新和发展

总结

Linux学习是一个循序渐进的过程,需要大量的实践和积累。通过系统化的学习路线,从基础命令到高级系统管理,从网络配置到安全防护,从Shell编程到容器化技术,你将逐步掌握Linux的核心技能。

学习要点回顾

  1. 扎实的基础:命令行操作和系统概念是根本
  2. 实践导向:通过项目和实际问题来学习
  3. 自动化思维:用脚本和工具提高效率
  4. 持续学习:技术发展迅速,需要不断更新知识
  5. 社区参与:参与开源项目和技术社区

成功的关键

  • 动手实践:理论必须结合实际操作
  • 问题导向:通过解决实际问题来学习
  • 系统思维:理解各个组件之间的关系
  • 安全意识:始终考虑安全因素
  • 文档习惯:记录和分享学习经验

记住,Linux的精髓在于”一切皆文件”的设计哲学和强大的命令行工具。保持好奇心,多动手实践,善于利用文档和社区资源,你一定能够成为Linux领域的专家!

愿你在Linux的世界中探索无限可能!🐧