Вопрос или проблема
Я использую виртуальную машину на сервере, к которому не могу получить доступ, и файловая система смонтирована в режиме только для чтения:
# 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, так как у меня файловая система только для чтения. Как я могу выйти из этого замкнутого круга?
Похоже, у вас есть /run
ramdisk (файловая система tmpfs), которая смонтирована для чтения/записи.
Можете ли вы скачать более актуальную версию e2fsck
туда?
Тогда вы сможете:
- Запустить
e2fsck -f /dev/vda
из/run
и исправить вашу корневую файловую систему. - Перезагрузить систему.
Это удалит ваш недавно загруженныйe2fsck
, так как файловые системы tmpfs переинициализируются при перезапуске.
Но ваша корневая файловая система должна быть доступна для записи. - Скачать
e2fsck
снова, на корневую файловую систему.
На самом деле, если вы сможете перемонтировать корневую файловую систему после её исправления (без перезагрузки),
то сможете просто скопировать e2fsck
в /sbin
(или туда, где он должен быть).
Ответ зависит от того, как возникла эта ошибка?
Это может произойти, если вы загрузили более новое ядро, и оно обновило вашу файловую систему 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
клиент, например, Filezilla, чтобы скопировать его в каталог /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
распаковал data.tar.gz вместо data.tar.xz, тогда используйте tar zxvf data.tar.gz
для распаковки. Также, если вам не хватает некоторых инструментов (ar
, tar
, gzip
, xz
) или вам не хватает места, вы можете распаковать это на любом другом сервере или рабочей станции GNU/Linux и скопировать только файл sbin/e2fsck.static
на неисправный сервер.
Наконец, вы можете выполнить fsck:
brokenserver:/run# chmod 755 /run/sbin/e2fsck.static
brokenserver:/run# ./sbin/e2fsck.static /dev/vda
Примечание: если вы получаете ошибку “Permission denied”, это, вероятно, либо потому, что ваш /run
смонтирован с noexec (не в вашем случае, но если бы так, вы бы исправили это с помощью mount -oremount,exec /run
), либо потому, что вы скачали версию для неправильной архитектуры (например, amd64
на старом i386
– смотрите arch(1)). strace(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)
Ответ или решение
Чтобы решить проблему с сиротскими инодами в вашей виртуальной машине, следуйте следующим шагам. Этот процесс потребует использования статически скомпилированной версии утилиты e2fsck
, поскольку файловая система вашей машины в данный момент доступна только для чтения и обновление стандартной версии невозможно. Мы рассмотрим ваши действия, чтобы восстановить файловую систему в нормальное состояние и минимизировать риск потери данных.
1. Анализ проблемы
Вы получаете ошибку при попытке монтирования файловой системы в режиме чтения-записи из-за необработанного списка сиротских инодов. Стандартное средство проверки файловой системы e2fsck
требует более новой версии для обработки флагов metadata_csum
.
2. Подготовка решений
Подготовка резервных копий данных
Поскольку работа с файловой системой может привести к потере данных, важно сначала создать резервную копию всех критичных данных. Это можно сделать, например, с помощью утилиты nc
для передачи данных по сети на другую машину:
# На другой машине
nc -l -p 8080 > backup.tar.gz
# На вашей машине
tar cf - / | nc другой_компьютер 8080
3. Использование статической версии e2fsck
Загрузка и распаковка e2fsck.static
Так как /run
— это временная файловая система RAM (tmpfs), которая доступна для чтения и записи, вы можете использовать ее для загрузки и работы со статической версией утилиты e2fsck
.
-
Загрузка statically-linked e2fsck:
Перейдите в директорию
/run
и загрузите статически скомпилированную версиюe2fsck
:cd /run wget http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/e2fsck-static_1.44.2-1~bpo9+1_amd64.deb
-
Распаковка деб-пакета:
Распакуйте DEB-файл:
ar x e2fsck-static_*.deb tar Jxvf data.tar.xz
Если распаковали
data.tar.gz
, используйте:tar zxvf data.tar.gz
-
Запуск e2fsck.static для исправления файловой системы:
Убедитесь, что утилита доступна для выполнения:
chmod 755 /run/sbin/e2fsck.static
Затем выполните проверку:
/run/sbin/e2fsck.static /dev/vda
4. Завершение процесса
Перезагрузка и восстановление системы
После успешной проверки и исправления файловой системы выполните перезагрузку:
reboot
Проверьте, что файловая система теперь монтируется в режиме чтения-записи. Если обнаружите какие-либо проблемы, повторите процесс исправления.
Заключение
Убедитесь, что установлено самое новое программное обеспечение, особенно если работа ведется с виртуальными машинами и файлами с более новыми расширенными флагами. Регулярно проверяйте оборудование на наличие ошибок и обязательно создавайте резервные копии перед осуществлением любых крупномасштабных изменений в файловой системе.