我正在尝试设置一个 Linux 开发环境,以便我可以安全地更改我的网站而不破坏实时网站。
Linode 托管我的实时网站。一个简单的解决方案是将我的开发服务器也托管在 Linode 上,但我想避免将托管成本翻倍。
我认为最便宜的方法是在我的 Windows 工作站上使用 Vagrant 来托管我的开发环境。
尝试将备份恢复到 Vagrant 并重新启动 VM 后,我无法再通过 ssh 进入 Vagrant 主机。
这可能是因为通过恢复备份我覆盖了一些特殊的 Vagrant 配置,但我不确定如何避免这种情况。
我该如何让这种方法奏效?如果我的方法从根本上是错误的,你能建议一种替代方法吗?
创建备份
在 Linode 上,我使用这些命令创建整个文件系统的压缩副本,同时忽略不应包含在备份中的内容:
$ sudo rsync -ahvz --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/backup/*} /* /backup/2
$ sudo tar -czf /backup/2.gz /backup/2
因为这是第二次备份,所以备份文件被命名为2.gz
。第一次备份被命名为1.gz
。
我使用 WinSCP 将备份文件复制到我的 Windows 工作站。
设置 Vagrant 主机
我需要一个与我的 Linode 操作系统(Ubuntu 12.04.3 LTS,内核 3.9.3)匹配的 Vagrant 盒子。我从中选择了最匹配的vagrantbox.es:
Ubuntu Server Precise 12.04.3 amd64
内核已为 Docker 做好准备(不包括 Docker)
在我的工作站上,我运行了以下命令来添加框并初始化和启动实例:
$ vagrant box add ubuntu-precise http://nitron-vagrant.s3-website-us-east-1.amazonaws.com/vagrant_ubuntu_12.04.3_amd64_virtualbox.box
$ mkdir linode-test
$ cd linode-test
$ vagrant init ubuntu-precise
$ vagrant up
现在 Vagrant 正在端口 2222 上运行带有 SSH 的机器。
操作系统版本相同。内核版本为 3.8.0。听起来很接近。
恢复备份
我使用 WinSCP 将备份文件复制2.gz
到/home/vagrant/2.gz
Vagrant 框中。
我使用 PuTTY 通过 ssh 连接到我的新 Vagrant 盒子:
在框上将备份移动到文件系统根目录。
$ sudo mv 2.gz /
将档案解压到文件系统根目录:
$ sudo tar -xvpz -f 2.gz -C / --strip-components=2
(我发现我需要使用 strip 组件,因为档案中的所有文件都有前缀backup/2/
。我会在下次备份时修复这个问题。)
tar 命令完成后,我退出系统。
测试备份
当我尝试再次登录时,它不再允许我使用密码以 vagrant 身份登录。
它确实允许我以 iain(实时 Linode 上的用户)的身份使用密码登录。这让我很惊讶,因为我在实时 Linode 上禁用了密码验证。我认为我必须重新启动 ssh 服务才能使更改生效。
我没有选择重新启动 ssh,而是选择重新启动整个系统。
现在我甚至无法进入登录屏幕。当我尝试连接时,PuTTY 显示“连接被拒绝”。
什么地方出了错?
答案1
你无法再以 vagrant 身份登录的原因是你备份了 /etc,其中包含阴影。由于 linode 的影子文件不包含 vagrant 用户的条目,因此它不允许您使用该凭据登录。您可以使用 linode 用户登录,因为凭据位于 /etc/shadow 文件中,但 ssh 守护程序使用的是默认设置,允许所有人进行密码验证。如果一切正常,您只需重新加载 ssh 服务以获取新配置(来自备份的禁用密码验证的配置)。
但是恢复过程中一定出了问题。根据提供的信息,我只能假设是什么问题,我想避免这种情况。但是,如果您在关闭 vagrant box 的情况下打开 virtualbox 管理窗口,您将能够正常启动虚拟机。这将允许您查看控制台中显示的任何错误。如果没有错误,它至少允许您使用控制台登录(而不是 SSH)。您可以使用您的普通帐户获取访问权限并查看哪里出了问题。/var/log 中的某些内容会为您指明正确的方向(最有可能是 /var/log/syslog)。
答案2
经过一些调整后,您可能会发现您的方法基本可行,但我建议采用完全不同的方法。
要使实时服务器和开发服务器的一般配置保持同步,要么使用 puppet 进行部署,要么非常小心。要同步您的 Web 代码和上传的文件,rsync 是可以的,定义要包含的内容并保持范围窄。只包含应用程序,而不是整个系统。您可能不想使用 rsync,而是想使用 git 或其他版本控制系统。从开发服务器签入更改,然后将其签出到实时服务器。将来,您可以使用持续部署系统自动执行此操作。
您可能还需要一种方法来同步数据库内容。不要指望只复制 mysql 存储其数据的文件,除非您准备在执行此操作时关闭两端的数据库引擎,或者您在文件系统级别有某种快照机制(例如使用 LVM)。
您可能希望将实时数据更新同步到开发系统与备份系统结合起来。即备份实时数据,然后将其恢复到开发系统。这很好,因为您会不断验证备份,但如果您每天都备份,那么恢复昨天的备份有时可能会很不方便。
也许有点矫枉过正了。不过现在感觉可能比实际情况要多一点。至少要理解这个模型是可以随着时间推移而改变的。