Самый точный из известных мне методов заключается в использовании вывода системного вызова lstat (). В частности, поле st_dev. Существует утилита командной строки stat (1), которую можно использовать для просмотра этой информации. Например, вывод «stat / etc / issue» на моем ноутбуке:
File: ‘/etc/issue’
Size: 65 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1610916043 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Обратите внимание на третью строку, первое поле «Устройство». Здесь перечислены 801h. Это значение может быть разделено на два байта, 8 и 1. Первый байт известен как старший номер, второй байт - младший номер. Итак, следующий шаг - выяснить, какое устройство старшее 8, младшее 1.
Я считаю консалтинг / proc / partitions самым быстрым. В моем случае / proc / partitions содержит содержимое:
major minor #blocks name
8 16 234431064 sdb
8 17 33554432 sdb1
8 18 200875608 sdb2
8 0 500107608 sda
8 1 500106584 sda1
Из этого вывода довольно ясно, что старший 8, младший 1 - это sda1. Мы можем подтвердить это с помощью ls -l / dev / sda1
brw-rw---- 1 root disk 8, 1 May 8 05:33 /dev/sda1
Обратите внимание на 8, 1 перед отметкой даты.
Важно понимать / помнить, что имя файла устройства, например / dev / sda1, является только меткой. Старшие и младшие числа являются значимыми, важными значениями файла устройства. Если вам интересно, посмотрите утилиту mknod (1), используемую для создания файлов устройств. Я мог бы создать новую запись / dev под названием aardvark с основным 8, второстепенным 18 со следующим синтаксисом:
mknod /dev/aardvark b 8 18
Тогда я мог бы легко смонтировать его:
mount /dev/aardvark /mnt
и если мы посмотрим на вывод команды mount или содержимое / proc / mounts и увидим:
/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)
df -h показывает:
/dev/aardvark 192G 154G 38G 81% /mnt
... В любом случае, смысл всего этого состоит в том, чтобы проиллюстрировать, что важными деталями для идентификации блочного устройства являются старшие и младшие номера, а не метка файла устройства, и что использование системного вызова lstat () - лучший способ запросить эти значения.
В качестве последнего комментария я просто перечитал ваш вопрос, чтобы убедиться, что отвечаю на него, и понял, что вы спрашиваете, какая метка исходного устройства будет отображаться в / proc / mounts для монтирования с привязкой. Это будет та же самая метка исходного устройства, которая использовалась в исходном вызове mount (2) для источника точки монтирования файловой системы для монтирования связывания. Возможно, пример поможет:
У меня есть / dev / sdb2 и / dev / aardvark (так же, как указано выше). Они оба - основные 8, второстепенные 18. Обратите внимание, я буду монтировать одну и ту же файловую систему дважды. Я делаю следующее:
mkdir /mnt1 /mnt2 /foo
mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2
Обратите внимание, что я делаю каталог somedir в / mnt1. Но поскольку / mnt1 и / mnt2 имеют одинаковую монтированную файловую систему, somedir также будет доступен через / mnt2.
mkdir /mnt1/somedir
mkdir /foo/left /foo/right
mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right
Теперь, если мы проверим / proc / mounts, мы увидим:
/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0
Метка исходного устройства на / foo / ... bind mounts совпадает со значением, изначально указанным в вызове файловой системы mount (2). Помните, что / dev / aardvark и / dev / sdb2 в моем примере - это одно и то же устройство.
Я понимаю, что только что напечатал роман, и первая половина на самом деле не отвечает на ваш вопрос, но казалось, что это пустая трата, чтобы удалить его. Возможно, это поможет кому-то еще.
Удачи.
PS Имейте в виду, что некоторые файловые системы основаны на сети - например, NFS или CIFS - или являются виртуальными - как procfs или sysfs и не имеют блочного устройства-источника. Я не знаю, что будет возвращено как устройство в выводе статистики, просто за то, что оно того стоит.
$PWD
(это то, что я монтирую) похоронено в серии символических ссылок, привязных монтирований и т. Д., То мне нужно будет рекурсивно исследовать путь для точек монтирования.