Su pregunta era acerca de Linux, por lo que esto es (más o menos) específico de Linux.
A continuación se muestra un ejemplo de código para tres variantes para mapear mayor/menor a un nombre de dispositivo.
- Parse/proc/partitions.
- Preguntar hal. Hal también realiza un seguimiento del dispositivo "principal", lo que significa que puede obtener fácilmente el disco y también la partición.
- Compruebe sysfs usted mismo. Aquí es de donde hal obtiene su información.
Yo diría que/proc/partitions es el más simple: es solo un archivo para abrir y verificar. Hal le brinda la mayor información y abstrae muchos detalles. sysfs puede verse como más correcto que/proc/partitions y no requiere que hal se ejecute.
Para un programa de escritorio me gustaría ir a hal. En un sistema integrado, iría con sysfs.
import os
def main():
dev = os.stat("/home/").st_dev
major, minor = os.major(dev), os.minor(dev)
print "/proc/partitions says:", ask_proc_partitions(major, minor)
print "HAL says:", ask_hal(major, minor)
print "/sys says:", ask_sysfs(major, minor)
def _parse_proc_partitions():
res = {}
for line in file("/proc/partitions"):
fields = line.split()
try:
tmaj = int(fields[0])
tmin = int(fields[1])
name = fields[3]
res[(tmaj, tmin)] = name
except:
# just ignore parse errors in header/separator lines
pass
return res
def ask_proc_partitions(major, minor):
d = _parse_proc_partitions()
return d[(major, minor)]
def ask_hal(major, minor):
import dbus
bus = dbus.SystemBus()
halobj = bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
hal = dbus.Interface(halobj, 'org.freedesktop.Hal.Manager')
def getdevprops(p):
bdevi = dbus.Interface(bus.get_object('org.freedesktop.Hal', p),
"org.freedesktop.Hal.Device")
return bdevi.GetAllProperties()
bdevs = hal.FindDeviceByCapability("block")
for bdev in bdevs:
props = getdevprops(bdev)
if (props['block.major'], props['block.minor']) == (major, minor):
parentprops = getdevprops(props['info.parent'])
return (str(props['block.device']),
str(parentprops['block.device']))
def ask_sysfs(major, minor):
from glob import glob
needle = "%d:%d" % (major, minor)
files = glob("/sys/class/block/*/dev")
for f in files:
if file(f).read().strip() == needle:
return os.path.dirname(f)
return None
if __name__ == '__main__':
main()
por qué no tratar de analizar la salida de 'mount'? –