35 votos

¿Cómo puedo mover de un tirón un único bit en un archivo?

Quiero intencionalmente daño un archivo con el fin de poner a prueba las afirmaciones de que btrfs puede curarse a sí mismo. El artículo habla acerca de tomar el sistema de ficheros, dañando una foto de "flipping" de un solo bit y, a continuación, volver a montar. En los antiguos sistemas de ficheros sólo sería dañado pero se supone que reparar en btrfs. En teoría, esto tiene sentido, pero lo que realmente quiero probarlo.

El problema es que el artículo no explica cómo a hacer nada de eso.
Cómo se podría ir sobre el cambio de un solo bit en un sitio específico dentro de un sistema de ficheros?

También debo señalar que esto debe ser hecho en un sistema de archivos sin conexión para que btrfs no ver a mi escribir como intencional.

Edit: si bien la pregunta (y discusión) habla mucho acerca de btrfs, me gustaría saber si hay sistema de archivos independiente de los métodos de aplicación de este tipo de corrupción (de manera que puedan ser comparados a través de diferentes tipos de RAID/controllers/etc).

20voto

cgbinho Puntos 1

Yo no soy un experto, pero el btrfs-progs paquete incluye una herramienta específica para ello, aunque puede que tenga que construir desde el código fuente. En cualquier caso, una vez que se han instalado o construido btrfs-progs, usted debería ser capaz de utilizar la herramienta btrfs-corrupt-block, el cual es utilizado por el btrfs los desarrolladores para probar el sistema de ficheros.

Ahora, como he dicho, no he tenido mucho tiempo para jugar con btrfs, así que no sé exactamente el uso de esta herramienta. Pero con él, usted debería ser capaz de corromper a un sistema de archivos sin conexión, que se fijará cuando el archivo dañado es leer (suponiendo que usted ha configurado en RAID o algo así que hay otra copia para uso).

16voto

RN. Puntos 559
  1. Obtener el valor de un solo sector en el dispositivo de bloque (por ejemplo /dev/sda1) con un desplazamiento de 1 millón de sectores de desplazamiento (sólo un ejemplo):

    sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
    

    Este arbitrario elegido 1M * 512 bytes desplazamiento es sólo para asegurarse de que usted está fuera de la parte de los metadatos del sistema de ficheros y, en realidad, en un sector que contiene los datos.

  2. Editar el raw del sector de datos cambiando el contenido con un editor hexadecimal. Véase, por ejemplo, Necesitan de un buen editor hexadecimal para Linux.

  3. Poner de nuevo el sector de la unidad con la if y of argumentos invertido:

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    

16voto

Jim Salter Puntos 2940

@Oli - hola, soy Jim Salter, el hombre que escribió ese artículo. Yo estaba trabajando con una máquina virtual, lo que hizo que las cosas más simples. Lo que hice es que comenzó con un archivo JPEG, y se abrió en un editor hexadecimal. El particular que usé fue Bendiga, que se puede instalar en Ubuntu con un simple apt-get install bendiga.

Después de la apertura de los archivos JPEG en la Bendiga, entré a la página de abajo un par de veces para llegar bien a la "carne" del JPEG, y, a continuación, sólo destacó alrededor de cincuenta bytes de datos, y copiar y pegar en un editor de texto (en mi caso, gEdit). Esto me dio algo para la búsqueda.

Ahora me salvó el JPEG en cada matriz en la VM. El almacenamiento detrás de los arreglos fueron una serie de .qcow2 archivos. Una vez que me había salvado el JPEG en las matrices, pude cargar el .qcow2 archivos asociados con cada matriz en la Bendiga, y la búsqueda de ellos, no eran muy grandes, no siendo nada, pero el JPEG y algunos de los metadatos para que el cincuenta patrón de bytes que yo había resaltado y copiado de los archivos JPEG. Voila, tuve el bloque de corruptos! En este punto, yo sólo podía editar manualmente bytes individuales de los archivos JPEG almacenados en la máquina virtual de disco virtual utilizando la Bendiga - y, sobre todo, hacerlo exactamente de la misma manera en cada matriz.

La única arruga es que en el caso de la matriz raid 5 probado en el artículo, me tenía que asegurarse de que he editado el real de la copia de los datos en la raya, y no el de la paridad para las bandas en sí - fue una pequeña imagen en una matriz vacía, así que no había ningún dato en el SIGUIENTE bloque en la banda, haciendo que el bloque de paridad contienen los datos inalterada desde el bloque de datos. Si yo hubiera accidentalmente editado el bloque de paridad en lugar del bloque de datos, la imagen se han mostrado como sin cambios.

Una nota final, no hay NECESIDAD de máquinas virtuales para hacer esto, puede hacer las mismas cosas de la misma manera con bare metal; eso sería más de un dolor en el trasero, porque tendría que trabajar con toda la raw unidades en lugar de con una pequeña y agradable .qcow2 de archivos, o bien iba a tener que tirar de las unidades y los puso en una máquina diferente, o arranque en vivo (o alternativo) entorno a meterse con ellos. (He probado ZFS de datos de la curación exactamente de esta forma, pero en real bare metal máquinas, 7-ish años atrás, cuando por primera vez me interesé en la próxima generación de sistemas de archivos.)

Espero que esto ayude!

4voto

kuester2000 Puntos 5327

Usted podría tratar de un pequeño programa que se realizará FIBMAP ioctl(2) sobre el archivo abierto.

Por una rápida búsqueda en la web, he encontrado este post en el blog http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html el detalle de cómo hacer esto, incluso un enlace a un programa de ejemplo que se puede compilar y ejecutar el mismo.

$ git clone git://kernel.ubuntu.com/cking/debug-code
$ cd debug-code/block-mapper-fibmap
$ make
$ sudo ./fibmap /path/to/your/image-file.jpg

Esta es exactamente la forma en hdparm --fibmap (mencionado por @falconer) es implementado.

Después de encontrar los números de bloque que podría emplear dd gongfu para modificar el archivo, como @gertvdijk esbozado. O tal vez sólo podría modificar el fibmap.c programa anterior para hacer el bit flip para usted, directamente de la escritura para el archivo de dispositivo evitando el sistema de archivo de capa (tres parámetros para el programa: 1. la ruta de acceso al archivo, 2. archivo de dispositivo que contiene el sistema de archivos, 3. desplazamiento de bits y se desea modificar).

(Descargo de responsabilidad: yo no lo he probado y no puede garantizar que el FIBMAP ioctl(2) va a trabajar para un archivo en el dispositivo de loopback o un sistema de archivos btrfs, pero creo firmemente que esperar que lo hace. Estoy adivinando hdparm comprobará el tipo de dispositivo antes de realizar la ioctl(2) sobre el archivo y por lo tanto es su defecto.)

3voto

falconer Puntos 8812
sudo hdparm --fibmap /PATH/TO/FILE

le dará el Lba donde se encuentra el archivo. Después de esto, usted puede usar @gertvdijk 's respuesta.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: