15 полезных Linux команд для управления ленточными библиотеками
Ленточные устройства на регулярной основе следует использовать для архивирования файлов или для передачи данных от одного сервера к другому. Как правило, ленточные устройства все подключены к Unix системе. Резервные копии следует выполнять на диски (например в облако) и ленточные устройства. В этой статье мы рассмотрим:
- Название ленточных устройств
- Команды для управления лентами
- Основные команды резервного копирования и восстановления с ленточных устройств
Зачем выполнять резервное копирование?
- Резервное копирование очень важно:
- Возможность восстановления при отказе работы дисковой подсистемы
- Случайное удаление файлов
- Полное уничтожение сервера, в том числе уничтожение локальных резервных копий из-за пожара или других проблем.
Вы можете использовать архивы, основанные ленточном резервном копировании всего сервера и перемещать ленты за пределы серверной.
Каждая лента устройство может хранить несколько файлов резервных копий. Ленточные резервные файлы создаются с помощью cpio, tar, dd, и тп. Тем не менее, накопитель на магнитной ленте может быть открыт и закрыт на запись данных различными программами. Вы можете хранить резервные копии на физической ленте. Между каждым файлом ленты есть «файл знак лента». Это используется для того, что бы указать где заканчивается один файл и начинается следующий. Используйте команду mt для позиционирования ленты (перемотки вперед или назад)
Как данные хранятся на ленте
Все файлы хранятся на ленте последовательно в архивах. Первый архив будет находится на физическом начале ленты и так далее.
Именование ленточных устройств в Unix
- /dev/rmt/0 или /dev/rmt/1 или /dev/rmt/[0-127] : Обычное именование лент в Unix. Лента перематывается.
- /dev/rmt/0n : Так называются не перематываемые лентыe т.е. после использования ленты, не оставляет пленку в текущем состоянии для следующей команды.
- /dev/rmt/0b : Использование magtape интерфейс т.е. поведение BSD. Более читаемый различными ОС, такими как AIX, Windows, Linux, FreeBSD, и др.
- /dev/rmt/0l : Сжатие на низком уровне.
- /dev/rmt/0m : Сжатие на среднем уровне.
- /dev/rmt/0u :Сжатие на высоком уровне.
- /dev/rmt/0c : Установлена плотность сжатия.
- /dev/st[0-9] : конкретное имя Linux SCSI ленточного устройства.
- /dev/sa[0-9] : FreeBSD конкретное имя устройства SCSI ленты.
- /dev/esa0 : FreeBSD конкретное имя устройства SCSI ленты, которые могут быть извлечены по окончанию записи.
Как просмотреть установленные SCSI ленточные устройства?
Используйте следующие команды
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
## Linux ## lsscsi lsscsi -g ## IBM AIX ## lsdev -Cc tape lsdev -Cc adsm lscfg -vl rmt* ## Solaris Unix ## cfgadm –a cfgadm -al luxadm probe iostat -En ## HP-UX Unix ## ioscan Cf ioscan -funC tape ioscan -fnC tape ioscan -kfC tape |
Пример ответа команды
Команда mt
В системе Linux и Unix-подобных, команда mt используется для управления операциями ленточного накопителя, например, найти статус или файлы на ленте или писать контрольные знаки на ленте. Синтаксис:
1 |
mt -f /tape/device/name operation |
Настройка среды
Вы можете установить переменную оболочки TAPE. Это путь ленточного накопителя. По умолчанию (если эта переменная не установлена) является /dev/nsa0 на FreeBSD. Может изменить с помощью опции -f передается команде mt, как описано ниже.
1 2 3 4 5 |
## Добавить в скрипт запуска системы ## TAPE=/dev/st1 #Linux TAPE=/dev/rmt/2 #Unix TAPE=/dev/nsa3 #FreeBSD export TAPE |
Показать состояние tape/drive
1 2 3 4 5 |
mt status #Use default mt -f /dev/rmt/0 status #Unix mt -f /dev/st0 status #Linux mt -f /dev/nsa0 status #FreeBSD mt -f /dev/rmt/1 status #Unix |
Так же вы можете использовать цикл, что бы просмотреть все ленточные устройства в системе
1 2 3 4 |
for d in 0 1 2 3 4 5 do mt -f "/dev/rmt/${d}" status done |
Перемотка ленты
1 2 3 4 |
mt rew mt rewind mt -f /dev/mt/0 rewind mt -f /dev/st0 rewind |
Извлечение ленты
1 2 3 4 5 |
mt off mt offline mt eject mt -f /dev/mt/0 off mt -f /dev/st0 eject |
Стереть ленту
1 2 3 |
mt erase mt -f /dev/st0 erase #Linux mt -f /dev/rmt/0 erase #Unix |
Перемотка Кассеты
Если возникают, ошибки чтения, нужно очистить стример, а затем повторите попытку следующим образом:
1 2 3 |
mt retension mt -f /dev/rmt/1 retension #Unix mt -f /dev/st0 retension #Linux |
Запись n метки EOF в текущей позиции ленты
1 2 3 |
mt eof mt weof mt -f /dev/st0 eof |
Перемотка вперед на определенное количество меток EOF
Лента позиционируется на первом блоке следующего файла, т.е. ленты будет позиционировать на первом блоке
1 2 3 |
mt fsf mt -f /dev/rmt/0 fsf mt -f /dev/rmt/1 fsf 1 |
Перемотка назад на определенное количество меток EOF
1 2 3 |
mt bsf mt -f /dev/rmt/1 bsf mt -f /dev/rmt/1 bsf 1 |
Основные команды резервного копирования.
Резервирование директории
1 2 |
tar cvf /dev/rmt/0n /etc tar cvf /dev/st0 /etc |
Восстановление из архива
1 2 |
tar xvf /dev/rmt/0n -C /path/to/restore tar xvf /dev/st0 -C /tmp |
Просмотр проверка содержимого бэкапа
1 2 3 4 5 6 7 |
mt -f /dev/st0 rewind; dd if=/dev/st0 of=- ## tar format ## tar tvf {DEVICE} {Directory-FileName} tar tvf /dev/st0 tar tvf /dev/st0 desktop tar tvf /dev/rmt/0 foo > list.txt |
Копирование разделов dump or ufsdump
1 2 3 4 5 6 7 8 9 |
## Unix backup c0t0d0s2 partition ## ufsdump 0uf /dev/rmt/0 /dev/rdsk/c0t0d0s2 ## Linux backup /home partition ## dump 0uf /dev/nst0 /dev/sda5 dump 0uf /dev/nst0 /home ## FreeBSD backup /usr partition ## dump -0aL -b64 -f /dev/nsa0 /usr |
Восстановление разделов командой ufsrestore или restore
1 2 3 4 5 6 7 8 9 10 11 12 |
## Unix ## ufsrestore xf /dev/rmt/0 ## Unix interactive restore ## ufsrestore if /dev/rmt/0 ## Linux ## restore rf /dev/nst0 ## Restore interactive from the 6th backup on the tape media ## restore isf 6 /dev/nst0 ## FreeBSD restore ufsdump format ## restore -i -f /dev/nsa0 |
Запись в начало ленты
1 2 3 4 5 6 7 8 |
## This will overwrite all data on tape ## mt -f /dev/st1 rewind ### Backup home ## tar cvf /dev/st1 /home ## Offline and unload tape ## mt -f /dev/st0 offline |
Восстановление с начала ленты
1 2 3 |
mt -f /dev/st0 rewind tar xvf /dev/st0 mt -f /dev/st0 offline |
Начать запись после последнего архива
1 2 3 4 5 6 7 8 |
## This will kee all data written so far ## mt -f /dev/st1 eom ### Backup home ## tar cvf /dev/st1 /home ## Unload ## mt -f /dev/st0 offline |
Начать запись после второго архива
1 2 3 4 5 6 7 |
## To wrtite after tar number 2 (should be 2+1) mt -f /dev/st0 asf 3 tar cvf /dev/st0 /usr ## asf equivalent command done using fsf ## mt -f /dev/sf0 rewind mt -f /dev/st0 fsf 2 |
Восстановить архив 2
1 2 3 |
mt -f /dev/st0 asf 3 tar xvf /dev/st0 mt -f /dev/st0 offline |
Как проверить резервные копии на ленте созданные с помощью tar?
Важно регулярно проверять резервные копии, что бы понимать, что система функционирует правильно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#!/bin/bash # A UNIX / Linux shell script to backup dirs to tape device like /dev/st0 (linux) # This script make both full and incremental backups. # You need at two sets of five tapes. Label each tape as Mon, Tue, Wed, Thu and Fri. LOGBASE=/root/backup/log # Backup dirs; do not prefix / BACKUP_ROOT_DIR="home sales" # Get todays day like Mon, Tue and so on NOW=$(date +"%a") # Tape devie name TAPE="/dev/st0" # Exclude file TAR_ARGS="" EXCLUDE_CONF=/root/.backup.exclude.conf # Backup Log file LOGFIILE=$LOGBASE/$NOW.backup.log # Path to binaries TAR=/bin/tar MT=/bin/mt MKDIR=/bin/mkdir # ------------------------------------------------------------------------ # Excluding files when using tar # Create a file called $EXCLUDE_CONF using a text editor # Add files matching patterns such as follows (regex allowed): # home/vivek/iso # home/vivek/*.cpp~ # ------------------------------------------------------------------------ [ -f $EXCLUDE_CONF ] && TAR_ARGS="-X $EXCLUDE_CONF" #### Custom functions ##### # Make a full backup full_backup(){ local old=$(pwd) cd / $TAR $TAR_ARGS -cvpf $TAPE $BACKUP_ROOT_DIR $MT -f $TAPE rewind $MT -f $TAPE offline cd $old } # Make a partial backup partial_backup(){ local old=$(pwd) cd / $TAR $TAR_ARGS -cvpf $TAPE -N "$(date -d '1 day ago')" $BACKUP_ROOT_DIR $MT -f $TAPE rewind $MT -f $TAPE offline cd $old } # Make sure all dirs exits verify_backup_dirs(){ local s=0 for d in $BACKUP_ROOT_DIR do if [ ! -d /$d ]; then echo "Error : /$d directory does not exits!" s=1 fi done # if not; just die [ $s -eq 1 ] && exit 1 } #### Main logic #### # Make sure log dir exits [ ! -d $LOGBASE ] && $MKDIR -p $LOGBASE # Verify dirs verify_backup_dirs # Okay let us start backup procedure # If it is Monday make a full backup; # For Tue to Fri make a partial backup # Weekend no backups case $NOW in Mon) full_backup;; Tue|Wed|Thu|Fri) partial_backup;; *) ;; esac > $LOGFIILE 2>&1 |