首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XFS已损坏,无法实现xfs_repair

XFS已损坏,无法实现xfs_repair
EN

Server Fault用户
提问于 2011-01-27 23:56:49
回答 1查看 4.4K关注 0票数 2

我的一个托管服务器有一些XFS问题。上次崩溃后,我的一些RRD文件夹被破坏了。

示例(抱歉,它是法语):

代码语言:javascript
复制
# rm *
rm: impossible de supprimer « create_rrd.sh »: La structure a besoin d'un nettoyage
rm: impossible de supprimer « old »: est un dossier
rm: impossible de supprimer « tcgraph.log »: La structure a besoin d'un nettoyage
rm: impossible de supprimer « tcgraph.rrd »: La structure a besoin d'un nettoyage

正常的做法是在单个用户中重新启动系统,或者使用活动cd,然后在/dev/sda上运行xfs_repair。不幸的是(这太容易了),托管公司提供了一个选项,重新启动一张活cd,这是行不通的。访问数据中心不是一种选择。

似乎我根本无法触摸节点,每次我都会收到“结构需要清理”的信息。

因此,问题是:有人知道手工修复/修复XFS文件系统的方法吗?任何低级别的XFS操作工具都可以帮助您吗?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2011-01-28 01:07:01

简短的回答是否定的。

更长的答案是,尝试将所有内容复制到tmpfs ramdisk中,切换/转到tmpfs中,然后卸载硬盘文件系统,在修复驱动器文件系统时完全从ram上运行,这将是非常吸引人的。

我不是第一个想到这个问题的人,我找到了这条线,但是没有关于这个计划是否有效的信息。因为它的目的是擦拭驱动器,他们没有费心拆掉它。

为此,创建一个目录和mount -t tmpfs none /some/directory,然后开始使用系统的重要部分(sshd、挂载、umount、xfs工具、shell和所有运行它所需的库)的副本填充它,可能所有的/etc都要确定,最后是init.chroot监狱创建脚本在这里会有所帮助,拥有大约4GB的RAM也会有所帮助。在其中挂载proc的副本,如果使用devfs,也要挂载devfs的副本。使用/etc/ssh/ sshd _config的副本,设置sshd以启动另一个端口。将chroot发送到您的ramdisk,并确保所有工作正常,并且没有缺少库,然后在ramdisk中(在备用端口上)启动sshd,这样就可以在其中着色。检查是否可以将ssh插入其中(这可能还需要将/home目录复制到其中)(并在您可能拥有的任何防火墙上打开端口)。

现在,魔术开始了:您需要找到一个名为枢轴_根部的实用程序,而不是对tmpfs进行着色。它在生活中的唯一目的就是叫枢轴_根()。它在Debian上的中。pivot_root()的目的本质上是同时对每个进程进行着色。最初用于将initrd ramdisk映像移动/从initrd ramdisk映像移动到实际驱动器,如果这样做有效,那么您将从实际驱动器移动/从实际驱动器移动到ramdisk映像。因此,假设您在复制了所需的所有内容之后执行了mkdir /mnt/tmpfs; mount -t tmpfs none /mnt/tmpfs,下一步是mkdir /mnt/tmpfs/oldroot; pivot_root /mnt/tmpfs /oldroot (如果空间复制用完了,请卸载/mnt/tmpfs并再次挂载它,这一次是使用-o size=...,因为默认情况下只允许内存的一半)。

最后一步是卸载/oldroot。您需要卸载/oldroot/sysfs /oldroot/proc等等。如果您仍然得到“文件系统很忙”,您可以尝试强迫它,或者至少通过查看ls -l /proc/*/cwd /proc/*/fd/ | grep /oldroot/并杀死仍然引用它的所有文件(这可能包括未着色的ssh服务器)来跟踪打开的所有文件。在你开始杀人之前,确保你已经登录了那个备用的sshd )。显然不要杀死进程1 (init)。如果无法强制umount运行init,则需要使用chroot /oldroot /sbin/telinit u2 (您当前正在运行的2=runlevel,或者init可能会杀死所有内容,然后重新启动并重新启动),通过运行您在ramdisk中的“新”init,使init“升级”。为了让它使用/oldroot/dev/initctl ( ramdisk /dev/initctl是不一样的)(注意,telinit将使用/oldroot/dev/initctl与现有的init进程(即pivot_rooted到ramdisk )对话,所以启动的init将在ramdisk上,而不是/oldroot上)。

我不打算在这里的生产服务器上尝试这个。也许这个周末我会在家里试试。

票数 4
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/227871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档