孤立 inode 问题

孤立 inode 问题

我在无法访问的服务器上使用虚拟机,并且以只读模式安装文件系统:

# dmesg
.... 
[2.535658] EXT4-fs (vda): Couldn't remount RDWR because of unprocessed orphan inode list.  Please umount/remount instead

所以我尝试运行:

# e2fsck -f /dev/vda
e2fsck 1.42.9 (28-Dec-2013)
/dev/vda has unsupported feature(s): metadata_csum
e2fsck: Get a newer version of e2fsck!

输出df

/dev/root        41022688 37964956    944196  98% /
devtmpfs          4084008        0   4084008   0% /dev
tmpfs             4085752        0   4085752   0% /dev/shm
tmpfs             4085752   397012   3688740  10% /run
tmpfs             4085752        0   4085752   0% /sys/fs/cgroup
tmpfs              817152        0    817152   0% /run/user/0
tmpfs              817152        0    817152   0% /run/user/1000

输出mount

/dev/vda on / type ext4 (ro,relatime,stripe=8191,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=4084008k,nr_inodes=1021002,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=23,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
configfs on /sys/kernel/config type configfs (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,relatime)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=817152k,mode=700)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=817152k,mode=700,uid=1000,gid=1000)

当然,我无法更新 e2fsck,因为我有一个只读文件系统。我怎样才能跳出循环?

答案1

看起来您有一个/run以读/写方式安装的 ramdisk(tmpfs 文件系统)。你能在那里下载最新的e2fsck吗?然后你应该能够

  • e2fsck -f /dev/vda/run根文件系统运行并修复它。
  • 重启。这将清除您新下载的 tmpfse2fsck文件系统,因为重新启动时会重新初始化 tmpfs 文件系统。但你的根文件系统现在应该是读/写的。
  • 再次下载e2fsck到根文件系统。

事实上,如果您可以在修复根文件系统后重新挂载它(无需重新启动),那么您应该能够复制e2fsck/sbin (或它所属的任何地方)。

答案2

答案取决于这个错误是如何产生的?

如果您启动了一些较新的内核,并且它将您的 ext4 文件系统升级到了较新的版本,而您的默认内核并不完全支持,则可能会发生这种情况。如果是这样,解决方案可能就像重新启动到较新的内核一样简单,然后彻底卸载文件系统。

但是,如果您“什么也没做”并且错误本身出现,则可能表明随机硬件损坏。在这种情况下,谨慎的做法是首先备份您需要的所有数据(实际上备份内容总是一个好主意)。您可以使用scp/sftp将所有重要数据备份到工作站,或者如果您有其他可用服务器,则进行完整系统备份,例如:

otherserver# nc -l -p 8080 > brokenserver-backup.tar.gz
brokenserver# tar zcf - / | nc otherserver.example.com 8080

在获得有效的备份后,您需要e2fsck按照 @G-Man 的建议获取更新的备份。然而,正如您发现的,您需要静态编译/链接e2fsck 的版本,否则会抛出缺少动态库的错误。以下是具体操作方法。

为此,首先您需要下载静态版本。这样做的好处是它可以适用于任何 GNU/Linux 发行版。我更喜欢来自 http://packages.debian.org/e2fsck-static

su
cd /run
wget http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/e2fsck-static_1.44.2-1~bpo9+1_amd64.deb

或者,您可以在工作站上下载并使用sftp客户端,例如菲莱齐拉将其复制到/run损坏的服务器上的目录。

然后,您需要将其拆包。对于.deb,您使用artar

brokenserver:/run# ar xv e2fsck-static_1.44.2-1~bpo9+1_amd64.deb 
x - debian-binary
x - control.tar.gz
x - data.tar.xz

brokenserver:/run# tar Jxvf data.tar.xz 
./
./sbin/
./sbin/e2fsck.static
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/e2fsck-static/
./usr/share/doc/e2fsck-static/changelog.Debian.gz
./usr/share/doc/e2fsck-static/copyright
./usr/share/man/
./usr/share/man/man8/
./usr/share/man/man8/e2fsck.static.8.gz

笔记: 如果ar拆封的话数据.tar.gz广州代替数据.tar.gzxz,然后你就可以用来tar zxvf data.tar.gz解压。另外,如果您错过了某些工具(artargzipxz)或者空间不足,您可以在任何其他 GNU/Linux 服务器或工作站上解压该工具,然后将sbin/e2fsck.static文件复制到损坏的服务器。

然后,你终于可以进行 fsck 了:

brokenserver:/run# chmod 755 /run/sbin/e2fsck.static
brokenserver:/run# ./sbin/e2fsck.static /dev/vda

笔记:如果你得到“没有权限”错误,可能是因为您/run已安装不执行(不是你的情况,但确实如此,你可以用 修复它mount -oremount,exec /run,或者因为你下载了错误的架构(例如,amd64旧的二进制文件i386- 请参阅拱门(1))。跟踪(1)最后会为您提供更多信息,例如:

execve("/run/sbin/e2fsck.static", ["/run/sbin/e2fsck.static"], [/* 22 vars */]) = -1 ENOEXEC (Exec format error)

或者

execve("/run/sbin/e2fsck.static", ["/run/sbin/e2fsck.static"], [/* 22 vars */]) = -1 EACCES (Permission denied)

相关内容