ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Ubuntu生产环境初始化SOP:从裸机到可承载业务的完整实操指南

Ubuntu生产环境初始化SOP:从裸机到可承载业务的完整实操指南 1. 生产环境初始化这件事为什么必须靠SOP做Ubuntu运维和服务器管理这些年我最大的感触就是装系统是入门初始化才是分水岭。很多朋友在虚拟机里装好Ubuntu敲两行lsb_release -a看到版本号出来就觉得自己会了。可真到了要把一台机器投入生产的那天面对的问题完全不是这么回事。生产环境初始化和个人电脑装系统有本质区别。个人电脑装好系统、连上WiFi、装个输入法就能用。生产环境不行它要承载业务流量要考虑安全基线要考虑后续运维的标准化接口要考虑故障出现时能不能快速定位、快速恢复。这一大堆要求如果每次靠临时想一想靠哪位同事记得哪条命令就补哪条结果必然是灾难。这也是为什么“跟韩工学Ubuntu”系列到了第10章专门拿出整整一章讲生产环境初始化标准流程SOP。前面那么多课时在打基础到了第10章就是把散落的技能点串成一条完整的生产线。而004篇作为这一章的练习题篇干的事更具体把你从“看懂了”推到“能上手、能复盘、能出错”的位置。我一直认为看教程和做练习之间的差距就是“我以为我会了”和“我真的会了”之间的差距。看别人敲命令跟在生产环境里自己从头初始化一台机器是完全不同的认知体验。前者是线性阅读后者是要做决策、踩坑、回滚、补漏的完整闭环。这一篇练习题就是逼着你把这个闭环跑一遍。先说清楚这篇练习题的定位它不是课后应付式的小测验而是严格按照一套真实生产环境初始化SOP拆出来的实操训练。每一道题背后都对应着生产环境初始化流程里一个绕不开的环节。做完这套题你应该能独立完成一台全新Ubuntu服务器从裸机状态到可以承接业务的全部标准动作并且知道自己每一步在干什么、为什么这么干。2. 先复盘生产环境初始化SOP的标准全流程不把SOP全貌讲清楚就上练习题等于不教游泳直接把人扔水里。所以在做题之前我们把韩工这章的初始化SOP主干流程先过一遍。这既是对003篇的复习也是练习题的内容索引。2.1 初始化SOP的分层思想一套能落地的初始化SOP绝不是一条命令一条命令的堆叠而是有清晰层次的。我自己习惯把初始化分成四层基础层系统安装、磁盘分区、内核参数、时区语言、软件源配置。这一层解决的是“机器能不能稳定运行”的问题。安全层SSH加固、防火墙规则、用户权限体系、自动更新策略。这一层解决的是“机器能不能被信任”的问题。运行时层Docker等容器运行时、日志收集、监控探针、时钟同步。这一层解决的是“业务怎么在上面跑、出事了怎么发现”的问题。交付层初始化脚本归档、基线配置导出、文档记录。这一层解决的是“以后还能不能复现、交接给下一个同事能不能接得住”的问题。004篇练习题就是按照这个分层逻辑设计的。你做题时如果发现某道题卡住了不要急着翻答案先退回对应的层次去想一想这道题考的是哪一层的能力。2.2 每一层初始化动作的选型逻辑光知道分几层还不够每一层里的具体选型背后都有讲究。基础层最常见的争议是分区方案。生产环境我强烈建议/boot独立分区/和/home分开数据盘单独挂载。原因很简单日志和用户数据如果和系统目录搅在一起系统盘满了以后整台机器可能直接进入只读状态业务瞬间全挂。数据独立挂载还能在系统崩溃时把数据盘拔下来插到别的机器上接着用。练习题里就会让你针对不同业务场景设计合适的分区方案这块没有标准答案但有明确的判断标准。安全层最核心的是SSH和用户权限。SSH我从来不允许直接用root登录也从来不允许使用密码登录。生产环境的密钥管理至少要做到每个运维人员独立密钥、独立账户、按需授权。禁止共享密钥因为共享密钥出问题的时候你根本查不出来是哪个人的操作导致了故障。练习题里有一个场景题就是围绕这个设计的。运行时层这块时间同步是最容易被忽略但又特别致命的一个环节。分布式系统里日志时间戳不统一排错的时候对不上时间线那种痛苦我经历过一次就再也不想经历。所以chrony或ntp的配置在练习题里专门出了一道题。2.3 韩工这套SOP和其他教程的区别网上讲Ubuntu初始化的文章一搜一大把为什么韩工的教学值得专门做一套练习题我总结下来有三个不同点。第一是强调“为什么”而不是“怎么敲”。很多教程给你一串命令告诉你复制粘贴就行。韩工这套SOP会解释每一条命令背后的目的比如为什么设置vm.swappiness而不是直接关掉swap为什么生产环境要用国内镜像源而不是官方源。练习题里很多判断题考的就是你知不知道这个“为什么”。第二是强调SOP的可复制性和版本管理。真正的SOP不是写在你笔记本里的备忘录它应该是能放进git仓库、能走评审流程、能根据环境迭代的正式文档。所以练习题里有专门一道题要求你把初始化脚本整理成带注释、带输出检查点的规范脚本而不是一串跑完就算完事的临时命令。第三是强调验收与回滚。很多初始化流程讲完就结束了没有人告诉你初始化完了怎么验证每一条都生效了出了问题怎么回滚。韩工的初始化SOP每一个阶段都有明确的验收命令和回滚策略对应地练习题里也有验收和回滚相关的题目。3. 004篇练习题全解析题目、思路与答案下面进入正题。我把这组练习题拆成四道从基础到综合难度递增。每一道题都按照“题目 → 考察点 → 参考操作 → 常见错误”的结构来展开。建议你先自己动手做一遍再来看解析。3.1 练习题A全新服务器的环境信息采集与基线确认题目内容你拿到一台全新的Ubuntu 22.04 LTS服务器系统已安装完成尚未做任何配置。请写出一组命令完成以下信息采集操作系统版本和内核版本CPU核数、内存大小、磁盘分区与剩余空间系统默认语言、时区、当前时间是否已启用SSH服务监听的端口是什么已安装的软件包总数考察点这道题看起来简单但实际非常关键。生产环境初始化的第一步不是改配置而是摸清现状。很多人上来就改SSH、换源结果改了以后发现系统里装了不该装的东西、磁盘空间根本不够、时区还是UTC导致日志时间对不上来回返工。参考操作# 版本与内核信息 lsb_release -a uname -a # CPU与内存 lscpu free -h # 磁盘分区与使用率 lsblk df -hT # 语言与时间 locale timedatectl # SSH服务状态与监听端口 systemctl status ssh ss -tlnp | grep ssh # 软件包数量dpkg方式统计 dpkg --list | wc -l到这里还没完生产环境的信息采集必须形成一份基线记录。我建议把这些输出重定向到一个文件里跟上主机名和时间戳存档备用mkdir -p /root/system-baseline { echo 主机名 hostnamectl echo 内核与版本 lsb_release -a uname -a echo 硬件资源 lscpu free -h lsblk df -hT echo 时间与语言 timedatectl locale echo SSH监听状态 ss -tlnp | grep ssh || echo SSH未监听 } /root/system-baseline/$(hostname)-baseline-$(date %F).txt常见错误这道题最常见的错误就是只采集了自己“想得到”的信息而不是按照一套固定模板去采集。生产环境初始化最忌讳想起一出是一出。所以韩工在流程里反复强调信息采集也要模板化。你可以不抄我上面的命令但一定要提前准备好自己的采集清单这是SOP意识的第一课。3.2 练习题B编写一键初始化脚本含软件源替换、系统更新、基础工具安装题目内容请编写一个 Bash 脚本/root/init/init_base.sh要求实现以下功能自动判断当前用户是否为 root非 root 则退出并给出提示将软件源替换为国内阿里云镜像源以 Ubuntu 22.04 为例执行apt update和apt upgrade -y安装基础工具包vim、curl、wget、git、tree、htop、net-tools、chrony每一步执行后检查上一条命令是否成功失败则记录错误日志并退出脚本结束后输出“初始化完成”和基础工具版本号考察点这道题考的是自动化能力和脚本规范性。生产环境初始化不能每次靠手工一条一条敲命令你必须把重复动作固化成脚本而且要保证脚本可追溯、可复用、可排错。参考操作#!/bin/bash # # 文件: init_base.sh # 功能: Ubuntu 22.04 基础环境初始化 # 用法: sudo bash init_base.sh # set -u # 变量未定义时报错 LOG_FILE/var/log/init_base.log ERROR_FLAG0 # 检查root权限 if [ $(id -u) -ne 0 ]; then echo [错误] 请使用root用户或sudo运行此脚本。 | tee -a $LOG_FILE exit 1 fi # 备份并替换软件源 echo [1/4] 替换软件源... if [ -f /etc/apt/sources.list ]; then cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %F) fi cat /etc/apt/sources.list EOF deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse EOF if [ $? -ne 0 ]; then echo [错误] 软件源替换失败。 | tee -a $LOG_FILE exit 1 fi # 更新与升级 echo [2/4] 更新软件源与升级系统... apt update $LOG_FILE 21 || { echo [错误] apt update失败。 | tee -a $LOG_FILE; exit 1; } apt upgrade -y $LOG_FILE 21 || { echo [错误] apt upgrade失败。 | tee -a $LOG_FILE; exit 1; } # 安装基础工具 echo [3/4] 安装基础工具... apt install -y vim curl wget git tree htop net-tools chrony $LOG_FILE 21 || { echo [错误] 基础工具安装失败请检查网络或软件源。 | tee -a $LOG_FILE exit 1 } # 输出完成信息 echo [4/4] 初始化完成。 echo 关键工具版本信息 vim --version | head -1 curl --version | head -1 git --version chronyd --version常见错误这道题的高频翻车点有三个。第一个是apt upgrate拼写错误正确是upgrade这种低级错误在手工敲命令时可能很容易发现写进脚本里就不一定了尤其是脚本一长、输出刷屏的时候。所以要养成脚本里每条命令后检查返回码的习惯这个脚本里用了|| {}的方式就是出于这个目的。第二个是忘了在脚本开头设置set -u或类似的安全选项。脚本里如果用了未定义的变量默认情况下Bash会把它当空字符串继续跑这在生产环境里可能引发很难排查的诡异问题。set -u的作用就是让未定义变量直接报错退出。第三个是软件源配置写死成jammy版本。这个脚本只适用于Ubuntu 22.04如果你拿到的是24.04源地址要替换成noble。更稳妥的做法是在脚本里先读取系统版本再动态生成源类似下面这样. /etc/os-release echo deb https://mirrors.aliyun.com/ubuntu/ ${VERSION_CODENAME} main restricted universe multiverse /etc/apt/sources.list这样脚本的兼容性会好很多。练习题只要能跑通就行但生产环境里我强烈建议你做成动态的。3.3 练习题CSSH安全加固与sudo权限配置题目内容完成以下安全配置禁止root用户通过SSH登录禁止SSH密码登录仅允许密钥登录新增运维用户deploy加入sudo组并为其配置SSH密钥登录修改SSH默认端口为 22822配置防火墙仅放行 22822 端口和 80/443 端口重启SSH和防火墙服务并验证配置生效考察点这道题是安全层的核心实战。生产环境的SSH入口如果裸奔被扫到弱口令爆破基本是迟早的事。这道题要完成的不仅是一堆命令而是一整套“最小暴露面”的安全思路。参考操作# 1. 创建deploy用户并加入sudo组 useradd -m -s /bin/bash deploy usermod -aG sudo deploy passwd deploy # 2. 切换至deploy用户创建SSH密钥对 su - deploy ssh-keygen -t ed25519 -C deployproduction -f ~/.ssh/id_ed25519 touch ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys exit # 3. 编辑SSH服务端配置 /etc/ssh/sshd_config # 修改以下配置项 # Port 22822 # PermitRootLogin no # PasswordAuthentication no # PubkeyAuthentication yes # 注意改Port前先把22822端口在防火墙放行不然有可能把自己锁在门外 sudo sed -i s/^#\?Port.*/Port 22822/ /etc/ssh/sshd_config sudo sed -i s/^#\?PermitRootLogin.*/PermitRootLogin no/ /etc/ssh/sshd_config sudo sed -i s/^#\?PasswordAuthentication.*/PasswordAuthentication no/ /etc/ssh/sshd_config sudo sed -i s/^#\?PubkeyAuthentication.*/PubkeyAuthentication yes/ /etc/ssh/sshd_config # 4. 检查配置语法 sudo sshd -t # 5. 重启SSH服务CentOS用sshdUbuntu用ssh sudo systemctl restart ssh # 6. 配置防火墙 sudo ufw allow 22822/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable sudo ufw status常见错误这道题翻车率相当高我几乎每次带人都能碰到类似事故。最典型的是改完SSH配置直接重启没先跑sshd -t检查语法结果某个配置项写错SSH直接起不来。这时候如果人在机房还有救远程操作就只有哭的份了。另一个典型问题是防火墙把自己锁在外面。ufw默认规则是拒绝所有入站流量你先把SSH端口改了但防火墙只放行了22重启防火墙以后22和22822都不通这台机器就在你面前但你就是连不进去。所以操作顺序很重要先放行新端口再改SSH配置最后启用防火墙。还有一个细节是密钥的权限。authorized_keys、.ssh目录、私钥文件的权限如果不对SSH服务端会直接拒绝用这个密钥。我做这次练习时故意把chmod命令漏掉一次就是想提醒自己权限问题100%会发生。3.4 练习题D综合场景题——独立设计一套生产环境初始化SOP题目内容某公司采购了一台新服务器规划用于部署一个Nginx反代和多个Spring Boot应用。系统为Ubuntu 22.04 LTS硬件配置为8核16G内存、1块512G SSD系统盘、1块2T HDD数据盘。请你给出磁盘分区方案给出时区、时间同步、主机名修改方案给出Docker及Docker Compose安装方案给出Swap设置建议给出日志切割策略考察点这道题没有固定答案考的是综合决策能力。生产环境初始化永远没有放之四海而皆准的“标准答案”只有针对具体场景的最优解。这道题就是让你模拟一次真实的方案设计。参考设计思路磁盘分区上512G SSD我会采用LVM布局/分配100G/boot分配2Gswap分配8G剩余空间留给/var和/home的逻辑卷。2T HDD单独分区挂载到/data用于存放应用数据和日志。SSD跑系统和应用HDD存数据这是很经典的分层方案。Swap设置上16G物理内存的机器swap给8G比较合理。韩工在课程里提醒过很多次不要完全关掉swap。有些优化教程说关swap能提升性能那是针对特定数据库场景的通用业务跑着跑着内存飙上来没有swap做缓冲OOM Killer直接杀进程那酸爽不想体验第二次。时间同步用chrony配置国内NTP服务器地址这个没什么争议。主机名建议按“业务-环境-序号”的规则命名比如nginx-prod-01不要用意义不明的ubuntu-server-2这种运维场景下主机名就是机器识别的第一标签。Docker安装我倾向于使用官方脚本加国内镜像加速器组合。这里有个易错点Docker CE在Ubuntu上默认源是官方源国内服务器如果直接用官方源安装成功率不高一定要先换源再装。日志切割用logrotate生产环境的日志不切割一个月就能把磁盘吃干净。按天切割、保留30天、压缩旧日志这套配置要写进SOP。这道题做完之后建议再做一个动作把你的方案写成一页纸文档然后找身边有经验的人帮你评审。方案设计能力不是靠背命令练出来的是靠方案被批评、被质疑练出来的。4. 做这套练习题时最常踩的坑与排查方法练习题做完对答案只是第一步更值钱的是从错误中提炼出排查经验。下面几个坑是我从大量练习者反馈和自己实操中总结出来的高发问题做个速查整理。4.1 SSH端口修改后无法连接症状运维人员修改Port后重启ssh服务再用新端口连接时提示Connection refused或超时。排查步骤先确认sshd进程是否在监听新端口ss -tlnp | grep ssh确认防火墙是否放行ufw status确认云服务器的安全组规则是否同步放行新端口如果是在虚拟机里确认是否有外部防火墙或NAT转发在干扰这里插一个经验修改SSH端口在生产环境里不是必须操作。如果你把SSH暴露在公网上改端口确实能挡掉一部分扫描流量但真正解决安全问题的还是密钥登录禁root这些硬措施。端口从22改成22822在fail2ban等工具面前意义不大因为它记录的是IP而不是端口。所以这道题的重点不是让你推广改端口而是让你掌握改端口后全链路连通性检查的思路。4.2 apt update失败或速度极慢症状执行apt update时长时间卡住或者报错提示无法解析、连接超时。排查步骤先确认网络ping mirrors.aliyun.com检查DNScat /etc/resolv.conf检查源配置是否有低版本bionic/cosmic等与系统版本不匹配确认是否有代理环境变量干扰env | grep -i proxyUbuntu的apt源配置在不同版本上有差异。22.04及以前主要用/etc/apt/sources.list24.04开始引入了/etc/apt/sources.list.d/ubuntu.sources这种deb822格式的文件两者语法不一样。如果你拿老教程的命令直接改24.04的源大概率不生效。这个版本差异在韩工的课程里专门强调过也是练习题里容易踩坑的地方。4.3 chrony时间同步状态异常症状chronyc tracking显示Leap status不是Normal或者System time偏差过大。原因排查检查chrony是否正常运行systemctl status chrony检查防火墙是否放行UDP 123端口确认NTP服务器的域名解析是否正常检查是否有其他时间同步服务如systemd-timesyncd在抢占Ubuntu默认可能带着systemd-timesyncd如果你装完chrony但没禁用前者两个服务会打架。正确做法是安装chrony后主动停用并屏蔽systemd-timesyncd服务然后重启chrony。这个问题不做一遍实操根本意识不到我当年也是看了好几天日志才发现。4.4 练习题里最容易被忽视的三个小点结合我自己做题和带人的经验有三处细节是大多数人第一次做这套题都会忽略的。第一hostnamectl set-hostname改完主机名以后/etc/hosts里也要同步修改。很多服务靠主机名做本地解析/etc/hosts里的老主机名不更新某些服务会解析出错误地址排错时极其迷惑。第二ufw默认的sshd规则是允许22端口你改了SSH端口后旧的22端口放行规则还留在防火墙里。虽然无害但修整一下更干净。可以在/etc/ufw/user.rules里清理或者直接ufw delete allow 22/tcp。第三练习脚本里的apt upgrade在生产环境的执行策略要谨慎。大版本升级、内核升级可能在重启后引入不兼容问题。很多生产环境的策略是只执行apt update并升级安全补丁不主动做全量upgrade或者升级前先在测试环境验证。你的练习题可以全量升级但心里要清楚这两者的区别。5. 练习题的隐藏价值把SOP变成身体记忆很多人误解练习题的作用以为做题只是为了验证“我学会了”。实际上这套004篇练习题的真正价值是把SOP从一份文档变成你的身体记忆。怎么理解这件事你第一次照着SOP初始化一台机器每一个步骤都要查文档、看命令、确认参数动作很慢第二次做稍微快一点等到你独立做完这套练习题的四个场景再次拿到一台新服务器时你脑子里会自然浮现出下一步该做什么、上一步的结果怎么验证、哪一步容易出错、出错以后去哪儿排查。这个过程就是把显性知识内化成隐性能力的过程。我见过太多运维新人拿着网上零散的教程东拼西凑今天学一条命令明天看一个配置文件知识是碎片化的遇到真实环境立刻不知所措。而系统做一套题等于在脑子里搭好了一个框架之后遇到任何新环境你只是往框架的不同位置补内容而不是推倒重来。韩工的课把练习题放在整章的最后这个编排很刻意。前面的课程给了你砖块、水泥、图纸练习题是让你亲手把房子盖一遍。盖的过程中你才会发现哪些砖块是缺损的哪些水泥配比不对哪些图纸标注意思不明。发现这些问题恰恰是这门课最重要的收获。这套题做完以后我个人建议你找个不用的虚拟机从头再跑一遍完整流程但这次不看任何参考材料完全凭记忆写脚本、做配置。跑完了再对照标准SOP逐项检查。你很快就会发现自己漏了防火墙的某条规则或者忘了配置日志切割或者时区没改过来。这些漏项就是你现在最需要补的短板。生产环境初始化看着是脏活累活不如写业务代码有成就感但它是整个运维体系的基石。一台没有初始化好的机器后续无论部署什么业务都会埋雷。基础不牢地动山摇这句话放在服务器初始化上一点都不过分。
返回列表