2011-12-29 17 views
5

Soy nuevo en la programación de Linux c, ¿hay alguna API que pueda obtener información de partición de un dispositivo?Programación en Linux C: ¿Cómo obtener la información de partición de un dispositivo?

+0

Quiere recibir la lista de particiones disponibles en un bloque dado dispositivo (presumiblemente un disco físico)? –

+0

Podría ser un posible duplicado de http://stackoverflow.com/questions/5288034/how-get-uuid-of-a-device-partition-in-linux-programatically –

+0

@Brian Cain sí – bright

Respuesta

0

No conozco ninguna API para eso.

Hice ldd `which fdisk` y no mostraba ninguna biblioteca que perteneciera a la tabla de partición de lectura, así que asumí que lo hace solo.

Un vistazo rápido al código fuente del programa fdisk me convence aún más de que no utiliza ninguna biblioteca externa.

Si usted está interesado en entender las cosas a sí mismo y aprender por su cuenta aquí es lo que sugiero que hagas:

  1. Leer la página de Wikipedia sobre MBR.
  2. Obtenga la fuente en fdisk y lea el código.
0

El (pseudo) archivo "/ proc/particiones" contiene al menos una lista de las particiones encontradas en los dispositivos físicos. Lamentablemente, no dice nada sobre los tipos de particiones (en particular, no hay una forma simple de adivinar si una partición es realmente una extendida). Aquí es lo que encuentro en/proc/particiones de mi máquina:

major minor #blocks name 

    8  0 488386584 sda 
    8  1 13631488 sda1 
    8  2 237375488 sda2 
    8  3   1 sda3 
    8  4 3650560 sda4 
    8  5 3413781 sda5 
    8  6 29294496 sda6 
    8  7 14651248 sda7 
    8  8 9767488 sda8 
    8  9 176586448 sda9 
    8  16 7815168 sdb 
    8  17 7811136 sdb1 

SDA es mi hd, SDB es una llave USB. Tenga en cuenta que sda3 es una partición extendida, pero es difícil adivinarlo sin leer directamente la tabla de particiones del disco. La información que encuentre en este archivo puede ser suficiente o no, depende de nuestras necesidades particulares. En mi humilde opinión, una forma más segura es:

1) Create a couple of pipes 
2) fork a process an redirect the pipes to child's stdin and sdtout (fd 0 and 1) 
3) execl "fdisk /dev/sdXXX" 
4) send a "p\n" command to the child process 
5) read the lines containg the complete partition information 

Espero que esto pueda ayudarle.

2

Puede echar un vistazo a /sys/block/sd?/ donde hay muchos pseudo archivos que le informan sobre algunos parámetros de partición.

2

libblkid podría ser una API agradable. blkid (presente en el paquete util-linux) lo usa.

blkid enumera todas las particiones junto con la etiqueta, el tipo de sistema de archivos y el UUID. Aquí hay una salida en mi sistema.

# blkid 
/dev/sda1: LABEL="grub" UUID="a760119d-916a-492c-8ec1-50f81dbf4e26" TYPE="ext2" 
/dev/sda3: LABEL="Library" UUID="248D72BD2E5CF009" TYPE="ntfs" 
/dev/sda5: LABEL="WinXP" UUID="545CC7085CC6E438" TYPE="ntfs" 
/dev/sda6: LABEL="Win7" UUID="22F009B2F0098CEB" TYPE="ntfs" 
/dev/sda7: LABEL="Puppy" UUID="fe1dc425-ad17-4773-971a-435d91690883" SEC_TYPE="ext2" TYPE="ext3" 
/dev/sda8: LABEL="Linux Mint" UUID="0c61a114-9353-499b-a1cd-ba19722b1e43" TYPE="ext4" 
/dev/sda9: LABEL="Ubuntu L" UUID="5f6923e1-92f4-4b3f-b613-9e78839e1987" TYPE="ext4" 
/dev/loop0: TYPE="squashfs" 
/dev/loop1: UUID="16e3a75d-74dc-4391-a9e2-4305c08c5707" TYPE="ext3" 
/dev/loop4: TYPE="squashfs" 
# 

Aquí es manual de referencia: http://www.kernel.org/pub/linux/utils/util-linux/v2.21/libblkid-docs/

acabo ahora encontré esta biblioteca, a mí mismo en busca de respuesta para la misma pregunta.

7

La respuesta de Akash Rawal es bastante cercana. Una buena forma es usar libblkid.

Este es un ejemplo para obtener de una partición: Using libblkid to find UUID of a partition.

que combinan el código de abajo y ejemplos en el menú de referencia libblkid y generar a continuación el programa de trabajo:

#include <stdio.h> 
#include <string.h> 
#include <err.h> 
#include <blkid/blkid.h> 


int main (int argc, char *argv[]) { 
    blkid_probe pr = blkid_new_probe_from_filename(argv[1]); 
    if (!pr) { 
     err(1, "Failed to open %s", argv[1]); 
    } 

    // Get number of partitions 
    blkid_partlist ls; 
    int nparts, i; 

    ls = blkid_probe_get_partitions(pr); 
    nparts = blkid_partlist_numof_partitions(ls); 
    printf("Number of partitions:%d\n", nparts); 

    if (nparts <= 0){ 
     printf("Please enter correct device name! e.g. \"/dev/sdc\"\n"); 
     return; 
    } 

    // Get UUID, label and type 
    const char *uuid; 
    const char *label; 
    const char *type; 

    for (i = 0; i < nparts; i++) { 
     char dev_name[20]; 

     sprintf(dev_name, "%s%d", argv[1], (i+1)); 

     pr = blkid_new_probe_from_filename(dev_name); 
     blkid_do_probe(pr); 

     blkid_probe_lookup_value(pr, "UUID", &uuid, NULL); 

     blkid_probe_lookup_value(pr, "LABEL", &label, NULL); 

     blkid_probe_lookup_value(pr, "TYPE", &type, NULL); 

     printf("Name=%s, UUID=%s, LABEL=%s, TYPE=%s\n", dev_name, uuid, label, type); 

    } 

    blkid_free_probe(pr); 

    return 0; 
} 

Uso:

gcc -o getuuid getuuid.c -lblkid 
sudo ./getuuid /dev/sdc 
Number of partitions:1 
Name=/dev/sdc1, UUID=754A-CE25, LABEL=KINGSTON, TYPE=vfat 
Cuestiones relacionadas