Что означают пустые фигурные скобки в bash? [дубликат]

Cuando tú dd,

Básicamente, una copia de disco directa consistente y exitosa solo se puede lograr a través de un sistema independiente como un Live CD, e incluso entonces debe tener cuidado con los sistemas de archivos que se montan automáticamente sin que usted lo sepa.

Además, si espera que haya errores de lectura (, por lo tanto, sync, noerrory otras convopciones ), es mucho más confiable ir con ddrescueen su lugar. Maneja correctamente los errores de lectura e incluso tiene la capacidad de reintentar y reanudar.

En general, las copias a nivel de bloque tienden a ser poco confiables porque es fácil cometer errores. La única razón por la que se hacen es que es el único método para producir una copia con consistencia perfecta(solo si se hace correctamente ).

Todos los demás enfoques son simplemente suficientemente buenos en la práctica, nunca perfectos. No hay forma de hacer una copia perfecta con procesos en ejecución que mantienen la mitad de sus datos en la memoria y la otra mitad en el disco. Tienes que apagarlo para obtener la imagen completa. (O virtualice todo y congélelo.)

Hay alternativas:

  • copias de seguridad basadas en archivos usando cp, rsync o programas de copia de seguridad dedicados como borg
  • herramientas específicas del sistema de archivos (xfsdump, btrfs send / snapshot,...)
  • LVM instantáneas(pero no con btrfs)
  • Las bases de datos necesitan un tratamiento especial y proporcionan sus propias herramientas de respaldo

Si debe ser una copia a nivel de bloque, también puede abusar del sistema mdadm para colocar una capa RAID 1 en la unidad de origen y usarla para producir una copia consistente de un sistema en ejecución agregando una unidad de destino.El RAID mantiene ambos lados en perfecta sincronización, por lo que evita principalmente el problema de la inconsistencia (siempre que permita que finalice la sincronización antes de quitar la unidad de destino ).

# RAID creation (before installing Linux)
mdadm --create /dev/md0 --level=1 --raid-devices=1 --force /dev/source

# /proc/mdstat
md0 : active raid1 sda2[3]
      134306472 blocks super 1.2 [1/1] [U]

# Add the target drive.
mdadm --grow /dev/md0 --raid-devices=2 --force
mdadm --manage /dev/md0 --add --write-mostly /dev/target

# Wait for RAID resilvering.
mdadm --wait /dev/md0
sync

# Remove the target drive.
mdadm /dev/md0 --fail /dev/target
mdadm /dev/md0 --remove /dev/target
mdadm --grow /dev/md0 --raid-devices=1 --force

Pero eso es un truco y la copia seguirá apareciendo como un sistema de archivos que no se desmontó correctamente. Esto es un poco menos peor que una pérdida de energía, ya que no puedes hacer un synccuando pierdes energía inesperadamente. Pero órdenes de magnitud mejor que dddonde el estado de la primera mitad de la imagen está horas por detrás de la última mitad.

Utilizo este método para duplicar mi única unidad SSD en HDD todas las semanas, sin evitar la inactividad de HDD. Si el SSD falla, el HDD se puede iniciar directamente con poco esfuerzo.

Por supuesto, también se puede lograr lo mismo con una copia basada en archivos.


Dado que menciona los UUID, la clonación de unidades a nivel de bloque clonará los UUID, lo que a su vez puede ser la causa del desastre. (En el caso del truco RAID anterior, están convenientemente ocultos detrás de la capa RAID.)

La copia basada en archivos a un nuevo sistema de archivos tendrá nuevos UUID, pero es razonablemente sencillo de resolver:

  • chroot, edite /etc/fstab, actualice initramfs, reinstale el gestor de arranque (encontrará el método chroot en básicamente todas las wikis de Linux)
  • de lo contrario, restaure los UUID antiguos cambiándolos con tune2fs -U , existen herramientas similares para otros sistemas de archivos (requiere documentación, de lo contrario no sabrá los UUID que necesita ). Nuevamente, tenga cuidado de no duplicarlos, solo haga esto si el dispositivo anterior se ha ido por completo.

0
23.03.2019, 05:09
3 ответа

Если строка {} появляется где-либо в имени утилиты или аргументах, она заменяется путем к текущему файлу (, найденному с помощью 'find' ). Итак, в вашем примере скопируйте {файл, который find находит} в $HOME/$dir _name/

0
28.04.2021, 23:35

Означает результат команды find, переданной в качестве аргумента вexec:

Предположим, что результатом команды findявляется x, тогда:

find..... -exec echo "{}"

даст результат x, потому что xпередается в качестве аргумента, и этот аргумент представлен {}.

В вашем случае find выдаст файлы со свойством -path $HOME/$dir_name -prune -o -name "*$file_suffix"и эти файлы будут представлены команде cpкомандой{}(один за другим, а не все вместе ).

0
28.04.2021, 23:35

{}не имеет особого значения для bash, но что-то значит для find.

find. -exec stat {} ";"

Будет рекурсивно отслеживаться каждый файл, доступный из текущего рабочего каталога, одним вызовом statдля каждого файла.

find. -exec stat {} "+"

запустит statс несколькими файлами одновременно.

Вы можете убедиться, что {}на самом деле не являются частью синтаксиса оболочки, заключив его в кавычки или используя переменную.

find. -exec stat "{}" ";"

A="{}" find. -exec stat "$A" ";"

выдаст тот же результат, что и в первом примере.

1
28.04.2021, 23:35

Теги

Похожие вопросы