前言:为什么2026年Linux运维依然是香饽饽?
很多人觉得现在流行Serverless、容器化、Kubernetes,Linux运维是不是不吃香了?恰恰相反——越是大规模的应用,越是离不开Linux服务器。
我认识一个在二线城市工作的运维工程师朋友,去年跳槽到一家中型互联网公司,年薪从15万涨到了28万。他说现在招人特别难,真正懂Linux、能把系统跑稳的人太少了。很多候选人简历上写着”熟悉Linux”,结果连基本的日志分析、进程排查都不会。
这不是个例。根据2026年各大招聘平台的数据,Linux运维工程师依然是需求最大的技术岗位之一,平均薪资比同级别开发岗还要高15%-20%。
今天就和大家聊聊,怎么从零开始学习Linux运维,以及这条路上有哪些坑需要避开。

一、Linux运维到底是什么?
很多人对运维的理解还停留在”重装系统”、”装软件”的层面。实际上,现代Linux运维要做的事情远不止这些:
初级运维:保障服务器稳定运行,包括系统部署、日常巡检、故障处理、性能监控。
中级运维:自动化运维、CI/CD流程搭建、数据库管理、安全加固。
高级运维/DevOps:架构设计、容器化改造、Kubernetes集群管理、SRE实践。
简单来说,运维的核心职责是让系统稳如老狗,进而在稳的基础上不断提升效率和成本优化。
二、学习路线总览(12个月规划)
| 阶段 | 时间 | 核心技能 | 目标岗位 |
|---|---|---|---|
| 基础入门 | 1-2个月 | Linux系统操作、命令行基础 | 桌面运维、技术支持 |
| 网络管理 | 3-4个月 | 网络配置、服务部署、安全防护 | 初级运维工程师 |
| 系统管理 | 5-6个月 | Shell编程、性能调优、监控告警 | 中级运维工程师 |
| 集群架构 | 7-8个月 | 高可用集群、负载均衡、存储管理 | 高级运维工程师 |
| 自动化运维 | 9-10个月 | Ansible、Terraform、IaC实践 | DevOps工程师 |
| 云原生进阶 | 11-12个月 | Docker、Kubernetes、云平台 | 云计算工程师 |
三、第一阶段:Linux基础入门(1-2个月)
3.1 选择你的第一个Linux发行版
对于初学者,我推荐从Ubuntu或Rocky Linux开始:
- Ubuntu:桌面友好,软件包丰富,社区活跃,遇到问题容易找到解决方案
- Rocky Linux:企业级CentOS替代,稳定性强,适合以后工作环境
安装方式建议使用虚拟机:
bash
# 安装VirtualBox或使用云服务器
# 推荐云服务器:阿里云、腾讯云新用户首月9.9元
# 推荐虚拟机:VirtualBox、VMware Workstation
3.2 Linux核心概念:先理解再动手
Linux的哲学思想:
- 一切皆文件:硬件设备、进程、网络连接,在Linux里都是文件
- 小工具组合:每个命令只做一件事,通过管道组合完成复杂任务
- 配置在文本:配置文件都是纯文本,方便版本管理和批量修改
必须记住的目录结构:
bash
/ # 根目录,所有文件的顶级父目录
├── /home # 普通用户主目录(你的代码、项目一般放这里)
├── /root # 超级管理员(root)主目录
├── /etc # 系统配置文件(SSH、防火墙、软件配置)
├── /var # 动态文件目录(日志、数据库文件)
├── /usr # 系统软件安装目录
├── /tmp # 临时文件目录(重启后清空)
├── /opt # 第三方软件目录(手动安装的MySQL、Tomcat等)
└── /dev # 设备文件目录
重要原则:
- 普通用户操作优先在
/home目录下 - 禁止随意修改
/etc和/root目录 - 危险命令要三思:
rm -rf /、dd if=/dev/zero of=/dev/sda
3.3 命令行基础:每天都在用的技能
文件和目录操作
bash
# 切换目录
cd /home/ubuntu/projects
# 查看当前目录
pwd
# 列出文件
ls -la # -l详细信息,-a显示隐藏文件
ls -lh # -h人性化显示大小(KB/MB/GB)
# 创建目录
mkdir projects
mkdir -p /path/to/deep/directory # -p递归创建
# 复制文件
cp source.txt /backup/
cp -r source_folder/ /backup/ # -r递归复制目录
# 移动/重命名
mv oldname.txt newname.txt
mv file.txt /new/location/
# 删除(慎用!)
rm file.txt # 删除单个文件
rm -r folder/ # 删除目录
rm -rf /dangerous # 强制删除(永久!无法恢复!)
文本处理工具链
这是运维的核心技能,必须熟练掌握:
bash
# 查看文件
cat file.txt # 一次性显示全部内容
head -n 20 file.txt # 显示前20行
tail -n 100 file.txt # 显示后100行
tail -f /var/log/nginx/access.log # 实时追踪日志
# 文本搜索
grep "error" /var/log/syslog # 搜索包含error的行
grep -r "failed" /var/log/ # -r递归搜索目录
grep -i "warning" file.txt # -i忽略大小写
grep -n "keyword" file.txt # -n显示行号
# 高级文本处理
sed -i 's/old_string/new_string/g' file.txt # 替换文本
awk '{print $1, $3}' file.txt # 提取第1、3列
find /var/log -name "*.log" -mtime -7 # 查找最近7天修改的日志
用户和权限管理
bash
# 添加用户
sudo useradd -m -s /bin/bash username
sudo passwd username
# 切换用户
su - username # 切换并加载环境变量
# 文件权限
chmod 755 file.sh # 755 = rwxr-xr-x(所有者可执行)
chmod +x script.sh # 添加执行权限
chown user:group file.txt # 修改所有者
进程管理
bash
# 查看进程
ps aux # 查看所有进程
ps -ef | grep nginx # 查找nginx进程
top # 动态查看(按q退出)
htop # 更好用的top(需安装)
# 管理进程
kill 1234 # 终止PID为1234的进程
kill -9 1234 # 强制终止
killall nginx # 按名称终止所有nginx进程
# 后台运行
./long_running_script.sh & # 后台运行
nohup ./script.sh & # 持久后台运行(关掉终端也继续)
systemd服务管理
现代Linux系统都用systemd管理服务:
bash
# 基本操作
sudo systemctl start nginx # 启动服务
sudo systemctl stop nginx # 停止服务
sudo systemctl restart nginx # 重启服务
sudo systemctl status nginx # 查看状态
# 开机自启
sudo systemctl enable nginx # 开机自启
sudo systemctl disable nginx # 禁止开机自启
sudo systemctl is-enabled nginx # 检查是否自启
# 查看日志
sudo journalctl -u nginx # 查看nginx日志
sudo journalctl -u nginx -f # 实时追踪
sudo journalctl --since "1 hour ago" # 查看最近1小时日志
3.4 实战练习:搭建LNMP环境
学完上面的命令,来个实战:搭建一个LNMP(Linux + Nginx + MySQL + PHP)网站环境。
bash
# 1. 安装Nginx
sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
# 2. 安装MySQL
sudo apt install mysql-server -y
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation # 安全配置
# 3. 安装PHP
sudo apt install php-fpm php-mysql -y
sudo systemctl start php8.1-fpm
# 4. 配置Nginx支持PHP
sudo vim /etc/nginx/sites-available/default
Nginx配置示例:
nginx
server {
listen 80;
server_name your_domain.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
}
bash
# 5. 测试配置并重载
sudo nginx -t
sudo systemctl reload nginx
# 6. 创建测试页面
sudo sh -c 'echo "<?php phpinfo(); ?>" > /var/www/html/info.php'
# 7. 访问 http://your_server_ip/info.php 验证
四、第二阶段:Linux网络管理(3-4个月)
4.1 网络基础回顾
作为运维,你需要清楚理解:
- IP地址:设备的网络标识(IPv4 vs IPv6)
- 子网掩码:划分网络大小(如255.255.255.0)
- 默认网关:访问外网的出口
- DNS:域名解析服务器
bash
# 查看网络信息
ip addr show
ip route show
cat /etc/resolv.conf
# 测试网络连通性
ping -c 4 8.8.8.8 # 测试到Google DNS
ping -c 4 baidu.com # 测试DNS解析
traceroute baidu.com # 路由追踪
mtr baidu.com # ping+traceroute组合
4.2 配置静态IP
bash
# Ubuntu/Debian (netplan方式)
sudo vim /etc/netplan/00-installer-config.yaml
yaml
network:
version: 2
ethernets:
ens33:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
bash
sudo netplan apply
4.3 SSH服务深度配置
SSH是运维最重要的工具,必须熟练掌握:
bash
# 基本连接
ssh username@server_ip
ssh -p 2222 username@server_ip # 指定端口
# SSH密钥登录(安全又方便)
ssh-keygen -t ed25519 -C "your_email"
ssh-copy-id username@server_ip # 自动上传公钥
# SSH配置优化
sudo vim /etc/ssh/sshd_config
sshd_config优化配置:
bash
# 禁止root登录
PermitRootLogin no
# 仅允许密钥登录
PasswordAuthentication no
PubkeyAuthentication yes
# 修改默认端口(安全加固)
Port 2222
# 限制用户登录
AllowUsers ubuntu deploy
# 连接超时设置
ClientAliveInterval 300
ClientAliveCountMax 2
4.4 防火墙配置
bash
# Ubuntu使用ufw
sudo ufw enable # 启用防火墙
sudo ufw allow 22/tcp # 允许SSH
sudo ufw allow 80/tcp # 允许HTTP
sudo ufw allow 443/tcp # 允许HTTPS
sudo ufw deny 3306 # 禁止MySQL端口
sudo ufw status # 查看状态
# CentOS/RHEL使用firewalld
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
五、第三阶段:Shell脚本与自动化(5-6个月)
5.1 为什么运维必须学Shell?
运维的日常工作充满了重复性操作:备份日志、监控状态、批量部署……手动做既低效又容易出错。Shell脚本就是把重复的事情自动化。
5.2 Shell基础语法
变量和字符串
bash
#!/bin/bash
# 定义变量(=号两边不能有空格)
name="Linux运维"
version=1.0
# 使用变量
echo "欢迎学习 ${name}"
echo "当前版本: $version"
# 获取命令输出
current_date=$(date +%Y%m%d)
hostname=$(hostname)
echo "今天日期: $current_date"
echo "主机名: $hostname"
# 接收用户输入
echo "请输入您的名字:"
read username
echo "您好,$username"
条件判断
bash
#!/bin/bash
age=25
# 数值比较:-eq等于、-ne不等于、-gt大于、-lt小于、-ge大于等于、-le小于等于
if [ $age -ge 18 ]; then
echo "已成年"
elif [ $age -ge 13 ]; then
echo "青少年"
else
echo "未成年"
fi
# 字符串比较:=等于、!=不等于、-z空字符串
name="admin"
if [ "$name" = "admin" ]; then
echo "管理员登录"
fi
# 文件测试:-f文件存在、-d目录存在、-r可读、-w可写、-x可执行
if [ -f "/etc/passwd" ]; then
echo "passwd文件存在"
fi
循环
bash
#!/bin/bash
# for循环:遍历列表
for i in 1 2 3 4 5; do
echo "第 $i 次"
done
# for循环:遍历文件
for file in /var/log/*.log; do
echo "处理: $file"
done
# while循环
count=1
while [ $count -le 5 ]; do
echo "计数: $count"
count=$((count + 1))
done
# 读取文件每一行
cat /etc/hosts | while read line; do
echo "行内容: $line"
done
5.3 实战脚本:系统巡检脚本
bash
#!/bin/bash
# 系统巡检脚本 v1.0
# 用途:定期检查服务器健康状态
DATE=$(date +%Y%m%d_%H%M%S)
LOG_DIR="/var/log/health_check"
REPORT="$LOG_DIR/report_${DATE}.txt"
# 确保日志目录存在
mkdir -p $LOG_DIR
# 写入报告头部
echo "=====================================" > $REPORT
echo "系统巡检报告" >> $REPORT
echo "检查时间: $(date)" >> $REPORT
echo "主机名: $(hostname)" >> $REPORT
echo "=====================================" >> $REPORT
echo "" >> $REPORT
# 1. 系统基本信息
echo "【系统信息】" >> $REPORT
uname -a >> $REPORT
echo "" >> $REPORT
# 2. CPU使用率
echo "【CPU使用率】" >> $REPORT
top -bn1 | grep "Cpu(s)" >> $REPORT
echo "" >> $REPORT
# 3. 内存使用情况
echo "【内存使用情况】" >> $REPORT
free -h >> $REPORT
echo "" >> $REPORT
# 4. 磁盘使用情况
echo "【磁盘使用情况】" >> $REPORT
df -h | grep -v tmpfs >> $REPORT
echo "" >> $REPORT
# 5. 网络连接状态
echo "【网络连接统计】" >> $REPORT
echo "TCP连接数: $(netstat -an | grep tcp | wc -l)" >> $REPORT
echo "ESTABLISHED连接: $(netstat -an | grep ESTABLISHED | wc -l)" >> $REPORT
echo "" >> $REPORT
# 6. TOP 10进程
echo "【TOP 10 CPU进程】" >> $REPORT
ps aux --sort=-%cpu | head -11 >> $REPORT
echo "" >> $REPORT
# 7. 错误日志检查
echo "【最近错误日志】" >> $REPORT
journalctl -p err --since "1 day ago" | tail -20 >> $REPORT
# 8. 检查告警
echo "" >> $REPORT
echo "【告警检查】" >> $REPORT
# CPU告警
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$cpu_usage > 80" | bc -l) )); then
echo "⚠️ CPU使用率超过80%: ${cpu_usage}%" >> $REPORT
fi
# 磁盘告警
disk_usage=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
if [ "$disk_usage" -gt 80 ]; then
echo "⚠️ 磁盘使用率超过80%: ${disk_usage}%" >> $REPORT
fi
# 内存告警
mem_usage=$(free | grep Mem | awk '{print int($3/$2 * 100)}')
if [ "$mem_usage" -gt 80 ]; then
echo "⚠️ 内存使用率超过80%: ${mem_usage}%" >> $REPORT
fi
echo "" >> $REPORT
echo "=====================================" >> $REPORT
echo "巡检完成" >> $REPORT
# 屏幕输出并保存日志
cat $REPORT
echo "报告已保存至: $REPORT"
# 发送邮件告警(可选)
if grep -q "⚠️" $REPORT; then
echo "检测到告警,请查看报告"
# mail -s "服务器告警: $(hostname)" admin@example.com < $REPORT
fi
5.4 定时任务crontab
bash
# 编辑定时任务
crontab -e
# 格式:分 时 日 月 周 命令
# 示例:
# 每分钟执行一次
* * * * * /path/to/script.sh
# 每天凌晨2点执行
0 2 * * * /path/to/backup.sh
# 每周日凌晨3点执行
0 3 * * 0 /path/to/cleanup.sh
# 每月1日凌晨4点执行
0 4 1 * * /path/to/monthly_report.sh
# 每5分钟执行一次
*/5 * * * * /usr/local/bin/health_check.sh
六、第四阶段:服务器集群与高可用(7-8个月)
6.1 负载均衡:让流量均匀分布
bash
# Nginx负载均衡配置
upstream backend {
server 192.168.1.10:80 weight=5;
server 192.168.1.11:80 weight=3;
server 192.168.1.12:80 backup;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6.2 Keepalived高可用
两台服务器实现VIP漂移,主服务器故障时自动切换到从服务器:
bash
# 安装
sudo apt install keepalived -y
# 主服务器配置
sudo vim /etc/keepalived/keepalived.conf
conf
vrrp_instance VI_1 {
state MASTER # 从服务器设为BACKUP
interface ens33 # 网卡名称
virtual_router_id 51
priority 100 # 从服务器设为90
advert_int 1
virtual_ipaddress {
192.168.1.100 # 虚拟IP
}
track_script {
chk_nginx # 健康检查脚本
}
}
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx"
interval 2
weight -5
}
七、第五阶段:自动化运维Ansible(9-10个月)
7.1 Ansible入门
Ansible是运维自动化的神器,它通过SSH连接目标机器,不需要在远程机器安装代理:
bash
# 安装
sudo apt install ansible -y
# 配置主机清单
sudo vim /etc/ansible/hosts
ini
[webservers]
192.168.1.10
192.168.1.11
192.168.1.12
[dbservers]
192.168.1.20
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=/home/ubuntu/.ssh/id_rsa
7.2 Ad-hoc命令:快速执行单个任务
bash
# 测试连通性
ansible all -m ping
# 在所有web服务器上安装nginx
ansible webservers -m apt -a "name=nginx state=present"
# 在所有服务器上执行shell命令
ansible all -m shell -a "df -h | grep '/$'"
# 复制文件
ansible webservers -m copy -a "src=/local/file.txt dest=/remote/file.txt"
7.3 Playbook:编写可复用的自动化任务
yaml
# deploy_webapp.yml
---
- name: Deploy Web Application
hosts: webservers
become: yes
vars:
app_version: "2.1.0"
app_path: "/var/www/myapp"
tasks:
- name: Install required packages
apt:
name:
- nginx
- python3
- python3-pip
state: present
update_cache: yes
- name: Create application directory
file:
path: "{{ app_path }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Deploy application files
git:
repo: "https://github.com/company/webapp.git"
version: "v{{ app_version }}"
dest: "{{ app_path }}"
- name: Install Python dependencies
pip:
requirements: "{{ app_path }}/requirements.txt"
virtualenv: "{{ app_path }}/venv"
- name: Configure Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/myapp
notify: Reload Nginx
- name: Enable Nginx site
file:
src: /etc/nginx/sites-available/myapp
dest: /etc/nginx/sites-enabled/myapp
state: link
notify: Reload Nginx
- name: Restart application
systemd:
name: myapp
state: restarted
daemon_reload: yes
- name: Check application health
uri:
url: "http://localhost/health"
status_code: 200
register: health_check
- name: Fail deployment if health check fails
fail:
msg: "Application health check failed!"
when: health_check.status != 200
handlers:
- name: Reload Nginx
systemd:
name: nginx
state: reloaded
- name: Restart Nginx
systemd:
name: nginx
state: restarted
执行Playbook:
bash
# 完整执行
ansible-playbook deploy_webapp.yml
# 模拟执行(不实际操作)
ansible-playbook deploy_webapp.yml --check
# 指定标签执行
ansible-playbook deploy_webapp.yml --tags "nginx,config"
# 指定主机执行
ansible-playbook deploy_webapp.yml --limit "192.168.1.10"
八、总结与职业建议
8.1 学习路线总结
| 阶段 | 核心技能 | 学习资源 |
|---|---|---|
| 基础入门 | Linux命令、文件系统、用户权限 | 《鸟哥的Linux私房菜》、实验楼 |
| 网络管理 | SSH、防火墙、网络配置 | 阿里云ACP认证课程 |
| Shell编程 | 脚本编写、定时任务、文本处理 | 博客园/Linuxpig系列教程 |
| 集群架构 | 负载均衡、高可用、存储管理 | 马哥Linux视频课程 |
| 自动化运维 | Ansible、Terraform、CI/CD | Red Hat官方文档 |
| 云原生 | Docker、Kubernetes、云平台 | Kubernetes权威指南 |
8.2 实战建议
- 搭建实验环境:用虚拟机或云服务器搭建自己的实验环境,边学边练
- 参与开源项目:给Ansible角色、Kubernetes Operator贡献代码
- 考取认证:RHCE(红帽认证工程师)、阿里云ACP、AWS Solutions Architect
- 建立博客:把踩坑经历和学习心得写下来,既巩固知识又积累作品
8.3 薪资参考(2026年数据)
| 级别 | 城市 | 月薪范围 | 年薪范围 |
|---|---|---|---|
| 初级运维 | 二线 | 6-10K | 8-15万 |
| 中级运维 | 一线 | 12-20K | 15-30万 |
| 高级/DevOps | 一线 | 20-35K | 25-50万 |
| SRE/平台工程师 | 一线大厂 | 35-60K | 50-80万 |

发表回复