如何将Linode恢复到Vagrant VM?

我试图build立一个Linux开发环境,这样我就可以安全地更改我的网站,而不会中断现场。

Linode承载我的生活网站。 一个简单的解决scheme就是在Linode上托pipe我的开发服务器,但是我想避免我的托pipe成本翻倍。

我看到的最便宜的方法是在我的Windows工作站上使用Vagrant来托pipe我的开发环境。

在我尝试将备份恢复到Vagrant并重新启动虚拟机之后,我不能再ssh进入Vagrant主机。

这可能是因为通过恢复备份我覆盖了一些特殊的stream浪汉configuration,但我不知道如何避免这种情况。

我如何使这种方法工作? 如果我的方法从根本上是错误的,你能提出一个替代scheme吗?

创build备份

在Linode上,我使用这些命令来创build整个文件系统的压缩副本,同时忽略了不应包含在备份中的内容:

$ 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.esselect了壁橱比赛:

Ubuntu服务器精确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复制到Vagrant框上的/home/vagrant/2.gz

用PuTTY我通过SSH连接到我的新的stream浪者箱子:

在框中将备份移动到文件系统根目录。

 $ sudo mv 2.gz / 

将存档解压到文件系统根目录:

 $ sudo tar -xvpz -f 2.gz -C / --strip-components=2 

(我发现我需要使用strip组件,因为档案库中的所有文件都有前缀backup/2/ ,我将在下次备份时修复此问题。)

在tar命令完成之后,我从盒子中注销。

testing备份

当我尝试再次login时,不会再让我用密码login。

它确实让我作为iain,我的用户在现场Linode,用密码login。 这令我感到惊讶,因为我禁用了我的现场Linode密码validation。 我想我必须重新启动ssh服务才能使更改生效。

我select重新启动整个系统,而不是重新启动ssh。

现在我甚至不能进入login屏幕。 当我尝试连接时,PuTTY说“连接被拒绝”。

什么地方出了错?

你之所以无法登陆,是因为你备份了含有影子的内容 。 由于来自linode的影子文件不包含stream浪用户的条目,因此不会允许您使用该凭据进行login。 您可以使用您的linode用户login,因为凭证位于/ etc / shadow文件中,但ssh守护进程正在使用允许所有人进行密码validation的默认设置。 如果一切正常,您可以重新加载ssh服务来获取新的configuration(禁用密码validation的备份)。

但是在恢复过程中一定会出现问题。 从提供的信息中,我只能做出什么假设,而我想避免这种情况。 但是,如果在stream浪箱closures的情况下打开virtualboxpipe理窗口,则可以正常启动虚拟机。 这将允许您查看控制台中显示的任何错误。 如果不存在错误,至less会允许您使用控制台login(而不是SSH)。 您可以使用您的普通帐户访问并查看发生了什么问题。 / var / log中的某些内容会指向正确的方向(很可能是/ var / log / syslog)。

经过一番调整之后,你可能会把你的方法主要工作,但我build议完全不同的方法。

要使活动服务器和开发服务器的一般configuration保持同步,请使用puppet进行部署,或者要非常小心。 为了同步你的网页代码和上传的文件,rsync是好的,定义你想要包含的内容并保持它的窄。 只是应用程序,而不是整个系统。 而不是使用rsync,你可能想使用git或其他版本控制系统。 检查dev的变化,然后检查他们的生活。 在轨道的某处,您可以使用连续部署系统自动执行此操作。

您可能还需要一种同步数据库内容的方法。 不要指望只复制mysql存储其数据的文件,除非你准备在数据库引擎两端同时closures数据库引擎,或者在文件系统级别有某种快照机制(例如使用LVM)。

您可能希望将数据更新的同步从live到dev与您的备份系统结合在一起。 即采取生活的备份,并恢复他们的开发。 这很好,因为您经常validation备份,但是如果您每天都进行备份,那么恢复昨天的备份有时可能会不方便。

也许它的矫枉过正 不过现在可能觉得它比现在还要多一点。 至less要把模型理解为随着时间推移的东西。