Проблема с осиротевшим индексным узлом

Вопрос или проблема

Я использую виртуальную машину на сервере, к которому не могу получить доступ, и файловая система смонтирована в режиме только для чтения:

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

  1. Загрузка 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
  2. Распаковка деб-пакета:

    Распакуйте DEB-файл:

    ar x e2fsck-static_*.deb
    tar Jxvf data.tar.xz

    Если распаковали data.tar.gz, используйте:

    tar zxvf data.tar.gz
  3. Запуск e2fsck.static для исправления файловой системы:

    Убедитесь, что утилита доступна для выполнения:

    chmod 755 /run/sbin/e2fsck.static

    Затем выполните проверку:

    /run/sbin/e2fsck.static /dev/vda

4. Завершение процесса

Перезагрузка и восстановление системы

После успешной проверки и исправления файловой системы выполните перезагрузку:

reboot

Проверьте, что файловая система теперь монтируется в режиме чтения-записи. Если обнаружите какие-либо проблемы, повторите процесс исправления.

Заключение

Убедитесь, что установлено самое новое программное обеспечение, особенно если работа ведется с виртуальными машинами и файлами с более новыми расширенными флагами. Регулярно проверяйте оборудование на наличие ошибок и обязательно создавайте резервные копии перед осуществлением любых крупномасштабных изменений в файловой системе.

Оцените материал
Добавить комментарий

Капча загружается...