¿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:
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
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.
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
ya se puede desmontar el dispositivo de bucle:
# losetup -d /dev/loop0
ú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.
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