简介面向技能竞赛备赛与云计算运维进阶的学习者文档系统梳理了涵盖九大模块的完整学习路线适合零基础起步或希望查漏补缺的运维初学者。资源仅含1个docx文件压缩包约18KB内容精炼覆盖Linux常用命令与目录结构、Shell脚本自动化、MySQL主从复制、LVS与RabbitMQ集群、OpenStack虚拟化、Ansible自动化运维、Python编程、Docker容器部署以及Kubernetes的CICD构建。每个阶段均设置明确学习目标、推荐视频教程和独立考核任务例如编写Shell脚本部署LNMP并实现MySQL自动备份、基于Ansible在三台主机上配置高可用数据库集群、调用Python API创建flavor、利用docker-compose部署webmall应用。读者按周推进即可逐步掌握从系统管理到容器编排的完整云计算运维技能体系尤其适合备战云计算技能竞赛或规划运维职业进阶的学习者。资源已有1701人学习下载内容实用性已获得较多学习者验证。1. 这条云计算运维路线为什么值得按周推进而不是收藏吃灰这份标题为「云计算运维学习路线及具体细节」的 docx本质不是知识清单而是一份按周排期的训练计划Linux 基础、Shell、MySQL、集群、OpenStack、Ansible、Python、Docker、K8s每个阶段两周到三周末尾都跟一个独立完成的考核。反直觉的地方在于大多数自学云计算运维的人卡住的不是某个命令而是不知道「学到什么程度算过关」。这份文档的价值就是把模糊的「学会」变成了可验收的行为——你能独立部署 LNMP、能独立搭 MySQL 主从、能独立拉起一个 RabbitMQ 集群。适合正在备赛技能竞赛、准备转岗云运维、或者从传统系统维护往上走的人直接照这个节奏排期。2. Linux 与 Shell两周一阶段的地基该怎么打很多人在 Linux 阶段用的是「背命令」的学法拿一张命令大全表格从 a 背到 z背完第三天忘掉一半。这条路线里基础能力只安排了两周它的考核点却在后面——Shell 脚本阶段要独立编写部署 LNMP 的脚本。这意味着 Linux 阶段真正要建立的不是命令记忆而是两种能力路径感和服务排查感。2.1 目录与命令先建立「路径感」再谈背命令文档点名的 /etc、/var、/opt、/mnt 这四个目录是云服务器上最常打交道的几个位置。/etc 装配置、/var 装日志和缓存、/opt 装第三方软件、/mnt 是临时挂载点。另外还要知道 /usr/local 是手动编译安装的默认前缀跟 yum 装的程序互补。判断自己有没有过关不是看能不能默写而是丢给你一台陌生机器敢不敢动手配置文件去 /etc 找服务起不来去 /var/log/messages 和 /var/log/nginx/error.log 找线索。命令层面vim、yum、cat、find、mount 这五个是使用频率最高的缩影。vim 至少要熟练三个操作/ 搜索、yy 复制、dd 删除配合 :wq 和 :q!日常够用。yum 要懂 install、remove、info、repolist遇到装不上的包第一反应是跑yum repolist看源是否正常。find 我一般让人先记一个组合find /var/log -name *.log -mtime 7 -size 100M -exec ls -lh {} \;这条命令的意思是在 /var/log 下找出名字以 .log 结尾、修改时间超过 7 天、体积大于 100MB 的日志文件并逐条列出详情。-mtime 7是超过 7 天-mtime -7是 7 天以内-exec ... {} \;对每个结果执行后面的命令{}会被替换成文件名。动手前先用ls -lh看清楚目标是不是真的要删确认后再换成-delete误删业务日志可没有后悔药。mount 一定要连 fstab 一起理解mount /dev/vdb1 /data只对本次生效写进 /etc/fstab 才能开机自动挂载。fstab 写错会导致机器起不来这是云主机启动异常的一个高频原因所以改之前先cp /etc/fstab /etc/fstab.bak真起不来还能用单用户模式改回来。2.2 服务与防火墙配置的边界在哪文档列的服务不少Iptables、Firewalld、NTP、Tomcat、Nginx、MySQLmariadb。这个阶段的目标不是背下每个服务的全部参数而是知道每类服务的「最小可运行配置」和「出问题去哪看」。防火墙是云环境里最容易翻车的一环很多初学者在服务器上装了 Nginx却发现外部访问不了最后发现是 firewalld 默认拒绝了端口firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload--zonepublic指定公共区--add-port3306/tcp放行 MySQL 端口--permanent表示写入持久化配置最后的--reload让配置立即生效。注意加了--permanent之后必须 reload否则当前会话里防火墙行为不会变。调试临时端口可以用--timeout300五分钟自动失效适合临时开端口做测试不用回头清理规则。NTP 在云上通常是 chrony 而不是老式 ntpd排查方法也很固定timedatectl status看是否同步chronyc sources -v看时间源是否 reachable。Tomcat 和 Nginx 这段重点练的是「启停 日志」三件套systemctl status nginx看状态、ss -lntp | grep 80看监听、tail -f /var/log/nginx/access.log看请求进来没有。Tomcat 的最小配置在 conf/server.xml 里的 Connector 端口Nginx 在 /etc/nginx/conf.d/default.conf 的 server 块改完都要nginx -t先做语法检查再 reload。MySQLmariadb装完第一件事是跑mysql_secure_installation把匿名用户和测试库清掉这个习惯要在这个阶段形成后面主从、集群全都要建立在干净实例上。2.3 Shell 脚本以 LNMP 部署脚本为骨架Shell 阶段的文档推荐了视频教程两周目标定得很实在能编写脚本、能解读脚本。判断标准就一句话——给你一个没见过的 .sh能不能三分钟说出它在干什么给你一台干净机器能不能写脚本把 LNMP 装起来。这里给一个我常用的部署骨架比光看视频进度快得多#!/bin/bash # 一键部署 LNMP适用于 CentOS 7Nginx MariaDB PHP-FPM set -e MYSQL_ROOT_PWDInit123 WEB_ROOT/var/www/html yum install -y epel-release nginx mariadb-server php-fpm php-mysqlnd systemctl start mariadb systemctl enable mariadb # 首次启动后设置 root 密码已有密码时跳过 mysqladmin -uroot password ${MYSQL_ROOT_PWD} 2/dev/null || echo root 密码已设置 # 写一个 PHP 探针页验证 PHP 能连上数据库 cat ${WEB_ROOT}/index.php EOF ?php $conn new mysqli(127.0.0.1, root, Init123); if ($conn-connect_error) { die(DB down: . $conn-connect_error); } echo LNMP OK; ? EOF systemctl restart nginx php-fpm curl -I http://127.0.0.1/index.php代码里的set -e让脚本在任意一步失败时立即退出避免后面继续执行造成连锁错误2/dev/null || echo处理 mysqladmin 首次运行时的退出码差异防止脚本被一个「已知会失败」的步骤卡死探针页用 PHP 的 mysqli 连数据库是为了验证 PHP-FPM 到 MariaDB 的链路是通的。关键参数只有一个MYSQL_ROOT_PWD按自己环境改。写完脚本别急着验收把set -e删掉两行人为制造一个失败场景看输出能不能帮你定位问题——能定位才算真的会了。备份脚本是另一个必练项思路固定mysqldump 做全备、binlog 做增量cron 定时调度。全备命令用mysqldump --single-transaction --master-data2 -uroot -p--single-transaction是 InnoDB 的在线备库关键参数不加它备份期间写入会被阻塞--master-data2会在备份文件里自动记录当时的 binlog 位点恢复时接着增量往后追。增量不用写复杂逻辑定时FLUSH LOGS滚动 binlog再把滚动出来的旧文件归档就够0 2 * * * /root/scripts/mysql_full_backup.sh 30 * * * * /root/scripts/mysql_binlog_archive.sh第一条每天凌晨两点做全备第二条每半小时归档一次 binlog两个时间点错开避免备份窗口叠加。恢复顺序永远是先做全备再用 binlog 把数据追到误操作时间点之前所以 binlog 归档的保存周期至少要和全备周期匹配别把增量链掐断。2.4 网络能解决日常故障就够网络这块文档提的是「掌握路由器交换机基础配置能解决日常网络故障」注意这个定位——不是让你考网络工程认证而是给运维排查兜底。云环境里最常用的其实是四个检测命令ping测连通、telnet ip port测端口、ss -lntp看监听、curl -I看 HTTP 响应。我排障的顺序永远是先 ping 网关通不通再 telnet 目标端口起没起最后 curl 看应用层返回什么。三步下来问题在哪一层基本就清楚了。路由器交换机这块掌握 VLAN 划分、静态路由、链路聚合这三个概念就够应付绝大多数岗位面试。碰到「两台机器不通」的故障排查路径就一个先确认是不是同一网段跨网段看网关有没有路由同网段直接看网关和防火墙。云上还要多查一步安全组规则这相当于云厂商的外围防火墙经常有人在服务器里折腾半天最后发现是安全组没放行。文档后面 LVS 要用的网络基础到集群阶段再补也来得及别在第一阶段钻网络底层两周时间花在 Linux 和脚本上回报率更高。3. MySQL 主从与集群把单机数据库升级成高可用MySQL 阶段给了两周目标看起来简单——CRUD、权限、主从。但这两个周其实是整条路线里最容易拉开差距的位置主从复制牵涉 binlog、GTID、半同步、读写分离后面的 PCS 集群和 RabbitMQ 集群又建立在「节点间通信、数据一致、故障切换」这些同样的概念上。数据库没学透集群阶段会寸步难行。3.1 CRUD 与权限主从之前先过基础关CRUD 不是背四条语句而是练出「写 SQL 前先想索引」的直觉。云运维场景里你天天会面对的是慢查询EXPLAIN SELECT ...看 type 字段如果是 ALL说明全表扫描数据量上来就会拖垮业务看 key 字段有没有命中索引没命中就考虑加索引。练 SQL 用学校教材就行但建议自己建表灌几万条测试数据再查否则感觉不到索引的威力。用户权限分配要动手实践。MySQL 8 默认认证插件是 caching_sha2_password很多老程序不认主从也偶尔栽在这。给一个最小授权组合-- 创建复制专用账号只给复制权限 CREATE USER repl% IDENTIFIED BY Repl123; GRANT REPLICATION SLAVE ON *.* TO repl%; -- 创建应用账号限定库和来源网段 CREATE USER app10.0.0.% IDENTIFIED BY App123; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO app10.0.0.%;第一段创建复制专用账号权限只给 REPLICATION SLAVE不给多余权限第二段给应用账号只授 appdb 库的增删改查并且限定来源网段 10.0.0.%——这是生产环境最起码的权限边界。注意 MySQL 8 的 GRANT 语法不能带 IDENTIFIED BY必须先 CREATE USER 再 GRANT。还要养成随时备份的习惯mysqldump就是运维的后悔药哪怕只是改个权限前先备一份也不亏。3.2 MySQL 主从binlog 配置与 GTID主从搭建流程已经很成熟但很多人照着文档搭完发现不生效问题大多出在 server-id 没显式设置或者两台机器的配置文件里 binlog 格式不对。我按 GTID 模式给一个最小配置这是 MySQL 5.7 之后的主流方式# 主库 /etc/my.cnf [mysqld] server-id1 log-binmysql-bin binlog_formatrow gtid_modeON enforce_gtid_consistencyON # 从库 /etc/my.cnf [mysqld] server-id2 log-binmysql-bin relay-logrelay-bin read_onlyON gtid_modeON enforce_gtid_consistencyON参数含义log-bin开启二进制日志主从复制的数据源头binlog_formatrow是行级复制比 statement 安全不会因为函数或存储过程导致主从数据不一致gtid_modeON开启全局事务标识让从库自动追踪主库事务省去手动指定 binlog 文件和位置的麻烦read_onlyON防止应用误写从库。gid 配置好后在主库执行授权再在从库执行-- 基于 GTID 自动定位主库前提是两侧 gtid_mode 都开启 CHANGE MASTER TO MASTER_HOST10.0.0.11, MASTER_PORT3306, MASTER_USERrepl, MASTER_PASSWORDRepl123, MASTER_AUTO_POSITION1; START SLAVE; SHOW SLAVE STATUS\GMASTER_AUTO_POSITION1表示基于 GTID 自动定位这是和传统日志位点复制最大的区别——传统方式要手动记 MASTER_LOG_FILE 和 MASTER_LOG_POS从库宕机恢复后很容易错位。SHOW SLAVE STATUS\G的输出重点看两行Slave_IO_Running: Yes和Slave_SQL_Running: Yes任意一个是 No 就按这个顺序查先看 Last_IO_Error 或 Last_SQL_Error 字段的原始报错再回去看两台机器 server-id 是否冲突再看防火墙有没有放 3306最后确认 repl 账号密码没敲错。3.3 集群扩展LVS、Keepalived 与 RabbitMQ集群阶段的考核是「独立实现 RabbitMq 集群创建」但文档先列了 LVS 和 PCS这个顺序是有道理的。LVS 解决四层负载均衡Keepalived 解决 VIP 漂移——这两个理解了RabbitMQ 集群里的节点发现、镜像队列、故障转移都是同一套思想。LVS 三种模式先分清模式原理后端要求适用场景NAT调度器改写报文目标地址后端网关指向调度器小规模简单环境DR改写 MAC 地址转发性能最高后端 lo 绑定 VIP 并抑制 ARP生产环境最常用TUNIP 隧道封装转发后端支持隧道协议跨机房多活调度算法记住 rr轮询和 wlc加权最少连接就够日常面试了。Keepalived 的核心配置是虚拟路由组里的 priority 和 virtual_ipaddress主节点 priority 大宕机后 VIP 自动漂到备节点。排查时记住一句话VIP 漂移失败先看ip addr里有没有 VIP再看两个节点 priority 是不是配反了最后看组播报文通不通。PCS 集群了解创建流程即可它和 RabbitMQ 是两个方向PCS 管资源和服务的高可用RabbitMQ 集群是消息中间件本身的横向扩展。RabbitMQ 集群搭建有三个关键点所有节点的 erlang cookie 必须一致/var/lib/rabbitmq/.erlang.cookie所有节点能互相解析 hostname/etc/hosts 写全加入集群用rabbitmqctl join_cluster rabbitnode1。镜像队列是在普通集群之上把队列复制到多个节点设置策略即可# 把所有队列在集群所有节点上做镜像防止单节点故障丢消息 rabbitmqctl set_policy ha-all ^ {ha-mode:all}这条命令把名字匹配正则^即所有队列的队列设为 ha-mode all每个节点都持全量镜像。实际生产里别无脑 all节点多了内存占用翻倍用{ha-mode:exactly,ha-params:2}指定副本数更稳。4. OpenStack 与 Ansible手动云平台与自动化的组合拳OpenStack 和 Ansible 这两个阶段放在一起是整条路线里最考验耐心的一段。OpenStack 要理解核心组件怎么协作Ansible 则把之前攒下的 Linux、MySQL、集群知识变成可重复执行的代码——这两周学完你才算从「操作员」变成「能交付的人」。4.1 OpenStack 组件先懂各自分工再敲命令OpenStack 部署像个黑匣子文档给的考核目标是「参考文档实现部署」但你动手敲部署脚本之前先把组件职责背下来会高效得多。Nova 管计算虚拟机的创建和调度全走它Neutron 管网络虚拟网桥、安全组、浮动 IP 都在这Glance 管镜像ISO、qcow2 归它管Cinder 管块存储也就是云硬盘Keystone 管认证所有命令的第一步都是用它的令牌。组件关系就看一条链路用户用 keystone 令牌 - 调 nova 创建虚拟机 - nova 去 glance 拉镜像 - Neutron 分配 IP - Cinder 提供数据盘。命令层面我建议把这三个练成条件反射# 上传镜像注意磁盘格式必须与文件真实格式一致 openstack image create --file centos7.qcow2 --disk-format qcow2 --container-format bare centos7 # 创建虚拟机规格RAM 单位是 MB磁盘单位是 GB openstack flavor create --vcpus 2 --ram 4096 --disk 40 m1.medium # 创建实例network 名称必须先 openstack network list 确认 openstack server create --flavor m1.medium --image centos7 --network provider-net web01第一条上传镜像--disk-format qcow2必须和文件真实格式一致写成 raw 会导致实例起不来第二条创建规格--ram 4096是 4GB 内存--disk 40是 40GB 根盘第三条创建实例容易错的参数是--network名称写错会直接报 network not found。排错时顺序反着来实例状态 ERROR先openstack server show web01看 fault 字段描述的原始错误再上计算节点tail -f /var/log/nova/nova-compute.log看后台日志。4.2 Ansible从 ad-hoc 到 Playbook 再到 RoleAnsible 的考核是「对三台云主机安装高可用数据库集群」这个任务比单机部署复杂在一点三台机器的配置有差异主库要开 binlog从库要设 read_onlyVIP 要落在当前主库上。用 ad-hoc 命令一条条敲能完成但不可复现Playbook 才是交付级方案。先看连通性验证ansible all -i hosts -m ping-i hosts指定 inventory 文件-m ping不是 ICMP ping而是检测目标机 Python 环境和 SSH 通道是否可用。hosts 文件长这样[mysql] db1 ansible_host10.0.0.11 db2 ansible_host10.0.0.12 db3 ansible_host10.0.0.13 [mysql:vars] ansible_userroot ansible_ssh_private_key_file/root/.ssh/id_rsa server_id1连通验证跑通后Playbook 至少包含四个任务安装 mariadb、分发 my.cnf 模板、启动服务设开机自启、创建复制账号。模板里用{{ server_id }}这类变量区分主从每台机器的 server_id 在 hosts 文件里单独指定避免两台机器配成一样的 ID 导致复制错乱--- - name: 配置 mariadb 主从 hosts: mysql tasks: - name: 安装 mariadb yum: name: mariadb-server state: present - name: 分发 my.cnf 模板 template: src: my.cnf.j2 dest: /etc/my.cnf notify: restart mariadb handlers: - name: restart mariadb systemd: name: mariadb state: restartednotify和handlers是 Playbook 里的联动机制只有模板内容真的变了才会触发后面的重启动作避免每次跑 playbook 都无故重启数据库。Roles 则是把模板、任务、变量拆成固定目录结构roles/mysql/{tasks,templates,vars,handlers}适合团队复用但不用一上来就追求 role 化先把 Playbook 写顺。4.3 Python用调 API 的方式学语法Python 在这个路线里不是编程课是「自动化运维的最后一公里」。飞机大战那个项目练的是语法基本功变量、循环、函数、类两周时间合适。但真正和运维绑定的是后面那句考核——使用 Python 调用 API 实现创建 flavor。这是把 OpenStack 和 Python 串起来的关键你已经会用命令行创建 flavor现在把它变成可编程的# 导入 openstacksdk连接参数与 OpenStack 环境变量一一对应 from openstack import connection conn connection.Connection( auth_urlhttp://10.0.0.10:5000/v3, project_nameadmin, usernameadmin, passwordAdmin123, region_nameRegionOne ) # 调用 compute 服务的 create_flavor返回 flavor 对象 flavor conn.compute.create_flavor( namepython-m1.small, ram2048, vcpus2, disk20 ) print(flavor.id)connection.Connection封装了认证和所有资源操作auth_url 指向 keystone 的 v3 端点project_name 和 username 是你在 OpenStack 里的租户和账号。create_flavor返回的对象包含 id、name 等属性flavor.id就是后续创建虚拟机要用的规格 ID。如果环境没有 openstacksdk退而求其次用 requests 直接调 API 也行但要自己处理 token 获取和过期刷新代码量会翻倍。学 Python 的边界记住一条不要往 web 开发方向跑你的目标是两周后能写脚本批处理 OpenStack 资源不是写业务系统。5. 避坑按这条路线自学会翻车的五个典型问题这条路线我帮不少人带过以下五个问题几乎每个人都会踩到个别能卡一周。每条按「现象 → 原因 → 解决」写可以直接对照排查。5.1 看视频两小时动手十分钟——时间分配倒挂现象一周下来视频看了十几个自己敲的命令不超过五条学到第三周前两章的知识已经模糊。原因视频是按作者的节奏走的不是按你的节奏看一遍很轻松动手才暴露问题大脑天然倾向轻松的那边。解决强制按「看 20 分钟视频动手 40 分钟」循环Shell 阶段尤其如此——看完变量和循环就去写一个猜数字脚本。看着是耽误进度实际是在赚动手次数脚本能力是敲出来的不是看出来的。5.2 MySQL 主从建好了但 Slave_SQL_Running 一直是 No现象IO 线程 YesSQL 线程 No从库数据停在一个旧位点。原因绝大多数是 SQL 线程在重放某个事务时出错比如主库上的 DDL 在从库执行失败、主从初始数据不一致、或者 GTID 事务已经被从库执行过又重复变更。解决先SHOW SLAVE STATUS\G看 Last_SQL_Error 具体报错若是因为重复执行导致的事务冲突可以用STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER 1; START SLAVE;跳过一条错误。但要提醒自己这是缓兵之计治本要重新核对两侧数据一致性至少对关键表SELECT COUNT(*)对比一下正式环境用 pt-table-checksum。5.3 OpenStack 部署按文档敲报错连环现象文档是给一套理想环境写的你的两台虚拟机配置或 IP 段不完全一致装到 Neutron 配置步骤时节点起不来日志连环报错。原因OpenStack 部署集群默认控制节点和计算节点互通、hostname 解析正确、时间同步一致这些前置条件没保证后面全是连锁反应。解决装之前做三个自查——/etc/hosts里控制节点和计算节点的 hostname 是否互相能解析chronyc sources和timedatectl确认时间同步ping两个节点的管理 IP 通不通。这三个没问题再动包管理器至少能省掉六成未知报错。5.4 Ansible 连不上目标主机SSH 指纹与免密失败现象ansible all -m ping报 Failed to connect to the host via ssh但直接ssh ip能登录。原因Ansible 默认需要 SSH 免密且首次连接会做 host key 检查目标机的 known_hosts 没有记录时交互式确认会打断自动化流程。解决先用ssh-copy-id root目标IP把公钥推过去再在 ansible.cfg 里声明[defaults] host_key_checking False remote_user root private_key_file /root/.ssh/id_rsahost_key_checking False是学习环境常用的开关生产环境建议保留 True 并预置 known_hosts。更隐蔽的坑是控制节点 /root 目录权限被改成 777sshd 会拒绝密钥认证chmod 755 /root之后再重试。5.5 Docker 镜像拉不动、构建慢根源在镜像源没换现象docker pull 在几 KB/s 速度徘徊或者直接 timeoutdocker compose 起 webmall 卡在拉镜像。原因默认 docker hub 在国内访问不稳定网络路径上的失败被 docker daemon 反复重试表现就是长时间卡住。解决改 /etc/docker/daemon.json 配置镜像加速器改完重启cat /etc/docker/daemon.json EOF { registry-mirrors: [https://docker.m.daocloud.io] } EOF systemctl daemon-reload systemctl restart docker构建镜像还有一条血泪经验把依赖安装和源码拷贝分成两个 RUN充分利用 Dockerfile 的分层缓存否则每次改源码都要重装一遍全量依赖。镜像源地址各地区差异大选一个快速访问的就够别迷信大厂源一定快实测为准。6. 路线收口用 CICD 把 Docker 与 K8s 变成交付链路Docker 三周的落点是「独立部署 webmall」——用 docker-compose 把前端、后端、数据库编排起来练的是镜像构建、容器互联、数据卷挂载和端口映射能跑通这条链路容器化部署的闭环就建立了。K8s 三周的落点则是「基于 Kubernetes 构建持续集成 CICD」这已经不是单纯容器编排而是把前面所有阶段串成一条生产链路代码提交触发构建、构建产物做成镜像、镜像推送到仓库、K8s 滚动更新应用。走到这里你其实一只脚踏进了 PaaS 的范畴——K8s 之上承载的就是应用平台能力。建议在这个阶段实现一个最小闭环用 GitLab 放代码CI 里跑构建产物是 Docker 镜像推送到自建 registry最后一步用到 Kubernetes 的滚动更新能力。核心命令只有一条但含义很重kubectl set image deployment/webmall webmallharbor.example.com/library/webmall:v1.2.3set image是 K8s 中最常用的发布动作把 deployment/webmall 中名为 webmall 的容器镜像更新到指定版本。K8s 会先启动新副本等新的 Ready再摘掉旧 Pod发布全程不中断。v1.2.3这种版本号或 Git commit 短哈希是回滚的依据——出了问题kubectl rollout undo deployment/webmall一键回到上一个稳定版本这就是把镜像版本管理好最大的红利。我带人走到这一步时养成了一个习惯每个阶段考核完成都把当时的命令和踩坑记录写进一个 markdown 文件按日期归档。后来这些笔记成了我再带人时最快的备课材料从那以后每次接手新环境第一件事也一定是先建目录记命令而不是急着敲第一条指令。希望这套路线和这些坑位记录能帮你少走几个弯路。本文还有配套的精品资源点击获取