它是什么
这里的方案不是给教室添一台高配电脑,也不是让大家轮流挤在同一台 Linux 上敲命令。它是一套可复用的云端积木:GCP(Google 的云平台)的 VM 跑系统,虚拟私有云隔出“网络教室”,镜像保存标准环境,快照留回滚点;开班复制,下课还原,下一班继续用。
对 Linux培训机构 来说,每位学员的练习机、教师演示机和课后作业环境都能统一放到云端。老师不用排查“你本机装了什么版本”,学员用普通笔记本也能连到同一套环境;谁练坏了系统,只影响自己的 VM。
小白先记三件事:VM 是练习电脑,里面就是 Linux;SSH 是远程入口,像安全走进练习机的门;镜像是批量复制模板,配好一台,就能给全班生成一样的机器。虚拟私有云和快照先混脸熟:一个管隔离,一个管后悔药。
先别创建资源。打开 GCP 控制台右上角的 Cloud Shell,它是网页命令行,不用先装软件。复制执行下面命令,只检查工具、登录账号、当前项目和已开启的服务:
gcloud --version
gcloud auth list
gcloud config list
gcloud services list --enabled
为什么先查?新手常翻车在没登录、项目选错、机器建到别处,或把空列表当成命令错。看清“我在哪、有什么”,后面再建环境会踏实很多;服务里没有 Compute Engine API,先找管理员开启。
- 坑:关掉浏览器不等于关 VM,机器在云上跑就可能计费;下课时按老师要求停止或删除。
- 坑:SSH 连不上先别重装,多半是防火墙、网络规则或登录账号没选对。
- 坑:快照不是镜像,镜像也不自动保存作业;镜像用于统一发机,快照用于留后路。别全班共用一台 VM,也别随手删磁盘。
解决什么问题
对 Linux培训机构 来说,云上实训先解决的是「别让第一课卡在装环境」。学员自带电脑可能是 Windows、macOS 或不同 Linux 版本,软件包、登录工具、依赖版本都不一样;有人误删配置,老师就要从讲课变成修电脑。统一发一台干净的 Linux VM,等于把全班电脑先擦成同一张白纸,本机系统差异和依赖冲突就不会拖慢课程。
零基础先安装 Google Cloud CLI,再复制下面整段。第一条会打开浏览器登录,按提示选项目和区域;后面固定区域、机型、系统镜像,是为了让每个人看到的提示和报错尽量一致。
gcloud init
gcloud services enable compute.googleapis.com
gcloud compute instances create linux-lab-demo
--zone=asia-east1-b
--machine-type=e2-medium
--image-family=debian-12
--image-project=debian-cloud
--boot-disk-size=20GB
SNAP="linux-lab-demo-$(date +%Y%m%d%H%M%S)"
gcloud compute instances stop linux-lab-demo --zone=asia-east1-b
gcloud compute disks snapshot linux-lab-demo
--snapshot-names="$SNAP"
--zone=asia-east1-b
gcloud compute images create linux-lab-base-$(date +%Y%m%d%H%M%S)
--source-disk=linux-lab-demo
--source-disk-zone=asia-east1-b
--family=linux-training
for i in 1 2 3; do
gcloud compute instances create "linux-lab-student-$i"
--zone=asia-east1-b
--machine-type=e2-medium
--image-family=linux-training
--image-project="$(gcloud config get-value project)"
--boot-disk-size=20GB
done
gcloud compute instances start linux-lab-demo --zone=asia-east1-b
小白容易踩的坑:没开通结算、区域配额不足、同名机器重复创建,都会让创建失败;别急着重装自己的电脑,先换机器名或换区域。快照和自定义镜像也别混:快照是某个时间点的回滚点,镜像是给全班复制初始环境的模板。
教师把标准机做成自定义镜像,就能快速分发相同初始环境;结课统一回收 VM,教室电脑不再反复装系统,机器损耗和人工排障都少了。快照加自定义镜像,让误操作可回滚,特别适合讲权限、网络、服务部署这些高风险实验。出错时用最近快照开一台恢复机,比在原机上硬修更稳。
TS=$(date +%Y%m%d%H%M%S)
SNAP=$(gcloud compute snapshots list
--filter="name~^linux-lab-demo-"
--sort-by=~creationTimestamp
--limit=1
--format="value(name)")
DISK="linux-lab-rescue-disk-$TS"
VM="linux-lab-rescue-$TS"
gcloud compute disks create "$DISK"
--zone=asia-east1-b
--source-snapshot="$SNAP"
gcloud compute instances create "$VM"
--zone=asia-east1-b
--machine-type=e2-medium
--disk="name=$DISK,boot=yes,auto-delete=yes"
这段要在做过快照后再复制;它会新建恢复机和磁盘,不会覆盖原机,适合先找回文件。坑是快照、镜像、磁盘会一直占存储,名字带日期只是方便清理,不代表自动免费。
成本方面,用按需计费和关机策略控制 Linux培训机构 的多班实训成本:上课才占用计算资源,下课前复制下面整段,设置下次开机四小时后自动关机,并先停掉学生机。
for i in 1 2 3; do
gcloud compute instances add-metadata "linux-lab-student-$i"
--zone=asia-east1-b
--metadata=startup-script='#!/bin/bash
sleep 4h
shutdown -h now'
done
for i in 1 2 3; do
gcloud compute instances stop "linux-lab-student-$i" --zone=asia-east1-b
done
结课不再用了,再复制下面整段回收 VM,只执行一次。
for i in 1 2 3; do
gcloud compute instances delete "linux-lab-student-$i" --zone=asia-east1-b --quiet
done
再提醒一次:只关浏览器不等于关机;关机后 CPU 和内存通常不再计费,但磁盘、快照、镜像、公网地址仍可能产生费用;删除不可恢复,只对学生练习机做,千万别选错项目。
怎么上手
对 Linux培训机构 来说,第一次带班别急着开机器。先在 GCP 控制台新建项目、绑定结算账号,再到「结算里的预算和提醒」设 50 元、100 元邮件提醒;然后打开 Cloud Shell 复制第一段,开通计算引擎。地区选离学员近的:亚洲班先用 asia-east1,华南可看香港/新加坡,北方或日本可看东京,SSH 打字更不卡。坑:预算只提醒不自动关机;项目没切到新建的那个,机器会建错地方。
PROJECT_ID=$(gcloud config get-value project)
echo "当前项目:$PROJECT_ID"
REGION="asia-east1"
ZONE="asia-east1-b"
NET="linux-class-vpc"
SUBNET="linux-class-subnet"
TAG="linux-class"
gcloud services enable compute.googleapis.com
gcloud compute networks describe "$NET" >/dev/null 2>/dev/null || gcloud compute networks create "$NET" --subnet-mode=custom
gcloud compute networks subnets describe "$SUBNET" --region="$REGION" >/dev/null 2>/dev/null || gcloud compute networks subnets create "$SUBNET" --network="$NET" --region="$REGION" --range=10.10.0.0/24
gcloud compute firewall-rules describe "${NET}-allow-ssh" >/dev/null 2>/dev/null || gcloud compute firewall-rules create "${NET}-allow-ssh" --network="$NET" --allow=tcp:22 --source-ranges=0.0.0.0/0 --target-tags="$TAG"
gcloud compute firewall-rules describe "${NET}-allow-course" >/dev/null 2>/dev/null || gcloud compute firewall-rules create "${NET}-allow-course" --network="$NET" --allow=tcp:8080 --source-ranges=0.0.0.0/0 --target-tags="$TAG"
这段建了独立网络,只放行 22 和示例课程端口 8080。为什么不用默认网络?它自带几条规则,新手常以为只开 SSH,其实还开了别的。若课程不用 Web,8080 就别开;SSH 对全网开放只适合临时课堂,正式班请限制来源 IP。
控制台也能一台台点,下面用 gcloud 一次做完:把常用软件、练习账号、教学脚本写进启动脚本,先创建 01 号 Linux VM,再复制到 02、03;编号加长就是全班名单。软件特别多时,可把验收后的 01 号保存成自定义镜像,之后从镜像开课更快。
printf '%sn'
'#!/bin/bash'
'set -e'
'apt-get update'
'DEBIAN_FRONTEND=noninteractive apt-get install -y vim curl git net-tools sudo'
'for u in student01 student02; do if ! id "$u" >/dev/null 2>/dev/null; then useradd -m -s /bin/bash "$u"; fi; echo "$u:LinuxLab@123" | chpasswd; usermod -aG sudo "$u"; done'
'mkdir -p /opt/lab'
'printf "%sn" "#!/bin/bash" "echo 欢迎来到 Linux 练习环境" > /opt/lab/hello.sh'
'chmod +x /opt/lab/hello.sh'
> startup.sh
for i in 01 02 03; do
gcloud compute instances describe "linux-lab-$i" --zone="$ZONE" >/dev/null 2>/dev/null ||
gcloud compute instances create "linux-lab-$i"
--zone="$ZONE"
--machine-type=e2-medium
--network="$NET"
--subnet="$SUBNET"
--image-family=debian-12
--image-project=debian-cloud
--boot-disk-size=20GB
--tags="$TAG"
--metadata-from-file=startup-script=startup.sh
done
启动脚本不是开机瞬间跑完,等一两分钟,确认教学脚本能跑后,课前给 01 号做快照,学员练坏了能回到初始状态。固定密码和管理员权限只适合演示,正式课要改密或收紧权限。
DISK=$(gcloud compute instances describe linux-lab-01 --zone="$ZONE" --format='value(disks[0].source)' | sed 's|.*/||')
SNAP="linux-lab-init-$(date +%Y%m%d%H%M%S)"
gcloud compute disks snapshot "$DISK" --snapshot-names="$SNAP" --zone="$ZONE"
课后一定先导出记录,再停机或删除:机器一停,SSH 就进不去;一删,本机历史可能没了。命令历史和登录日志可看学员操作,云平台审计日志能对照谁改过资源,评分更公平。
mkdir -p class-logs
gcloud services enable logging.googleapis.com
for i in 01 02 03; do
gcloud compute ssh "linux-lab-$i" --zone="$ZONE" --command='sudo tar czf /tmp/lab-log.tgz /home/*/.bash_history /var/log/auth.log 2>/dev/null || true'
gcloud compute scp "linux-lab-$i:/tmp/lab-log.tgz" "class-logs/linux-lab-$i.tgz" --zone="$ZONE"
done
gcloud logging read 'resource.type="gce_instance" AND logName:"cloudaudit.googleapis.com"' --limit=200 --format=json > class-logs/gcp-audit.json
停机用第一段,省钱且可恢复;确认快照和 class-logs 已保存后,才用第二段删除。两段二选一,别连着复制。
for i in 01 02 03; do gcloud compute instances stop "linux-lab-$i" --zone="$ZONE" --quiet; done
for i in 01 02 03; do gcloud compute instances delete "linux-lab-$i" --zone="$ZONE" --quiet; done
与替代方案对比
对 Linux培训机构 来说,选环境不是比谁高级,而是看课后能否快速恢复、下一班能否一模一样开起来:
- 本地机房:断网也能练,稳定可控;但采购、维护、扩容要排期,上一班留下的用户、服务、规则要人工清,不适合短周期班级反复重置。
- 本地虚拟机:装在学员电脑上,零云费;但内存、CPU 虚拟化、系统网络模式各不相同,同一镜像跑出不同结果,教师很难统一排障。
- GCP 云端 VM:可批量创建、快照回滚、权限隔离和远程访问;课前发同一套环境,课后一键还原,改坏一台不拖累别人。代价是要理解计费与网络规则:VM、磁盘、公网 IP、快照可能收费,端口还受 VPC 防火墙、路由限制。
对比时先别装软件。进入任意方案的 Linux 终端后,直接复制下面几行做体检,不需要管理员权限:
cat /etc/os-release
ip -br addr
ping -c 3 8.8.8.8
ss -tuln
为什么这么做:分别看系统版本、网卡 IP、出网情况、监听端口。老师收集输出,就能判断环境是否一致、网络是否通、服务有没有起来。小白常踩的坑:随手用管理员权限改配置;看到端口在监听就以为公网能访问,其实云端还要放行防火墙;以为关机就不收费,磁盘、公网 IP、快照仍可能计费;快照回滚会覆盖课后改动,作业要先交。
结论:只讲基础命令,本地虚拟机足够;涉及服务部署、多机网络、端口放行和故障恢复,云端 VM 更贴近生产,GCP 的批量创建、快照回滚、权限隔离和远程访问才更省教师时间。
最佳实践
刚开课最容易犯的错,是图省事把所有班级塞进同一个项目、把一把私钥发到群里。一旦有人 rm -rf 或误删磁盘,全班一起停课;月底账单也分不清是谁烧的钱。正确做法是「一班一项目」,学员账号只给「能看、能登自己那台机」的权限。下面这段直接粘进 Cloud Shell 就能跑,项目 ID 带时间戳,不会和别人撞名:
CLASS="linux-01"
PROJ="gcpok-$CLASS-$(date +%s)"
gcloud projects create "$PROJ" --name="Linux培训班-$CLASS"
gcloud config set project "$PROJ"
gcloud projects update "$PROJ"
--update-labels=class=$CLASS,course=linux-basic,owner=zhangsan
gcloud projects add-iam-policy-binding "$PROJ"
--member="user:xueyuan@example.com" --role="roles/compute.viewer"
gcloud projects add-iam-policy-binding "$PROJ"
--member="user:xueyuan@example.com" --role="roles/compute.osLogin"
小白坑:owner= 和邮箱要换成真人;标签不是随手备注,是后面筛账单的唯一依据,别留空。私钥千万别发微信群,开了上面的 OS Login 后,人走了删账号即可,不用挨台机删公钥。
PROJ="$(gcloud config get-value project)"
BILL="$(gcloud billing accounts list --format='value(name)' --limit=1)"
gcloud billing projects link "$PROJ" --billing-account="$BILL"
gcloud services enable compute.googleapis.com billingbudgets.googleapis.com --project="$PROJ"
gcloud billing budgets create --billing-account="$BILL"
--display-name="$CLASS-预算" --budget-amount=300 --currency-code=CNY
--threshold-rule=percent=0.8 --threshold-rule=percent=1.0
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
预算到 80% 就发邮件,比月底看到账单再心跳快得多。小白坑:若提示找不到结算账号,先让管理员去控制台绑一次付款方式,这步一学期只做一次;新项目默认没开 Compute API,所以上面特意先 services enable,漏了这行后面全报错。
最烧钱的其实是忘了关机:别指望讲师记得,让机器自己下班。把下面这段放进虚拟机跑一次,周一到周五 22 点自动停:
sudo tee /etc/cron.d/auto-stop <<'EOF'
0 22 * * 1-5 root /sbin/shutdown -h now
EOF
sudo systemctl restart cron
小白坑:关机不等于删除,磁盘还在计费,真结课要走回收;cron 用的是机器本地时区,先 timedatectl 确认是 Asia/Shanghai。
安全上只留一条门缝:SSH 交给平台托管登录,22 端口只对你当前的公网 IP 开,默认那两条「全网可连」的规则要删。命令会自动取你现在的出口 IP,不用手抄:
MY_IP="$(curl -s ifconfig.me)/32"
gcloud compute firewall-rules create allow-ssh-teacher
--allow=tcp:22 --source-ranges="$MY_IP" --target-tags=lab-vm
gcloud compute firewall-rules delete default-allow-ssh default-allow-rdp --quiet
小白坑:回家换 WiFi、开手机热点后 IP 会变,连不上不是机器坏了,重跑第一行更新规则就行;图方便填 0.0.0.0/0,半夜就会被扫。
最后在 Cloud Shell 里把「初始化 / 检查 / 回收」固化成一个小工具,新讲师不用背控制台点哪里,照着敲就不会漏步骤:
sudo tee /usr/local/bin/labctl <<'EOF'
#!/bin/bash
Z="asia-east1-b"
case "$1" in
init) gcloud compute instances create lab-vm --zone=$Z
--machine-type=e2-micro --tags=lab-vm
--image-family=debian-12 --image-project=debian-cloud ;;
check) gcloud compute instances list --filter="name=lab-vm" ;;
clean) gcloud compute instances delete lab-vm --zone=$Z --quiet ;;
*) echo "用法: labctl init | check | clean" ;;
esac
EOF
sudo chmod +x /usr/local/bin/labctl
labctl check
把这几段存进班级手册:开课前 init,中途 check,结课 clean 再核对预算标签。流程写下来,才不会「换个讲师就换一套环境」。
常见问题(FAQ)
没有服务器基础,能跟上 Linux培训机构的云端实训吗?
可以。先学连接 VM、基本命令和文件权限,再做服务部署实验。
学员误删系统文件怎么办?
用课前快照或自定义镜像重建 VM,教师可把恢复过程变成演练。
GCP 实训会不会很贵?
按课时开机、课后停机,配合小规格 VM 和预算提醒,成本可控。
需要给每台 VM 配公网地址吗?
只放行 SSH 和课程端口即可,也可用堡垒机或平台托管登录减少暴露。
和线下机房相比,考试评分方便吗?
可通过启动脚本、日志和操作结果自动留痕,便于教师复盘评分。
不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。
