如何将Ubuntu 16.04服务器完整复制到另一台Ubuntu服务器
Hey Ricky, 刚好我之前帮朋友搞定过几乎一模一样的Ubuntu服务器迁移需求——从一台配置好的16.04机器把整个Node应用环境搬到全新服务器。下面给你整理几个最实用的方案,你可以根据自己的情况挑:
方案一:全量系统同步(最省心,1:1复刻旧环境)
这个方法适合你想完全复制旧服务器的所有配置,包括系统设置、软件、应用,一步到位。
步骤如下:
- 确保新服务器能通过SSH访问旧服务器,两边都安装
rsync和sshpass(如果需要密码登录的话):
在两台机器上执行:sudo apt-get update && sudo apt-get install rsync sshpass -y - 在新服务器上运行同步命令(注意替换成你的旧服务器用户名和IP):
解释一下参数:sudo rsync -avz --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} old_user@192.168.x.x:/ /-avz:归档模式+显示详细信息+压缩传输--delete:删除新服务器上旧服务器没有的文件,保持完全一致--exclude:排除虚拟文件系统和临时目录,这些目录不需要同步
- 同步完成后需要调整几个关键配置:
- 修改主机名:
sudo hostnamectl set-hostname new-server-name - 调整网卡配置:编辑
/etc/network/interfaces,把旧服务器的IP换成新服务器的IP - 更新
/etc/fstab:如果旧服务器有特殊挂载项,确保新服务器的磁盘路径匹配 - 重启新服务器:
sudo reboot,然后检查所有服务是否正常启动
- 修改主机名:
方案二:分模块迁移(更灵活,只迁移必要内容)
如果不想同步整个系统,只想迁移Node应用相关的环境和配置,这个方案更合适,分成几个模块操作:
1. 迁移已安装的软件包
先导出旧服务器的软件包列表,再在新服务器批量安装:
- 旧服务器执行:
dpkg --get-selections > installed_packages.txt - 把文件传到新服务器:
scp installed_packages.txt new_user@192.168.x.x:/tmp/ - 新服务器执行:
sudo dpkg --set-selections < /tmp/installed_packages.txt sudo apt-get dselect-upgrade -y
2. 迁移Node.js环境与应用
- Node.js本身:如果是用nvm安装的,直接复制nvm目录到新服务器:
scp -r old_user@192.168.x.x:~/.nvm new_user@192.168.x.x:~/
然后在新服务器执行source ~/.nvm/nvm.sh,验证版本:node -v
如果是系统级安装的,上面的软件包同步已经包含了,直接用就行 - 应用代码与配置:
复制应用目录:rsync -avz old_user@192.168.x.x:/path/to/your/node/app new_user@192.168.x.x:/opt/your-app/
复制环境变量文件(比如.env)、反向代理配置(比如Nginx的/etc/nginx/sites-available/your-app.conf) - 应用依赖:推荐在新服务器重新执行
npm install(避免跨平台二进制包冲突),如果赶时间也可以直接复制node_modules目录 - 进程管理配置:如果用systemd管理Node进程,复制服务文件:
scp old_user@192.168.x.x:/etc/systemd/system/your-app.service new_user@192.168.x.x:/etc/systemd/system/,然后执行sudo systemctl daemon-reload && sudo systemctl start your-app.service
3. 迁移数据库(如果你的Node应用用到了)
比如常用的MySQL/MariaDB:
- 旧服务器导出数据库:
mysqldump -u root -p your-db-name > db-backup.sql - 传到新服务器:
scp db-backup.sql new_user@192.168.x.x:/tmp/ - 新服务器先创建空数据库:
mysql -u root -p -e "CREATE DATABASE your-db-name;" - 导入数据:
mysql -u root -p your-db-name < /tmp/db-backup.sql
如果是MongoDB,用mongodump和mongorestore操作类似,这里就不展开了。
方案三:磁盘镜像克隆(适合物理机/虚拟机)
如果你的旧服务器是虚拟机,直接用虚拟化平台(比如VMware、VirtualBox)的克隆功能就行,一步到位。如果是物理机,可以用dd命令做磁盘镜像:
- 在旧服务器的Live CD环境下(避免文件系统被占用)执行:
sudo dd if=/dev/sda of=/mnt/usb/backup.img bs=4M(/dev/sda是旧服务器的系统盘,/mnt/usb是外接存储) - 把镜像文件传到新服务器,同样在Live CD环境下恢复:
sudo dd if=/path/to/backup.img of=/dev/sda bs=4M
⚠️ 这个方法要特别小心,会覆盖新服务器的整个磁盘,操作前一定要确认磁盘路径正确!
关键注意事项
- 备份优先:操作前一定要备份旧服务器的应用代码、数据库、配置文件,比如用
tar -czf backup.tar.gz /path/to/app /etc/nginx /var/lib/mysql - 版本一致:确保新服务器也是Ubuntu 16.04,否则软件包可能会有兼容性问题
- 验证服务:迁移完成后,逐个检查服务状态,比如
systemctl status nginx、systemctl status your-app.service,查看日志排查问题:journalctl -u your-app.service - 防火墙规则:如果旧服务器用ufw,导出规则:
ufw show added > ufw-rules.txt,传到新服务器后逐个添加,或者直接在新服务器重新配置
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

