我不小心压缩了整个服务器

我不小心压缩了整个服务器

好吧,如果有人想扮演上帝并创造奇迹,那我就同意了。

因此,我被赋予了编写一个脚本的任务,该脚本可以查找超过 6 个月的文件,然后对其进行压缩,然后将其删除。在编写此脚本的过程中,我运行了此脚本:

find / -type f -mtime -400 ! -mtime -180 | xargs gzip blablabla

这让每个文件都带有 .gz 扩展名。我一注意到就立即撤消了它,但有点太晚了。完成命令后,我的 bash 命令都不起作用,因为 $PATH 变量本身清空了。我尝试了很多方法才意识到问题所在。

因此,在解压所有文件后,我仍然无法启动。我设法进入 grub 救援,然后按照在线说明进行操作:

root (hd0,0)
setup (hd0)
kernel (hd0,0)/boot/vml[...]
initrd (hd0,0)/boot/initrd.im[...]

此后,我的 Linux 部分启动,但出现以下错误:

Begin : Running /scripts/init-bottom ... mount : mounting /dev on /root/dev failed : No such file or directory
mount: mounting /sys/ on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed : No such file or directory
Target filesystem doesn't have requrested /sbin/init.
No init found. Try passing init= bootarg.

我尝试修复文件系统,从 3 个不同的 LiveCD/救援盘启动,从 2 个不同的盘运行启动修复。我确实强制执行了 fsck...

我真的没有主意了,我需要至少启动这个服务器,这样我才能恢复我的 SQL 数据库。我迫切需要帮助,如果需要的话我甚至愿意付钱。

我已经连续三天整天潜伏在论坛上寻找可能的解决方案,但仍然停留在原地...能帮帮我吗?

答案1

这取决于文件系统是否已修复到足以让您能够从 LiveCD 挂载这些分区。不要费心尝试启动系统。首先,挂载分区并解压缩所有 .gz 文件。这将为您提供 init 和系统二进制文件的工作副本。然后您可以使用 grub 修复引导扇区。然后启动到单用户模式并再次 fsck 文件系统。如果成功,您将拥有一个正在运行的系统。您还会有一堆解压缩的文件(如手册页),这些文件确实应该被压缩,但这比拥有一个无法启动的系统要好。

如果你无法从 LiveCD 安装分区,那么很遗憾,你运气不佳。此时,没有什么可以恢复你的系统。

答案2

我首先尝试的是运行 LiveCD 环境并尝试解压所有内容,希望这样系统可以恢复到可启动状态。注意:如果原始 gzip 过程中断,我担心可能会损坏数据。

否则,我会尝试按照其他人的建议将数据库迁移到新系统,但正如您所遇到的,可能存在需要单独解决的劳动密集型依赖和配置问题。

答案3

这里的普遍共识是,您应该将磁盘安装到正常运行的系统中并挽救您的文件,这并没有错。这是明智的做法。但另一种方法更有趣,而且很有教育意义。我在努力摆脱混乱局面的过程中学到了很多东西,而其他人可能会放弃并从头开始重新安装。(但不是在其他人依赖的服务器上……)

无论如何,到目前为止,您有一个正在运行的 initramfs(initrd)。这是一个好的开始。但它无法完成对 init 的交接,因为 init 现在init.gz可能是?要取得任何进展,准确了解您拥有的 Linux 发行版会有所帮助,这样我们就可以查找其 initramfs 中有哪些可用于紧急情况的工具。

您呈现的错误消息看起来可能来自 Debian 的 initramfs。如果是 Debian,那么您应该(initramfs)在最后一个错误后的下一行获得 shell 提示。如果是这样,您应该查看那些失败的挂载发生了什么。缺少/root/dev?(/root在 initramfs 运行期间应该挂载正常根文件系统的位置)

如果您没有收到 shell 提示,那么接下来的内容No init found. Try passing init= bootarg.将会很有趣。即使它只是一个闪烁的光标,那也是一个线索。如果它看起来完全冻结,请尝试使用 magic sysrq 或 Ctrl+ScrollLock 获取有关哪些进程仍在运行的信息。

Debian initramfs 还允许您通过向内核命令行添加参数来请求几个特殊地标处的 shell break=。例如,要获取Running /scripts/init-bottom行前的 shell,请使用break=bottom

另外:我不知道该find命令是如何进行 gzip 压缩的每一个文件……对于我来说,选择 180 到 400 天之间的文件似乎是正确的。

相关内容