Появился тут музейный, но вполне себе рабочий экспонатЪ ленточного накопителя 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
Как-то вот так вот все...