Utilizando libparted para obtener información de nuestros discos

Pese a que en este blog normalmente solo escribe Jose Carlos (vosotros le llamáis rooibo), a partir de ahora yo también iré escribiendo de vez en cuando, a ver si así esto coge un poco mas de vida, ya que Jose Carlos no siempre tiene tiempo. Me llamo Noemi y a pesar de que es la primera vez que escribo en un blog como este (bueno, mas bien es la primera vez que escribo en un blog que no se hable solo de curiosidades tonterías) espero estar a la altura.

Libparted es una librería desarrollada en C por el proyecto GNU, la cual estoy utilizando casi a diario en el nuevo proyecto que estamos llevando a cabo Jose Carlos y yo.

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 <stdio.h>
#include <parted/parted.h>
#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 <parted/parted.h>

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.

About these ads

7 Responses to “Utilizando libparted para obtener información de nuestros discos”


  1. 1 martesito octubre 8, 2008 en 6:07 pm

    ¿Porque la opcion -l del gcc? (gcc -lparted test.c -o test)

    ¡mola el articulin! queremos mas ;)

  2. 3 Noemi octubre 8, 2008 en 6:22 pm

    martesito, las librerías tienen funciones exportadas, que permiten ser usadas desde los programas, la opcion -l seguida de la librería, indica que el programa debe disponer de esa librería, y poder usar sus funciones, al compilarlo, asi, el programa, al ser ejecutado, lo primero que hará será cargar la librería, para disponer de sus funciones.

    rooibo, gracias :D, espero volver a escribir pronto

  3. 4 vierito5 octubre 8, 2008 en 6:24 pm

    @martesito: para compilar usando esa librería

  4. 5 hypno octubre 11, 2008 en 11:14 pm

    Felicidades por el articulo y magnifica explicacion

  5. 6 lachi marzo 17, 2010 en 3:41 pm

    hello.. un buen artículo.. yo también trabajo en algo en lo que necesito usar esas librerías.. me darías algo de documentación??

  6. 7 Carlos Carranza octubre 16, 2011 en 6:14 pm

    Hola, con libparted, tambien puedo saber cuanto espacio libre tiene cada dispositivo??.. no encuentro la opción adecuada.

    Salu2!


Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s





Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: