如何将 Linode 恢复到 Vagrant VM?

如何将 Linode 恢复到 Vagrant VM?

我正在尝试设置一个 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.gzVagrant 框中。

我使用 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)。

您可能希望将实时数据更新同步到开发系统与备份系统结合起来。即备份实时数据,然后将其恢复到开发系统。这很好,因为您会不断验证备份,但如果您每天都备份,那么恢复昨天的备份有时可能会很不方便。

也许有点矫枉过正了。不过现在感觉可能比实际情况要多一点。至少要理解这个模型是可以随着时间推移而改变的。

相关内容