Можно ли использовать tar для полного резервного копирования системы?

Оказывается, я неправильно понял вопрос в смысле подстановки команд. Только в этом случае оболочка участвует в обработке вывода.

Надеюсь, это тоже заинтересует ...

Я подключаюсь к оболочке с помощью strace -p 2140 перед запуском echo $ (/ bin / echo foo) в этом thell. Это часть результата:

pipe([3, 4])
pipe([5, 6])
...
read(3, "foo\n", 128)

Вот что происходит в дочернем процессе:

dup2(4, 1)
close(4)
close(3)
...
execve("/bin/echo", ...

Оболочка соединяет файловые дескрипторы 3 и 4, а затем выполняет разветвление. Дочерний процесс делает fd 4 своим stdout перед запуском новой программы. Таким образом, все, что дочерний элемент пишет в stdout , может быть прочитано родительской оболочкой на ее fd 3.

3
17.12.2017, 01:10
1 ответ

Работает ли резервное копирование на основе tar, зависит от того, какие метаданные вы хотите архивировать и какую реализацию tar вы используете.

В GNU tar недавно добавлена ​​поддержка списков ACL для Linux, но эта поддержка неполноценна, и может случиться так, что файлы извлекаются с помощью списков ACL, которых нет в архиве, но которые были унаследованы от родительского каталога. Это может дать доступ пользователям, которые не должны иметь этот доступ.

Аналогичные проблемы возникают и с поддержкой SELinux в GNU tar.

Если вы не полагаетесь на такого рода метаданные и не планируете делать инкрементные резервные копии, вы можете использовать GNU tar.

Кстати, :в самую последнюю версиюstar(в schilytools )добавлена ​​поддержка SELinux.

Людям, которые считают, что можно использовать GNU tar для инкрементного резервного копирования, следует запустить этот сценарий, чтобы убедиться, что он не работает. Соответствующий отчет об ошибке был отправлен сопровождающим GNU tar в сентябре 2004 г., в 2011 г. и в 2016 г. Эта ошибка известна уже 14 лет :

.
if [ "$gtar" ]; then
    #
    # Permit: gtar=/tmp/tar-1.30/src/tar sh gnutarfail.sh
    #
    GT=`"$gtar" --help 2> /dev/null | grep GNU`
else
    GT=`gtar --help 2> /dev/null | grep GNU`
    if [ "$GT" ]; then
            gtar=gtar
    else
            # Some systems have "gtar" installed as "tar"
            GT=`tar --help 2> /dev/null | grep GNU`
            if [ "$GT" ]; then
                    gtar=tar
            fi
    fi
fi
if [ -z "$GT" ]; then
    echo No gtar found
    exit 1
fi
echo gtar installed as $gtar
# Preparation complete
#-----------------------------------

cd /tmp
mkdir test.$$
cd test.$$

set -x

mkdir test
mkdir test/dir1
mkdir test/dir2

echo dir1-file > test/dir1/dir1-file
echo dir2-file > test/dir2/dir2-file

$gtar -g/tmp/test.$$/listed-incr -c -f /tmp/test.$$/full.tar test

rm -rf test/dir2
mv test/dir1 test/dir2

$gtar -g/tmp/test.$$/listed-incr -c -f /tmp/test.$$/incremental.tar test

mv test orig

$gtar -x -g/dev/null -f /tmp/test.$$/full.tar
$gtar -x -g/dev/null -f /tmp/test.$$/incremental.tar
3
27.01.2020, 21:35

Теги

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