Сжатие дерева каталогов в несколько tar-архивов в один xz

Краткое введение в форматы CD:

CD-R может записывать несколько сессий. Каждая сессия должна быть завершена и "закрыта", прежде чем ее можно будет прочитать. Каждая сессия содержит ввод, вывод и некоторое количество дорожек. Вы можете записать все дорожки в одной сессии (диск сразу, опция -dao) или каждую дорожку по очереди из разных файлов (концептуально) с паузами между ними (дорожка сразу, опция -tao), но вы должны записать все дорожки и закрыть сессию.

Формат данных для компакт-дисков (CD-ROM, "желтая книга") был разработан поверх аудиоформата (CD-DA, "красная книга") и правильно разделяет непрерывный цифровой аудиопоток на сектора. Для этого ему необходима заголовочная информация, поэтому в аудио "секторе" 2352 байта, а для данных только 2336 байт. Кроме того, коррекция ошибок на аудио компакт-дисках достаточно хороша для аудио, где можно допустить несколько ошибочных битов, но недостаточно хороша для данных. Поэтому каждый сектор получает дополнительные биты коррекции ошибок, оставляя 2048 байт пользовательских данных. Это также называется "Режим 1". Он используется по умолчанию в cdrecord, и я не рекомендую использовать какой-либо другой режим для записи данных. Доступные "сырые" режимы позволяют записывать подканальные данные, но вам это не нужно.

Однако, вам потребуется перед записью разбить дорожки на блоки соответствующего размера. И нет, 4512 байт не кратно 2048 байт. Так что для резервного копирования, что-то вроде

tar -c --record-size=2048 -f track.tar

и затем что-то вроде

cdrecord -multi dev=0,0,0 -data track.tar

для создания многосеансового CD с одной дорожкой. Если CD не заполнен, можно добавить еще одну сессию.

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

Edit:

Если целью является частое создание резервных копий на DVD+RW или DVD-RW (+ или - имеет значение, это разные форматы), вы можете терпеть сбои, поэтому вы можете попробовать потоковую передачу с tar. Вам также, вероятно, не нужно несколько сессий.

Вы также можете передавать поток с mkisofs, что даже лучше, потому что не будет проблем с монтированием, а в man cdrecord есть пример:

mkisofs -R /master/tree | cdrecord -v -dao fs=6m speed=2 dev=2,0 -

Последние - предназначены для "чтения данных из stdin". Вы можете захотеть изменить скорость, размер FIFO, приоритеты ввода/вывода (это еще одна банка червей), driveropts=burnfree, если поддерживается, и т.д.

Для постоянного резервного копирования на носители с возможностью записи, я бы всегда рекомендовал делать это безопасным способом, без потоковой передачи.

1
12.05.2017, 17:41
2 ответа

Что вы на самом деле делаете, так это объединяете все шары tar. Вы можете увидеть весь контент, используя переключатель tar -i:

$ tar -itvf rootdir.tar.xz
subdir_2/
subdir_1/

Я не думаю, что возможно создать tar-шар из всех этих подкаталогов tar-шаров напрямую через канал. Вам нужно сначала записать их на диск в цикле:

for foo in `find rootdir -maxdepth 1 -name "subdir_*" -type d`
do
  tar --create --verbose --file=- --directory="rootdir" "$(basename ${foo})" \
  >"${foo}.tar"
done
tar -cf -  rootdir/subdir*.tar | xz -zc9 > rootdir.tar.xz
rm rootdir/subdir*.tar
1
28.01.2020, 00:55

Вы можете создать tarфайлы для каждого каталога, то есть directory-1.tar, directory-2.tar,...,, directory-n.tar, затем создать файл tar со всеми частями и сжать его на tar Jcf whole-shebang.tar.xz directory-*.tar.

Зачем это делать, если можно просто tar Jcf whole-shebang.tar.xz directory-*? Вы, конечно, можете извлечь отдельные каталоги/файлы из этого комка шерсти, в вашей настройке вам придется сначала извлечь конкретный архив, а затем рыться в нем, чтобы получить то, что вы хотите.

2
04.03.2020, 16:31

Теги

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