Friday, April 13, 2018

CentOS 6.6 리눅스 관리] 11.3 아카이브, 압축 및 백업/복구 - tar, mt 명령


안녕하세요. 썬구루입니다. 이제 아카이브 명령인 tar와 테이프 매체 제어 명령인 mt 명령에 대해 알아보도록 하겠습니다. 백업이란 특정 시점에 원본에 대한 사본을 만드는 것이고 복구는 특정 시점에 백업한 사본을 가지고 데이터를 복원하는 것이라고 앞 게시물에서 언급하였었습니다.

만약 여러분들이 만든 문서를 제출하기 위해 컴퓨터에 작성한 파일을 USB 플래시 메모리로 복사를 하였다면 그것이 바로 백업입니다. 그리고 사본을 제출하려 하는 것이죠. 그런데 만약 여러분들이 만든 원본의 데이터가 실수로 인해 삭제가 되었다면 어떻게 할 수 있을까요? 이미 제출한 USB 메모리를 회수하여 다른 USB 메모리 복사한 후 사본은 제출하고 다른 사본을 집으로 가져와 컴퓨터에 복사한다면 그것이 바로 복구입니다.

만약 그 사이에 갱신된 내용이 있었는데 원본 파일이 삭제되었다면 갱신된 내용들은 유실이 되는 것이죠. 왜냐하면 사본을 만든 그 시점까지에 대한 정보만 있을 테니까요. 백업을 하는 방법은 다양합니다. 그중 이 게시물에서 우리는 tar 명령을 가지고 백업/복구를 해보려 하는 것이죠.

tar는 tape archive의 약자입니다. 테이프에 특정 파일들을 아카이빙 하기 위해 사용되었던 명령이죠. 그럼 아카이브(Archive)란 무엇이냐?
아카이브란 백업을 위해 특정 시간에 함께 패키지한 파일들의 집합을 뜻합니다. 다르게 말하면 백업을 위해 특정 파일들을 묶는다는 것이죠. 그럼 어디에 묶어서 보관하느냐?

  ▶ 파일시스템 위의 단일 파일
  ▶ 테이프 미디어(Tape Media. DDS, SDLT, DLT, LTO 등)
  ▶ USB 플래시 메모리, DVD 등

위와 같은 매체에 보관할 수 있습니다.

간혹 tar를 압축 명령이라고 하는 분들이 있는데 tar는 단순히 파일들을 묶어 저장하거나 추출하는 기능을 위해 사용하지 압축 기능은 없습니다. 그럼 tar를 뭐라 부르는데요? 아카이브 명령!!! 압축된다던데요? 그것은 tar의 옵션을 사용하여 다른 압축 명령을 호출하여 사용하는 것입니다. mt는 뭔데요.? mt는 Magetic Tape의 약자로 테이프 드라이브에 삽입된 테이프 미디어를 제어하기 위해 사용되는 명령입니다. 보통 단일 서버 시스템 데이터 백업을 하기 위해 내장 또는 외장형 단일 드라이브를 사용합니다. 서버가 유닉스 또는 리눅스 운영체제를 사용한다면 드라이브 안에 있는 테이프 미디어를 제어하기 위해 사용하는 명령이 mt 명령입니다.

■ tar 명령

파일이나 디렉터리를 특정 시점에 단일 파일 또는 테이프 같은 다른 저장 매체에 백업 또는 복구(추출) 하기 위해 사용되는 명령이다.

1). 명령 형식

tar [옵션] [파일...]

2). 옵션

옵 션
내 용
-c
 tar 아카이브를 생성하기 위해 사용되는 옵션이다.
-t
 아카이브에 있는 파일 리스트를 출력하기 위해 사용되는 옵션이다.
-x
 아카이브에 있는 파일을 추출하기 위해 사용되는 옵션이다.
-v
 Verbose mode
-f DEVICENAME
 디바이스를 명시하기 위해 사용되는 옵션이다. 디바이스 이름 대신 파일 이름이 올 수도 있다.
-j
 bzip2를 통해 아카이브를 한다.
-z
 gzip을 통해 아카이브를 필터한다.
-Z
 compress를 통해 아카이브를 필터한다.
-C DIRECTORY
 특정 디렉터리에 풀기 위해 사용하는 옵션이다.

3). 예제

 ▶ tar 백업

이전에 만들었던 /dev/sdc1에 생성한 파일시스템을 /backup 디렉터리를 생성한 후 마운트한다. 그리고 /etc 디렉터리에 있는 파일들을 tar 명령을 사용하여 /backup 디렉터리에 단일 파일로 아카이브 하는 것을 보여준다. -j 와 -z 옵션을 사용하여 tar 아카이브를 한 파일 용량을 자세히 확인해보자. 그리고 file 명령으로 파일 유형을 확인해보자.

[root@sunguru ~]# blkid
/dev/sda3: UUID="047dc93f-6363-4570-a7b5-1937a6534afa" TYPE="ext4"
/dev/sda1: UUID="b7618935-2a1e-4f2a-ad9f-167a96b8e935" TYPE="ext4"
/dev/sda2: UUID="1b4804f6-b38b-4484-928d-73f04f327afb" TYPE="swap"
/dev/sdb1: UUID="b380e123-e1ee-4ae2-8ae2-55827b5bae91" TYPE="ext4"
/dev/sdc1: UUID="6b5eddb7-6373-42fc-9d74-dc95507d4280" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdc2: UUID="000558d2-4c63-417e-83aa-ae38cef22887" TYPE="ext4"
/dev/sr0: LABEL="CentOS_6.6_Final" TYPE="iso9660"
[root@sunguru ~]#
[root@sunguru ~]# df -hF ext4
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        16G  2.8G   12G  19% /
/dev/sda1       190M   32M  149M  18% /boot
/dev/sdc2       2.2T   73M  2.0T   1% /data02
[root@sunguru ~]#
[root@sunguru ~]# mkdir /backup
[root@sunguru ~]# mount /dev/sdb1 /backup
[root@sunguru ~]#
[root@sunguru ~]# df -h /backup
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       4.9G   11M  4.6G   1% /backup
[root@sunguru ~]#
[root@sunguru ~]# cd /etc
[root@sunguru etc]#
[root@sunguru etc]# tar -cf /backup/etc_2016071001.tar ./*
[root@sunguru etc]# tar -cjf /backup/etc_2016071001.tar.bz2 ./*
[root@sunguru etc]# tar -czf /backup/etc_2016071001.tar.gz ./*
[root@sunguru etc]#
[root@sunguru etc]#
[root@sunguru etc]# ls -l /backup
total 48924
-rw-r--r--. 1 root root 31631360 Jul 11 01:08 etc_2016071001.tar
-rw-r--r--. 1 root root  8594496 Jul 11 01:08 etc_2016071001.tar.bz2
-rw-r--r--. 1 root root  9848450 Jul 11 01:09 etc_2016071001.tar.gz
drwx------. 2 root root    16384 Jun 28 18:01 lost+found
[root@sunguru etc]#
[root@sunguru etc]# file /backup/*
/backup/etc_2016071001.tar:     POSIX tar archive (GNU)
/backup/etc_2016071001.tar.bz2: bzip2 compressed data, block size = 900k
/backup/etc_2016071001.tar.gz:  gzip compressed data, from Unix, last modified: Mon Jul 11 01:09:00 2016
/backup/lost+found:             directory
[root@sunguru etc]# 

▶ tar 아카이브 파일 리스트 확인

tar 아카이브 파일에서 아카이브된 파일 리스트를 확인하기 위해 -t 옵션을 사용할 수 있다. 이때 -v 옵션도 같이 사용한다.

[root@sunguru backup]# ls
etc_2016071001.tar  etc_2016071001.tar.bz2  etc_2016071001.tar.gz  lost+found
[root@sunguru backup]#
[root@sunguru backup]#
[root@sunguru backup]# tar -tvf etc_2016071001.tar | head
drwxr-xr-x root/root         0 2016-05-27 02:46 ./ConsoleKit/
drwxr-xr-x root/root         0 2010-11-11 07:09 ./ConsoleKit/run-seat.d/
drwxr-xr-x root/root         0 2010-11-11 07:09 ./ConsoleKit/run-session.d/
drwxr-xr-x root/root         0 2016-05-27 02:46 ./ConsoleKit/seats.d/
-rw-r--r-- root/root        64 2010-11-11 07:09 ./ConsoleKit/seats.d/00-primary.seat
-rw-r--r-- root/root      4439 2014-07-17 00:02 ./DIR_COLORS
-rw-r--r-- root/root      5139 2014-07-17 00:02 ./DIR_COLORS.256color
-rw-r--r-- root/root      4113 2014-07-17 00:02 ./DIR_COLORS.lightbgcolor
drwxr-xr-x root/root         0 2016-05-27 02:48 ./NetworkManager/
drwxr-xr-x root/root         0 2014-10-15 19:26 ./NetworkManager/dispatcher.d/
[root@sunguru backup]# 




▶ tar 복구(추출)

etc_2016071001.tar 파일에 아카이브되어 있는 모든 파일들을 /backup/etc 디렉터리에 풀기 위해 아래 명령을 사용한다.

[root@sunguru backup]# pwd
/backup
[root@sunguru backup]# ls
etc_2016071001.tar  etc_2016071001.tar.bz2  etc_2016071001.tar.gz  lost+found
[root@sunguru backup]#
[root@sunguru backup]# mkdir etc
[root@sunguru backup]#
[root@sunguru backup]# tar -xf etc_2016071001.tar -C /backup/etc 2> /dev/null
[root@sunguru backup]#
[root@sunguru backup]# ls -Rl etc/ | wc -l
3100
[root@sunguru backup]# 

특정 파일만 추출하기 위해 복구할 파일 이름들을 명시할 수 있다.

[root@sunguru backup]# rm -rf etc
[root@sunguru backup]#
[root@sunguru backup]# ls
etc_2016071001.tar  etc_2016071001.tar.bz2  etc_2016071001.tar.gz  lost+found
[root@sunguru backup]#
[root@sunguru backup]# mkdir etc
[root@sunguru backup]#
[root@sunguru backup]# tar -xf etc_2016071001.tar -C /backup/etc ./group ./shadow ./passwd
[root@sunguru backup]#
[root@sunguru backup]# ls -l etc
total 12
-rw-r--r--. 1 root root  895 Jul 10 19:18 group
-rw-r--r--. 1 root root 1979 Jul 10 19:18 passwd
----------. 1 root root 1156 Jul 10 19:18 shadow
[root@sunguru backup]#  

압축된 tar 파일 압축 파일 풀지 않고 파일 복구하기 위해 파이프라인(|) 기호를 사용할 수 있다.

[root@sunguru backup]# cat etc_2016071001.tar.gz | tar -xzf - -C /backup/etc 2> /dev/null
[root@sunguru backup]#
[root@sunguru backup]# ls -Rl etc | wc -l
3100
[root@sunguru backup]#
[root@sunguru backup]#
[root@sunguru backup]# ls
etc  etc_2016071001.tar  etc_2016071001.tar.bz2  etc_2016071001.tar.gz  lost+found
[root@sunguru backup]# 

▶ 테이프 디바이스를 활용한 tar 백업

아래는 mtx 명령을 이용하여 L700 테이프 라이브러리 슬롯 1번에 있는 테이프 미디어를 드라이브 0번에 삽입한 후 mt 명령을 이용하여 미디어를 제어, 이를 제일 앞으로 감은 후(rewind) /dev/st0 드라이브를 통해 테이프 미디어에 /etc 디렉터리에 있는 파일을 백업하는 것을 보여준다.

[root@centos64 mhvtl]# lsscsi -g | grep L700
[3:0:0:0]    mediumx STK      L700             0105  /dev/sch0  /dev/sg10
[root@centos64 mhvtl]#
[root@centos64 mhvtl]# mtx -f /dev/sg10 status | head -7
  Storage Changer /dev/sg10:4 Drives, 43 Slots ( 4 Import/Export )
Data Transfer Element 0:Empty
Data Transfer Element 1:Empty
Data Transfer Element 2:Empty
Data Transfer Element 3:Empty
      Storage Element 1:Full :VolumeTag=E01001L4                         
      Storage Element 2:Full :VolumeTag=E01002L4                         
[root@centos64 mhvtl]#
[root@centos64 mhvtl]# mtx -f /dev/sg10 load 1 0
Loading media from Storage Element 1 into drive 0...done
[root@centos64 mhvtl]#
[root@centos64 mhvtl]# mtx -f /dev/sg10 status | head -7
  Storage Changer /dev/sg10:4 Drives, 43 Slots ( 4 Import/Export )

Data Transfer Element 0:Full (Storage Element 1 Loaded):VolumeTag = E01001L4                     
Data Transfer Element 1:Empty
Data Transfer Element 2:Empty
Data Transfer Element 3:Empty
      Storage Element 1:Empty
      Storage Element 2:Full :VolumeTag=E01002L4                         
[root@centos64 mhvtl]#
[root@centos64 mhvtl]# mt -f /dev/st0 rewind
[root@centos64 mhvtl]# mt -f /dev/st0 status
SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x46 (LTO-4).
Soft error count since last status=0
General status bits on (41010000):
 BOT ONLINE IM_REP_EN
[root@centos64 mhvtl]#
[root@centos64 mhvtl]# cd /etc
[root@centos64 etc]#
[root@centos64 etc]# tar -cf /dev/st0 ./*
[root@centos64 etc]# mt -f /dev/st0 rewind
[root@centos64 etc]#
[root@centos64 etc]# tar -tf /dev/st0 | wc -l
2209
[root@centos64 etc]# 




■ mt 명령

mt 명령은 테이프 드라이브 안에 있는 미디어를 제어하기 위해 사용되는 명령이다.


1). 명령 형식

mt [ -f DEVICE_NAME ] OPERATION [ COUNT ]

2). Operation

Operation
내 용
rewind
 테이프를 처음으로 되돌린다.
offline
 테이프를 드라이브에서 배출한다.
status
 테이프 드라이브의 상태 정보를 출력한다.
eod
 데이터의 끝으로 이동한다.
erase
 테이프에 있는 데이터를 삭제하여 초기화한다.
fsf COUNT
 현재 구간에서 앞(Forward)으로 구간 이동을 COUNT 수 만큼 하기 위해 사용한다.
bsfm COUNT
 현재 구간에서 뒤(Backward)로 구간 이동을 COUNT 수 만큼 하기 위해 사용한다.

3). 예제

현재 테이프 미디어에는 /etc 디렉터리에 있는 파일들을 tar 백업한 Sub Volume이 하나가 있다. 테이프를 하나의 볼륨(Volume)으로 본다면 이 일부분에 /etc/에 대한 백업 데이터가 있을 것이다. 이를 백업 이미지라 부르고 그 구간을  서브 볼륨(Sub Volume)이라고 하기도 한다.

아래는 /dev/st0에 있는 미디어를 맨 앞으로 되돌리고 그 후 데이터의 끝으로 이동하였다. 그러면 /etc 디렉터리를 백업한 다음 구간에 가서 테이프가 정지한다. 왜냐하면 rewind를 뜻하는 n 문자를 st0 앞에 적었기 때문이다. 그리고 /root에 있는 파일들을 tar 명령을 사용하여 /dev/nst0 디바이스를 통해 테이프 미디어에 백업하였다. 그리고 다시 /usr/sbin 디렉터리에 있는 파일들을 백업하였다.

[root@centos64 etc]# mt -f /dev/st0 rewind
[root@centos64 etc]# mt -f /dev/nst0 eod
[root@centos64 etc]#
[root@centos64 etc]# cd /root
[root@centos64 ~]#
[root@centos64 ~]# tar -cf /dev/nst0 ./*
[root@centos64 home]#
[root@centos64 home]# cd /usr/sbin
[root@centos64 sbin]#
[root@centos64 sbin]# tar -cf /dev/nst0 ./*
[root@centos64 sbin]# 

그러면 미디어에 세 개의 서브 볼륨(Sub Volume)이 존재하게 된다. 첫 번째는 /etc, 두 번째는 /root, 세 번째는 /usr/sbin  디렉터리에 존재하는 파일들이 백업된 것이다. 그러면 /root 디렉터리에 있었던 파일들이 실수로 인해 유실되었다고 가정한다면 어떻게 백업본을 통해 데이터를 복원할 수 있을까?

이를 위해 /root 디렉터리로 이동 rm 명령을 사용하여 모든 파일을 삭제한다. 그런 후 미디어의 두 번째 서브 볼륨에 있는 백업 이미지로부터 데이터를 복원하기 위해 mt 명령을 이용하여 구간 이동을 한다. 그리고 tar 명령을 사용하여 데이터를 복원한 후 ls 명령을 사용하여 데이터가 정상적으로 복구되었는지 확인한다.

[root@centos64 sbin]# cd /root
[root@centos64 ~]# ls
anaconda-ks.cfg  install.log                             Music      Videos
Desktop          install.log.syslog                      Pictures
Documents        kmod-mhvtl-1.3-1.el6.elrepo.x86_64.rpm  Public
Downloads        mhvtl-utils-1.5-4.x86_64.rpm            Templates
[root@centos64 ~]#
[root@centos64 ~]# rm -rf ./*
[root@centos64 ~]#
[root@centos64 ~]# ls
[root@centos64 ~]#
[root@centos64 ~]# mt -f /dev/st0 rewind
[root@centos64 ~]# mt -f /dev/nst0 fsf 1
[root@centos64 ~]#
[root@centos64 ~]# tar -xf /dev/nst0
[root@centos64 ~]#
[root@centos64 ~]# ls
anaconda-ks.cfg  install.log                             Music      Videos
Desktop          install.log.syslog                      Pictures
Documents        kmod-mhvtl-1.3-1.el6.elrepo.x86_64.rpm  Public
Downloads        mhvtl-utils-1.5-4.x86_64.rpm            Templates
[root@centos64 ~]# 

여기까지 tar와 mt 명령에 대해 알아보았습니다. 현업에서는 내장 또는 외장형 디바이스를  사용하는 경우도 많으니 mt 명령은 반드시 알아두는 것이 좋습니다.

다음 게시물에서는 파일 압축에 대해 알아보도록 하겠습니다.






No comments:

Post a Comment