Архіватор tar залишається одним із базових інструментів у Linux та інших Unix-подібних системах. У цій статті розглядається принцип роботи tar, логіка створення архівів і особливості взаємодії з файловою системою. Матеріал допоможе зрозуміти, чому tar вважається стандартом у Linux-середовищі та в яких сценаріях він залишається незамінним інструментом для роботи з даними.
Утиліта tar спочатку використовувалася для створення архівів на магнітній стрічці ( tar – ta pe a r chive). В даний час tar використовується для створення архівів на будь-яких носіях і практично є основним засобом зберігання файлів і каталогів в одному файлі спеціального формату. Головною перевагою формату tar є те, що архів містить не тільки самі дані файлів, що архівуються, але і інформацію про структуру каталогів, власника, і тимчасові мітки (час створення, модифікації, доступу). Архіватор tar не виконує стиснення даних, що архівуються, він всього лише упаковує безліч файлів в один файл, розмір якого приблизно дорівнює сумарному розміру упакованих файлів (трохи більше за рахунок додавання власних службових заголовків). Для стиснення ж, використовуються зовнішні програми ( gzip, bzip2 і т.п. )
Для отримання підказки щодо використання tar достатньо викликати вбудовану довідку. Вона виводить короткий опис призначення програми та основні параметри командного рядка.
У відповідь буде показано базовий синтаксис використання утиліти та підказки для відновлення окремих файлів із архіву.
Найпростіші команди дозволяють швидко створювати архіви, переглядати їх вміст або розпаковувати файли.
Ця команда створює файл archive.tar, що містить файли foo і bar.
Виводить детальний список усіх файлів і каталогів, що зберігаються в архіві.
Вилучає всі файли з архіву archive.tar у поточний каталог.
Робота з архівами в tar будується навколо кількох ключових режимів. Саме вони визначають, що саме буде зроблено з архівом — створення, перегляд чи вилучення.
-c, –create — створення нового архіву
-t — перегляд вмісту архіву
-x, –extract, –get — вилучення файлів з архіву
-r, –append — додавання файлів
-u, –update — додавання тільки нових файлів
-A, –catenate, –concatenate — приєднання tar-файлів до архіву
Цих режимів зазвичай достатньо для більшості повсякденних задач.
Для резервного копіювання tar підтримує інкрементний режим, який дозволяє зберігати лише ті файли, що змінилися з моменту попереднього архівування. Це особливо зручно для регулярних бекапів.
-g, –listed-incremental=ФАЙЛ — інкрементне резервування нового формату GNU
-G, –incremental — інкрементне резервування старого формату
–check-device / –no-check-device — контроль номерів пристроїв
–ignore-failed-read — не зупиняти роботу при помилках читання
Також доступні опції для роботи з розрідженими файлами та повторюваними входженнями:
-S, –sparse
–sparse-version=MAJOR[.MINOR]
–occurrence[=N]
Під час вилучення архівів часто важливо контролювати, чи будуть перезаписані існуючі файли. tar надає для цього окрему групу параметрів.
-k, –keep-old-files — не перезаписувати існуючі файли
–overwrite / –overwrite-dir — примусовий перезапис
–no-overwrite-dir — збереження метаданих каталогів
-U, –unlink-first — видаляти файл перед вилученням
-W, –verify — перевірка архіву після запису
За потреби результати роботи можна перенаправляти або змінювати поведінку збереження атрибутів.
-O, –to-stdout — виведення файлів у стандартний потік
–to-command=КОМАНДА — передача файлів іншій програмі
–atime-preserve — збереження часу доступу
–numeric-owner — використання числових UID/GID
–no-same-owner / –no-same-permissions — керування правами доступу
tar підтримує кілька стандартних форматів архівів і може працювати разом із зовнішніми програмами стиснення.
Формати архіву:
gnu
pax (POSIX)
ustar
v7
Опції стиснення:
-a, –auto-compress — автоматичне визначення типу
-z, –gzip
-j, –bzip2
–lzma, –lzip
Для отримання короткої довідки щодо використання tar введіть команду:
tar –usage
При виконанні цієї команди, відображаються варіанти використання параметрів командного рядка без будь-яких пояснень:
Використання: tar [-AcdrtuxGnSkUWOmpsMBiajJzZhPlRvwo?] [-g ФАЙЛ] [-g ФАЙЛ] [-g [-b БЛОКИ] [-H ФОРМАТ] [-V ТЕКСТ] [-I ПРОГ] [-C КАТАЛОГ] [-K ІМ'Я-ЧЛЕНА] [-N ДАТА-АБО-ФАЙЛ] [-T ФАЙЛ ] [-X ФАЙЛ] [--catenate] [--concatenate] [--create] [--append] [--list] [--test-label] [--update] [--extract] [--get] [--check-device] [--listed-incremental=ФАЙЛ] [--incremental] [--ignore-failed-read] [--level=N] [--seek] [--no- [--occurrence[=N]] [--sparse-version=MAJOR[.MINOR]] [--sparse] [--keep-old-files] [--keep-newer-files] [--no-overwrite-dir] [--overwrite] [--overwrite-dir] [--recurs [--skip-old-files] [--unlink-first] [--verify] [--ignore-command-error] [--no-ignore-command-error] [--to-stdout] [--to-command=КОМАНДА] [--acls] [--atime-preserve[=СПОСОБ]] [--group=ІМ'Я] [--mode=РЕЖИМ] [--mtime=ДАТА-АБО-ФАЙЛ] [--touch] [--no-acls] [--no-delay-directory-restore] [--no-same-owner] [--no-same-permissions] [--no- selinux [--owner=ІМ'Я] [--preserve-permissions] [--same-permissions] [--preserve] [--same-owner] [--preserve-order] [--same-order] [--selinux] [--xattrs] [--file=АРХІВ] [--force-local] [--info-script=ІМ'Я] [--new-volume-script=ІМ'Я] [--tape-length=N] [--multi-volu [--rsh-command=КОМАНДА] [--volno-file=ФАЙЛ] [--blocking-factor=БЛОКИ] [--read-full-records] [--ignore-zeros] [--record-size=N] [--format=ФОРМАТ] [--old-archive] [--portability [--pax-option=keyword[=значення][,keyword[=значення]]...] [--posix] [--label=ТЕКСТ] [--auto-compress] [--use-compress-program=ПРОГ] [--bzip2] [--xz] [--lzip] [--lzma [--gzip] [--gunzip] [--ungzip] [--compress] [--uncompress] [--add-file=ФАЙЛ] [--backup[=УПРАВЛІННЯ]] [--directory=КАТАЛОГ] [--exclude=ШАБЛОН] [ --exclude-backups] [--exclude-ca [--exclude-caches-under] [--exclude-tag=ФАЙЛ] [--exclude-tag-all=ФАЙЛ] [--exclude-tag-under=ФАЙЛ] [--exclude-vcs] [--dereference] [--hard-dereference] [--starting-file=ІМ'Я-ЧЛЕНА] [-- [--no-recursion] [--no-unquote] [--null] [--newer=ДАТА-АБО-ФАЙЛ] [--after-date=ДАТА-АБО-ФАЙЛ] [--one-file-system] [--absolute-names] [--recursion] [--suffix =ФРОК] [--exclude-from=ФАЙЛ] [--strip-components=N] [--transform =РОЗШИРЕННЯ] [--xform=РОЗШИРЕННЯ] [--anchored] [--ignore-case] [--no-anchored] [--no-ignore-case] [ --no-wildcard [--wildcards] [--wildcards-match-slash] [--checkpoint[=N]] [--checkpoint-action=ДІЯ] [--index-file=ФАЙЛ] [--check-links] [--no-quote-chars=РЯДОК ] [--quote-chars=РЯДОК [--block-number] [--show-defaults] [--show-omitted-dirs] [--show-transformed-names] [--show-stored-names] [--totals[=СИГНАЛ]] [--utc] [--verbose] [--warning= KEYWORD [--restrict] [--usage] [--version] [ФАЙЛ]...
Можна також скористатися вбудованою довідковою системою:
man tar
tar -create -file=archive.tar file1 file2 – створити в поточному каталозі архів archive.tar з файлів ffile1 і file2
tar -cf archive.tar file1 file2 – те ж , що і в попередньому прикладі, але з використанням синтаксису коротких опцій (скорочених параметрів командного рядка : -c відповідає опцій, їх можна об’єднувати – параметри -c -f файл.tar можна вводити як -cf файл.tar . tar -cvf archive.tar file1 домашнього каталогу користувача user . При використанні даного формату команди, нерідко виникає питання, чому tar не включає в архів приховані файли і каталоги, імена яких починаються з точки . файл або група файлів. Визначенням підходящих під шаблон об’єктів займається сама командна оболонка, в якій виходячи з міркувань безпеки, шаблон ” *” не включає імена файлів, що починаються з точки. tar -zcvf /backup/archive.tar.gz /home/user/ – створити архів усіх файлів домашнього каталогу користувача user з використанням стиснення даних за допомогою gzip tar -jcvf /backup/archive.tar.bz2 /home/user/ – створити архів усіх файлів домашнього каталогу користувача user з використанням стиснення даних /backup/archive.tar.bz2 /home/user/ – створити архів всіх файлів домашнього каталогу користувача user з використанням програми, яка визначається автоматично по імені файлу .
Якщо на ім’я файлу архіву неможливо визначити програму стиснення, то архів створюється, але стиснення не виконується. При розпакуванні архіву параметр -a вказувати не обов’язково, оскільки тип стиснення визначається автоматично у будь-якому випадку:
tar -tvf archive.tar – відобразити список файлів і каталогів архіву archive.tar
tar -tvf archive.tar > listfiles – те, що й у попередньому прикладі, але з видачею результатів у текстовий файл listfiles
tar -xvf archive.tar – розпакувати (розархівувати) в поточний каталог вміст
./backup/archive.tar –C /home2/ – витягти вміст архіву /backup/archive.tar у каталог /home2 .
tar –xv –keep-newer-file –f /backup/archive.tar –C /home2 – те саме, що й у попередньому прикладі, тільки перезапис існуючих файлів не буде виконано, якщо вони того ж віку або новіші.
tar –xvkf /backup/archive.tar –C /home2 – якщо виймати дані з архіву, буде спроба перезапису існуючого файла, то програма tar завершиться помилкою.
tar –exclude=log -zcvf /backup/archive.tar.gz /var/ – при архівуванні виключити файли журналів.
tar –exclude-backups –exclude-caches –exclude-tag-all=excludes.txt -zcvf /backup/home.tar.gz /home/ – при архівуванні виключити файли бекапів, кеш і всі каталоги, в яких присутній файл з ім’ям excludes.txt
Утиліта tar дозволяє створювати tar, що містять лише ті файли, які були змінені з моменту повного або додаткового резервного копіювання. У разі використання такого режиму архівування виконується команда tar з параметром –listed-incremental=ФАЙЛ ( -g ФАЙЛ ), де ФАЙЛ вказує на файл метаданих, в якому зберігається інформація про стан інкрементного архіву.
Якщо такого файлу не існує, то при виконанні команди створюється повний архів, а також новий метаданих файл, який буде використовуватися в наступних етапах створення інкрементних резервних копій.
tar -zcvf /backup/home.tar.gz –backup=numbered –listed-incremental=/backup/home_meta /home/ – створити інкрементний архів каталогу /home .
Параметр –backup=numbered вказує на те, що потрібно створювати нумеровані резервні копії.
Повний архів, в даному прикладі, буде створений у вигляді файлу з ім’ям home.tar.gz , а наступні інкрементні архіви будуть створюватися з іменами home.tar.gz.~1~ , home.tar.gz.~2~ і т.д.
Для відновлення даних з інкрементного архіву потрібно спочатку розархівувати повний архівний файл, а потім інкрементні:
tar -zxvf /backup/home.tar.gz -C /home2 – витягти в каталог /home2 вміст повного архіву.
tar -zxvf /backup/home.tar.gz.~1~ -C /home2 – отримати в каталог /home2 вміст першого інкрементного архіву.
tar -zxvf /backup/home.tar.gz.~2~ -C /home2 – отримати в каталог /home2 вміст другого інкрементного архіву.
Використання інкрементного архівування в tar дозволяє, наприклад, створювати автоматично за допомогою планувальника періодичні резервні копії (щодня, щотижня, щомісяця тощо).
tar — це приклад інструмента, який не застаріває, навіть попри десятиліття розвитку Linux-екосистеми. Його сила не в модності чи «зручному інтерфейсі», а в універсальності, передбачуваності та глибокій інтеграції з системою. Саме тому tar досі використовується всюди: від ручної роботи адміністратора до автоматичних резервних копій, від збирання пакетів і контейнерів до серверних бекапів і CI/CD-процесів.
У сучасних Linux-системах tar залишається базовим «будівельним блоком»: він не стискає дані самостійно, але ідеально поєднується з будь-якими алгоритмами стиснення; він не приховує деталей, але зберігає всю важливу метаінформацію; він простий у базовому використанні, але надзвичайно гнучкий у складних сценаріях. Особливо цінною є підтримка інкрементного архівування, яка дозволяє будувати ефективні та надійні системи резервного копіювання без зайвих накладних витрат.