1. 为什么非得在 VMware 里装 Ubuntu?——从开发真实场景倒推环境选型逻辑
我第一次在 VMware 上搭 Ubuntu 开发环境,不是因为“看起来很酷”,而是被现实逼的:手头只有 Windows 笔记本,但项目要求必须跑在 Linux 内核上;客户给的交叉编译链只提供 .deb 包;CI 流水线用的是 Ubuntu 22.04 LTS 镜像,本地测试不一致就等于白干。这时候,WSL 虽然轻量,但它本质是子系统,不是完整内核——比如你没法加载 real-time patch、没法挂载 /dev/video0 设备、没法调试 USB 协议栈底层驱动。而物理机双系统?重启一次切环境要 90 秒,改一行代码就要等 3 分钟,效率直接砍半。
VMware Workstation Pro(注意不是 Player)成了唯一解:它能虚拟出完整的 x86_64 架构 Linux 环境,支持 USB 3.0 直通、PCIe 设备透传(对 FPGA/PCIe 加速卡开发至关重要)、GPU 硬件加速(CUDA 开发绕不开),更重要的是——它和宿主 Windows 共享剪贴板、拖拽文件、自动适配分辨率,开发体验接近原生。这不是“能用就行”的妥协方案,而是经过三年嵌入式 + 大数据 + AI 工具链开发验证后的最优路径。
你可能看到网上一堆“VMware 安装 Ubuntu 教程”,但绝大多数漏掉了最关键的判断点:你的开发任务到底需要什么级别的 Linux 环境保真度?
- 如果只是写 Python 脚本、跑 Jupyter Notebook、学 Linux 命令——WSL2 完全够用,甚至更快;
- 如果要编译 Linux 内核模块、调试 USB HID 协议、跑 ROS2 的实时节点、验证 systemd service 启动顺序——VMware 是底线,不是选项;
- 如果涉及 GPU 计算(PyTorch/TensorFlow)、FPGA 开发(Vivado SDK)、ARM 交叉编译(aarch64-linux-gnu-gcc)——必须开 VMware 的 3D 图形加速和 CPU 虚拟化(Intel VT-x/AMD-V),且 BIOS 中必须启用;
提示:别被“Ubuntu 官网下载 ISO”误导。Ubuntu Desktop 24.04 LTS 镜像默认启用了 Wayland 显示服务器,而 VMware 17.x 对 Wayland 支持不稳定,会导致分辨率无法自适应、复制粘贴失效、甚至黑屏。实测下来,Ubuntu 22.04.4 LTS Desktop(使用 Xorg 会话)仍是 VMware 下最稳的开发基线版本——它自带 kernel 5.15,对大多数外设驱动兼容性极佳,且官方长期维护至 2027 年。
关键词“vmware虚拟机安装ubuntu”背后藏着一个隐性需求:不是“怎么装”,而是“装完之后能不能立刻干活”。所以本文不讲“下一步→下一步→完成”,而是从开发者的实际工作流出发,拆解每一个环节背后的硬约束:为什么内存必须分 4GB 而不是 2GB?为什么网络必须用桥接模式而非 NAT?为什么 SSH 服务默认关闭?这些不是配置技巧,而是 Linux 开发环境的底层契约。
2. VMware 配置的五个致命细节——90% 的人卡在第一步
很多人装完 Ubuntu 发现“连不上网”“复制不了文字”“屏幕拉伸变形”,不是 Ubuntu 有问题,而是 VMware 的默认配置和开发需求存在三处根本性错位。下面这五项设置,必须在安装前手动调好,否则重装一次浪费 20 分钟。
2.1 CPU 与内存分配:不是越多越好,而是够用+预留
VMware 默认给虚拟机分配 2 核 CPU、2GB 内存。这对桌面浏览够用,但对开发是灾难:
- 编译一个中等规模 C++ 项目(如 ROS2 Foxy),4 核 CPU 可将时间从 12 分钟压缩到 3 分钟;
- VS Code + Docker Desktop + Chrome 三个进程常驻,内存占用轻松突破 3.2GB;
- 更关键的是:Linux 内核的 slab 分配器需要连续物理内存页,如果宿主机内存碎片化严重,VMware 动态内存回收机制会触发频繁 swap,导致编译时卡顿如 PPT。
实操建议:
- CPU 核心数 = 宿主机物理核心数 - 1(留一核给 Windows 系统调度);
- 内存固定分配 4GB(不是“最大 4GB”,而是“启动即占满 4GB”);
- 在 VMware 设置 → 内存 → 勾选“为虚拟机预留所有内存”——这会禁用内存气球(ballooning)技术,避免运行时内存被 Windows 回收;
注意:如果你的宿主机是 16GB 内存,分 4GB 给虚拟机后,Windows 剩余 12GB 完全够用;但若宿主机只有 8GB,强行分 4GB 会导致 Windows 卡死。此时应降级为 3GB,并关闭 Ubuntu 的图形特效(
gsettings set org.gnome.desktop.interface enable-animations false)。
2.2 网络模式选择:NAT 是陷阱,桥接才是开发刚需
VMware 提供三种网络模式:NAT、桥接、仅主机。网上教程几乎全教 NAT,因为它“能上网”。但开发环境需要的是双向可达性:
- 你用 VS Code Remote-SSH 连接虚拟机,宿主机必须能 ping 通虚拟机 IP;
- 虚拟机里跑的 Flask 服务(localhost:5000),宿主机浏览器必须能直接访问;
- Docker 容器暴露的端口(如 8080),宿主机需能 curl 测试;
NAT 模式下,虚拟机 IP 是 192.168.199.x 段,宿主机在 192.168.1.x 段,天然隔离;而桥接模式让虚拟机获得和宿主机同网段的独立 IP(如宿主机是 192.168.1.100,虚拟机就是 192.168.1.101),这才是开发所需的真实网络拓扑。
配置步骤:
- VMware 设置 → 网络适配器 → 选择“桥接模式”;
- 勾选“复制物理网络连接状态”(确保宿主机 WiFi 断开时虚拟机也断网,避免路由混乱);
- 关键一步:在 Ubuntu 安装过程中,不要跳过网络配置——手动设置 IPv4 为“手动”,填入:
- 地址:192.168.1.101(比宿主机 IP 小 1 或大 1)
- 掩码:255.255.255.0
- 网关:192.168.1.1(你的路由器地址)
- DNS:114.114.114.114(国内最快)
这样装完就能直接ssh user@192.168.1.101,无需进系统再配。
2.3 显示设置:分辨率自适应失效的根源
VMware Tools(现在叫 Open VM Tools)是解决显示问题的核心,但很多人装完仍黑屏或模糊,原因在于:
- Ubuntu 22.04 默认启用 Wayland,而 Open VM Tools 的 Xorg 驱动不兼容 Wayland;
- VMware Tools 安装脚本会检测当前会话类型,若检测到 Wayland 就跳过 Xorg 驱动安装;
解决方案分两步:
- 安装前强制使用 Xorg:在 Ubuntu 启动菜单按
e键,找到linux行末尾,添加systemd.unit=graphical.target,然后Ctrl+X启动; - 装完立即切换会话:登录界面右下角点击齿轮图标 → 选择 “Ubuntu on Xorg”;
验证是否生效:终端执行echo $XDG_SESSION_TYPE,输出x11即正确;若为wayland,说明没切成功。
2.4 USB 控制器:没有它,STM32 调试器就是块砖
如果你做嵌入式开发(STM32/Freertos),USB 设备直通是刚需。VMware 默认不启用 USB 3.0 控制器,导致 ST-Link/V2、J-Link 无法识别。
- 设置路径:VMware → 虚拟机设置 → 硬件 → 添加 → USB 控制器 → 选择 USB 3.0;
- 关键权限:Ubuntu 中需将用户加入
dialout组,否则lsusb能看到设备,但openocd报错Permission denied;sudo usermod -aG dialout $USER # 注销重登生效 - 实测发现:某些 USB 3.0 设备(如高速摄像头)在 VMware 下需勾选“连接时连接到此虚拟机”,否则热插拔失效。
2.5 共享文件夹:比 SCP 高效 10 倍的协作方式
开发者最频繁的操作是什么?把 Windows 写的代码丢进 Ubuntu 编译。用scp每次输密码太慢,U 盘拷贝又麻烦。VMware 原生共享文件夹才是王道:
- 设置路径:VMware → 虚拟机设置 → 选项 → 共享文件夹 → 添加 → 选择 Windows 文件夹(如
D:\dev\project); - Ubuntu 中挂载点默认为
/mnt/hgfs/,但该目录权限为 root,普通用户不可写; - 正确挂载命令:
sudo mkdir -p /home/user/shared sudo mount -t vmhgfs-fuse .host:/project /home/user/shared -o allow_other,uid=1000,gid=1000 - 为避免每次重启手动挂载,写入
/etc/fstab:.host:/project /home/user/shared vmhgfs-fuse allow_other,uid=1000,gid=1000 0 0
这样cd ~/shared就能直接编辑 Windows 里的代码,保存即同步,VS Code Remote 插件可直接打开该路径。
3. Ubuntu 22.04 开发环境初始化:跳过 37 个坑的精简清单
装完系统只是开始。Ubuntu Desktop 默认带 GNOME 桌面、Snap 应用、Rhythmbox 音乐播放器——这些对开发全是负资产。下面这份初始化清单,是我三年来从 37 个踩坑记录中提炼出的最小必要集,执行完即可进入编码状态。
3.1 系统级精简:卸载 Snap,释放 1.2GB 磁盘与 CPU
Snap 是 Ubuntu 的包管理新宠,但对开发者是毒药:
- 每个 Snap 应用(如 code、firefox)自带完整运行时,占 300MB+;
snapd进程常驻,CPU 占用 5%-8%,编译时拖慢整体速度;apt update会被 snapd 抢占网络,导致包管理超时;
彻底移除命令:
sudo apt autoremove --purge snapd sudo rm -rf /var/cache/snapd/ sudo rm -rf /var/lib/snapd/ # 删除残留的 snap bin 目录链接 sudo rm /usr/bin/snap注意:移除后
sudo apt install会快 3 倍,df -h可释放 1.2GB 空间。后续所有软件用apt或curl | bash安装。
3.2 开发工具链:VS Code + GCC + CMake 的黄金组合
Ubuntu 自带gcc版本是 11.4,但很多项目(如 PX4)要求 GCC 12+。别急着apt install gcc-12,先确认:
gcc --version输出11.4.0是安全的,因为gcc是符号链接,默认指向gcc-11;- 若需 GCC 12,执行:
sudo apt install gcc-12 g++-12 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11 --slave /usr/bin/g++ g++ /usr/bin/g++-11 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 --slave /usr/bin/g++ g++ /usr/bin/g++-12 sudo update-alternatives --config gcc # 交互式选择
VS Code 安装必须用.deb包而非 Snap:
curl -fsSL https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64 -o code.deb sudo apt install ./code.deb装完立即禁用自动更新(Settings → Application → Auto Update → Disabled),避免开发中途弹窗打断思路。
3.3 中文输入法:搜狗输入法的兼容性修复
Ubuntu 22.04 的 fcitx5 框架与搜狗输入法存在冲突,表现为:
- 输入法候选框位置错乱;
- Ctrl+Space 切换失效;
- 中文标点符号显示为方块;
根治方案:
- 卸载 fcitx5:
sudo apt remove fcitx5*; - 安装 fcitx4(搜狗官方支持的版本):
sudo apt install fcitx libfcitx-qt5-1 wget https://cdn2.ime.sogou.com/dl/index/1642513517/sogoupinyin_4.1.0.1703_amd64.deb sudo dpkg -i sogoupinyin_4.1.0.1703_amd64.deb - 重启 fcitx:
fcitx -r; - 系统设置 → 区域和语言 → 输入源 → 添加 “Chinese (Sogou Pinyin)”;
实测效果:中文输入延迟 < 50ms,词库同步 Windows 版搜狗,且不会与 VS Code 的 Ctrl+Space 冲突。
3.4 SSH 服务:开启即用,无需额外配置
Ubuntu Desktop 默认关闭 SSH 服务,但远程开发必须开启:
sudo apt install openssh-server sudo systemctl enable ssh sudo systemctl start ssh验证:sudo ss -tuln | grep :22应输出tcp LISTEN 0 128 *:22 *:*。
关键安全设置:编辑/etc/ssh/sshd_config:
PermitRootLogin no(禁止 root 登录);PasswordAuthentication no(禁用密码,强制密钥登录);AllowUsers yourusername(只允许指定用户);
生成密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com" ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.101从此ssh user@192.168.1.101直接免密登录,比密码安全 100 倍。
3.5 Docker 环境:绕过 apt 仓库的镜像源陷阱
Ubuntu 官方 apt 仓库的 Docker 包版本老旧(20.10),而最新项目(如 ROS2 Humble)要求 Docker 24.0+。必须用 Docker 官方源:
# 卸载旧版 sudo apt remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt install ca-certificates curl gnupg lsb-release # 添加 Docker 官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加稳定版仓库 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 更新并安装 sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io # 加入 docker 组(免 sudo) sudo usermod -aG docker $USER newgrp docker # 立即生效,无需重启验证:docker run hello-world输出 “Hello from Docker!” 即成功。
4. 针对高频开发场景的专项优化:从 STM32 到 Hadoop 的配置要点
不同开发方向对 Linux 环境的要求差异极大。下面针对搜索热词中最常出现的三类场景,给出不可跳过的配置要点——这些不是“锦上添花”,而是“不配就编译不过”的硬性条件。
4.1 STM32/Freertos 开发:OpenOCD + ARM-GCC 的链路打通
STM32 开发的核心是调试器(ST-Link/J-Link)与 OpenOCD 的通信。常见失败现象:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg报错Error: unable to find a matching interface;- VS Code 的 Cortex-Debug 插件连接超时;
根因是 USB 权限与 OpenOCD 配置不匹配。解决方案:
- 创建 udev 规则:
(0483:3748 是 ST-Link V2 的 VID:PID,其他型号查echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-stlink.rules sudo udevadm control --reload-rules sudo udevadm triggerlsusb) - 安装 ARM-GCC 工具链:
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi - OpenOCD 配置文件
stm32f103c8t6.cfg必须包含:
注意:source [find interface/stlink-v2.cfg] transport select hla_swd source [find target/stm32f1x.cfg]hla_swd是 ST-Link 的协议,不是swd;
实测经验:ST-Link V2.1 固件需升级到 v2.j27(官网下载),否则在 Ubuntu 下无法识别 STM32F4 系列芯片。
4.2 Hadoop/Spark 开发:Java 环境与 SSH 免密的双重校验
Hadoop 伪分布式模式要求:
- Java 8 或 11(Hadoop 3.3+ 要求 Java 11);
- SSH 本机免密登录(
ssh localhost不输密码); JAVA_HOME环境变量必须指向 JDK 根目录,不能是 JRE;
配置步骤:
- 安装 OpenJDK 11:
sudo apt install openjdk-11-jdk-headless echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' >> ~/.bashrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc - 生成 SSH 密钥并启用:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys - 验证:
ssh localhost应直接进入 shell,java -version输出openjdk version "11.0.22";
注意:Hadoop 的
hdfs namenode -format命令若报错 “Cannot create directory”,大概率是JAVA_HOME指向错误或 SSH 未生效。
4.3 Python 数据科学环境:Conda 替代 pip 的必然性
pip install tensorflow在 Ubuntu 上极易失败,原因:
- pip 安装的 wheel 包依赖宿主机 GLIBC 版本,Ubuntu 22.04 的 GLIBC 2.35 与 TensorFlow 2.12 的二进制不兼容;
- numpy/scipy 的 Fortran 编译器缺失,
pip install会尝试源码编译,耗时 20 分钟且大概率失败;
Conda 的优势在于:
- 预编译二进制包,GLIBC 兼容性由 Conda 自动处理;
- 独立 Python 环境,避免系统 Python 被污染;
conda install自动解决 BLAS/LAPACK 等数学库依赖;
安装 Miniconda:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 $HOME/miniconda3/bin/conda init bash source ~/.bashrc创建数据科学环境:
conda create -n ds python=3.10 conda activate ds conda install numpy pandas matplotlib scikit-learn tensorflow pytorch实测:conda install tensorflow30 秒完成,import tensorflow as tf无报错。
5. 故障排查实战:从 “Ubuntu SSH 无法连接” 到 “Linux 解压文件乱码” 的完整链路
网上搜索热词中,“ubuntu ssh无法连接” 和 “linux 解压文件乱码” 是最高频的两个问题。它们看似独立,实则都指向同一个底层机制:字符编码与网络服务的协同失效。下面以真实排查过程还原,教你如何像老司机一样快速定位。
5.1 SSH 无法连接:三层过滤器的逐级穿透
当ssh user@192.168.1.101报错 “Connection refused” 或 “No route to host”,按以下顺序排查:
- 物理层:
ping 192.168.1.101是否通?不通则检查 VMware 网络模式是否为桥接、Ubuntu 是否获取到正确 IP(ip a查看 eth0 的 inet 地址); - 服务层:
sudo ss -tuln | grep :22是否监听?不监听则sudo systemctl status ssh查看服务状态,常见原因是sshd配置语法错误导致启动失败; - 防火墙层:Ubuntu 默认启用 ufw,
sudo ufw status verbose若为 active,则sudo ufw allow 22; - SSH 配置层:检查
/etc/ssh/sshd_config中ListenAddress是否为0.0.0.0(监听所有接口),而非127.0.0.1(只监听本地);
一个真实案例:某次更新后
sshd启动失败,日志显示fatal: missing privilege separation directory。根因是/var/run/sshd目录被误删,执行sudo mkdir -p /var/run/sshd && sudo chown root:root /var/run/sshd即恢复。
5.2 解压乱码:UTF-8 与 GBK 的编码战争
Windows 打包的 zip 文件,文件名默认用 GBK 编码,而 Linux 解压工具(unzip)默认用 UTF-8 解码,导致中文名显示为.txt。这不是 bug,是编码标准差异。解决方案有三:
- 临时解压:
unzip -O GBK archive.zip(unzip 6.0+ 支持-O指定编码); - 永久配置:编辑
/etc/unzip.conf,添加charset GBK; - 终极方案:用
7z替代 unzip,它自动识别编码:sudo apt install p7zip-full 7z x archive.zip
注意:
tar.gz文件不存在此问题,因为 tar 本身不存储文件名编码,解压时由 locale 决定。确保locale输出LANG=zh_CN.UTF-8即可。
5.3 VS Code Remote 连接失败:SSH 配置文件的隐藏陷阱
VS Code Remote-SSH 插件连接失败,错误提示 “Failed to download vscode server”,往往不是网络问题,而是 SSH 配置文件~/.ssh/config的格式错误:
- 必须用空格缩进,不能用 Tab;
Host名称不能含下划线(my_vm会失败,my-vm可用);User字段必须小写,user正确,User错误;
正确配置示例:
Host ubuntu-dev HostName 192.168.1.101 User user IdentityFile ~/.ssh/id_ed25519然后 VS Code 中Ctrl+Shift+P→ “Remote-SSH: Connect to Host” → 选择ubuntu-dev。
5.4 Docker 容器无法访问宿主机服务:网络命名空间的真相
在容器里curl http://host.docker.internal:3000报错 “Connection refused”,是因为:
host.docker.internal是 Docker Desktop for Windows/Mac 的特性,Linux 版 Docker 不支持;- 容器的网络命名空间与宿主机隔离,
127.0.0.1指向容器自身,不是宿主机;
正确方案:
- 获取宿主机在 Docker 网桥中的 IP:
ip route | awk '{print $3}'(通常为 172.17.0.1); - 在容器中
curl http://172.17.0.1:3000; - 或启动容器时加
--add-host=host.docker.internal:host-gateway(Docker 20.10+);
这个知识点救了我三次:一次是容器调用宿主机的 PostgreSQL,一次是调用本地的 Redis,一次是调试前端代理到后端 API。
6. 性能调优与长期维护:让虚拟机三年不重装的实践心得
一个稳定的开发环境,不是装完就结束,而是持续维护的结果。下面这些操作,是我维护 12 台 VMware Ubuntu 虚拟机(从 2021 年至今)总结出的“不重装秘诀”。
6.1 磁盘空间预警:自动清理 apt 缓存与旧内核
Ubuntu 每次apt upgrade都会保留旧内核,三个月后/boot分区占满导致无法更新。自动化清理脚本:
# 创建 /usr/local/bin/clean-apt.sh #!/bin/bash # 清理 apt 缓存 sudo apt clean # 删除旧内核(保留最新两个) dpkg -l | awk '/^ii linux-image-[0-9]+/{print $2}' | sort -V | sed -n '1,'$(($(dpkg -l | awk '/^ii linux-image-[0-9]+/{print $2}' | wc -l)-2))'p' | xargs sudo apt purge -y # 清理不再需要的依赖 sudo apt autoremove -y加入 crontab 每月执行:
sudo crontab -e # 添加:0 2 1 * * /usr/local/bin/clean-apt.sh6.2 时间同步:VMware Tools 的 NTP 陷阱
虚拟机长时间挂起后,系统时间会漂移,导致 Git commit 时间错乱、SSL 证书验证失败。VMware Tools 自带vmtoolsd服务,但默认不启用 NTP 同步。修复:
# 编辑 VMware Tools 配置 sudo nano /etc/vmware-tools/tools.conf # 在 [guestinfo] 下添加: [timeSync] enable = true # 重启服务 sudo systemctl restart vmtoolsd验证:timedatectl status中 “System clock synchronized” 应为 yes。
6.3 快照策略:不是“随时拍”,而是“关键节点拍”
新手常犯错误:每天拍快照,结果磁盘爆满。正确策略:
- 安装完成:拍第一个快照,命名为 “Base-Ubuntu-22.04”;
- 装完开发工具:VS Code、Docker、Java,拍 “Dev-Tools-Ready”;
- 项目初始化后:
.git仓库建好、makefile写完,拍 “Project-Booted”; - 绝不拍正在编译/下载中的状态:快照会冻结 I/O,可能导致文件损坏;
删除快照时,VMware 会合并磁盘文件,耗时较长。建议在宿主机空闲时操作。
6.4 备份方案:rsync 比 VMware 导出更高效
VMware 的 “导出为 OVF” 功能生成 10GB+ 文件,且恢复慢。生产环境用 rsync 增量备份:
# 宿主机 Windows 上安装 WSL2 Ubuntu,运行: rsync -avz --delete --exclude='*.log' --exclude='/tmp/' user@192.168.1.101:/home/user/ /backup/ubuntu-dev/每周执行一次,备份目录仅增加几百 MB,恢复时rsync -avz /backup/ubuntu-dev/ user@192.168.1.101:/home/user/即可。
最后分享一个血泪教训:某次误删
/etc/apt/sources.list,导致apt update全部失败。恢复方法不是重装,而是curl -s http://archive.ubuntu.com/ubuntu/dists/jammy/main/binary-amd64/Packages.gz | zcat | head -20查看官方源格式,再重建 sources.list。记住:Linux 环境的每个文件都有备份价值,而快照和 rsync 就是你的保险绳。