Вопрос или проблема
У меня есть старый ноутбук с Linux, который используется как домашний сервер. Он в основном запускает множество контейнеров Docker. У меня есть внешний жесткий диск, зашифрованный с помощью LUKS, подключенный к ноутбуку, который монтируется и расшифровывается с помощью скрипта. Контейнеры Docker используют монтирование Docker к тому же смонтированному месту, так что файлы в конечном итоге сохраняются на моем внешнем жестком диске из контейнеров Docker.
Я расшифровываю и монтирую диск следующим образом:
sudo cryptsetup luksOpen --key-file=$KEY_FILE UUID=$DRIVE_UUID $PARTITION_NAME
sudo mount /dev/mapper/$PARTITION_NAME /mnt/storage
Результат команды lsblk -o NAME,KNAME,UUID,FSTYPE,TYPE,MOUNTPOINT,SIZE
выглядит следующим образом.
sdc sdc disk 10.9T
|-sdc1 sdc1 67E3-17ED vfat part 200M
|-sdc2 sdc2 91c4ccef-ebf2-4976-8c93-93d48340022b apfs part 465.7G
`-sdc3 sdc3 0d8b7631-030b-4e29-9eb4-079566c114a6 crypto_LUKS part 10.5T
`-seagate-external-hd-123 dm-2 f21491cc-ce4e-420d-8a76-585ea5fd57ab ext4 crypt /mnt/storage 10.5T
Однако спустя некоторое время (несколько дней или может быть пару недель?) я замечаю в своих логах, что результат той же команды lsblk теперь показывает:
sdc sdc disk 10.9T
|-sdc1 sdc1 67E3-17ED vfat part 200M
|-sdc2 sdc2 91c4ccef-ebf2-4976-8c93-93d48340022b apfs part 465.7G
`-sdc3 sdc3 0d8b7631-030b-4e29-9eb4-079566c114a6 crypto_LUKS part 10.5T
Тем не менее, когда я запускаю ls -lah /mnt/storage
, я действительно вижу данные на жестком диске. Что происходит? Почему lsblk больше не показывает точку монтирования? Будет ли запись в эту точку монтирования по-прежнему сохранять данные на мой жесткий диск?
Также, какой правильный способ определить, что зашифрованный жесткий диск открыт и смонтирован, если я не могу просто использовать lsblk?
Мой скрипт выполняется по расписанию cron, потому что по какой-то причине, после некоторого продолжительного времени, монтирование внешнего жесткого диска снимается. Если скрипт обнаруживает это, он пытается выполнить luksopen и монтирование. Тем не менее, скрипт определял, открыто ли luks, основываясь на наличии $LUKS_UUID в команде lsblk, и теперь, кажется, это ненадежный способ обнаружения, что диск открыт. Какой правильный способ определить, могу ли я получить к нему доступ? Достаточно ли просто проверить df -h | grep /mnt/storage
? Мне не совсем ясно, достаточно ли этого, чтобы сказать, что диск действительно открыт / расшифрован / используется, поэтому я изначально использовал команду lsblk.
Ответ или решение
Проблема, с которой вы столкнулись, может быть вызвана несколькими факторами, связанными с управлением внешними накопителями в Linux. Давайте разберем ваши вопросы подробно.
Почему lsblk
не показывает точку монтирования?
Команда lsblk
отображает текущее состояние блоковых устройств и их соответствующих точек монтирования. Когда вы не видите монтирование в выводе lsblk
, это может указывать на то, что файловая система не была должным образом монтирована или отключилась, однако ваша команда ls -lah /mnt/storage
показывает данные. Это может происходить по следующим причинам:
-
Неожиданное отключение привода: Если ваш внешний привод временно отключается (например, из-за энергосберегающих функций), то монтирование может стать нестабильным. В этом случае содержимое каталога остается доступным, но связь с устройством может потеряться.
-
Таймаут монтирования: Если ваш скрипт монтирует диск через cron, а система не может завершить процесс монтирования (например, по проблемам с подключением), то она может оставить монтирование в состоянии "неактивно".
Как узнать, открыт ли зашифрованный диск и смонтирован ли он?
Не всегда надежно полагаться на lsblk
. Вместо этого вы можете использовать несколько других методов, чтобы проверить состояние вашего диска:
-
Команда
mount
: Выполнив командуmount
, можно увидеть все смонтированные файловые системы и их точки монтирования. Вы можете проверить, что ваша точка/mnt/storage
действительно смонтирована:mount | grep /mnt/storage
-
Состояние LUKS: Вы можете использовать
cryptsetup status
для проверки состояния LUKS-проверки:sudo cryptsetup status seagate-external-hd-123
Это покажет, открыт ли ваш зашифрованный раздел.
-
Команда
df -h
: Как вы правильно заметили, командаdf -h | grep /mnt/storage
также полезна. Она покажет, что файловая система действительно монтирована и доступна. Это можно считать достаточно надежным индикатором.
Как предотвратить автоматическое размонтирование диска?
Если ваш скрипт запускается через cron, убедитесь, что он содержит условия для повторного монтирования при обнаружении, что диск отключен. Например:
# Проверка, открыт ли LUKS
if ! cryptsetup status seagate-external-hd-123 | grep -q "is active"; then
echo "Диск не открыт, открываю..."
sudo cryptsetup luksOpen --key-file=$KEY_FILE UUID=$DRIVE_UUID $PARTITION_NAME
fi
# Проверка, смонтирован ли диск
if ! mount | grep -q "/mnt/storage"; then
echo "Диск не смонтирован, монтирую..."
sudo mount /dev/mapper/$PARTITION_NAME /mnt/storage
fi
С помощью вышеупомянутых методов вы сможете более надежно контролировать доступ к вашему зашифрованному внешнему жесткому диску и избежать проблем с его стабильностью в будущем.