我有一个远程 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。将ssh
stdout 流回本地主机,然后> /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
排除以达到同样的效果。
这种流式传输方法的变体使用netcat
SSH TCP 转发。例如,您启动ssh -R rport:localhost:lport
,并在本地运行 netcat,监听该 lport 并写入文件。然后,在远程,您可以绑定挂载或以其他方式排除不需要的目录,然后tar
流式传输到另一个(远程)netcat
,该远程写入“localhost”rport(ssh 将其转发到本地的 lport)。