Я использую оба CloneZilla и Back In Time для создания резервных копий системы и данных соответственно.
Преимущество CloneZilla перед встроенными инструментами, такими как dd
, заключается в том, что он использует свой собственный partclone
, который создает очень маленькие изображения (распознает разреженные файлы, может использовать несколько вариантов сжатия). утилиты, ...) и возвращается к ddrescue
, который позволяет читать поврежденные жесткие диски! (Приятно иметь эту самую последнюю резервную копию, прежде чем жесткий диск окончательно откажется.)
Однако вы должны иметь (как минимум) отдельные /
и / home
, если вы хотите легко различать вашу ОС и файлы конфигурации пользователя.
Ничто не является таким гибким, надежным и быстрым, как CloneZilla, чтобы выполнять полное автономное резервное копирование образов / дисков (и я всегда читаю руководства по резервному копированию, если кто-то упоминает его любимый инструмент резервного копирования, чтобы увидеть есть ли у них что-то получше, чем у меня)
Если вы поместите CloneZilla на 512-мегабайтный загрузочный раздел внешнего жесткого диска USB, вы можете просто загрузить его на любой машине и восстановить любую резервную копию, сделанную вами на этом разделе, остальная часть того же жесткого диска.
Предупреждение: если вы восстановите одну и ту же резервную копию системы на нескольких машинах, все эти машины будут клонами друг друга с тем же именем хоста, часовым поясом, IP (если статический), ... так что все эти необходимо настроить после "восстановления" ...
В качестве альтернативы у меня есть загрузочный USB SLC накопитель с полной установкой Linux (в моем случае lubuntu) без каких-либо проприетарных драйверов и ведущий раздел FAT, без раздела подкачки, но файл подкачки внутри раздела /
, который я могу загрузить на любой машине (пока) и который я использую для лечения компьютеров с Windows (или просто работаю на чужой машине без касаясь их данных, если они параноики).
read -p "$1:" tmp1
и read -p "$2:" tmp2
считывают по строке ввода от пользователя каждый, используя первый($1
)и второй($2
)аргументы функции в качестве подсказок. Результаты сохраняются в tmp1
и tmp2
. Затем, если они равны, значение из tmp1
считывается в переменную, названную первым аргументом функции сread "$1" <<< "$tmp1"
Итак, то, что вы получите с помощью read_and_verify domain "Please enter the domain of your web application twice"
, выглядит примерно так, а введенные пользователем данные выделены курсивом:
domain:foo Please enter the domain of your web application twice:foo
Затем введенное значение сохраняется в переменной domain
; работает echo "$domain"
после того, как выше показано foo
.
I misunderstand why is the $1 and $2 needed and henceforth why is the read "$1" <<< "$tmp1" needed.
$1
и $2
используются в качестве подсказок пользователю, а $1
— это , также используется для передачи имени результирующей переменной в функцию. Это делает первую подсказку немного странной. Возможно, лучше использовать что-то более описательное, например.:
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
Или использовать сообщение, переданное в $2
, для обоих подсказок, как это делает ответ на ваш другой вопрос .
read "$1" <<< "$tmp1"
также несколько странен, поскольку обычно вы можете просто присвоить значение одной переменной другой. Однако здесь проблема в том, что $1
содержит имя переменной, поэтому нам нужно косвенное присвоение. В Bash 4.3 и более поздних версиях мы могли бы использовать для этого ссылку на имя :
declare -n ref="$1"
ref=$tmp1
Таким образом, всю функцию лучше написать так:
#!/bin/bash
function read_and_verify {
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
declare -n ref="$1"
ref=$tmp1
fi
}
(обратите внимание, что здесь не используется второй аргумент.)
read_and_verify
— это функция, в этом контексте $1
— первый аргумент (здесь вы вызываете ее с одним из доменов, dbrootp или dbuserp )и $2
— второй аргумент (строки, следующие за каждым из этих опций в вызовах ). Если мы расширим его для вызова:
function read_and_verify {
read -p "domain:" tmp1
read -p "Please enter the domain of your web application twice:" tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
read "domain" <<< "$tmp1"
fi
}
И это то, что $1
и $2
делают в вашей функции.