Вопрос или проблема
Мне нужно подтвердить, что никакая часть диска не смонтирована перед перезаписью всего диска. Проблема в том, что, похоже, нужно знать имена любых файловых систем на диске, прежде чем проверять их по отдельности, и это может быть в целом сложно.
В качестве примера, система, на которой я это пишу, имеет SSD, и parted -l
показывает этот диск как /dev/nvme0n1
, размер 500G. /dev/block
показывает:
lrwxrwxrwx 1 root root 10 Nov 18 12:37 259:0 -> ../nvme0n1
lrwxrwxrwx 1 root root 12 Nov 18 12:37 259:1 -> ../nvme0n1p1
lrwxrwxrwx 1 root root 12 Nov 18 12:37 259:2 -> ../nvme0n1p2
Номер минорного устройства 0 — это ‘весь диск’, в то время как 1 — это загрузочный раздел, а 2 — раздел подкачки. Этот SSD настроен для LVM, но устройства LVM имеют совершенно другие имена в /dev/mapper
.
Слово nvme0n1
нигде не появляется, когда вы проверяете смонтированные файловые системы (mount
, findmnt nvme0n1
, /proc/mounts
, /etc/mtab
). Слово nvme0n1p1
появляется, но только потому, что это смонтированный загрузочный раздел (/boot/efi
). В общем, диск, на который я смотрю, может не иметь загрузочного раздела, так что поиск nvme0n1
в качестве префикса может не быть полезным (и даже если я найду слово с правильным префиксом, могу ли я гарантировать, что оно на том же диске?)
Существует ли какой-либо универсальный способ выяснить, используется ли диск? В данном конкретном случае я могу проанализировать вывод lsblk
, чтобы найти имена /dev/mapper
под nvme0n1
, но это не выглядит как хорошее долгосрочное решение.
(и даже если я найду слово с правильным префиксом, могу ли я гарантировать, что оно на том же диске?)
Да, префикс буквально указывает, какой это диск — nvme0n1
это NVMe устройство 0 пространство 1, и все разделы nvme0n1p##
названные таким образом, потому что они находятся на этом конкретном диске.
Существует ли какой-либо универсальный способ выяснить, используется ли диск? В данном конкретном случае я могу проанализировать вывод lsblk, чтобы найти имена /dev/mapper под nvme0n1, но это не выглядит как хорошее долгосрочное решение.
Это неплохо, так как lsblk имеет код для определения как прямых смонтированных разделов, так и отношений между устройствами-обработчиками, — и даже отношений mdraid, которые являются отдельной вещью по сравнению с устройствами-обработчиками. Не думаю, что может даже существовать по-настоящему универсальное решение без обращения к таким инструментам, как lsblk, которые знают, как собирать эту информацию из нескольких разрозненных мест.
Вместо того, чтобы анализировать его обычный вывод, запустите lsblk --json
и проанализируйте его, найдя свой диск и рекурсивно спускаясь в его атрибут .children
, пока не найдете один с непустым .mountpoints
.
Но даже lsblk не знает о многодисковых файловых системах Btrfs, например (показывая точку монтирования только под одним из устройств), и он знает еще меньше о ZFS.
Проверьте /etc/mtab
, сгенерированный ядром список всего, что смонтировано. man mtab
.
Прочитайте man lsof
, особенно всю запись, начинающуюся с
+D D Эта опция заставляет lsof искать все открытые экземпляры каталога D и все файлы и каталоги, которые он содержит, до его
полной глубины.
и сделайте что-то вроде
sudo lsof +D <mountpoint>
для каждой смонтированной файловой системы.
Также, на всякий случай, проверьте с помощью swapon
или cat /etc/swaps
, еще одного сгенерированного ядром файла.
Ответ или решение
Для подтверждения того, что никакая часть диска не смонтирована перед его перезаписью, необходимо выполнить несколько шагов. В условиях, когда у вас есть SSD (например, /dev/nvme0n1), существует несколько методов для определения занятости диска. Рассмотрим эти методы детально.
1. Использование команды lsblk
Команда lsblk
позволяет получить информацию о подключенных устройствах и их файловых системах. В частности, с помощью опции --json
можно получить структурированную информацию, которая будет проще для анализа.
Пример команды:
lsblk --json
На основе вывода этой команды, вы можете обработать JSON, чтобы выяснить наличие любых точек монтирования. Например, вам необходимо пройтись по вложенным атрибутам .children
, проверяя поле .mountpoints
. Если вы найдете любое непустое значение в .mountpoints
, это будет означать, что соответствующая часть диска в данный момент используется.
2. Проверка файлов /etc/mtab
и /proc/mounts
Файлы /etc/mtab
и /proc/mounts
содержат информацию о монтированных файловых системах. Вы можете просмотреть содержимое этих файлов:
cat /etc/mtab
или
cat /proc/mounts
Проверяя наличие упоминания (например, nvme0n1
или его разделов), вы сможете установить, используется ли диск или его части.
3. Использование команды findmnt
Команда findmnt
предоставляет удобный способ для поиска монтированных файловых систем. В комбинации с флагом --segments
можно уточнить результаты:
findmnt --segments
Здесь вы сможете увидеть, есть ли монтированные файловые системы, связанные с вашим диском.
4. Использование lsof
для поиска открытых файлов
Если вам нужно установить, используются ли какие-либо открытые файлы на диске, можно воспользоваться командой lsof
. Например, чтобы проверить все файлы в определённой точке монтирования, выполните команду:
sudo lsof +D <ваша_точка_монтирования>
Эта команда покажет вам все открытые файлы в заданной директории и их подкаталогах.
5. Проверка свопа
Если диск может быть использован в качестве области подкачки, то важно также проверить его занятость с помощью команд:
swapon --show
или
cat /etc/swaps
Эти команды позволят вам увидеть, используется ли диск в качестве пространства подкачки.
Заключение
Подводя итог, перед тем как перезаписывать диск, ключевыми шагами являются:
- Проверьте монтирование через
lsblk
,findmnt
, и/proc/mounts
. - Используйте
lsof
для выяснения открытых файлов в точках монтирования. - Не забудьте проверить наличие свопа.
Эти методы обеспечат вам всестороннюю проверку статуса использования диска. Следуя указанным шагам, вы можете с уверенностью подтвердить, что диск свободен от монтирования и готов к безопасной перезаписи.