通过 SSH 将用户和状态保存/备份到镜像或类似位置的 Ubuntu 服务器

通过 SSH 将用户和状态保存/备份到镜像或类似位置的 Ubuntu 服务器

我有一个远程 Ubuntu 服务器,我将在其上安装一个小型软件堆栈、设置一个用户、配置防火墙并更改一些系统设置。

完成此操作后,我想将状态备份到映像或以其他方式备份服务器,以便我可以在其他 Ubuntu 服务器上恢复它。它需要保留堆栈、防火墙、用户等。

这可能吗?通过 SSH 执行此操作的最佳方法是什么

答案1

如果您要采用这种方法,请尽可能在虚拟机中设置系统。然后暂停(或最好关闭)实例并克隆备份设备。这是最简单、最可靠的方法。

(我开始研究如何手动执行此操作,并意识到有很多陷阱,因为你必须浏览备份实时文件系统(例如,可以使用 lvm 快照来完成,或者通过滥用 mdadm 并降级磁盘来完成,但这些解决方案都不是“好”的)。也可能你可以安装 3 个分区,克隆(启动、根和临时根),然后在设置启动和根到临时根的枢轴后,将根和启动设为只读并进行备份,但所有这些都非常混乱且容易出错 - 你最好按照教程在文件级别而不是图像级别重新创建可启动系统 - 例如使用类似https://github.com/AB9IL/linux-clone

答案2

一般方法:

echo "password-for-sudo" | ssh [email protected] sudo -S tar --one-file-system -cpf - / > /tmp/server.tar

不必担心此操作期间会发生任何变化。如果您在意,请停止所有可以停止的服务(例如数据库、Web 服务器等);其他一切都无关紧要。

sudo -S从 stdin 读取密码,echo将其放入 stdin,ssh然后将其流式传输到远程执行的sudo。它在远程运行tar --one-file-system -cpf - /(以 root 身份),存档所有内容并将其流式传输到 stdout。将sshstdout 流回本地主机,然后> /tmp/server.tar将其写入文件。您可以链接例如gzip本地以立即压缩文件,还可以添加压缩选项以ssh加快传输速度(如果通过互联网传输)。

为了避免在命令行中输入密码,您可以创建一个文件,将其放入其中,然后将该文件放入 ssh stdin 而不是 echo。

--one-file-system选项用于不捕获、/dev等。如果有/proc/sys一些你想捕获的已挂载文件系统,将它们添加到 之后/,如下所示:tar --one-file-system -cpf - / /boot /home。绕过虚拟文件系统的另一种方法是创建 / 的绑定挂载并使用它:

mkdir /tmp/root-bind
mount -o bind / /tmp/root-bind
mount -o bind /home /tmp/root-bind/home
...

现在,使用类似... ssh ... sudo ... tar -cpf - /tmp/root-bind > ...。不要忘记随后卸载所有内容。或者,最后,您可以使用tar 排除以达到同样的效果。


这种流式传输方法的变体使用netcatSSH TCP 转发。例如,您启动ssh -R rport:localhost:lport,并在本地运行 netcat,监听该 lport 并写入文件。然后,在远程,您可以绑定挂载或以其他方式排除不需要的目录,然后tar流式传输到另一个(远程)netcat,该远程写入“localhost”rport(ssh 将其转发到本地的 lport)。

相关内容