
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 /run
disco ram (sistema de archivos tmpfs) montado en lectura/escritura. ¿Puedes descargar el más actual e2fsck
allí? Entonces deberías poder
- Ejecute y
e2fsck -f /dev/vda
arregle/run
su 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
e2fsck
nuevamente 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 e2fsck
a /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
/ sftp
para 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, e2fsck
como 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 sftp
un cliente comofilezillapara copiarlo al /run
directorio en el servidor roto.
Luego, debes desempacarlo. Para .deb
, usas ar
y 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 ar
está desembaladodatos.tar.gzen lugar dedatos.tar.xz, entonces lo usarías tar zxvf data.tar.gz
para 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.static
archivo 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 /run
está 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, amd64
binario 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)