Utilizando libparted para obtener información sobre nuestros discos

30 junio 2010 Publicado por cLimbo

Libparted es una librería desarrollada en C por el proyecto GNU.

Se trata de una librería que nos permite desde listar hasta crear, borrar y modificar particiones. Fue desarrollada para el programa parted, cuya versión gráfica y más conocida es gparted

Para instalar libparted en sistemas basados en debian (como ubuntu):

apt-get install libparted1.8-dev

Una vez instalada, podemos empezar a utilizarla desde nuestros programas, pero antes de entrar en detalle, mejor empezar con un ejemplo:

#include
#include
#define MEGABYTE 1048576

int main (void)
{
PedDevice* device = NULL;
PedDisk* disk = NULL;
PedPartition* part = NULL;
PedGeometry geom;

unsigned long size;
double length;
PedSector p_size;
char *fsname;

ped_device_probe_all ();

while ((device = ped_device_get_next(device))) {
disk = ped_disk_new(device);
p_size = device->length;
size = p_size/MEGABYTE;
size = size * device->sector_size;
printf(“%s name: %s size: %uMB\n”,device->path,device->model,size);

for (part = ped_disk_next_partition (disk, NULL); part;
part = ped_disk_next_partition (disk, part)) {
geom = part->geom;
length = (double)geom.length/MEGABYTE*device->sector_size;
if(part->fs_type) {
fsname = (char*)part->fs_type->name;
} else {
fsname = “Uknown”;
}

//if(part->num > 0) {
printf(“\t%s%d %10.2fMB %s\n”,device->path, part->num,length,fsname);
//}
}

}
return 0;
}

para compilarlo es suficiente poner

gcc -lparted test.c -o test

Al ejecutarlo nos muestra una lista con nuestros discos y sus particiones (debemos ejecutarlo como root ya que libparted utiliza instrucciones a bajo nivel que requieren privilegios de administrador para funcionar)

andr0med:/home/ap0# ./test
/dev/sda name: ATA Hitachi HTS54161 size: 152576MB
/dev/sda1 146389.14MB ext3
/dev/sda2 6236.17MB Uknown
/dev/sda5 6236.14MB linux-swap
andr0med:/home/ap0#

Si miramos el código, vemos que hay dos bucles anidados (uno dentro de otro), el primero es el que lee los discos mientras que el que está dentro se encarga de iterar sobre las particiones de cada disco leído.

Lo primero que tenemos que hacer es incluir la librería

#include

Libparted necesita escanear el sistema busca de dispositivos de almacenamiento, para ello llamamos a ped_device_probe_all:

ped_device_probe_all ();

A continuación, creamos un bucle que itera sobre ped_device_get_next, obteniendo el siguiente dispositivo cada vez que es llamada la función. Cuando no queden mas dispositivos, la función devuelve NULL y el bucle finaliza:

while ((device = ped_device_get_next(device)))

con ped_disk_new(device) a partir de un dispositivo creamos un disco para poder tratarlo como tal

disk = ped_disk_new(device);

con esto obtenemos el tamaño del disco en megabytes

p_size = device->length;
size = p_size/MEGABYTE;
size = size * device->sector_size;

de esta forma ya podemos printear nuestro disco por pantalla con su ruta en el sistema(device->path), modelo(device->model) y su tamaño en MB (size)

printf(“%s name: %s size: %uMB\n”,device->path,device->model,size);

terminado esto, entramos en el segundo bucle el cual hace lo mismo que el primero pero en este caso llamando a las diferentes particiones de nuestro disco

for (part = ped_disk_next_partition (disk, NULL); part;
part = ped_disk_next_partition (disk, part))

Como veis, es un bucle exactamente igual, pero esta vez llamando a ped_disk_next_partition. Calculamos el tamaño de cada partición encontrada en el disco, de la misma forma que hacemos para calcular el tamaño de cada disco:

length = (double)geom.length/MEGABYTE*device->sector_size;

A continuación, comprobamos si la partición tiene un sistema de archivos conocido, en caso contrario lo llamamos Uknown

if(part->fs_type) {
fsname = (char*)part->fs_type->name;
} else {
fsname = “Uknown”;
}

finalmente, printeamos nuestras particiones filtrándolas

if(part->num > 0) {
printf(“\t%s%d %10.2fMB %s\n”,device->path, part->num,length,fsname);
}

Esta condición que comprueba si el número de partición es mayor que 0, es necesaria para impedir que se muestren por pantalla particiones inexistentes por pantalla, ya que ninguna partición está identificada por un número negativo, veamos que pasa si quitamos el condicional:

andr0med:/home/ap0# ./test
/dev/sda name: ATA Hitachi HTS54161 size: 152576MB
/dev/sda-1 0.03MB Uknown
/dev/sda1 146389.14MB ext3
/dev/sda2 6236.17MB Uknown
/dev/sda-1 0.03MB Uknown
/dev/sda5 6236.14MB linux-swap
/dev/sda-1 2.49MB Uknown
andr0med:/home/ap0#

Esto es solo una pequeña parte de lo que se puede hacer con libparted, en un futuro ya volveré a hablar de ella.

Etiquetas: , , , ,