Problema con el inodo huérfano

Problema con el inodo huérfano

Estoy usando una máquina virtual en un servidor al que no puedo acceder y tengo el sistema de archivos montado en modo de solo lectura:

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

Entonces intenté ejecutar:

# 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!

Salida de 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

Salida de 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)

Por supuesto, no puedo actualizar e2fsck porque tengo un sistema de archivos de sólo lectura. ¿Cómo puedo escapar del bucle?

Respuesta1

Parece que tiene un /rundisco ram (sistema de archivos tmpfs) montado en lectura/escritura. ¿Puedes descargar el más actual e2fsckallí? Entonces deberías poder

  • Ejecute y e2fsck -f /dev/vdaarregle /runsu sistema de archivos raíz.
  • Reiniciar. Esto borrará el archivo recién descargado e2fsck, porque los sistemas de archivos tmpfs se reinicializan cuando reinicia. Pero su sistema de archivos raíz debería poder leer/escribir ahora.
  • Descargue e2fscknuevamente en el sistema de archivos raíz.

De hecho, si puede volver a montar el sistema de archivos raíz después de arreglarlo (sin reiniciar), entonces debería poder copiarlo e2fscka /sbin (o donde quiera que pertenezca).

Respuesta2

La respuesta depende de cómo surgió este error.

Podría suceder si inició algún kernel más nuevo y actualizó su sistema de archivos ext4 a una versión más nueva, que su kernel predeterminado no es totalmente compatible. Si es así, la solución puede ser tan simple como iniciar nuevamente en ese kernel más nuevo y desmontar limpiamente el sistema de archivos.

Sin embargo, si "no hizo nada" y el error apareció solo, puede indicar una corrupción aleatoria del hardware. En ese caso, sería prudente hacer primero una copia de seguridad de todos los datos que necesita (en realidad, siempre es una buena idea hacer una copia de seguridad). Puede utilizar scp/ sftppara realizar una copia de seguridad de todos los datos importantes en su estación de trabajo o, si tiene algún otro servidor disponible, realizar una copia de seguridad completa del sistema, por ejemplo:

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

Después de tener una copia de seguridad funcional, necesita obtener una más nueva, e2fsckcomo sugirió @G-Man. Sin embargo, como descubrió, necesitacompilado/vinculado estáticamenteversión de e2fsck, o arrojará un error sobre bibliotecas dinámicas faltantes. Aquí se explica cómo hacerlo.

Para hacer eso, primero necesitas descargar la versión estática. Lo bueno de esto es que puede ser para cualquier distribución GNU/Linux. prefiero los de 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

Alternativamente, puede descargarlo en su estación de trabajo y usar sftpun cliente comofilezillapara copiarlo al /rundirectorio en el servidor roto.

Luego, debes desempacarlo. Para .deb, usas ary tar.

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

Nota: si arestá desembaladodatos.tar.gzen lugar dedatos.tar.xz, entonces lo usarías tar zxvf data.tar.gzpara desempacar. Además, si echa de menos algunas de las herramientas ( ar, tar, gzip, xz) o se queda sin espacio, puede descomprimirlas en cualquier otro servidor o estación de trabajo GNU/Linux y copiar sólo el sbin/e2fsck.staticarchivo al servidor roto.

entonces finalmente llegas a fsck:

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

Nota:Si lo consigues"Permiso denegado"error, probablemente se deba a que /runestá montadono ejecutivo(no en su caso, pero lo sería, lo arreglaría con mount -oremount,exec /run, o porque descargó la arquitectura incorrecta (por ejemplo, amd64binario en el antiguo i386; consultearco(1)).rastro(1)Te daría más información al final, como:

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

o

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

información relacionada