給系統管理員的 15 條實用 Linux/Unix 磁帶管理命令
為什麼備份?
一個備份計劃對定期備份文件來說很有必要,如果你寧願選擇不備份,那麼丟失重要數據的風險會大大增加。有了備份,你就有了從磁碟故障中恢復的能力。備份還可以幫助你抵禦:
- 意外的文件刪除
- 文件或文件系統損壞
- 伺服器完全毀壞,包括由於火災或其他問題導致的同盤備份毀壞
- 硬碟或 SSD 崩潰
- 病毒或勒索軟體破壞或刪除文件
你可以使用磁帶歸檔備份整個伺服器並將其離線存儲。
理解磁帶文件標記和塊大小
圖01:磁帶文件標記
每個磁帶設備能存儲多個備份文件。磁帶備份文件通過 cpio,tar,dd 等命令創建。同時,磁帶設備可以由多種程序打開、寫入數據、及關閉。你可以存儲若干備份(磁帶文件)到一個物理磁帶上。在每個磁帶文件之間有個「磁帶文件標記」。這用來指示一個物理磁帶上磁帶文件的結尾以及另一個文件的開始。你需要使用 mt 命令來定位磁帶(快進,倒帶和標記)。
磁帶上的數據是如何存儲的
圖02:磁帶上的數據是如何存儲的
所有的數據使用 tar 以連續磁帶存儲格式連續地存儲。第一個磁帶歸檔會從磁帶的物理開始端開始存儲(tar #0)。接下來的就是 tar #1,以此類推。
Unix 上的磁帶設備名
- /dev/rmt/0 或 /dev/rmt/1 或 /dev/rmt/[0-127] :Unix 上的常規磁帶設備名。磁帶自動倒回。
- /dev/rmt/0n :以無倒回為特徵,換言之,磁帶使用之後,停留在當前狀態等待下個命令。
- /dev/rmt/0b :使用磁帶介面,也就是 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 磁帶設備名,在關閉時彈出(如果可以的話)。
磁帶設備名示例
- /dev/rmt/1cn 指明正在使用 unity 1,壓縮密度,無倒回。
- /dev/rmt/0hb 指明正在使用 unity 0,高密度,BSD 行為。
- Linux 上的自動倒回 SCSI 磁帶設備名:/dev/st0
- Linux 上的無倒回 SCSI 磁帶設備名:/dev/nst0
- FreeBSD 上的自動倒回 SCSI 磁帶設備名:/dev/sa0
- FreeBSD 上的無倒回 SCSI 磁帶設備名:/dev/nsa0
如何列出已安裝的 scsi 磁帶設備?
輸入下列命令:
### Linux(更多信息參閱 man) ###
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
來自我的 Linux 伺服器的輸出示例:
圖03:Linux 伺服器上已安裝的磁帶設備
mt 命令示例
在 Linux 和類 Unix 系統上,mt 命令用來控制磁帶驅動器的操作,比如查看狀態或查找磁帶上的文件或寫入磁帶控制標記。下列大多數命令需要作為 root 用戶執行。語法如下:
mt -f /tape/device/name operation
設置環境
你可以設置 TAPE shell 變數。這是磁帶驅動器的路徑名。在 FreeBSD 上默認的(如果變數沒有設置,而不是 null)是 /dev/nsa0。可以通過 mt 命令的 -f 參數傳遞變數覆蓋它,就像下面解釋的那樣。
### 添加到你的 shell 配置文件 ###
TAPE=/dev/st1 #Linux
TAPE=/dev/rmt/2 #Unix
TAPE=/dev/nsa3 #FreeBSD
export TAPE
1:顯示磁帶/驅動器狀態
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 unity 1 也就是 tape device no. 1
你可以像下面一樣使用 shell 循環語句遍歷一個系統並定位其所有的磁帶驅動器:
for d in 0 1 2 3 4 5
do
mt -f "/dev/rmt/${d}" status
done
2:倒帶
mt rew
mt rewind
mt -f /dev/mt/0 rewind
mt -f /dev/st0 rewind
3:彈出磁帶
mt off
mt offline
mt eject
mt -f /dev/mt/0 off
mt -f /dev/st0 eject
4:擦除磁帶(倒帶,在支持的情況下卸載磁帶)
mt erase
mt -f /dev/st0 erase #Linux
mt -f /dev/rmt/0 erase #Unix
5:張緊磁帶盒
如果磁帶在讀取時發生錯誤,你重新張緊磁帶,清潔磁帶驅動器,像下面這樣再試一次:
mt retension
mt -f /dev/rmt/1 retension #Unix
mt -f /dev/st0 retension #Linux
6:在磁帶當前位置寫入 EOF 標記
mt eof
mt weof
mt -f /dev/st0 eof
7:將磁帶前進指定的文件標記數目,即跳過指定個 EOF 標記
磁帶定位在下一個文件的第一個塊,即磁帶會定位在下一區域的第一個塊(見圖01):
mt fsf
mt -f /dev/rmt/0 fsf
mt -f /dev/rmt/1 fsf 1 #go 1 forward file/tape (see fig.01)
8:將磁帶後退指定的文件標記數目,即倒帶指定個 EOF 標記
磁帶定位在下一個文件的第一個塊,即磁帶會定位在 EOF 標記之後(見圖01):
mt bsf
mt -f /dev/rmt/1 bsf
mt -f /dev/rmt/1 bsf 1 #go 1 backward file/tape (see fig.01)
這裡是磁帶定位命令列表:
fsf 前進指定的文件標記數目。磁帶定位在下一個文件的第一塊。
fsfm 前進指定的文件標記數目。磁帶定位在前一文件的最後一塊。
bsf 後退指定的文件標記數目。磁帶定位在前一文件的最後一塊。
bsfm 後退指定的文件標記數目。磁帶定位在下一個文件的第一塊。
asf 磁帶定位在指定文件標記數目的開始位置。定位通過先倒帶,再前進指定的文件標記數目來實現。
fsr 前進指定的記錄數。
bsr 後退指定的記錄數。
fss (SCSI tapes)前進指定的 setmarks。
bss (SCSI tapes)後退指定的 setmarks。
基本備份命令
讓我們來看看備份和恢復命令。
9:備份目錄(tar 格式)
tar cvf /dev/rmt/0n /etc
tar cvf /dev/st0 /etc
10:恢復目錄(tar 格式)
tar xvf /dev/rmt/0n -C /path/to/restore
tar xvf /dev/st0 -C /tmp
11:列出或檢查磁帶內容(tar 格式)
mt -f /dev/st0 rewind; dd if=/dev/st0 of=-
### tar 格式 ###
tar tvf {DEVICE} {Directory-FileName}
tar tvf /dev/st0
tar tvf /dev/st0 desktop
tar tvf /dev/rmt/0 foo > list.txt
12:使用 dump 或 ufsdump 備份分區
### Unix 備份 c0t0d0s2 分區 ###
ufsdump 0uf /dev/rmt/0 /dev/rdsk/c0t0d0s2
### Linux 備份 /home 分區 ###
dump 0uf /dev/nst0 /dev/sda5
dump 0uf /dev/nst0 /home
### FreeBSD 備份 /usr 分區 ###
dump -0aL -b64 -f /dev/nsa0 /usr
12:使用 ufsrestore 或 restore 恢復分區
### Unix ###
ufsrestore xf /dev/rmt/0
### Unix 互動式恢復 ###
ufsrestore if /dev/rmt/0
### Linux ###
restore rf /dev/nst0
### 從磁帶媒介上的第6個備份互動式恢復 ###
restore isf 6 /dev/nst0
### FreeBSD 恢復 ufsdump 格式 ###
restore -i -f /dev/nsa0
13:從磁帶開頭開始寫入(見圖02)
### 這會覆蓋磁帶上的所有數據 ###
mt -f /dev/st1 rewind
### 備份 home ###
tar cvf /dev/st1 /home
### 離線並卸載磁帶 ###
mt -f /dev/st0 offline
從磁帶開頭開始恢復:
mt -f /dev/st0 rewind
tar xvf /dev/st0
mt -f /dev/st0 offline
14:從最後一個 tar 後開始寫入(見圖02)
### 這會保留之前寫入的數據 ###
mt -f /dev/st1 eom
### 備份 home ###
tar cvf /dev/st1 /home
### 卸載 ###
mt -f /dev/st0 offline
15:從 tar number 2 後開始寫入(見圖02)
### 在 tar number 2 之後寫入(應該是 2+1)###
mt -f /dev/st0 asf 3
tar cvf /dev/st0 /usr
### asf 等效於 fsf ###
mt -f /dev/sf0 rewind
mt -f /dev/st0 fsf 2
從 tar number 2 恢復 tar:
mt -f /dev/st0 asf 3
tar xvf /dev/st0
mt -f /dev/st0 offline
如何驗證使用 tar 創建的備份磁帶?
定期做全系統修復和服務測試是很重要的,這是唯一確定整個系統正確工作的途徑。參見我們的驗證 tar 命令磁帶備份的教程以獲取更多信息。
示例 shell 腳本
#!/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.
# You can run script at midnight or early morning each day using cronjons.
# The operator or sys admin can replace the tape every day after the script has done.
# Script must run as root or configure permission via sudo.
# ----------------------------------------------------------------------# Copyright (c) 1999 Vivek Gite <vivek@nixcraft.com>
# This script is licensed under GNU GPL version 2.0 or above
# ----------------------------------------------------------------------# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------# Last updated on : March-2003 - Added log file support.
# Last updated on : Feb-2007 - Added support for excluding files / dirs.
# ----------------------------------------------------------------------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
關於第三方備份工具
Linux 和類Unix系統都提供了許多第三方工具,可以用來安排備份,包括磁帶備份在內,如:
- Amanda
- Bacula
- rsync
- duplicity
- rsnapshot
另行參閱
- Man pages - mt(1), mtx(1), tar(1), dump(8), restore(8)
via: http://www.cyberciti.biz/hardware/unix-linux-basic-tape-management-commands/
作者:Vivek Gite 譯者:alim0x 校對:Mr小眼兒
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive