
1. 先搭实验台虚拟机安装与基础命令热身1.1 系统选型与虚拟机安装实操做linux综合练习我建议选一台干净的虚拟机而不是直接在生产服务器上折腾。原因很简单综合练习必然要反复安装软件、改网络配置、调整内核参数一次操作失误可能导致整台服务器环境崩掉。虚拟机能随时拍快照练坏了三秒钟回滚这才是练习该有的底气。系统选型方面很多人纠结用哪个发行版。我的建议是首选Rocky Linux因为它是CentOS停更之后企业级服务器的主流替代品很多公司的生产环境都迁移到了Rocky或者AlmaLinux。你如果用Rocky练熟了去公司接手服务器不会觉得陌生如果想兼顾Ubuntu生态可以在虚拟机里再装一个Ubuntu Server做对比两台虚拟机互通一下网络顺带练练跨主机操作。虚拟机软件用VirtualBox就够开源免费跨平台。安装时注意几个关键点内存建议分配4GB以上磁盘至少40GB因为后面要装Docker、MySQL、Python编译环境空间小了很容易尴尬。网络模式先用NAT等系统装好之后再添加一块Host-Only网卡这样既能联网下载软件包又能从宿主机SSH进虚拟机模拟真实服务器的工作方式。安装前关闭Windows的Hyper-V和内核隔离功能否则虚拟机启动容易蓝屏或者性能异常。装完系统第一件事是创建快照名字就叫刚装好的纯净系统。后面不管练到什么程度只要思路混乱立刻就能回到起点重新开始。这个习惯我用了很多年帮我在练习阶段省下大量重装系统的时间。1.2 第一天必须过一遍的命令簇基础命令不建议死记硬背而是按一组任务对应一组命令的方式去记。我习惯把常用命令分成四组每组练到形成肌肉记忆为止。第一组是文件与目录操作。ls、cd、pwd、mkdir、touch、cp、mv、rm这些是基本功很多人觉得简单就跳过实际上一到真实场景就露馅。比如cp -a和cp -r有本质区别-a会保留权限、时间戳和链接属性备份配置目录时必须用-arm -rf后面一旦跟了变量管道符多一个空格都可能把系统目录删掉。我的习惯是删除操作前先ls确认路径再执行删除绝不在疲劳状态下敲高危命令。第二组是权限相关。chmod、chown、umask、ls -l配合起来可以完成绝大多数权限管理场景。有一个细节很容易踩坑chown user:group file中间的冒号可以用点代替但脚本里最好统一用冒号因为点号方式在不同shell下可能被解析成当前目录连接符。第三组是网络排查。ip addr、ping、ss -lntp、traceroute、dig是服务器日常排障的核心工具。现在很多书还在教ifconfig和netstat但这两者已经不是默认安装的网络工具包了iproute2才是正统。练习时可以直接把ifconfig忘掉全部改用ip命令避免到新环境里一脸茫然。第四组是进程与性能。ps、top、free、df、du负责看系统和进程状态kill负责处理失控进程。ps aux --sort-%cpu可以按CPU占用排序这是定位高负载进程最快的姿势。free -h用人类可读方式显示内存df -hT则能看出文件系统类型不同类型文件系统的排查思路完全不同。1.3 用户、组与sudo权限别再用root裸奔综合练习里有一个必须养成的习惯日常操作一律用普通用户只有真正需要提权时才用sudo。这不只是安全习惯也是面试常考的运维规范。创建用户的完整流程是这样# 创建用户并指定家目录和登录shell useradd -m -d /home/devops -s /bin/bash devops # 设置密码 passwd devops # 加入sudo组 usermod -aG wheel devops # 创建用户组并指定主要组 groupadd ops usermod -g ops devops # 查看用户信息 id devops这里有个细节值得解释-m参数会自动创建家目录如果忘记加用户登录后连~都是空的很多新手在这里卡半天。而-s /bin/bash指定shell有些系统默认shell是/bin/sh交互体验差很多。sudo权限的文件在/etc/sudoers里管理注意不要直接编辑而是用visudo命令打开。最常用的配置是允许某个组使用全部命令%wheel ALL(ALL) ALL如果只想允许某个用户执行特定命令比如重启服务可以写成devops ALL(root) /usr/bin/systemctl restart *这种细粒度授权在生产环境里非常实用既能放权又不至于失控。练习时重点体会权限最小化原则每次提权前先想清楚这条命令真的需要root权限吗关于用户管理的经验补充批量创建用户时可以用newusers加chpasswd组合把用户信息写到文本文件里导入。这在准备练习考试或者初始化测试环境时特别高效比逐个useradd快得多。2. 文件目录规划与文本处理能力训练2.1 目录规范设计与软链接技巧Linux的文件目录结构本身就是一门学问。综合练习时我建议按一个真实项目的标准来规划目录比如要准备一套运维工具集就按照下面这个结构组织/apps # 应用安装目录按应用分文件夹 /apps/mysql # MySQL的数据目录与配置文件 /apps/nginx # Nginx程序目录 /opt/scripts # 运维脚本集中地 /opt/logs # 日志文件存放处 /data/backup # 备份文件 /data/tmp # 临时文件目录规划好之后软链接就派上用场了。软链接可以解决程序要求固定路径但实际数据要放大数据盘的矛盾。比如MySQL安装在系统盘数据目录默认在/var/lib/mysql但数据盘挂在/data下此时不需要重新安装MySQL直接把数据目录迁移过去再用软链接指回来# 停止MySQL服务 systemctl stop mysql # 迁移数据目录 mv /var/lib/mysql /data/mysql # 创建软链接 ln -s /data/mysql /var/lib/mysql # 启动服务 systemctl start mysql这个操作我几乎每次装机都要用。注意ln -s后面第一个参数是目标第二个是链接名千万别写反。写反的后果是链接指向错误服务启动时报找不到目录排查起来比较让人抓狂。还有一点经验脚本里创建软链接时一定要先rm -rf旧链接否则重复执行脚本会报File exists。也可以加-f参数强制覆盖。命令行上敲一次两次无所谓但放到脚本里就要刻进习惯里。2.2 grep、awk、sed三件套实战文本处理能力是Linux综合练习的重头戏也是面试题和日常工作最容易考察的部分。grep负责筛选awk负责按列处理sed负责按行替换三者配合起来能完成绝大多数日志分析任务。先看grep的实战姿势。日志分析最常见的需求是在错误日志里找关键字并统计次数# 查找error关键字不区分大小写显示行号 grep -in error /var/log/messages # 递归查找某个目录下包含指定内容的文件 grep -ri timeout /apps/nginx/conf/ # 排除注释和无用行查看有效配置 grep -v ^# /etc/nginx/nginx.conf | grep -v ^$awk的用法需要重点练习它是运维脚本里的核心武器。看几个高频场景# 查看系统所有用户名和UID awk -F: {print $1, $3} /etc/passwd # 统计nginx访问日志里每个IP的访问次数 awk {print $1} /var/log/nginx/access.log | sort | uniq -c | sort -rn | head # 找出访问量最大的前10个URL awk {print $7} /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10sed则擅长批量替换和按行操作# 把配置文件里的8888端口全部改成80端口 sed -i s/8888/80/g /etc/nginx/nginx.conf # 删除第10到20行 sed -i 10,20d file.txt # 在第1行前插入内容 sed -i 1i # This is a comment file.txt要注意sed的-i参数是直接改文件内容不会输出到屏幕。练习时建议先不加-i而是把替换结果输出到终端检查一遍确认无误后再加-i执行。这个习惯能避免很多配置文件被改坏但不知道改了什么的悲剧。2.3 查找、统计与压缩备份文件查找是另一项高频刚需。find命令的灵活度极高但也容易被滥用。我的习惯是先想清楚条件再写命令并且尽量缩小搜索范围# 查找7天前修改过的日志文件 find /opt/logs -name *.log -mtime 7 # 查找大于500MB的大文件 find /data -type f -size 500M # 查找并直接删除历史备份 find /data/backup -name *.tar.gz -mtime 30 -exec rm -f {} \;-exec参数是find的灵魂它能把查找和处理串联起来。但注意里面{} \;的写法-exec要求每个操作必须以;结尾而这个分号在bash里是特殊字符必须用\;转义。在脚本里写这个命令时我经常忘记转义结果命令执行报语法错误。压缩备份方面tar是绝对主角。综合练习至少要熟练掌握三种场景# 打包并压缩整个目录 tar -czvf /data/backup/scripts_$(date %Y%m%d).tar.gz /opt/scripts/ # 查看压缩包内容但不解压 tar -tzvf /data/backup/scripts_20250101.tar.gz # 解压到指定目录 tar -xzvf /data/backup/scripts_20250101.tar.gz -C /tmp/文件名里的$(date %Y%m%d)是动态生成日期标记的习惯这样每次备份的文件名都不同不用手动改名。我一般在备份时会再加个时间戳格式类似scripts_20250101_1430.tar.gz每天不会重名清理时也方便按日期关键字匹配。3. 软件部署Docker、MySQL、JDK与Python3.1 用仓库方式装好Docker并配置镜像加速综合练习里最常被问到的软件部署技能一定绕不开Docker。我见过很多人直接curl安装脚本一把梭这种方式虽然快但可复现性差。正规做法是走官方仓库安装。Rocky Linux上安装Docker的完整流程# 安装依赖包 sudo dnf install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker sudo dnf install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl enable --now docker # 验证 sudo docker version这里有个关键点docker version能显示Client和Server两段信息如果Server段报错说明Docker服务没起来或者当前用户无权访问socket。如果不想每条命令都加sudo可以把自己加入docker用户组sudo usermod -aG docker $USER # 重新登录生效Docker默认从国外镜像仓库拉取镜像国内环境体验比较差。配置镜像加速器是当下很值得掌握的技能。新版本的Docker使用daemon.json文件{ registry-mirrors: [https://docker.m.daocloud.io] }修改后重启daemonsudo systemctl daemon-reload sudo systemctl restart docker然后拉取一个nginx镜像测试docker pull nginx:stable-alpine docker run -d -p 8080:80 --name web-demo nginx:stable-alpine用浏览器访问http://localhost:8080如果能看到nginx欢迎页说明Docker环境已经通了。这一步是后面所有容器化练习的地基。3.2 在容器里跑MySQL并做好数据持久化MySQL要么直接装系统服务要么用容器跑。综合练习阶段我更推荐容器方式因为它在数据持久化、日志查看、版本切换上都有明显优势。在Docker里跑MySQL的典型命令docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDMyStrongPass1 \ -e MYSQL_DATABASEtestdb \ -v /data/mysql:/var/lib/mysql \ --restartunless-stopped \ mysql:8.0参数逐个解释-d是后台运行--name是容器名-p把容器内3306映射到宿主机3306端口-e是环境变量这里设置root密码和初始数据库-v /data/mysql:/var/lib/mysql是把容器数据目录挂载到宿主机这是最关键的一项否则容器删除后数据全部丢失--restartunless-stopped让Docker在系统重启后自动拉起这个容器。容器启动后进入MySQL验证docker exec -it mysql8 mysql -uroot -p在MySQL命令行里执行show databases;能看到初始化的数据。这里有个常见坑刚启动的容器可能要等几十秒才能真正接受连接因为MySQL首次初始化需要时间。很多人第一次执行docker exec报错就以为装失败了其实只是还没就绪。可以加一个循环等待for i in {1..30}; do docker exec mysql8 mysqladmin ping -uroot -p$MYSQL_ROOT_PASSWORD --silent break sleep 2 done关于数据持久化的经验一定要把MySQL的数据目录挂到宿主机独立挂载点比如/data/mysql。数据库是日志型写入对磁盘I/O要求高独立挂载点好处是隔离、性能可控、备份方便。我准备备份时直接对/data/mysql目录做tar包拷贝完全不依赖容器状态。3.3 JDK 1.8环境变量踩坑记录很多后端项目依然跑在JDK 1.8上练习这个非常有实用价值。Linux装JDK很简单但环境变量配置容易埋坑。下载JDK的tar包解压到/usr/local/下sudo tar -xzf jdk-8u202-linux-x64.tar.gz -C /usr/local/ sudo mv /usr/local/jdk1.8.0_202 /usr/local/java然后配置环境变量。推荐写到/etc/profile.d/java.sh而不是直接改/etc/profile这样升级或卸载时清理方便语义也清晰export JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar写完后执行source /etc/profile.d/java.sh验证java -version javac -version两个命令输出版本一致说明JDK可用。踩坑记录如下第一安装系统自带的OpenJDK和手动安装的Oracle JDK会冲突java -version显示的是系统自带的版本此时要把/usr/bin/java用update-alternatives切换过来。第二PATH变量顺序很重要$JAVA_HOME/bin:$PATH必须放在前面否则如果系统里有其他java也在PATH里会优先执行旧的。第三初学者经常漏掉CLASSPATH虽然新版JDK不强制要求但有些老项目还需要加上可以避免很多奇怪的编译报错。3.4 Python安装与pip离线包管理Linux系统自带的Python版本通常不够用服务器上经常需要自己编译安装新版Python。这块是综合练习里最容易出问题的环节。编译安装Python的流程# 安装编译依赖 sudo dnf install -y gcc make zlib-devel libffi-devel openssl-devel bzip2-devel # 下载Python源码 wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz tar -xzf Python-3.11.9.tgz cd Python-3.11.9 # 配置安装路径 ./configure --prefix/usr/local/python311 # 编译安装 make -j$(nproc) sudo make install--prefix/usr/local/python311指定安装目录目的是不影响系统自带的python3命令。可以这样设置环境变量export PATH/usr/local/python311/bin:$PATH然后验证python3 --version。编译过程中的经验make -j$(nproc)用CPU核心数并行编译能大幅提速但虚拟机分配的核心数有限建议至少分配2核。编译时间取决于机器性能双核大约5-10分钟。还有一个常见需求是离线安装Python包。生产环境往往不能连外网这时需要在有网的机器上先下载包再拷贝到目标机器安装。方式如下# 有网环境下载包到本地目录 pip download -r requirements.txt -d /tmp/packages/ # 拷贝到离线环境后安装 pip install --no-index --find-links/tmp/packages/ -r requirements.txt这个技能在面试里经常被问实际运维中也经常用来解决内网环境Python依赖问题。日常练习要刻意模拟这种断网安装场景增加对依赖包完整性的敏感度。4. 自动化脚本计划任务与系统管理4.1 第一个规范脚本日志清理综合练习做到这里基本命令和服务部署都会了接下来就进入自动化脚本阶段。我建议从日志清理开始写第一个正式脚本因为需求常见、逻辑简单、见效快。一个标准日志清理脚本如下#!/bin/bash LOG_DIR/opt/logs KEEP_DAYS14 find $LOG_DIR -name *.log -mtime $KEEP_DAYS -exec rm -f {} \; find $LOG_DIR -name *.tar.gz -mtime 30 -exec rm -f {} \; echo $(date %Y-%m-%d %H:%M:%S) 清理完成 /var/log/cleanup_history.log这个脚本值得注意的细节开头第一行#!/bin/bash指定解释器KEEP_DAYS用变量管理方便以后修改两个find命令分别处理日志文件和压缩包保留天数不同最后追加一行执行记录到history日志里方便追溯。执行前先给脚本加执行权限chmod x /opt/scripts/cleanup_logs.sh /opt/scripts/cleanup_logs.sh脚本写完之后要测试边界条件先创建一个30天前的日志文件看看会不会被清理再创建一个昨天的日志文件确认不被误删。这种测试习惯能避免脚本上线后误删文件。4.2 密码过期提醒的实现linux密码过期提醒通知这类需求在实际运维中很常见也是一道经典的面试实操题。思路是利用chage命令查看密码过期信息再用crontab定时检查发现快要过期就发提醒。第一步设置用户的密码策略# 查看用户密码过期信息 chage -l devops # 设置密码有效期为90天过期前7天开始提醒 chage -M 90 -W 7 devops第二步编写提醒脚本。这里用一个循环读取所有有密码的有效用户判断剩余天数少于阈值就发通知#!/bin/bash THRESHOLD7 for user in $(cut -f1 -d: /etc/passwd); do expire_date$(chage -l $user | awk -F: /密码过期|Password expires/ {print $2}) [ -z $expire_date ] continue expire_epoch$(date -d $expire_date %s 2/dev/null) [ -z $expire_epoch ] continue now_epoch$(date %s) left_days$(( (expire_epoch - now_epoch) / 86400 )) if [ $left_days -le $THRESHOLD ]; then echo 用户 $user 的密码将在 $left_days 天后过期请尽快修改 fi done这里有一个坑chage -l输出语言可能随系统locale变化所以解析字段时要兼容中英文两种格式。我上面用了两个关键字密码过期|Password expires做兼容。实际生产环境建议固定环境为英文用LANGen_US.UTF-8执行命令脚本写起来才不会因为系统语言不同而失效。第三步把脚本丢到cron里# 每天凌晨8点检查 crontab -e 0 8 * * * /opt/scripts/check_password_expire.sh生产环境里提醒方式一般是发邮件或通知到群里测试环境可以先输出到文件确认逻辑正确后再接通知通道。4.3 systemd定时器等替代方案定时任务不只有crontab这一种方案。对于需要精确到分钟、或者要求高可靠性的任务systemd的timer也是现代Linux系统的首选这也是很多面试题里会出现的内容。systemd定时器由两个文件组成service描述要执行的任务timer定义执行时间。比如为日志清理脚本创建一个service文件[Unit] DescriptionClean old logs [Service] Typeoneshot ExecStart/opt/scripts/cleanup_logs.sh再创建timer文件[Unit] DescriptionRun cleanup_logs every day at 2 AM [Timer] OnCalendar*-*-* 02:00:00 Persistenttrue [Install] WantedBytimers.target启用方法cp cleanup_logs.service cleanup_logs.timer /etc/systemd/system/ systemctl daemon-reload systemctl enable --now cleanup_logs.timerPersistenttrue这个配置很关键如果系统在计划执行时间点正好关机下次开机时会立即补执行一次确保日志清理不会因为关机而漏掉。crontab无法做到这一点这也是很多生产环境改用systemd定时器的核心原因。顺序上建议先练crontab再练systemd timer。两者都会之后面试官问定时任务时你就能根据场景说出两种方案的取舍而不是只背一条命令。5. 网络、进程与故障排查闭环5.1 网卡配置文件与nmcli用法网络配置是Linux系统管理里最绕不开的实操点之一。像rocky linux网卡文件这种高频搜索词背后说明很多人都在配网时卡过。我用Rocky Linux举例讲清网络配置的核心逻辑。Rocky Linux从9.x开始使用NetworkManager作为默认网络管理工具网卡配置文件通常位于/etc/NetworkManager/system-connections/目录下文件名就是网卡名比如ens160.nmconnection。老系统习惯用的/etc/sysconfig/network-scripts/ifcfg-ens160在新版本中已不推荐。配置静态IP时可以用nmcli命令直接写这样不会因为手改配置文件出错# 查看当前网络状态 nmcli connection show # 修改网络连接为静态IP nmcli connection modify ens160 ipv4.method manual \ ipv4.addresses 192.168.10.100/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns 114.114.114.114,223.5.5.5 # 激活配置 nmcli connection up ens160修改完成后立即验证ip addr show ens160 ip route show这里强调一个思路改网络前务必先确认操作的是哪块网卡服务器上多网卡时容易搞混。我一般先执行ip link看网卡列表再执行nmcli connection show看连接状态两步确认后再做修改。还有一项很实用的排查技能是启用网卡自动接管意思是一根网线插到不同交换机时网卡能自动协商。生产服务器上基本都用固定IP练习时可以多折腾几种配置把ip、nmcli、ping、traceroute组合起来诊断网络问题。5.2 看懂进程状态与IPC方式面试题特别喜欢考察linux进程间通信相关的概念但很多人实际工作中并不接触底层知识所以综合练习里要专门花时间补这块。先掌握一个核心工具ps观察进程状态# 查看所有进程用完整命令格式显示 ps aux # 查看进程树能看出父子关系 pstree # 动态刷新进程状态 topps aux输出的STAT列是个重点。R表示运行中S表示睡眠Z表示僵尸进程。僵尸进程本身不占CPU但它的存在说明父进程没有正确回收子进程资源大量僵尸进程会耗尽PID。处理僵尸进程的办法是找到并重启父进程这在实际服务器上会频繁遇到。进程间通信方面最基础的是管道。cmd1 | cmd2把前一个命令的标准输出接到后一个命令的标准输入比如ps aux | grep nginx查找nginx进程。中级的IPC包括信号、消息队列、共享内存、信号量。在bash脚本里发信号控制进程# 查看进程PID pgrep -f my_daemon # 发送TERM信号让进程优雅退出 kill -15 PID # 发送KILL信号强制退出 kill -9 PID系统编程角度的IPC可以用Python写个测试比如用queue模块实现生产者消费者模型再把两个进程都放到同一台Linux上跑观察它们通过消息队列交换数据的过程。把书本概念和实际进程对上号面试被问到才能有的说。5.3 常见问题排查从蓝屏到端口冲突综合练习最见功力的一环是故障排查。这里我把高频问题整理成一张速查表并说明每项的排查路径。现象可能原因排查命令虚拟机安装Linux时蓝屏Hyper-V冲突、CPU虚拟化未开启关闭Hyper-VBIOS开启VT-x服务启动失败端口被占用ss -lntp、lsof -i :3306网络不通网卡未激活/网关错ip addr、ip route、ping磁盘满但日志不大inode耗尽df -i、find / -xdev -printf %f\n | wc -l进程被杀不掉处在不可中断睡眠ps -o stat,pid,ppid找父进程系统时间不对NTP未同步timedatectl status端口冲突是每台服务器上都会遇到的事。我一般用两条命令快速定位谁占了这个端口和这个端口监听了什么。# 查看端口监听状态 ss -lntp | grep 3306 # 查看指定端口占用进程带完整路径 lsof -i :3306一个真实的排障案例是装完MySQL后启动失败systemctl start mysql报port already in use。用ss -lntp看到localhost:3306被另一个mysqld实例占用之前安装的旧版本没有停干净。解决办法是把旧进程kill -9确认端口释放后再启动新服务。这个问题在虚拟机里反复练习条件反射建立起来以后去线上处理就很从容。还有一个非常容易翻车的点是防火墙。很多人配好服务后从外部访问不了第一反应是服务没起来检查下来一切正常最后一查是firewalld拦截了。排查方式sudo firewall-cmd --list-all sudo firewall-cmd --add-port8080/tcp --permanent sudo firewall-cmd --reload我习惯在练习阶段就把防火墙规则也纳入检查序列每次部署完端口服务先自问一句这个端口防火墙放行了吗6. 面试速答与综合场景自测6.1 高频面试题速答表Linux综合练习练到后期非常有价值的检验方式就是拿面试题自测。下面这些题目来自历年运维工程师、后端开发岗位常见题库每道题的答案方向我都给出提示。面试题答题要点Linux常用的文件查找命令有哪些、区别是什么find是实时搜索locate是基于数据库whereis和which搜命令位置如何查看服务器负载、CPU和内存占用uptime看平均负载top看动态实时free -h看内存软链接和硬链接的区别软链接是独立文件指向目标硬链接指向同一inode硬链接不能跨文件系统如何排查端口被占用ss -lntp、lsof -i :PORT、netstat -tunlpLinux开机启动流程BIOS→Bootloader→内核→init/systemd→target→服务如何查看系统发行版与内核版本cat /etc/os-release、uname -r如何监控一个进程并设置自动重启systemd服务配置Restartalways或用supervisor如何查看并实时跟踪日志tail -f /var/log/messagesjournalctl -f -u 服务名如何判断磁盘空间和inode是否充足df -h看空间df -i看inodecrontab和systemd timer有哪些优劣crontab简单直观systemd支持持久化、日志统一管理自测方法不需要把每道题都背下来而是边看题目边在虚拟机里实际操作一遍。比如软链接和硬链接区别这道题直接在/tmp下建个测试目录创建文件、创建软链和硬链再用ls -li查看inode印象就非常深刻。6.2 综合场景演练新服务器上线前要做什么最后唠叨一个综合练习的高阶玩法模拟一套完整的新服务器上线流程。所有技能单点过完不难难的是串起来。我给自己定过一个标准动作每次练完都要在新安装的虚拟机上执行一遍以下流程创建新用户并配置sudo权限禁用root直接登录SSH。配置静态IP、主机名、DNS确认能ping通网关和外网。安装Docker并配置镜像加速拉取nginx和mysql镜像。部署nginx容器作为反向代理MySQL容器做数据持久化。写一个脚本统计nginx访问日志前10的IP加入crontab每日执行。设置日志清理任务日志保留14天备份保留30天。把防火墙规则补齐只放行80、443、3306端口。最后做一次全面检查ss看端口、df看空间、systemctl status看服务、uptime看负载。这一套流程做完基本等同于完成了一次真实的生产初始化。你甚至可以把每个步骤的机器输出保存下来整理成一套自己的SOP文档面试时直接拿这套东西讲比背命令有说服力得多。我个人的体会是Linux综合练习最怕的是看了很多、敲得很少。命令背得再熟不亲手在虚拟机上敲一遍、不踩几个坑遇到真实环境还是会手忙脚乱。上面所有操作建议你准备一台虚拟机完整过一遍配置能随手写出来、排查路径能条件反射想起来这才是综合练习真正练到位的样子。