Tengo seis volúmenes lógicos de Linux que juntos respaldan una máquina virtual. La VM está actualmente apagada, por lo que es fácil tomar imágenes consistentes de ellos.
Me gustaría agrupar las seis imágenes juntas en un archivo. Trivialmente, podría hacer algo como esto:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Pero eso, por supuesto, crea una copia extra. Me gustaría evitar la copia extra.
El enfoque obvio:
tar c /dev/Zia/vm_lvraid_* | whatever
no funciona, ya que tar reconoce los archivos de forma especial (enlaces simbólicos en este caso) y básicamente los almacena ln -s
en el archivo. O, con --dereference
o directamente señalado /dev/dm-X
, los reconoce como especiales (archivos de dispositivo) y básicamente los almacena mknod
en el archivo.
He buscado opciones de línea de comandos para tar para anular este comportamiento, y no pude encontrar ninguna. También probé el cpio
mismo problema y tampoco pude encontrar ninguna opción para anularlo allí. También lo intenté 7z
(ídem). Lo mismo con pax
. Incluso lo intenté zip
, lo cual se confundió.
editar: Mirando el código fuente de GNU tar y GNU cpio, parece que ninguno de ellos puede hacer esto. Al menos, no sin trucos serios (el manejo especial de los archivos del dispositivo no se puede deshabilitar). Por lo tanto, se agradecerían sugerencias de trucos serios o utilidades alternativas.
TLDR: ¿Hay algún archivador que empaquetará varias imágenes de disco juntas (tomadas de dispositivos sin formato) y transmitirá esa salida, sin hacer copias adicionales en el disco? Mi preferencia se generaría en un formato común, como POSIX o GNU tar.
fuente
Respuestas:
Así que recientemente quería hacer esto con
tar
. Algunas investigaciones me indicaron que era más que un poco absurdo que no pudiera. Se me ocurrió estasplit --filter="cat >file; tar -r ..."
cosa extraña , pero, bueno, fue terriblemente lenta. Y cuanto más leía sobretar
lo más absurdo que parecía.Verás,
tar
es solo una lista concatenada de registros. Los archivos constituyentes no se alteran de ninguna manera, están completos dentro del archivo. Pero están bloqueados en los límites de bloqueo de 512 bytes , y antes de cada archivo hay un encabezado . Eso es. El formato del encabezado es realmente muy simple también.Entonces, escribí el mío
tar
. Lo llamo ...shitar
.Esa es la carne y las papas, de verdad. Escribe los encabezados y calcula el chksum, que, relativamente hablando, es la única parte difícil. Hace el
ustar
formato del encabezado ... tal vez . Al menos, emula lo que GNUtar
parece pensar que es elustar
formato del encabezado hasta el punto de que no se queja. Y hay más, es que todavía no lo he coagulado realmente . Aquí te muestro:Eso es
tar
. Todo está relleno de\0
nulos, así que me conviertoem
en\n
líneas electrónicas para facilitar la lectura. Yshitar
:SALIDA
Digo un poco allá porque ese no
shitar
es el propósito,tar
ya lo hace maravillosamente. Solo quería mostrar cómo funciona, lo que significa que necesito tocar elchksum
. Si no fuera por eso, simplemente estaríadd
saliendo de la cabeza de untar
archivo y listo. Eso puede funcionar incluso a veces, pero se vuelve complicado cuando hay varios miembros en el archivo. Aún así, el chksum es realmente fácil.Primero, haga 7 espacios, (lo cual es una cosa extraña de gnu, creo, como dice la especificación 8, pero lo que sea, un truco es un truco) . Luego sume los valores octales de cada byte en el encabezado. Ese es tu chksum. Por lo tanto, necesita los metadatos del archivo antes de hacer el encabezado, o no tiene un chksum. Y eso es un
ustar
archivo, en su mayoría.Okay. Ahora, lo que debe hacer:
Eso genera tres imágenes de disco de 500M, formatos y montajes cada uno, y escribe un archivo en cada uno.
Nota : aparentemente los dispositivos de bloqueo siempre se bloquearán correctamente. Bastante práctico
Ese
tar
es el contenido de los archivos del dispositivo de disco in-stream y canaliza la salida axz
.Ahora, el momento de la verdad...
¡Hurra! Extracción...
Comparación...
Y el monte ...
Y así, en este caso,
shitar
funciona bien, supongo. Prefiero no entrar en todas las cosas que no van a hacer bien. Pero, diré, al menos no hagas nuevas líneas en los nombres de archivo.También puede hacerlo, y tal vez debería, teniendo en cuenta las alternativas que le he ofrecido
squashfs
. No solo obtienes el archivo único creado a partir de la transmisión, sino que también esmount
capaz y está integrado en el núcleovfs
:De pseudo-file.example :
También puede usar
btrfs (send|receive)
para transmitir un subvolumen a cualquierstdin
compresor capaz que desee. Este subvolumen no necesita existir antes de que decida usarlo como contenedor de compresión, por supuesto.Aún así, sobre
squashfs
...No creo que le esté haciendo justicia. Aquí hay un ejemplo muy simple:
Ese es solo el
-p
argumento en línea paramksquash
. Puede obtener un archivo que-pf
contenga tantos como desee. El formato es simple: define el nombre / ruta de un archivo de destino en el nuevo sistema de archivos, le asigna un modo y un propietario, y luego le dice desde qué proceso ejecutar y leer stdout. Puede crear tantos como desee, y puede usar LZMA, GZIP, LZ4, XZ ... hmm, hay más ... formatos de compresión que desee. Y el resultado final es un archivo en el que ustedcd
.Más sobre el formato sin embargo:
Esto, por supuesto, no es solo un archivo, es una imagen de sistema de archivos de Linux comprimida y montable. Su formato es el del núcleo de Linux: es un sistema de archivos compatible con el núcleo de vainilla. De esta manera, es tan común como el kernel Linux de vainilla. Entonces, si me dijeras que estabas ejecutando un sistema Linux de vainilla en el que el
tar
programa no estaba instalado, dudaría, pero probablemente te creería. Pero si me dijeras que estabas ejecutando un sistema Linux de vainilla en el que elsquashfs
sistema de archivos no era compatible, no te creería.fuente
input f 444 root root dd if=/dev/sda1 bs=1024 count=10
f es la entrada del archivo? ¿Quizás sería mejor crear un dispositivo de juguete, llenarlo con datos y escribir desde él? ¿Y todo esto requiere root?input
archivo es un archivo en elsquashfs
archivo, la imagen del sistema de archivos que resulta de ejecutar el comando. Cuando lo hagamksquash
, puede especificar estos comandos de pseudofile para los comandos que se ejecutan y desde los cualesstdout
se captura en el momento de la compresión.Tu problema me dejó perplejo por algún tiempo, y creo que he encontrado una solución que funcionaría.
Creo que puedes lograr lo que quieres con 7z usando la
-si{NAME}
bandera.Podrá adaptarse a su necesidad.
EDITAR : eliminar el uso inútil del gato
fuente
7z
manual no menciona -si puede tomar un nombre de archivo, pero funciona. No es perfecto (la salida no se puede canalizar en alguna parte), pero definitivamente es la mejor hasta ahora que las salidas en un formato común.