Есть проблемы с некоторыми из вышеперечисленных решений. На самом деле есть проблема и с вопросом.
Последний ответ (поиск / proc / mounts) просто не работает: поиск "/" будет соответствовать каждой строке в / proc / mounts. Даже исправить это так не получится:
import subprocess
device = subprocess.check_output("awk '$2 == \"/filesystem\" { print $1}' /proc/mounts", shell=True)
print device
Когда "/ filesystem" равен "/", вы обычно получаете две записи, одну для "rootfs" и одну для реального устройства. Это также не будет работать, если в имени смонтированной файловой системы есть пробелы (пробел отображается как \ 040 в /proc/mounts).
Проблема усугубляется с помощью томов btrfs. Каждый подобъем монтируется отдельно, но все они используют одно и то же устройство. Если вы пытаетесь использовать снимок btrfs для создания резервных копий (как я), тогда вам нужно имя подобъема и указание типа файловой системы.
Эта функция возвращает кортеж (устройство, точка монтирования, файловая система) и, похоже, работает:
import os
def get_filesystem_partition(fs):
res = None
dev = os.lstat(fs).st_dev
for line in file('/proc/mounts'):
# lines are device, mountpoint, filesystem, <rest>
# later entries override earlier ones
line = [s.decode('string_escape') for s in line.split()[:3]]
if dev == os.lstat(line[1]).st_dev:
res = tuple(line)
return res
Кажется, это работает для всех случаев, о которых я могу подумать, хотя я ожидаю, что все еще есть патологические случаи, когда он падает на куски.