LINUX.ORG.RU

Помощь в распаковке tar архива (бэкап системы)

 


0

1

Приветствую всех и прошу помощи.

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

Попробую описать сложность с которой я столкнулся.

Имеется веб сервер, который работал на старом ПК с 2011 года. На данном ПК была установлена ОС freeBSD 7.4 i386. Периодически (не мной) на данном ПК выполнялась резервная копия всей системы на флэш карту с помощью команды: tar -cpvzf /mnt/WEB_SERV.tar.gz –exclude ./mnt –exclude ./proc –exclude ./tmp –exclude ./dev –exclude ./sys –exclude ./ boot/grub

В один день жесткий диск данного ПК вышел из строя. И теперь необходимо выполнить восстановление системы.

Почитав материал в сети интернет и послушав рекомендации, как я понял, достаточно выполнить распаковку архива с бэкапом в корневой каталог.

Установив на ПК аналогичную систему freeBSD 7.4 i386, подключив и смонтировав флешку с архивом и запустив команду распаковки: tar -xpvzf WEB_SERV.tar.gz -C / Я столкнулся со следующей сложностью, а именно, что процесс распаковки всегда останавливался на одном и том же файле.

Вот что указывала система на этапе распаковки: x ./usr/bin/perl5 tar: Error exit delayed from previous errors.

Т.е система останавливала распаковку на файле «perl5»

Сперва я подумал, может в архиве битый файл, и попробовал его исключить набрав команду: tar -xpvzf WEB_SERV.tar.gz –exclude ./usr/bin/perl5 -C /

Исключение файла было выполнено, но затем распаковка архива была остановлена на другом файле. Исключив его, а затем еще несколько файлов, на которых также стопорился процесс распаковки, я подумал что это не правильно и пошел искать причину дальше.

Затем я решил распаковать архив на ПК с системой Windows через программу 7zip. Архив был успешно распакован, и найдя в архиве файлы, на которых процесс распаковки останавливался, мной было обнаружено, что данные файлы являются символьными ссылками.

Символьная ссылка (также известна как символическая ссылка или символический линк) — это особый вид ссылки, используемый в Linux и других Unix-подобных системах. Она представляет собой файл, который содержит путь к другому файлу или каталогу. Отличие символьной ссылки от жесткой ссылки заключается в том, что символьная ссылка имеет собственное имя файла и может указывать на файлы и каталоги, расположенные в разных файловых системах.

И вот на этом моменте я и застрял.

Вопрос возник следующий:

  1. Есть ли возможность у tarа исключить в автоматическом режиме подобные ошибки, которые могут возникнуть при распаковке символьной ссылки? Команда ‘–ignore-failed-read’ действует как я понял только при создании архива, при распаковки аналогичную команду не нашел.

  2. В чем может быть причина, что tar «ломается» при распаковки символьных ссылок?

Буду очень благодарен в разъяснение.

Спасибо.

P.S

Нашел на одном ресурсе описание следующих ключей в tar, но их применение, к сожалению, не привело к результату. Процесс распаковки все также останавливается на одних и тех же файлах (символьные ссылки)

-U (только режим x) Разлинковать файлы перед их созданием. Без этой опции, tar перезапишет существующие файлы без сохранения существующий жестких ссылок. С этой опцией существующие жесткие ссылки будут сломаны, так же как и любые символические ссылки могут изменить местонахождение распаковываемых файлов.

-P Соблюдать имена пути. По умолчанию абсолютное имя пути (то которое начинается с символа /) имеет впереди слеш, который удаляется при создании архива или при распаковке. Так же tar откажется распаковывать записи в архиве, чьи имена пути содержат .. или чьи целевые директории будут изменены символической ссылкой. Эта опция отменяет данное поведение.

Записи в архивах могут использовать символические ссылки для восстановления файлов в других директориях. Архив может восстановить символическую ссылку в другую директорию, затем использовать эту ссылку для восстановления файла в эту директорию. Для защиты от этого, tar проверяет каждый распакованный путь на символические ссылки. Если последний элемент пути является символической ссылкой, он будет удален и замещен записью в архиве. Если указана опция -U, любая промежуточная символическая ссылка будет так же удалена. Если опции -U или -P не указаны, tar откажется распаковывать строку. Для защиты себя, вы должны опасаться любых архивов, которые поступают из недостоверных источников. Вы должны проверять содержимое архива tar -tf filename прежде, чем начнете распаковку. Вы должны использовать опцию -k для того что бы быть уверенным что tar не перезапишет существующие файлы или опцию -U для удаления всех существующих файлов. Обычно вы не должны распаковывать архивы пока используете привилегии суперпользователя. Учтите, что опция -P отключает проверки безопасности tar’а и позволяет распаковать архивы с сохранением абсолютных имен пути, .. Компонентами, или символическими ссылками на другие директории.

Попробуйте загрузиться с флешки, примонтировать свой корень куда-нибудь в /mnt и распаковать туда. Возможно, причина в том, что эти самые файлы активно используются системой.

CrX ★★★★★
()

Покажи нормально вывод tar-а. То что привёл ты - явно переврано. Никаких «битых файлов» в нём нет, и от символических ссылок проблем тоже быть не может.

«error exit delayed from previous errors» означает что где-то раньше были ошибки (и про них должно быть написано в консоли), а эта надпись - только подведение итога. Можешь запустить tar -xzf (без ключа -v который выводит кучу лишнего и может из-за него ты настоящую ошибку не заметил, и без ключа -p который и так по умолчанию активен).

Ключи -U и -P тебе не нужны.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от CrX

В данном случае это проблем не создаст. Если tar уже запустился то можно хоть затирать всю файловую систему - он уже подгрузил все .so которые ему нужны и больше в содержимом диска не нуждается.

Но может быть другая проблема: если в только что установленной системе есть файлы, которых нет в бекапе - tar их удалять не станет, а надо. Так что лучше сделать так: запуститься с флешки, удалить с раздела всё кроме dev mnt proc и что там ещё, и на этот чистый диск распаковать бекап. Или можно вообще не запускать инсталлятор, а просто разметить диск, настроить загрузчик, создать файловые системы и залить на них распакованный бекап.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)

А, ещё одна деталь: при установке или разметке диска надо сделать такие же разделы как были на старом. Какие были - можно посмотреть в файле /etc/fstab в бекапе.

На процесс распаковки это не повлияет, но если разделы не такие же - то восстановленная система потом не запустится. Ну или придётся править /etc/fstab на восстановленной системе чтоб он соответствовал новым разделам. Но лучше сделать как было - те кто её ставил наверно лучше знали какие там должны быть разделы.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от vel

Кстати да, но для фрибсд это не настолько актуально как для линуксов: там по умолчанию все системные юзеры создаются с фиксированными uid/gid (например mysql - 88, www - 80).

firkax ★★★★★
()
Ответ на: комментарий от firkax

Приветствую.

Подскажите, пожалуйста, не могли бы вы объяснить как грамотно выполнить эту рекомендацию:

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

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

И еще возник нюанс.

Если проверить файл fstab на системе, которую необходимо восстановить, то там указаны следующие разделы.

/dev/ad0s1a / /dev/ad0s1b swap /dev/ad0s1d /usr /dev/ad0s1e /var /dev/acd0 /cdrom

У меня же, при установки системы разделы всегда имеют название:

/dev/ad4s1a / /dev/ad4s1b swap /dev/ad4s1d /tmp /dev/ad4s1e /var /dev/ad4s1f /usr

Вопрос:

  1. Цифра 4 (ad4s1a) после букв ad от чего это зависит? В архиве цифра 0 а у меня при установке всегда 4. Что в ручном режиме, что в автоматическом. Или я что то не верно делаю?

  2. Запуститься с флэшки, это значит запустить ОС на флэш карте и с нее выполнить все конфигурации?

Я установил livecd.

  1. Установив livecd и попробовал изменить файл fstab чтобы привести его в соответствие, система не позволяет выполнить редактирование появляется уведомление «невозможно сохранить файл». Другие файлы с также невозможно изменить.

Прошу простить, если где то «криво» излагаю свою мысли.

palarius
() автор топика
Ответ на: комментарий от palarius

ad0 ad4 зависит от номера разъёма на материнке куда подключён диск (в более новом дисковом драйвере ada такого нет, если что, но он в более поздних фрибсд используется).

Запуститься с флешки - с установочной флешки, там на старте предлагается запустить шелл вместо инсталлятора, вот это и надо делать. Или с live если хочешь гуи, но гуи тут не нужен.

Ну и принято создавать разделы в порядке /, /usr, /var, /tmp как у тебя на старом диске и есть, только без отдельного /tmp почему-то. Если создашь отдельный /tmp хуже не будет наверно, только надо не забыть его в fstab вписать.

Размеры разделов: надо выяснить чем занято место. Какой размер у диска и какой размер был занят? Есть возможность распаковать бекап и посмотреть на файлы? Если да, зайди в директорию куда он распакован, и вот такие команды сделай

du -d 0 -h . usr var usr/home home tmp
ls -al | grep home  (узнать home это симлинк на usr/home или нет)

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

Можно например разметить инсталлятором а на моменте где он предлагает копировать файлы - отменить. Или если полностью вручную то сейчас напишу. Единственное - это инструкция для программы gpart, в freebsd 7 она уже была, но ей тогда ещё вроде не очень пользовались, а пользовались fdisk+bsdlabel. Как делать с помощью них я не помню, вот для gpart, надеюсь для 7 версии подойдёт всё:

gpart create -s MBR ad0
gpart add -t freebsd -b 1008 ad0
gpart create -s BSD ad0s1
gpart add -t freebsd-ufs -s размер_корня ad0s1
gpart add -t freebsd-swap -s размер_свап ad0s1
gpart add -t freebsd-ufs -s размер_usr ad0s1
gpart add -t freebsd-ufs -s размер_var ad0s1
gpart add -t freebsd-ufs -s размер_tmp ad0s1
gpart bootcode -b /boot/mbr ad0
gpart bootcode -b /boot/boot ad0s1
gpart set -a active -i 1 ad0
gpart show  # посмотреть что получилось
newfs -O2 -U -n /dev/ad0s1a
newfs -O2 -U -n /dev/ad0s1d
newfs -O2 -U -n /dev/ad0s1e
newfs -O2 -U -n /dev/ad0s1f
mount /dev/ad0s1a /mnt
mkdir /mnt/usr /mnt/var /mnt/tmp /mnt/proc /mnt/dev /mnt/mnt
chmod 1777 /mnt/tmp
mount /dev/ad0s1d /mnt/usr
mount /dev/ad0s1e /mnt/var
mount /dev/ad0s1f /mnt/tmp
tar --numeric-owner -x -f WEBSERV.tar.gz -C /mnt
vi /mnt/etc/fstab # добавляешь запись про /tmp

Вместо /mnt можно другой путь использовать куда монтировать новую систему.

Но надо сначала размеры разделов всего выяснить.

А хотя я почитал https://man.freebsd.org/cgi/man.cgi?query=gpart&apropos=0&sektion=0&a... пишут что gpart на freebsd7 работает только на кастомном ядре с добавленными опциями. Если gpart не заработает - создай всё инсталлятором, можно даже инсталляцию до конца довести, а потом перезапускаешься опять с флешки и начинаешь команды из того списка начиная с newfs. Ну или смотри как fdisk/bsdlabel пользоваться.

А ещё - на всякий случай проверь что в бекапе в /boot. А то у тебя в команде про grub написано, в фрибсд его обычно нет, вдруг там что-то нестандартное.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)