Как отличить каталог от подтома?

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

Пожалуйста, проверьте папку /boot/grub2, в которой находится grub.cfg. Если я прав, у grub.cfg действительно огромный размер файла. Для информации: обычный grub.cfg имеет размер около 10 КБ (при реальной тяжелой мультизагрузке, это может быть до 50 КБ ), но размеры файлов в мегабайтах или выше определенно являются признаком повреждения.

Основная причина заключается в том, что :после установки или серьезного обновления последним шагом является запуск grub2 -mkconfig, который регенерирует файл grub.cfg. Это серьезный процесс, который сканирует все диски и т. д., поэтому он занимает некоторое время. После записи этого файла система почти всегда делает прямую перезагрузку, чтобы все ваши изменения вступили в силу. Что происходит с SSD-дисками, так это то, что диск получает полный сброс из-за перезагрузки, в то время как записанные данные в grub.cfg еще не были безопасно зафиксированы в его ячейках NAND. В большинстве случаев данные есть, но закрытия файла (, которое устанавливает длину файла и т. д. ), не произошло, что приводит к огромному пустому пространству (или старым данным на диске ), которые следуют за обычный файл grub.cfg.

Эффект от этого действия следующий: :grub2 читает файл grub.cfg, но после обычных данных (, которые представляют собой список доступных загрузочных систем, )это занимает некоторое время (до 30 секунд )просто для анализа фиктивных данных (часто 0x00 байт или подобных ), иногда выдавая ошибки. Но в итоге он находит конец файла и выдает правильный список найденных ОС.

Исправить :Убедитесь, что все диски доступны, и вручную запустите grub2 -mkconfig с выводом в файл grub.cfg. В качестве альтернативы используйте шестнадцатеричный редактор, чтобы найти настоящий конец данных, а затем используйте инструмент копирования, чтобы скопировать точно нужное количество байтов в новый файл, а затем замените неисправный grub.cfg на исправный.

Но должно быть более постоянное исправление, так как при каждом обновлении системы может появляться одна и та же проблема. Это означает, что завершение работы системы должно гарантировать, что ВСЕ SSD-диски сохранят все данные.

8
16.02.2020, 08:06
2 ответа

Поле st_dev, возвращаемое stat(2), называется идентификатором устройства, содержащим файла, различается как в подтомах BTRFS, так и в файловые системы. Используя командную строку, то есть

if [ btrfs != "$(findmnt -noFSTYPE --target=.)" ]
then
    echo "not btrfs"
elif findmnt. >/dev/null
then
    echo "btrfs mountpoint"
elif [ "$(stat -c%d.)" -ne "$(stat -c%d..)" ]
then
    echo "btrfs subvolume"
else
    echo "btrfs directory"
fi
2
28.04.2021, 23:23
btrfs subvolume show /directory/in/question

Скорее всего вам нужно sudo. Команда завершится успешно, если это подтом; в противном случае это не удастся. Вы можете перенаправить вывод на /dev/nullи полагаться исключительно на статус выхода.

Будет проверен каждый каталог, доступный в дереве каталогов.:

sudo find / -type d -exec sh -c '
   for d do
      btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
   done' find-sh {} +

Возможно, вы захотите исключить пути, которые вне подозрений. Следующий код исключает /proc, /sysи /dev:

.
sudo find / -type d \( \
     \( -path /proc -prune \) -o \
     \( -path /sys -prune \) -o \
     \( -path /dev -prune \) -o \
     \( -exec sh -c '
        for d do
           btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
        done
     ' find-sh {} + \) \)

См. также:Как определить, на каком подтоме находится каталог/файл?

4
28.04.2021, 23:23

Теги

Похожие вопросы