Пишем бэкапы на ленту

Dec 12, 2016 21:01

Появился тут музейный, но вполне себе рабочий экспонатЪ ленточного накопителя HP StorageWorks Ultrium 460.








Все как положено: Ulta3 SCSI-интерфейс, LTO-2 кассеты для записи по 400 GB каждая. В целом - даже сейчас не самый плохой вариант для хранения вторичных резервных копий. Да, подобных "дэвайсов" уже практически не найти и если оный красавец прикажет долго жить - будет проблема. Но в целом - не так, чтобы очень это проблема. Ведь по стандарту LTO устройства с записью LTO-4 могут читать LTO-2 кассеты. А LTO-4 накопитель найти уже будет чуточку попроще. Да и вообще: не пропадать же такому чудо-устройству и двум десяткам кассет на которых даже муха не.... ну, не познала любовь муха...

Для подключения нашлась и PCI SCSI-плата, и шлейф подключения. Современный Debian с данным устройством все так же, как и Unix'ы N-дцати летней давности работают с использованием утилит tar и mt. Так как про LTFS накопитель еще не слышал, то все достаточно просто.

Кратко вспомним, как же оно там все крутится.

Прежде всего - на ленте НЕТ файловой системы в привычном понимании. Данные хранятся блоками данных, которые пишутся последовательно от начала ленты (BOT - Beginning of tape) до конца - (EOT - End of tape). Между блоками расположены маркеры конца блока данных и начала следующего блока. Начало кассеты не имеет маркера начала блока и начинается сразу с блока номер 0.

Для управления всем этим счастьем вводится понятие "считывающая головка" накопителя. Устанавливая ее на определенный маркер начала блока данных можно считать данные данного блока.

Запись на ленту ведется с использованием утилиты tar, которая (ВНЕЗАПНО!) есть ни что иное, как "Tape ARchiver". Позиционирование считывающей головки, чтение состояния, стирание ленты, перемотка и ряд других действий производится утилитой mt, которая (ВНЕЗАПНО!) есть ни что иное, как "Magnetic Tape".

Еще одно маленькое, но существенное замечание. Ленточный накопитель в системах Linux как правило распознается как устройство /dev/st0. Но еще так же имеется устройство /dev/nst0. Разница между ними лишь в том, что при записи на устройство /dev/st0 по окончании лента перематывается в начало, а при использовании /dev/nst0 - остается на конце последнего записанного блока.

Пара примеров команд:

Записать архив на ленту
tar czv /path/to/something

Считать данные с текущего блока данных:
tar tzv

Перемотать ленту в начало:
mt -f /dev/st0 rewind

Перемотать ленту в конец;
mt -f /dev/st0 eod

Получить текущий статус накопителя и ленты:
mt -f /dev/st0 status
mt -f /dev/st0 tell

Перейти на 1 блок данных назад от текущего блока.
mt -f /dev/st0 bsf 2; mt -f /dev/st0 fsf 2;
Здесь чуть подробнее: по окончании записи головка останавливается на маркере конца блока данных, который только что был записан. Чтобы перейти на начало предыдущего блока данных нам нужно "отмотать" назад до маркера конца блока, идущего перед тем, на который нам надо перейти (1-ая команда), и потом перейти на маркер начала блока, который нам нужен (2-ая команда). Такая вот "арифметика".

В целом все это запоминать и каждый раз контролировать правильность выполнения нет нужды (да и лень). Посему, набросал скрипт с базовыми операциями с лентой.

#!/bin/bash

export TAPE="/dev/nst0"
############################################
function anykey {
    read -n 1 -p "Press any key to continue..."
}

while true; do
clear
cat
1. Show tape status
2. Show list of files of current block
3. Write new data (append tape)
4. Rewind tape (Set to BOT)
5. Wind tape (Set to EOD)
6. Set head to N blocks before
7. Set head to N blocks after
8. Extract data from current block
9. Erase tape

0. Exit
-----

EOF
read -p "Select action: " ans

case $ans in
    1)
echo "====="; mt status ; echo "====="; anykey ;;
    2)
echo "====="; tar tzv; echo "====="
echo "Rewinding to the beginning of current block..."
mt bsf 2; mt fsf
echo "Done"; anykey ;;
    3)
      read -p "Select file or directory: " path
      cd $(dirname $path)
      if [ $? -ne 0 ]; then
          anykey
          continue
      fi
      echo "Positioning to the end of written data..."
      mt eod; tar czv $(basename $path) -C $(dirname $path)
      echo "Done"; anykey ;;
    4)
      echo "Rewinding tape..."; mt rewind; echo "Done"; anykey ;;
   5)
      echo "Winding tape..."; mt eod; echo "Done"; anykey ;;
    6)
      read -p "Enter number of blocks before to set to: " ans
      mt bsf $(($ans+1)); mt fsf
      echo "Done"; anykey ;;
    7)
      read -p "Enter number of blocks after to set to: " ans
      mt fsf $ans; echo "Done"; anykey ;;
    8)
      read -p "Enter folder where to extract: " path
      cd $path
      if [ $? -ne 0 ]; then
          anykey
          continue
      fi
      read -p "Extract all data from this block? [Y|n]: " ans
      if [ $ans == "n" ]; then
          read -p "Enter file or dir name: " ans
          tar zxpv $ans
      else
          tar zxpv
      fi
      echo "Done"; anykey ;;
    9)
      echo "WARNING! Erasing will destroy ALL data on tape! Continue? [y|n]";
      if [ $ans == "y" ]; then
        echo "Rewinding tape..."; mt rewind;
        echo "Erasing tape. This is quite long operation..."; mt erase; echo
      fi
      anykey ;;
    0) exit 0 ;;
    *) continue ;;
esac
done

Как-то вот так вот все...

hp, scripting, tape, debian, linux

Previous post Next post
Up