Система контроля версий включает в себя программу с различными функциями и правила хранения и описания версий. Общим для всех подобных систем является наличие репозитория - каталога, в котором хранятся копии файлов и их описания. Чтобы использовать ее как средство резервного копирования, репозиторий надо регулярно копировать на независимые носители.
В Solaris такая система носит название SCCS (source code control system). Она создает историю изменений каждого файла, помещаемого в репозиторий, что обуславливает наличие большого количества резервных копий. При повреждении актуальной версии файла ее можно будет восстановить из репозитория.
Конечно, при создании каталога репозитория следует установить соответствующие права доступа к нему.
Сначала нужно создать подкаталог SCCS в месте расположения файлов, которые планируется поместить в репозиторий. При этом оригиналы остаются на прежних местах и с такими же именами. SCCS нужна для работы с репозиторием, основные ее команды приведены ниже.
create - создание файла истории
clean – очистка текущего каталога
info - вывод полной информации о файле
get - извлечение файла только для чтения
enter - инициализация файла истории
edit - извлечение файла
unedit - возвращение файла к состоянию, в котором он был до последнего изменения
deledit - внесение изменений в репозиторий и извлечение файла
delget - внесение изменений в репозиторий и извлечение файла только для чтения
delta - внесение изменений в репозиторий
Например,
/usr/ccs/bin/sccs create file1 file2 осуществляет создание файла истории проекта для файлов file1 и file2. При этом файлы оригиналов сохраняются с добавленной в начале запятой (,file1 и ,file2 соответственно), а файлы истории предваряются префиксом s. (s.file1 и s.file2).
Для редактирования файла требуется извлечь его из репозитория, но если сначала файл изменить, а затем дать команду извлечения из репозитория, сделанные изменения пропадут.
Последовательность команд будет такой:
#/usr/ccs/bin/sccs edit file1
Далее любым способом вносятся изменения в файл.
#/usr/ccs/bin/sccs delta file1
(Последняя команда вносит изменения в файл истории.)
Когда нужно после сохранения истории внести изменения в файл, можно использовать команду deledit или заменить ее последовательностью команд delta и edit.
tar
Для сжатия файлов в Unix использовалась (да и сейчас используется) программа compress, добавляющая к имени файла .z, а для разархивирования таких файлов, соответственно, uncompress.
Также для сжатия применяют gzip; для распаковки файлов, сжатых gzip, нужен gunzip. Но gzip выполняет только одну функцию: сжатие и распаковка одного файла, он не умеет упаковывать несколько файлов в один архив. Поэтому для упаковки нескольких файлов обычно их сначала архивируют в один файл утилитой tar, а потом этот файл сжимают gzip. Сжатые архивы обычно имеют двойное расширение .tar.gz.
Существуют утилиты zip и unzip, используемые в основном тогда, когда нужно обеспечить совместимость с Windows.
Программа tar может применяться как для создания архива файловой системы, так и для хранения нескольких файлов внутри одного. Она собирает все указанные ей файлы в один большой файл, при этом его имя не изменяется. Преимуществом формата tar при создании архивов является то, что в архив записывается информация о структуре каталогов, о владельце и группе отдельных файлов, а также временные метки файлов.
Указав ключ z, можно сообщить tar, что после упаковки файлов в архив нужно вызвать gzip для сжатия. Такой же ключ используется и для распаковки, когда tar вызывает gunzip.
Упаковка файла в архив:
cd /export/home
tar cvzf olga.tar.gz olga/*
Ключи используются без знака минус перед ними, а их значения можно посмотреть в man:
с – create – создать архив;
v – verbose mode – выводить имена всех файлов на экран;
z – zip – после упаковки вызвать gzip для сжатия;
f – file – записать результат в файл, который указан после ключа f.
Можно также зайти в каталог и заархивировать содержимое:
cd /export/home/olga
tar cvzf olga.tar.gz *
Но это неудобно – при распаковке файлы окажутся не в каталоге olga, а там, где архив будет распаковываться.
Распаковать такой архив можно командой
tar xzvf olga.tar.gz
Очевидно, что x требует распаковать архив.
При архивировании способом, указанным в первом примере, в каталоге, где лежит архив, создастся подкаталог olga, и уже в него будут распакованы все файлы и подкаталоги архива.
dd
Известно, что уже в 1970 году утилита dd работала с ленточными накопителями, а расшифровка ее названия, скорее всего, относится к тому же периоду. В языке IBM System/360 JCL был оператор DD (Dataset Definition, определение набора данных), имя которого, возможно, и получила вновь созданная команда. Также существует вариант disk dump, но гораздо ближе к сути команды расшифровки “data destroyer” или “delete data”.
Программа нужна для копирования устройств в их образы и обратно, а также может копировать целые разделы дисков. Еще она применяется, когда нужно скопировать первые
n байт файла, пропустить
m байт от начала, прочитать файл с дефектного носителя, транслировать содержимое файла в ASCII, изменить порядок байт в файле и т.п. Пример вызова dd:
dd if=/dev/cdrom of=backup.iso bs=65535 conv=noerror
Это означает, что нужно сделать образ компакт-диска, используя указанный размер блока и игнорируя ошибки.
Другие параметры можно посмотреть в man dd.
Нельзя использовать dd для копирования файлов с одной ФС на другую, если размер блоков у них различен.
cpio
Команда cpio применяется для копирования файлов в архив и из архива и работает в трех режимах: входящего, исходящего и пассивного копирования.
Режим исходящего копирования (копирования в архив, Copy Out Mode) применяется для создания архива из файлов, подходящих по маске. Например,
#ls | cpio -oc > /new_file
Если стандартный входной поток формируется и направляется по программному каналу команде cpio -o, утилита группирует файлы так, что они могут быть перенаправлены (>) в один файл (new_file). Ключ -c отвечает за переносимость файла на другие машины. Результат можно перенаправить на устройство, а не в обычный файл. Файл результата состоит из заголовка и записанных вслед за ним имен и содержимого архивируемых файлов. Сжатия информации не производится.
Входящее копирование (т.е. копирование из архива, Copy In Mode) нужно для извлечения из архива определенных файлов (например, файла file1):
#cat new_file | cpio -i file1
Пассивное копирование (Pass Mode) служит для копирования файлов между файловыми системами, когда неприменима команда mv. В этом режиме cpio читает список файлов со стандартного ввода и копирует эти файлы в указанный каталог.
#find . -depth -print | cpio -pdlmv new_dir
Ключ -d требует создавать каталоги при необходимости, а -m - оставлять время изменения файла. При генерации списка полных имен файлов для cpio с помощью утилиты find важно указывать ключ -depth. Это решает проблемы с попытками создания файлов в каталогах, доступных только для чтения.
Целевой каталог new_dir должен существовать при использовании утилиты cpio совместно с find; если задается ключ -L для команды cpio, необходимо использовать ключ -follow для find, и наоборот.
rsync
Для копирования и синхронизации содержимого удаленных файлов и каталогов используется программа rsync. Можно применять rsync для работы поверх ssh или для самостоятельной работы в режиме клиент-сервер. В последнем случае потребуется на одной из сторон копирования запустить сервер rsync одноименной командой с ключом --daemon. В файле /etc/rsyncd.conf указывается, какие каталоги и с какими правами доступа к ним сервер rsync позволит видеть снаружи.
Rsync не передает файлы целиком, если в этом нет необходимости. При синхронизации каталогов с файлами большого объема, rsync обменивается с удаленным сервером контрольными суммами, посчитанными по блокам, и при совпадении контрольных сумм и размеров блоков не выполняет пересылку блока, который одинаков на обеих сторонах.
Для копирования файлов с компьютера comp1 из каталога /export/home на локальный компьютер в каталог /data/tmp нужно выполнить команду
rsync -avz comp1:export/home /data/tmp
Можно немного изменить команду
rsync -avz comp1:export/home/ /data/tmp
Слэш в окончании исходного пути меняет поведение при копировании так, что все файлы копируются в каталог /data/tmp без создания дополнительного уровня вложения каталогов. Завершающий исходный путь слэш означает
"копировать содержимое этого каталога". Без завершающего слэша -
"копировать каталог".
Различные примеры использования команды содержатся в man rsync.