Acceso directo al disco duro sin FS desde el programa C en Linux

2 minutos de lectura

avatar de usuario
ángel c

Quiero acceder a todo el disco duro directamente desde un programa C. No hay FS en él y nunca lo habrá.

Solo quiero abrir /dev/sda (por ejemplo) y hacer E/S en el nivel de bloque/sector del disco.

Estoy planeando escribir algunos programas para aprender a programar en C en el entorno Linux (conozco el lenguaje C, Python, Perl y Java) pero me falta confianza en el entorno Linux.

Para mis propósitos de aprendizaje, estoy pensando en jugar con kyoto-cabinet y guardar el valor correspondiente al hash calculado directamente en un “bloque/sector” del disco duro, grabando el par: “hash, referencia de bloque/sector” en un archivo de base de datos de hash del gabinete de kyoto.

No sé si esto es factible usando las funciones estándar de CI/O o, de lo contrario, tendría que escribir un “controlador de dispositivo” o algo así…

Como se mencionó en otra parte, en sistemas *NIX, bloquee dispositivos como /dev/sda se puede acceder como archivos simples. Tenga en cuenta que si el sistema de archivos se monta desde el dispositivo, fallaría al abrirlo como archivo para escritura.

Si quieres jugar con dispositivos de bloques, te aconsejo que primero uses el loop device, que presenta un archivo simple como un dispositivo de bloque. Por ejemplo:

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K
losetup /dev/loop0 $PWD/loop_file_10MB

Después, /dev/loop0 se comportaría como si fuera un dispositivo de bloque, pero toda la información escrita se almacenaría en el archivo.

  • Gracias a todos por la rápida respuesta. Primero lo intentaré con dispositivos de bucle.

    – Ángel C

    19 de agosto de 2010 a las 13:11

Como archivos de dispositivo para unidades (p. ej. /dev/sda) son dispositivos de bloque, esto significa que puede abrir, buscar y usar el archivo casi como un archivo normal.

Sí, como han señalado otros, simplemente puede abrir el dispositivo de bloqueo.

Sin embargo, es una muy buena idea hacer IO (escribir de todos modos) en los límites de bloque y en bloques completos. Puede usar algo como pread() y pwrite() para hacer estos IO, o mmap algunos o todos los dispositivos.

Hay un montón de ioctls que se pueden usar, consulte “man sd” para obtener más información. No parecen estar todos documentados en el mismo lugar.

En linux/fs.h se definen BLKROSET y un montón de otros ioctls, tiene que buscar para saber cómo usarlos. Puede hacer cosas útiles como averiguar qué tan grande es el dispositivo y cuál es el tamaño del bloque.

El código fuente del paquete util-linux-ng es tu amigo, contiene ejemplos.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad