
Я использую виртуальную машину на сервере, к которому не могу получить доступ, и моя файловая система смонтирована в режиме только для чтения:
# 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
свою корневую файловую систему. - Перезагрузите. Это сотрет ваши недавно загруженные
e2fsck
, поскольку файловые системы 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
, вы используете ar
и 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
Примечание: если ar
распакованданные.tar.гзвместоданные.tar.хз, то вы бы использовали tar zxvf data.tar.gz
для распаковки. Также, если вам не хватает некоторых инструментов ( ar
, tar
, gzip
, xz
) или у вас закончилось место, вы можете распаковать это на любом другом сервере GNU/Linux или рабочей станции и скопировать только файл sbin/e2fsck.static
на brokenserver.
затем вы наконец добираетесь до fsck:
brokenserver:/run# chmod 755 /run/sbin/e2fsck.static
brokenserver:/run# ./sbin/e2fsck.static /dev/vda
Примечание:если вы получите"Доступ запрещен"ошибка, это, вероятно, либо потому, что ваш /run
смонтированnoexec(не в вашем случае, но если бы это было так, вы бы исправили это с помощью 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)