Вопрос или проблема
Моя строка /etc/fstab
для SD-карты, которую я собираюсь смонтировать, выглядит так:
/dev/mmcblk1 /media/sd_card vfat user,rw,umask=000,sync 0 2
С этой строкой я могу смонтировать SD-карту, но каждый раз, когда я хочу отсоединить SD-карту, мне нужно выполнить blockdev --flushbufs /dev/mmcblk1
, если я хочу, чтобы внесенные изменения вступили в силу.
Что означает, что если я не выполню команду blockdev
, все внесенные изменения будут утеряны после отсоединения SD-карты.
Странно то, что все время, пока я использовал эту строку, я считал, что все работает нормально…
Так что я делаю не так?
Я работаю на jetson tx2 с установленным Ubuntu 16.04.
Мой raspbian bullseye имеет опцию flush mount именно для этого.
PARTUUID=80aaf812-01 /boot vfat defaults,flush 0 2
В других raspbian я в основном отказывался от монтирования /boot, чтобы исправить ситуации с загрузкой после сброса питания.
Ответ или решение
Автоматическая очистка буферов при монтировании в /etc/fstab
Общая проблема
Вы столкнулись с проблемой, когда при монтировании SD-карты с использованием файла /etc/fstab
изменения, которые вы вносите, не сохраняются, пока вы не выполните команду blockdev --flushbufs /dev/mmcblk1
. Это может привести к потере данных, если устройство будет выключено или отключено без предварительного вызова этой команды.
Разбор текущей конфигурации
Ваши настройки в /etc/fstab
выглядят следующим образом:
/dev/mmcblk1 /media/sd_card vfat user,rw,umask=000,sync 0 2
Параметры монтирования
/dev/mmcblk1
: Это устройство, представляющее вашу SD-карту./media/sd_card
: Путь,куда будет монтироваться устройство.vfat
: Файловая система, используемая для SD-карты.user,rw,umask=000,sync
: Флаги монтирования:user
: Разрешает обычным пользователям монтировать и размонтировать устройство.rw
: Монтирование в режиме чтения-записи.umask=000
: Позволяет всем пользователям читать, записывать и выполнять файлы.sync
: Вся запись на устройство выполняется синхронно, что замедляет операции, но обеспечивает, что все данные будут немедленно записаны на диск.
Причина проблемы
Команда blockdev --flushbufs /dev/mmcblk1
принудительно очищает буферы на устройстве, тем самым гарантируя, что все изменения, записанные в файловую систему, фактически попадают на физический носитель. Параметр sync
в вашем монтировании гарантирует, что изменения будут записаны без задержек на уровне программного обеспечения, но это не всегда эффективно для немедленного применения на уровне блока, особенно в случае с SD-картами и их кэшированием.
Решение: Использование flush
В Raspbian Bullseye, как вы указали, есть параметр flush
, который автоматически очистит буфер записи при размонтировании устройства. Однако Ubuntu 16.04, скорее всего, не поддерживает этот параметр в стандартной конфигурации для файловых систем, таких как vfat
.
Рекомендации
-
Использование команды
sync
перед извлечением SD-карты:
Вы можете добавить командуsync
перед тем, как физически отключать SD-карту. Это поможет убедиться, что все буферы будут очищены.sync
-
Используйте
umount
вместо простого извлечения:
Убедитесь, что вы используетеumount /media/sd_card
, чтобы размонтировать устройство корректно. Это заставит систему записать все кэшированные данные на диск. -
Создание скрипта:
Если выполнение командыsync
иumount
становится слишком трудоемким, вы можете создать простой скрипт, который будет выполнять их последовательно, и запускать его перед отключением.#! /bin/bash sync umount /media/sd_card
-
Проверка других файловых систем:
Возможно, вам стоит рассмотреть использование другой файловой системы, которая может поддерживать вашу необходимую функциональность. Некоторые файловые системы более эффективны в управлении буферизацией данных.
Заключение
Для корректной работы с SD-картами и минимизации потерь данных крайне важно реализовать правильный порядок операций. Вышеуказанные рекомендации помогут вам избежать случайной потери данных при отключении SD-карты. Если у вас остались вопросы или необходима дополнительная помощь, не стесняйтесь обращаться за помощью.