Обнаружение подключенных дисков в Linux и Mac OS X

Я использую QDir::drives() для получения списка дисков. Он отлично работает в Windows, но в Linux и Mac возвращает только один элемент «/», т.е. е. корень. Это ожидаемое поведение, но как я могу получить список дисков на Mac и Linux?

Также приветствуются не Qt, нативные API-решения.

Уточнение определения «диска»: я хотел бы получить список точек монтирования, которые видны как «диски» в Finder или встроенном файловом менеджере Linux.


person Violet Giraffe    schedule 03.09.2013    source источник


Ответы (7)


Что касается файловой системы, то в Unix/Linux нет концепции дисков (не могу поручиться за MacOSX, но я бы сказал, что это то же самое). Ближе всего, вероятно, будут точки монтирования, но нормальное приложение не должно беспокоиться о них, поскольку все уже доступно в корневом каталоге файловой системы / (отсюда поведение QDir::drives(), которое вы наблюдаете).

Если вы действительно хотите увидеть, какие точки монтирования используются, вы можете проанализировать вывод команды mount (без каких-либо аргументов) или, по крайней мере в Linux, содержимое файла /etc/mtab. Однако будьте осторожны, точки монтирования могут очень быстро стать довольно сложными (петлевые устройства, файловые системы FUSE, общие сетевые ресурсы и т. д.), поэтому, опять же, я бы не рекомендовал их использовать, если ваше приложение не предназначено для их администрирования.

Имейте в виду, что в ОС Unix-y точками монтирования обычно занимаются системные администраторы, а не конечные пользователи, если только мы не говорим о съемных носителях или временных сетевых ресурсах.


Изменить: После ваших разъяснений в комментариях в Linux вы должны использовать getmntent или getmntent_r, чтобы проанализировать содержимое файла /etc/mtab и таким образом получить список всех точек монтирования и соответствующих устройств.

Хитрость после этого заключается в том, чтобы определить, какие из них вы хотите отображать (съемные? сетевой ресурс?). Я знаю, что /sys/block/... может помочь с этим, но я не знаю всех деталей, так что вам придется копать еще немного.

Например, чтобы проверить, является ли /dev/sdd1 (USB-ключ), подключенный к /media/usb0/, съемным устройством, вы можете сделать (обратите внимание, что я использую имя устройства sdd, а не имя раздела sdd1):

$ cat /sys/block/sdd/removable
1

В отличие от моего основного жесткого диска:

$ cat /sys/block/sda/removable
0

Надеюсь, это поставит вас на правильный путь.

person syam    schedule 03.09.2013
comment
Отредактировал мой вопрос, чтобы указать, какие точки монтирования меня интересуют. Идеальным решением был бы соответствующий системный API, который возвращает список путей к файловой системе, но пока я не могу найти его ни для одной системы. - person Violet Giraffe; 04.09.2013
comment
MacOSX в этом отношении по сути является BSD и ведет себя соответственно, но с гораздо большей автоматизацией автоматического монтирования, чем обычно в *NIX. - person marko; 04.09.2013
comment
@VioletGiraffe Добавлена ​​дополнительная информация, которая может быть полезна, даже если она все еще немного расплывчата. - person syam; 04.09.2013
comment
Спасибо! getmntent дает немного мусора, а также желаемые очки, но это работает. - person Violet Giraffe; 04.09.2013
comment
cat /sys/block/sdd/removable/ возвращает 0 для моего внешнего жесткого диска. Я обнаружил, что проверка /dev/by-path/... записей на наличие текста usb в них более надежна. Мой внешний жесткий диск, установленный в /dev/sdb, имеет by-path идентификатор pci-0000:00:10.0-usb-0:1:1.0-scsi-0:0:0:0, который, в отличие от внутреннего жесткого диска, обозначается как pci-0000:00:11.0-ata-1 - person Marcus; 15.06.2016

Для OS X система арбитража дисков может использоваться для перечисления и мониторинга дисков и точек монтирования

person Nore    schedule 25.09.2013
comment
Ссылка мертва. Новый — developer.apple.com/library/mac/documentation/. Дарвин/Справочник/ - person prewett; 06.02.2016

Очистка вывода команды оболочки mount, безусловно, является одним из вариантов на любой платформе, хотя, каково ваше определение диска здесь? Физические носители, съемные драйверы, сетевые тома? Вам нужно будет сделать много фильтрации.

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

В Linux существует множество мест в зависимости от конкретного используемого дистрибутива. /mnt/ является традиционным, но есть и другие.

person marko    schedule 03.09.2013
comment
Я хотел бы получить список точек монтирования, которые видны как диски в встроенном файловом менеджере Finder или Linux. - person Violet Giraffe; 04.09.2013
comment
Я думаю, что это относится к `/Volumes' - хотя вы можете скрыть их на боковой панели Finder. - person marko; 04.09.2013
comment
@VioletGiraffe В Linux нет встроенного файлового менеджера, если только ls и cd не считаются одним (и у них, конечно, нет понятия дисков). - person syam; 04.09.2013
comment
@syam: может быть, не сам Linux, тогда KDE и GNOME. - person Violet Giraffe; 04.09.2013
comment
@VioletGiraffe Ну, я нахожусь в KDE, и Dolphin показывает мне только съемные носители (обычно USB или CD-ROM). Это то, что вам нужно? Мои различные разделы (несколько внутренних дисков) и сетевые ресурсы не отображаются. - person syam; 04.09.2013
comment
@syam: это + у меня есть раздел NTFS, смонтированный с помощью ntfsmount, и Dolphin также это показывает. - person Violet Giraffe; 04.09.2013
comment
@marko ...всегда находится под /Volumes/ У вас есть цитаты для этого? Я пытаюсь убедиться, что это всегда так для OSX, но не нахожу веских доказательств. - person mphair; 15.01.2014

В Linux способ получить информацию о смонтированных в данный момент дисках — проанализировать файл mtab. glibc предоставляет макрос _PATH_MNTTAB для поиска этого файла. См. http://www.gnu.org/software/libc/manual/html_node/Mount-Information.html#Mount-Information

person jhauris    schedule 03.09.2013
comment
Спасибо за указание направления. Это кажется актуальным: gnu.org/software/libc/manual/ html_node/mtab.html#mtab - person Violet Giraffe; 04.09.2013

Если вы знаете формат рассматриваемого диска/дисков, вы можете использовать команду df для вывода списка дисков из консоли или программно в виде системной команды. Например, чтобы найти все диски ext4:

df -t ext4

Вы можете просто добавить дополнительные форматы в ту же команду, если вас интересует более одного типа:

df -t ext4 -t tmpfs

Это вернет вам физическое расположение диска, объем памяти, который он имеет, объем используемой памяти, объем свободной памяти, процент использования и место, где он смонтирован в файловой системе.

df покажет вам все диски, установленные в системе, но некоторые из них будут не совсем тем, что вы ищете, например, временные файловые системы и т. д.

Не уверен, будет ли это работать на OSX или нет, но это работает в моем дистрибутиве Ubuntu 12.04.

person Brian    schedule 03.09.2013
comment
Это именно то, что мне дает функция getmntent! Спасибо за способ перепроверить. - person Violet Giraffe; 04.09.2013

Другой способ - проверить «Тома».

дф-Н | grep "/Тома"

person Paul Cav    schedule 07.07.2016

Я знаю, что это старо, но в нем не упоминается getfsstat, который я использовал в macos. Вы можете получить список монтирований (который будет включать большинство дисков), используя getfsstat. См. man 2 getfsstat для получения дополнительной информации.

person Bob    schedule 28.10.2018