Do tworzenia kopii zapasowej lub przenoszenia systemu na inną maszynę (klonowania) wykorzystywane są często narzędzia takie jak cp -a
, rsync -raAHX
, tar
, dd
.
Trzy pierwsze służą do kopiowania systemów plików (zawartych w nich plików wraz z ich atrybutami, właściwościami, itd).
Natomiast dd
wykorzystywany jest do tworzenia obrazów, kopii urządzeń blokowych, takich jak wolumeny LVM, partycje, dyski
(obraz taki może zawierać wiele partycji, a nawet wolumentów LVM, więcej o używaniu takich obrazów w artykule Własny Debian LiveUSB).
Tar działający z prawami root'a nie wymaga podawania opcji związanych z zachowaniem standardowych atrybutów plików.
Jednak od momentu, gdy dystrybucje zaczęły używać właściwości jądra zamiast zwykłego SUID dla niektórych programów (np. ping
– zobacz getcap /bin/ping
),
konieczne jest dodawanie w wywołaniu tar (zarówno tworzącym jak i rozpakowującym archiwum) opcji --xattrs --xattrs-include='*.*'
.
Polecenie tworzące archiwum z rootfs naszego systemu może wyglądać następująco:
tar -czf - --xattrs --xattrs-include='*.*' --one-file-system --exclude="./tmp/*" /
Natomiast polecenie rozpakowujące takie archiwum do katalogu $TARGET
następująco:
tar -xzf - --xattrs --xattrs-include='*.*' --numeric-owner -C $TARGET
Opcja --one-file-system
wymusza ignorowanie plików z zamontowanych systemów plików (m.in. takich jak /proc
, /sys
, /dev
, /run
),
a --exclude="./tmp/*"
ignorowanie plików z katalogu /tmp
nawet jeżeli jest on na tym samym systemie plików co rootfs.
Opcja --numeric-owner
powoduje korzystanie z numerycznych UIDów i GIDów co jest istotne gdy wypakowujemy archiwum na systemie mającym inne wartości UIDów w /etc/passwd niż system wypakowywany.
W obu wypadkach podana została opcja -f -
która powoduje zapis/czytanie archiwum do/z standardowego wejścia. Pozwala to na łatwa przesłanie takiego archiwum na inną maszynę poprzez ssh – np.:
tar -czf - --xattrs --xattrs-include='*.*' --one-file-system --exclude="./tmp/*" / | ssh user@host 'cat > archiwum.tgz'
lub pobranie go z maszyny zdalnej:
ssh user@host 'cat archiwum.tgz' | tar -xzf - --xattrs --xattrs-include='*.*' --numeric-owner -C $TARGET
Możliwe jest także bezpośrednie rozpakowywanie na maszynie zdalnej, bezpośrednie kopiowanie pomiędzy lokalnymi systemami plików a także przekierowanie do pliku poprzez (w tych wypadkach oczywiście zamiast przekierowania strumienia można podać od razu ścieżkę do pliku w opcji -f
):
tar -czf - --xattrs --xattrs-include='*.*' --one-file-system --exclude="./tmp/*" / > archiwum.tgz
lub
tar -xzf - --xattrs --xattrs-include='*.*' --numeric-owner -C $TARGET < archiwum.tgz