2009-12-21 10 views
5

Me gustaría programar una instantánea de un sistema de archivos en vivo en Linux, preferiblemente utilizando LVM. Me gustaría no desmontarlo porque tengo muchos archivos abiertos (mi escenario más común es que tengo un escritorio ocupado con muchos programas).instantánea de LVM del sistema de archivos montado

Entiendo que debido a los almacenamientos intermedios del kernel y la actividad general del sistema de archivos, los datos en el disco pueden estar en un estado más o menos indefinido.

¿Hay alguna manera de desmontar "atómicamente" un FS, hacer una instantánea LVM y volver a montarlo? Estará bien si el sistema operativo va a bloquear toda la actividad durante unos segundos para realizar esta tarea. ¿O tal vez algún tipo de "sincronización + instantánea" atómica? Kernel llamada?

No sé si es incluso posible ...

+1

Estuve en la lista de correo de LVM por un tiempo, y parece recordar que se supone que los sistemas de archivos deben tener ganchos para llamar al sistema de archivos al punto de control (es decir, configurarlo para que todos los registros se reproduzcan por journals fs) justo antes de una operación de instantánea LVM. Esto aseguraría que el sistema de archivos en sí estuviera al menos en un estado consistente en la instantánea. – Omnifarious

Respuesta

10

No debería tener que hacer nada para la mayoría de los sistemas de archivos Linux. Debería funcionar sin ningún esfuerzo de tu parte. El comando de instantánea en sí busca los sistemas de archivos montados utilizando el volumen que se está tomando una instantánea y llama a un gancho especial que los señala en un estado consistente de montaje y toma la instantánea de forma atómica.

Las versiones anteriores de LVM incluían un conjunto de parches de bloqueo de VFS que parchaban varios sistemas de archivos para que pudieran marcarse para una instantánea. Pero con nuevos kernels que ya deberían estar integrados en la mayoría de los sistemas de archivos Linux.

Esto intro on snapshots afirma tanto.

Y un poco más de investigación revela que para los núcleos de la serie 2.6 la serie ext de sistemas de archivos debería ser compatible con esto. ReiserFS probablemente también. Y si conozco a la gente de btrfs, probablemente también lo haga.

+0

Guau, eso es genial ... gracias. – liori

+0

Por supuesto, si está haciendo instantáneas LVM de una partición btrfs, está siendo bastante tonto. Btrfs maneja todo eso mejor que LVM. Y btrfs no necesita ningún gancho de punto de control debido a cómo funciona. O obtienes el superbloque apuntando a la nueva raíz o no lo haces. Por supuesto, probablemente tiene tal gancho, pero es casi superfluo. – Omnifarious

1

no estoy seguro de si esto va a hacer el truco para ti, pero se puede volver a montar un sistema de archivos como de sólo lectura. mount -o remount,ro /lvm (o algo similar) hará el truco. Después de que haya terminado su instantánea, puede volver a montar la lectura-escritura usando mount -o remount,rw /lvm.

+0

Esto solo es posible cuando no se abre ningún archivo para escribir ... con un escritorio, muchos archivos, aunque las aplicaciones no les escriben todo el tiempo; f.e. bases de datos sqlite de firefox y otras aplicaciones. – liori

3

Depende del sistema de archivos que esté utilizando. Con XFS puede usar xfs_freeze -f para sincronizar y congelar el FS, y xfs_freeze -u para activarlo de nuevo, para que pueda crear su instantánea desde el volumen congelado, que debería ser un estado de guardado.

4

Sé que ext3 y ext4 en RedHat Enterprise, Fedora y CentOS controlan automáticamente cuando se crea una instantánea LVM. Eso significa que nunca hay ningún problema al montar la instantánea porque siempre está limpia.

I creo XFS tiene el mismo soporte. No estoy seguro acerca de otros sistemas de archivos.

+1

"_RedHat Enterprise, Fedora y CentOS comprueban automáticamente cuando se crea una instantánea LVM_": ¿hay documentación que pruebe esto? ¿Es eso específico para RH? –

+0

@ Benoît: "muchos de los sistemas de archivos en el kernel 2.6 hacen esto automáticamente cuando se crea una instantánea" - http://tldp.org/HOWTO/LVM-HOWTO/snapshotintro.html –

+1

Bueno, esto es en realidad bastante nuevo http : //kernelnewbies.org/Linux_2_6_29#head-b6c330f9e6d252b514138f042ac9b01e9d4170ca! –

1

¿Hay alguna forma de desmontar "atómicamente" un FS, hacer una instantánea LVM y volver a montarlo?

Es posible tomar una instantánea de un sistema de archivos montado, incluso cuando el sistema de archivos no está en un volumen LVM. Si el sistema de archivos está en LVM o tiene instaladas instantáneas incorporadas (por ejemplo, btrfs o ZFS), utilícelas.

Las siguientes instrucciones son de un nivel bastante bajo, pero pueden ser útiles si desea tener la capacidad de tomar una instantánea de un sistema de archivos que no está en un volumen LVM y no puede moverlo a un nuevo volumen LVM. Aún así, no son para los pusilánimes: si comete un error, puede corromper su sistema de archivos.Asegúrese de consultar the official documentation y dmsetup página del manual, verificar tres veces los comandos que está ejecutando, y tener copias de seguridad!

El kernel de Linux tiene una increíble facilidad llamada Device Mapper, que puede hacer cosas buenas como crear dispositivos de bloque que son "vistas" de otros dispositivos de bloque, y por supuesto instantáneas. También es lo que LVM usa debajo del capó para hacer el trabajo pesado.

En los ejemplos a continuación supondré que desea la instantánea /home, que es un sistema de archivos ext4 ubicado en /dev/sda2.

En primer lugar, encontrar el nombre del dispositivo mapeador de dispositivos que la partición está montada sobre: ​​

# mount | grep home 
/dev/mapper/home on /home type ext4 (rw,relatime,data=ordered) 

En este caso, el nombre del dispositivo mapeador de dispositivos es home. Si la ruta al dispositivo de bloques no comienza con /dev/mapper/, entonces necesitará crear un dispositivo mapeador de dispositivos y volver a montar el sistema de archivos para usar ese dispositivo en lugar de la partición HDD. Solo necesitarás hacer esto una vez.

# dmsetup create home --table "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0" 
# umount /home 
# mount -t ext4 /dev/mapper/home /home 

A continuación, obtener la tabla de mapeo de dispositivos del dispositivo de bloques:

# dmsetup table home 
home: 0 3864024960 linear 9:2 0 

Sus números probablemente serán diferentes. El objetivo del dispositivo debe ser linear; si el tuyo no lo es, es posible que debas tomar consideraciones especiales. Si el último número (inicio de desplazamiento) no es 0, deberá crear un dispositivo de bloque intermedio (con la misma tabla que el actual) y usarlo como base en lugar de /dev/sda2.

En el ejemplo anterior, home está utilizando una tabla de entrada única con el objetivo linear. Deberá reemplazar esta tabla por una nueva que use el objetivo snapshot.

mapeador de dispositivos proporciona tres objetivos para snapshotting:

  • El objetivo snapshot, lo que ahorra escribe en el dispositivo COW especificado. (Tenga en cuenta que a pesar de que se llama una instantánea, la terminología es engañosa, ya que la instantánea será modificable, pero el dispositivo subyacente se mantendrá sin cambios.)

  • El objetivo snapshot-origin, que envía escribe en el dispositivo subyacente, sino también envía los datos antiguos que las escrituras sobrescribieron al dispositivo COW especificado.

Normalmente, se hacen home un objetivo snapshot-origin, a continuación, crear algunos snapshot objetivos en la parte superior de la misma. Esto es lo que hace LVM. Sin embargo, un método más simple sería simplemente crear un objetivo snapshot directamente, que es lo que mostraré a continuación.

Independientemente del método que elija, no debe de escritura en el dispositivo subyacente (/dev/sda2), o las instantáneas verá una vista dañada del sistema de archivos.Por lo tanto, como medida de precaución, se debe marcar el dispositivo de bloque como de sólo lectura:

# blockdev --setro /dev/sda2 

Esto no afectará a los dispositivos mapeador de dispositivos respaldados por ella, por lo que si ya has vuelve a montar en /home/dev/mapper/home , no debería tener un efecto notable.

A continuación, tendrá que preparar el dispositivo COW, que almacenará los cambios desde que se tomó la instantánea. Tiene que ser un dispositivo de bloques, pero puede estar respaldado por un archivo disperso. Si desea usar un archivo disperso de, p. 32GB:

# dd if=/dev/zero bs=1M count=0 seek=32768 of=/home_cow 
# losetup --find --show /home_cow 
/dev/loop0 

Obviamente, el archivo disperso no debe estar en el sistema de archivos que estés snapshotting :)

Ahora puede volver a cargar la mesa del dispositivo y convertirlo en un dispositivo de instantánea:

# dmsetup suspend home && \ 
    dmsetup reload home --table \ 
    "0 $(blockdev --getsz /dev/sda2) snapshot /dev/sda2 /dev/loop0 PO 8" && \ 
    dmsetup resume home 

Si eso tiene éxito, las nuevas escrituras en /home ahora deben grabarse en el archivo /home_cow, en lugar de escribirse en /dev/sda2. Asegúrese de controlar el tamaño del archivo COW, así como también el espacio libre en el sistema de archivos en el que se encuentra, para evitar quedarse sin espacio COW.

Una vez que ya no necesite la instantánea, puede fusionarla (para confirmar permanentemente los cambios en el archivo COW en el dispositivo subyacente) o descartarla.

  • fusionarla:

    1. reemplazar la tabla con un objetivo snapshot-merge en lugar de un objetivo snapshot:

      # dmsetup suspend home && \ 
          dmsetup reload home --table \ 
          "0 $(blockdev --getsz /dev/sda2) snapshot-merge /dev/sda2 /dev/loop0 P 8" && \ 
          dmsetup resume home 
      
    2. A continuación, supervisar el estado de la fusión hasta que todo no -los bloques de metadatos se fusionan:

      # watch dmsetup status home 
      ... 
      0 3864024960 snapshot-merge 281688/2097152 1104 
      

      Tenga en cuenta los 3 números al final (X/Y Z). La fusión se haya completado cuando X = Z.

    3. A continuación, sustituir la mesa con un objetivo lineal de nuevo:

      # dmsetup suspend home && \ 
          dmsetup reload home --table \ 
          "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0" && \ 
          dmsetup resume home 
      
    4. ya se puede desmontar el dispositivo de bucle:

      # losetup -d /dev/loop0 
      
    5. último , puede eliminar el archivo COW.

      # rm /home_cow 
      
  • Para descartar la instantánea, desmontar /home, siga los pasos 3-5 de arriba, y volver a montar /home. Aunque Device Mapper le permitirá hacer esto sin desmontar /home, no tiene sentido (dado que el estado de los programas en ejecución ya no se corresponderá con el estado del sistema de archivos), y es probable que corrompa su sistema de archivos.

+0

Cuando leo "incluso cuando el sistema de archivos no está en un volumen LVM", pensé "¡esta será una buena magia negra de devicemapper!" ¡Magnífico! Sin embargo, una pregunta: ¿este procedimiento activará los mismos ganchos que asegurarán que la instantánea esté en un estado consistente? Supongo que debería ser parte de la llamada 'blockdev --setro/dev/sda2'. – liori

+0

Puede agregar una llamada 'sync' justo antes de crear la instantánea; sin embargo, dado que no puedo encontrar ninguna fuente confiable sobre si' sync' actúa por encima o debajo de la capa del sistema de archivos, eso puede o no hacer algo. Independientemente de eso, la instantánea * será * consistente en el sentido de que todos los cambios que se incluirán o no en la instantánea estarán delimitados estrictamente por un punto en el tiempo, y no, p. Desplazamiento de disco o nombre de archivo, por lo que la instantánea aparecerá como si la máquina tuviera su corte de energía en ese momento, como debería. [...] –

+0

[...] Esto es suficiente, p. para que las bases de datos de ACI continúen manteniendo su integridad de datos. Y a menos que esté utilizando un sistema de archivos que no sea de diario (ext3 y más reciente están escribiendo un diario), creo que la corrupción del sistema de archivos también es muy poco probable, independientemente de si las memorias caché del sistema de archivos se han descargado. –

0

La corrupción de FS es "altamente improbable", siempre y cuando usted nunca trabaje en ningún tipo de entorno profesional. de lo contrario, te encontrarás con la realidad, y podrías intentar culpar a "bit rot" o "hardware" o lo que sea, pero todo se reduce a haber sido irresponsable. congelar/descongelar (como se menciona varias veces, y solo si se llama correctamente) es suficiente fuera de de entornos de bases de datos. para las bases de datos, usted todavía no tendrá una transacción-complete la copia de seguridad y si cree que una copia de seguridad que revierte alguna transacción está bien cuando se restaure: vea la oración de inicio. dependiendo de la actividad que acaba de agregar otra 5-10 minutos de tiempo de inactividad si alguna vez necesita esa copia de seguridad. La mayoría de nosotros puede permitírselo fácilmente, pero no puede ser un consejo general. Se honesto sobre los inconvenientes, muchachos.

+0

Gracias por su nota. Sin embargo, no agregue comentarios a otras respuestas como respuestas separadas. Para eso están los comentarios en la plataforma StackExchange. Le sugiero que agregue la parte sobre la corrupción del sistema de archivos como un comentario a la respuesta de Vladimir Panteleev (que supongo que se refiere), y la parte sobre las bases de datos estaría mejor ubicada como un comentario a la pregunta en sí. – liori

Cuestiones relacionadas