리눅스/공통

Tar를 이용한 리눅스 시스템 전체 백업과 복원

씨실과 날실 2020. 8. 13. 09:00


리눅스 시스템 전체 백업과 복원

실제 컴퓨터(Real Machine) 혹은 서버(Server)에서 시스템 백업과 복원 

시스템 백업

study@study-VirtualBox:~$ cd /

study@study-VirtualBox:/$ sudo tar cvpzf  backup.tar.gz --exclude=/proc/* --exclude=/lost+found/* --exclude=/media/* --exclude=/mnt/* --exclude=/sys/* /

현재 작업 디렉터리를 ~ 디렉터리(즉, 현재 로그인 중인 계정의 홈 디렉터리)에서 / 디렉터리(즉, 시스템의 최상위 디렉터리)로 이동합니다.

sudo로 관리자에 준한 실행 권한을 얻고, tar 명령를 실행하되, cvpzf(= -cvpzf)로 백업에 필요한 옵션을 설정하고, 생성할 백업 파일 이름을 지정해준 다음, 순수 파일명 바로 뒤에 .tar와 .gz를 차례로 붙여  확장자를 적어줌으로써 해당 생성 파일이 tar로 다수의 디렉터리와 파일들을 묶고 Gzip 포맷으로 압축하라고 지정해 줍니다. 이어서 --exclude= 옵션을 사용해 백업에서 제외할 내용을 지정해준 다음 마지막으로 백업 대상인 루트 디렉터리인 /를 적어 준다음 실행해줍니다.

위 예시는 여러 형태로 변주가 가능합니다.

위 예시에서는 /(루트) 디렉터리에서 작업했지만 굳이 그럴 필요는 없습니다. 단지 작업의 편의를 위해 작업 위치를 옮긴 것일 뿐입니다. 실제로 아래 가상머신에서의 백업 예시에서는 마운트된 USB 디렉터리에서 작업했습니다.

su - 명령 등을 통해 로그인 계정을 전환한 경우 sudo 명령 없이 바로 tar 명령으로 시작하면 됩니다.

-cvpzf 옵션은 작업자의 작업 방식과 생성할 파일 형식에 따라 바뀔 수 있습니다. 이 옵션들 중에서 일반 백업인 경우 cf, 시스템 백업인 경우 cpf가 필수 옵션입니다. 시스템 백업인 경우 p 옵션이 붙는 이유는 디렉터리와 파일의 퍼미션(권한 설정) 정보를 보존하기 위함입니다.

백업 진행 과정을 볼 필요 없다면 v 옵션을 사용할 필요 없습니다.

압축을 사용하지 않는다면 z 옵션을 사용할 필요 없습니다.

압축이 gzip 형식이라면 z 옵션을, bzip2 형식이라면 j 옵션을 사용합니다.

파일명과 확장자를 지정하는 자리에 경로를 지정해주면 해당 경로에 파일이 생성됩니다.

제외 형식이 디렉터리로 끝나면 해당 디렉터리 자체가 백업에서 제외되고 /* 형식으로 끝나면 해당 디렉터리는 남겨지고 그 안에 속한 하위 디렉터리와 파일들만 백업에서 제외됩니다.

위 명령에서 나열한 제외 디렉터리는 예시입니다. 이외에도 --exclude= 옵션을 사용하여 얼마든지 추가할 수 있습니다.


study@study-VirtualBox:/$ sudo tar cvpzf  backup.tar.gz \
--exclude=/proc/* \
--exclude=/lost+found/* \
--exclude=/media/* \
--exclude=/mnt/* \
--exclude=/sys/* \
/

명령이 길어지면 실수가 많아집니다. 따라서 가독성을 위해 줄바꿈을 하는 개행 문자를 사용하는데 위 예시처럼 \(역슬래시)를 사용합니다. 주의할 점은 줄바꿈할 필요가 없는 마지막 줄에는 \를 붙이면 안됩니다.


시스템 복원

study@study-VirtualBox:~$ cd /

study@study-VirtualBox:/$ sudo tar xvpzf backup.gz -C /

복원 명령에서는 tar의 옵션에 변화가 있는데 c 대신 x가 사용되었습니다. c 옵션은 tar 아카이브 파일을 생성하거나 기존 아카이브 파일을 덮어 쓸 때 사용한다면 x 옵션은 tar 아카이브 파일에서 디렉터리와 파일을 추출해 풀어 놓을 때 사용합니다.

-C 옵션은 압축을 풀 경로를 지정하는 옵션입니다. 이 옵션은 아카이브를 추출할 때만 사용할 수 있습니다.

위 명령은 백업 파일인 backup.gz가 / 디렉터리에 있을 것을 가정하고 작성된 명령들입니다. 복원 환경에 맞춰 명령을 변경해주어야 합니다. 그에 대한 자세한 방법은 아래 설명을 참고하시기 바랍니다.


위의 시스템 백업과 복원 예시는 백업과 복원을 위한 가장 핵심적인 사항만 적은 것입니다.

보다 자세한 내용은 후술한 가상머신에서 시스템 백업과 복원의 과정을 참고하시기 바랍니다.





이하의 내용은 버추얼박스 가상머신에서 리눅스 시스템 백업과 복원과정을 실습하는 과정입니다.

백업과 복원 방법에 대한 원활한 설명을 위해 가상머신을 이용하였습니다. 실제 컴퓨터도 대동소이하므로 참고하시기 바랍니다.

가상머신의 OS는 Ubuntu 20.04 LTS Focal Fossa 기준입니다.


1. 백업 사전 준비

1-1. 기존 시스템 정보 확인

study@study-VirtualBox:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           393M  1.4M  392M   1% /run
/dev/sda2       2.0T  8.9G  1.9T   1% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop2      241M  241M     0 100% /snap/gnome-3-34-1804/24
/dev/loop3      256M  256M     0 100% /snap/gnome-3-34-1804/36
/dev/loop1       55M   55M     0 100% /snap/core18/1880
/dev/loop4       63M   63M     0 100% /snap/gtk-common-themes/1506
/dev/loop5       50M   50M     0 100% /snap/snap-store/433
/dev/loop6       50M   50M     0 100% /snap/snap-store/467
/dev/loop7       30M   30M     0 100% /snap/snapd/8140
/dev/loop8       30M   30M     0 100% /snap/snapd/8542
/dev/sda1       511M  7.8M  504M   2% /boot/efi
/dev/loop9       56M   56M     0 100% /snap/core18/1885
Share           450G  312G  139G  70% /media/sf_Share
tmpfs           393M   20K  393M   1% /run/user/1000
/dev/sr0         58M   58M     0 100% /media/study/VBox_GAs_6.1.10
/dev/sdb1        15G  4.4G   11G  30% /media/study/USB
study@study-VirtualBox:~$ 

df -h 명령어를 실행하여 현재 사용 중이거나 마운트되어 있는 파일 시스템을 확인해봅시다.

참고1

df 명령어 : 리눅스 시스템에서 디스크 내 파일 시스템 사용량을 확인하는 명령어입니다.

-h 옵션 : 보기 편한 용량 단위로 끊어 출력하는 옵션입니다.(K=KB, M=MB, G=GB, T=TB)


위 정보들 중에서 우리가 확인해야 할 항목은 주 시스템 정보입니다.

Filesystem        Size      Used     Avail     Use%     Mounted on
/dev/sda1       511M      7.8M   504M         2%    /boot/efi
/dev/sda2       2.0T        8.9G     1.9T         1%     /

주 시스템 정도는 위 두 개로 모아집니다. 이들 중 우리가 백업할 대상은 시스템 주 파티션인 /dev/sda2입니다.


1-2. 백업 파일을 저장할 USB 마운트

1-2-1. USB를 마운트할 수 있는 상태인지, 장치 상태 확인

study@study-VirtualBox:~$ sudo fdisk -l
[sudo] study의 암호: 
Disk /dev/loop0: 240.82 MiB, 252493824 bytes, 493152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop2: 54.98 MiB, 57626624 bytes, 112552 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop3: 255.58 MiB, 267980800 bytes, 523400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop4: 62.9 MiB, 65105920 bytes, 127160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop5: 49.8 MiB, 52203520 bytes, 101960 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop6: 49.8 MiB, 52203520 bytes, 101960 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop7: 29.84 MiB, 31272960 bytes, 61080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sda: 1.102 TiB, 2199022206976 bytes, 4294965248 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8자리 영숫자-4자리 영숫자-4자리 영숫자-4자리 영숫자-12자리 영숫자

Device       Start        End    Sectors  Size Type
/dev/sda1     2048    1050623    1048576  512M EFI System
/dev/sda2  1050624 4294963199 4293912576    2T Linux filesystem


Disk /dev/sdb: 14.57 GiB, 15631122432 bytes, 30529536 sectors
Disk model: Cruzer Edge     
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8자리 영숫자-4자리 영숫자-4자리 영숫자-4자리 영숫자-12자리 영숫자

Device     Start      End  Sectors  Size Type
/dev/sdb1   2048 30527374 30525327 14.6G Microsoft basic data


Disk /dev/loop8: 29.9 MiB, 31334400 bytes, 61200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop9: 55.33 MiB, 58007552 bytes, 113296 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
study@study-VirtualBox:~$ 


Disk /dev/sdb: 14.57 GiB, 15631122432 bytes, 30529536 sectors
Disk model: Cruzer Edge    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8자리 영숫자-4자리 영숫자-4자리 영숫자-4자리 영숫자-12자리 영숫자

Device        Start        End     Sectors  Size Type
/dev/sdb1   2048 30527374 30525327 14.6G Microsoft basic data

USB 장치 항목을 봅니다. 장치명을 비롯하여 다양한 정보를 확인할 수 있습니다.

여기서 우리가 확인할 것은 장치(Device)명입니다. /dev/sdb1로 할당되어 있군요.


참고로 이때 관리자 권한을 획득하여 명령을 실행해주어야 합니다. 만약 그렇지 않으면  아래와 같이 허가 거부 메시지가 뜰 것입니다.

study@study-VirtualBox:~$ fdisk -l
fdisk: cannot open /dev/loop0: 허가 거부
fdisk: cannot open /dev/loop2: 허가 거부
fdisk: cannot open /dev/loop3: 허가 거부
fdisk: cannot open /dev/loop4: 허가 거부
fdisk: cannot open /dev/loop5: 허가 거부
fdisk: cannot open /dev/loop6: 허가 거부
fdisk: cannot open /dev/loop7: 허가 거부
fdisk: cannot open /dev/sda: 허가 거부
fdisk: cannot open /dev/sdb: 허가 거부
fdisk: cannot open /dev/loop8: 허가 거부
fdisk: cannot open /dev/loop9: 허가 거부
study@study-VirtualBox:~$

1-2-2. USB 마운트

☞ 실제 컴퓨터(Real Machine)의 경우

$ sudo mount [디바이스명] [마운트할 디렉터리]


study@study-VirtualBox:~$ sudo mount /dev/sdb1 /media

☞ 버추얼박스 가상머신의 경우

$ sudo mount [디바이스명] /media/계정명/USB의 레이블명


study@study-VirtualBox:~$ sudo mount /dev/sdb1 /media/study/USB

위 명령의 경우 일반적인 예시와는 달리 '/media/study(리눅스 계정 아이디)/USB(USB의 레이블명의 예)'로 설정한 이유는 호스트 컴퓨터에 꽂혀 있는 USB를 버추얼박스 가상머신에 인식시키게 되면 보통 /media/리눅스 계정 아이디 쪽에 자동  마운트되기 때문입니다. 그것을 반영한 명령입니다.

버추얼박스에 USB를 인식시키면 가상머신에 자동으로 마운트되므로 위 명령을 추가로 실행해줄 필요 없지만 만약 해당 USB를 언마운트했다가 다시 마운트할 경우 위와 같이 실행해주시면 됩니다.

참고로 언마운트 방법은 다음과 같습니다.

study@study-VirtualBox:~$ umount /dev/sdb1

이때 주의할 점은 'unmount'가 아니라 'un'에서 'n'이 빠진 'umount'입니다.


1-2-3. USB 마운트 후 마운트 정보 확인

study@study-VirtualBox:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           393M  1.4M  392M   1% /run
/dev/sda2       2.0T  8.9G  1.9T   1% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop2      241M  241M     0 100% /snap/gnome-3-34-1804/24
/dev/loop3      256M  256M     0 100% /snap/gnome-3-34-1804/36
/dev/loop1       55M   55M     0 100% /snap/core18/1880
/dev/loop4       63M   63M     0 100% /snap/gtk-common-themes/1506
/dev/loop5       50M   50M     0 100% /snap/snap-store/433
/dev/loop6       50M   50M     0 100% /snap/snap-store/467
/dev/loop7       30M   30M     0 100% /snap/snapd/8140
/dev/loop8       30M   30M     0 100% /snap/snapd/8542
/dev/sda1       511M  7.8M  504M   2% /boot/efi
/dev/loop9       56M   56M     0 100% /snap/core18/1885
Share           450G  312G  139G  70% /media/sf_Share
tmpfs           393M   20K  393M   1% /run/user/1000
/dev/sr0         58M   58M     0 100% /media/study/VBox_GAs_6.1.10
/dev/sdb1        15G  4.4G   11G  30% /media/study/USB
study@study-VirtualBox:~$ 


/dev/sdb1        15G   41M   15G   1% /media/study/USB

맨 하단에 마운트된 USB의 정보를 확인할 수 있습니다.


1-2-4. 버추얼박스 가상머신에서 USB 인식시키기

자세한 내용은 위 링크를 참고하시기 바랍니다.


1-3. USB 포맷

리눅스도 OS인 만큼 디스크 포맷을 지원합니다. 사용하고자 하는 파일시스템 형식에 따라 각기 다른 명령을 사용해주어야 합니다.


1-3-1. 리눅스에서 USB를 FAT 32로 포맷

$ sudo mkfs.fat -F 32 -n [사용할 볼륨 레이블 명] -v 장치명


-F : 포맷 유형 FAT32/FAT16 설정

-n : 볼륨 레이블명 설정

-v : 자세한작업 수행 정보 출력


study@study-VirtualBox:~$ sudo mkfs.fat -F 32 -n USB -v /dev/sdb1
mkfs.fat 4.1 (2017-01-24)
/dev/sdb1 has 64 heads and 32 sectors per track,
hidden sectors 0x0800;
logical sector size is 512,
using 0xf8 media descriptor, with 30525327 sectors;
drive number 0x80;
filesystem has 2 32-bit FATs and 16 sectors per cluster.
FAT size is 14896 sectors, and provides 1905968 clusters.
There are 32 reserved sectors.
Volume ID is c9fa570c, volume label USB        .
study@study-VirtualBox:~$ 


1-3-2. 리눅스에서 USB를 NTFS로 포맷

$ sudo mkntfs -f -L [사용할 볼륨 레이블 명] -v 장치명


-f : 빠른 포맷(= --fast) 동일한 기능 옵션으로 -Q(= --quick)를 사용 할 수 있음

-L : 볼륨 레이블명 설정(= --label)

-v : 자세한작업 수행 정보 출력(= --verbose)


study@study-VirtualBox:~$ sudo mkntfs -f -L USB -v /dev/sdb1
Cluster size has been automatically set to 4096 bytes.
Creating NTFS volume structures.
Creating root directory (mft record 5)
Creating $MFT (mft record 0)
Creating $MFTMirr (mft record 1)
Creating $LogFile (mft record 2)
Creating $AttrDef (mft record 4)
Creating $Bitmap (mft record 6)
Creating $Boot (mft record 7)
Creating backup boot sector.
Creating $Volume (mft record 3)
Creating $BadClus (mft record 8)
Creating $Secure (mft record 9)
Creating $UpCase (mft record 0xa)
Creating $Extend (mft record 11)
Creating system file (mft record 0xc)
Creating system file (mft record 0xd)
Creating system file (mft record 0xe)
Creating system file (mft record 0xf)
Creating $Quota (mft record 24)
Creating $ObjId (mft record 25)
Creating $Reparse (mft record 26)
Syncing root directory index record.
Syncing $Bitmap.
Syncing $MFT.
Updating $MFTMirr.
Syncing device.
mkntfs completed successfully. Have a nice day.
study@study-VirtualBox:~$ 


1-3-3. 리눅스에서 USB를 ext4로 포맷

$ sudo mke2fs -t ext4 -L [사용할 볼륨 레이블 명] -v 장치명


-t : 포맷 유형 설정

-L : 볼륨 레이블명 설정(= --label)

-v : 자세한작업 수행 정보 출력(= --verbose)


study@study-VirtualBox:~$ sudo mke2fs -t ext4 -L USB -v /dev/sdb1
mke2fs 1.45.5 (07-Jan-2020)
/dev/sdb1 contains a ntfs file system labelled 'USB'
Proceed anyway? (y,N) y
fs_types for mke2fs.conf resolution: 'ext4'
Filesystem label=USB
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
954720 inodes, 3815665 blocks
190783 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
117 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Filesystem UUID: 7c797ab9-c784-40f0-993b-91da5f9e5bea
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done   

study@study-VirtualBox:~$ 


포맷에 대한 보다 자세한 내용은 위 링크를 참고하시기 바랍니다.



USB에 볼륨 레이블을 지정하지 않은 경우

이제 백업하기 전에 백업 파일을 저장할, 마운트되어 있는 USB 저장장치의 디렉토리를 확인할 필요가 있습니다.

가장 손쉬운 방법은 마우스로 바탕화면의 USB 아이콘을 클릭하여 노틸러스(우분투 파일 관리자)로 해당 USB를 연 다음  그 창 빈 곳 아무데나 마우스 오른쪽 버튼을 눌러 메뉴 하단의 Open in Terminal을 눌러줍니다. 그러면 터미널에서 해당 USB의 마운트된 디렉토리 경로를 확인할 수 있습니다.

두 번째로는 터미널 명령어로 확인하는 방법입니다. 아래는 그 예시입니다.

버추얼박스 가상머신의 경우 USB가 자동 마운트되는 경우 마운트 위치는 아래와 같습니다.

/media/로그인 계정명/USB(레이블명)


ububtu@ububtu:~$ cd /media/ububtu
ububtu@ububtu:/media/ububtu$ ls
1234A56789B0C12A  VBox_GAs_6.0.10

위를 보시면 아시겠지만 버추얼박스 가상머신에 USB 저장장치를 인식시키면 아래 절대경로 하위에 USB 저장장치가 마운트됨을 확인할 수 있습니다.

/media/부팅 계정명

/media/study(로그인 계정명) 에서 ls 명령어를 입력해주면 현재 마운트되어 있는 장치의 디렉토리명을 확인할 수 있습니다. USB 저장장치에 따로 이름이 설정되어 있지 않으면 디렉토리명은 16자리 영숫자 조합으로 임의로 설정됩니다.

위 예시에서는 해당 USB 디렉토리명이 '1234A56789B0C12A'이고 절대 경로는 '/media/study/1234A56789B0C12A'가 됩니다.

만약 USB 볼륨 레이블이 이미 있다면 해당 이름이 표시 됩니다.


우분투 라이브 부팅 후 USB 마운트

Ubuntu 및 Live 부팅 및 설치 미디어를 통해 라이브 부팅한 경우 USB가 자동 마운트되지는 않습니다.

mount 명령을 사용하여 마운트하거나 노틸러스(파일 관리자)를 실행하여 USB 항목을 클릭해 자동 마운트해주어야 합니다.

노틸러스에서 USB 항목에 마우스를 올리면 Mount and open USB가 뜹니다. 해당 부분을 클릭하면 USB가 자동 마운트되고 노틸러스에서 USB 디렉터리가 보이게 됩니다.

또한 자동 마운트 위치는 '/media/ubuntu/USB 레이블명'입니다. 




2. 리눅스 시스템 전체 백업

리눅스에서의 백업

참고로 리눅스 시스템의 백업은 여러 방법이 있습니다.

첫 번째로 dd 명령어를 통해 디스크를 통째로 백업하는 방법입니다. 이는 가장 확실하되 극단적으로 비효율적인 방법입니다. 특히 백업해야 할 디스크 용량이 클수록 이 비효율성은 크게 다가옵니다. 따라서 대부분의 경우 이 명령어를 사용하지는 않습니다.

두  번째는 tar 명령어를 이용, 단순히 필요한 디렉토리와 파일들을 압축함으로써 이루어집니다. 그리고 복원은 압축한 파일을 다시 푸는 것으로 완료됩니다.

세 번째는 Clonezilla와 같은 전문 백업 도구를 사용하는 것입니다.

Clonezilla는 리눅스 계열 시스템 백업의 끝판왕으로, 가장 효율적이고 고급 기능을 사용할 수 있는 방법입니다.

저는 여기서 tar 명령어를 이용한 압축 백업 방법에 대해 설명하도록 하겠습니다.


리눅스 시스템 백업 기본 명령어

sudo tar cvpzf  /경로/백업 파일명.tar.gz --exclude=백업에서 제외할 디렉토리 /

위의 백업 기본 명령어는 말 그대로 가장 기초적인 백업 명령어 구문입니다. 우리는 이 명령어를 활용하여 리눅스 시스템을 백업합니다.


2-1. 시스템 전체 백업

가장 먼저 최상위 디렉터리인 '/'로 이동합니다. 그후 아래의 명령어를 실행해줍니다.

study@study-VirtualBox:~$ cd /
study@study-VirtualBox:/$ sudo tar cvpzf /media/study/USB/backup_$(date +%m%d).tar.gz --exclude=/proc/* --exclude=/lost+found/* --exclude=/media/* --exclude=/mnt/* --exclude=/sys/* /

위 명령어는 백업의 모든 옵션을 한줄로 늘어 놓은 것입니다. 이것을 보기 편하게 줄바꿈을 사용할 수 있습니다.


sudo tar cvpzf  /media/study/USB/backup_$(date +%m%d).tar.gz \
--exclude=/proc/* \
--exclude=/lost+found/* \
--exclude=/media/* \
--exclude=/mnt/* \
--exclude=/sys/* \
/

터미널에서 줄바꿈하는 방법은 \키(역 슬래시 - 강제 개행)를 친 후 Shift키+Enter키를 누르는 것입니다. 제대로 줄바꿈한다면 아래와 같이 표시될 것입니다.


study@study-VirtualBox:/$ sudo tar cvpzf  /media/study/USB/backup_$(date +%m%d).tar.gz \
>--exclude=/proc/* \
>--exclude=/lost+found/* \
>--exclude=/media/* \
>--exclude=/mnt/* \
>--exclude=/sys/* \
/

위 명령은 백업 파일을 USB에 저장하는 방법입니다. /media/study/USB/ 부분은 USB의 마운트 포인트 디렉터리로 변경해주시면 됩니다.


2-1-1. 백업에 사용된 명령어와 옵션

백업에 사용된 명령어와 옵션을 설명하도록 하겠습니다.


절대경로 : 파일 생성 위치

경로는 /(슬래시)로 시작되며, 만약 경로를 적지 않고 파일명만 적는다면 작업 중인 디렉터리에 백업 파일이 생성됩니다.

$(date +%m%d) : 날짜 문자열

$(date +%m%d)는 파일 이름에 파일 생성 월과 날짜를 시스템의 날짜 정보를 참고하여 추가하는 명령입니다.

예를 들어 작업 날짜가 9월 5일이라면 backup_0905.tar.gz 이런식으로 파일 이름이 정해지는 것입니다.

파일 생성 날짜가 자동으로 생성되므로 백업 파일 관리에 굉장히 유용합니다.

tar.gz : 아카이브 압축 생성 파일 확장자

일반적으로 리눅스 시스템을 백업할 때 위 확장자명을 사용하게 됩니다. 이 확장자가 붙으면 각종 프로그램에서 해당 파일은 압축 파일로 인식하게 됩니다.

tar로 묶고 gzip으로 압축했다는 의미입니다.

\

터미널에서 명령어를 작성할 때 한줄로만 늘어놓게 되면 가독성이 굉장히 떨어지기 때문에 작업의 효율성을 높이기 위해 명령 입력(Enter)을 무시하는 줄바꿈을 사용하게 되는데 이때 사용하는 것이 바로 강제 개행 기호 \(역 슬래시)입니다.

이 강제 개행 기호 \(역 슬래시)를 치고 Shift+Enter키를 입력하면 줄바꿈이 됩니다.

--exclude=경로 : 해당 작업에서 지정 디렉토리 제외

--exclude=경로는 tar 명령 작업에서 지정한 디렉토리를 제외시키는 옵션입니다.

/* : 해당 디렉토리의 모든 내용을 작업에 포함

/*는 작업 시 해당 디렉토리의 모든 내용을 포함한다는 의미입니다.

/ : 디스크 최상위 디렉토리

/는 디스크의 최상위 디렉토리를 의미합니다.

시스템 또는 디스크를 백업하려면 당연히 최상위 디렉토리를 백업해야 하므로 이 / 기호를 사용하여 백업 대상을 지정합니다.

참고로 디스크 또는 시스템 백업은 최상위 디스크에서 작업을 해야 합니다. 따라서 cd /를 입력하여  최상위 디렉토리로 이동 후 백업 작업을 합니다.


2-1-2. 리눅스 시스템 백업시 제외 디렉터리와 파일

study@study-VirtualBox:~$ cd /
study@study-VirtualBox:/$ sudo tar cvpzf backup_$(date +%m%d).tar --exclude=/proc/* --exclude=/lost+found/* --exclude=/media/* --exclude=/mnt/* --exclude=/sys/* /

위 명령에 사용된 제외 디렉토리는 백업 시 대부분의 리눅스 배포판에서 공통으로 제외되어야 할 디렉터리입니다. 여기에  자신의 리눅스에 맞춰 런타임 디렉토리 등도 역시 필수적으로 제외해주어야 합니다. 예를 들어 현재 이 블로그에서 주 연재 기반이 되는 우분투의 경우 /run/* 또한 제외되어야 합니다.


참고로 우분투의 백업 공식 문서에서는 아래 디렉터리들을 제외 대상으로 안내하고 있습니다..

--exclude=/backup.tar.gz \
--exclude=/proc \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/dev \
--exclude=/sys \
--exclude=/run \ 
--exclude=/media \ 
--exclude=/var/log \
--exclude=/var/cache/apt/archives \
--exclude=/home/*/.gvfs \
--exclude=/home/*/.cache \ 
--exclude=/home/*/.local/share/Trash


/proc

현재 메모리상에 존재하는 작업들(프로세스)이 파일 형식으로 존재하는 가상파일 시스템 디렉터리

/tmp

일명 공용 디렉터리로, 시스템 사용 중 생성되는 임시 데이터가 저장되는 디렉터리

/mnt

/media와 유사하게 일시적으로 마운트 포인트로 사용하는 디렉터리

/dev

각종 디바이스 드라이버 디렉터리

/sys

시스템 하드웨어 정보 디렉터리

/run

런타임 데이터 디렉터리

/media

DVD, CD, USB 등과 같이 손쉽게 장착 및 제거할 수 있는 이동식 저장매체의 마운트 포인트 디렉터리

/var/log

시스템 로그 파일이 저장되는 디렉터리

/var/cache/apt/archives

APT를 통해 다운받은 .deb 파일이 저장되는 디렉터리

home/*/{.cache,.gvfs,.local/share/Trash}

이들 디렉터리는 리눅스 사용자별 홈 디렉터리에 생성되는 임시 파일이 저장되는 디렉터리로, 일반적으로 시스템 백업 시 백업 대상에서 제거해도 큰 문제는 없습니다.


제 글을 꼼꼼히 읽으신 분들은 공식 안내서와 제가 안내한 제외 옵션 구문이 다소 차이가 있음을 발견하실 수 있습니다.

우분투 공식 문서에서 안내하는 형식

--exclude=/proc \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/dev \
--exclude=/sys \
--exclude=/run \
--exclude=/media \


블로그에서 안내하는 양식

--exclude=/proc/* \
--exclude=/lost+found/* \
--exclude=/media/* \
--exclude=/mnt/* \
--exclude=/sys/* \

제외 형식이 디렉터리로 끝나면 해당 디렉터리 자체가 백업에서 제외되고 /* 형식으로 끝나면 해당 디렉터리는 남겨지고 그 안에 속한 하위 디렉터리와 파일들만 백업에서 제외됩니다.

만약 /* 형식이 아니라 디렉터리명으로 끝나면 나중에 복원 후 제외되었던 디렉터리를 새로 만들어 주어야 합니다.


2-1-3. 백업 완료

백업이 완료되면 아래와 같이 표시가 됩니다.

tar: 앞서 발생한 오류로 실패 코드를 반환하며 빠져나감
study@study-VirtualBox:~$ 

위처럼 표시되더라도 아무 문제 없습니다. 걱정하지 않으셔도 됩니다.


참고

Tar로 디렉터리 및 파일들을 묶거나 압축 백업 작업을 하다보면 아래와 같은 표시가 뜰 경우가 있습니다.

tar: /tmp/.X11-unix/X1025: 소켓을 무시했습니다
tar: /tmp/.X11-unix/X1024: 소켓을 무시했습니다
tar: /tmp/.X11-unix/X0: 소켓을 무시했습니다

소켓은 네트워크 응용 프로그램과 TCP/IP 등 네트워크 간의 통신 접속점으로 실제로는 아무 내용이 없습니다. 통신 프로그램을 실행하면 새로운 소켓이 생성되므로 굳이 백업할 필요가 없어 무시하는 것입니다.


backup_0808.tar.gz

백업이 완료되면 USB(여기서는 /media/study/USB)에 위와 유사한 형식의 이름을 가진 파일이 생성됩니다.





3. 시스템 복원

리눅스 시스템 복원 기본 명령어

$ sudo tar xvpzf /경로/백업 파일명.tar.gz -C /

위의 전형적인 복원 기본 명령어는 말 그대로 가장 전형적인 복원 명령어 구문입니다. 우리는 이 명령어를 활용하여 리눅스 시스템을 복원합니다.

이 명령은 복원하고자 하는 시스템이 정상적으로 구동이 가능할 때 바로 사용할 수 있습니다.

그러나 때로는 OS가 사전 설치되지 않은 깡통 PC 등에 복원해야 하는 경우도 있습니다. 이럴 땐 시스템이 구동되지 않기 때문에 부팅 USB 등을 사용해야 합니다.

리눅스(우분투) 부팅 USB는 아래 링크에서 소개하는 방법으로 만들 수 있습니다.

이렇게 만든 부팅 USB 디스크로 컴퓨터를 부팅해야 하는데 부팅 방법은 아래 링크를 참고하시기 바랍니다.


3-1. 버추얼박스 가상머신에서 Live CD iso 이미지를 이용해 시스템을 임시로 부팅

여기서는 버추얼박스 가상머신에서 복원 과정을 실습할 것이므로 버추얼박스 가상 머신에서 Live CD iso 이미지를 이용해 시스템을 임시로 부팅하는 과정을 먼저 알아보도록 하겠습니다.


3-1-1. 가상 머신에 USB 인식하기

시스템을 백업한 파일이 담겨 있는 USB를 가상머신에 미리 인식하기 위해 해당 인식 작업을 해주어야 합니다.

인식 작업은 위 링크를 참고하시기 바랍니다.


3-1-2. 버추얼박스 가상머신 저장소에 iso 이미지 등록

버추얼박스 저장 장치(IDE 컨트롤러)에 리눅스(우분투) 라이브 부팅 및 설치(인스톨) ISO 파일을 등록해주어야 합니다.

사용하고자 하는 가상머신 항목 위에 마우스를 올리고 오른쪽 버튼을 눌러줍니다. 그러면 위 그림처럼 가상머신용 메뉴가 뜨는데 여기서 맨 위의 설정 메뉴를 클릭해줍니다.


위 그림의 버추얼박스 가상머신의 저장소 설정 항목에 우분투(만약 다른 리눅스 배포판을 사용한다면 해당 배포판) LIVE 부팅 및 설치 ISO파일을 버추얼박스의 저장소 항목에 등록해줍니다.

사용되는 ISO 파일은 위 링크에서 다운받을 수 있습니다.

위 그림에서 컨트롤러(IDE) 우측의 광디스크 plus 아이콘을 클릭해줍니다.

그러면 바추얼박스의 버전에 따라 버추얼박스 질문창이 뜨기도 하고 바로 광학미디어 선택창이 뜨기도 하는데 질문창이 뜨는 경우는 구버전인 경우입니다.

버추얼박스 질문창이 뜨는 경우 해당 질문창의 내용은 다음과 같습니다.

VirtualBox - 질문

새 광학 드라이브를 IDE 컨트롤러에 추가하려고 하고 있습니다.

드라이브에 삽입할 가상 광 디스크를 선택하거나, 나중에 추가하기 위해서 비워 두시겠습니까?


비워 두기(E) / 디스크 선택하기(C) / 취소

위 질문창에서 디스크 선택하기(C) 버튼을 클릭해줍니다.


광학 디스크 선택기 창에서 사용할 Live CD iso 이미지를 선택하고 선택 버튼을 눌러줍니다.

만약 사용할 우분투 LIVE CD 부팅 및 설치 ISO가 위 그림처럼 이미 등록되어 있으면 해당 ISO를 선택한 다음 선택 버튼을 눌러주시면 됩니다.

만약 등록되어 있지 않다면 창 상단의 추가(A) 아이콘을 눌러 아까 다운받은 우분투 LIVE 부팅 및 설치 ISO 파일을 선택하여 추가해줍니다. 그 다음 앞 문단에서 설명한 절차를 밟아 가상머신 저장소에 등록해줍니다.


제대로 가상머신 저장소에 추가되었다면 위 그림처럼 표시될 겁니다. 그것을 확인하고 확인 버튼을 눌러줍니다.

이제 해당 가상머신의 EFI 사용 여부에 따라 부팅 방식이 달라지게 됩니다. 만약 사용하지 않는다면 복잡한 과정 없이 바로 Live CD로 부팅이 됩니다.

그러나 위 그림처럼 EFI를 설정하여 우분투를 설치했다면 조금 복잡해집니다.

위 그림처럼 확장된 기능 부분의 EFI 사용하기가 체크되어 있다면 Live CD로 부팅하기 위해 몇 단계를 더 거쳐야 합니다.

참고로 EFI 사용하기가 체크되어 있든, 안되어 있든 간에 위 그림처럼 부팅 순서가 광 디스크가 하드 디스크에 앞서도록 설정되어 있어야 합니다. 보통 위 그림의 부팅순서 설정이 기본값이므로 크게 신경쓰실 필요는 없을 겁니다.


가상머신을 실행하면 위와 같은 화면이 뜰 것입니다. 순식간에 넘어가므로 재빨리 ESC 키를 눌러줍니다.


GRUB 부팅 화면이 나옵니다. 여기서 UEFI Firmware Settings 항목을 선택해줍니다.


위 그림처럼 Boot Manager를 선택합니다.


리눅스 OS의 Live 부팅 및 설치 미디어 iso 파일을 가상머신 저장소 항목에 등록했다면 이 단계에서 해당 매체 항목이 존재할 것입니다. 해당 매체 항목을 선택해줍니다.

어떤 것인지 잘 모르겠다면 창 오른쪽의 마지막 소괄호 항목을 확인하시면 됩니다. 아까 우리는 우분투 Live CD 이미지를 가상머신에 광학미디어 프라이머리 마스터 항목에 추가했었습니다.

위 그림처럼 (Primary,Master,0x0)가 표시되는 항목이 해당 매체입니다.


다시 GRUB 부팅 화면으로 돌아옵니다. 이제 메뉴가 좀 늘었군요. 여기서 ubuntu 항목이나 ubuntu(safe graphics) 항목을 선택해줍니다.


디스크 체크 과정을 거칩니다. 건너뛰려면 위 화면에서 안내하는 것처럼 Ctrl+C를 눌러주시면 됩니다.


LIVE 부팅 및 설치 USB나 광학미디어로 부팅하면 위 그림처럼 우분투를 바로 라이브로 부팅할 것인지 아니면 우분투를 설치할 것인지 또는 다른 기능을 사용할 것인지 묻는 선택 항목이 나타날 것입니다.

위 그림 단계에서 언어를 한국어로 설정하고(굳이 그러지 않아도 됩니다.) Ubuntu 체험하기(Try Ubuntu without installing)를 클릭해줍니다.


우분투 Live 부팅이 된 다음 위 그림과 같은 모습을 볼 수 있게 됩니다.





3-2. 시스템 정보 확인

3-2-1. 마운트 정보 확인

ubuntu@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.5G   0% /dev
tmpfs           393M  1.4M  392M   1% /run
/dev/sr0        2.6G  2.6G     0 100% /cdrom
/dev/loop0      2.0G  2.0G     0 100% /rofs
/cow            2.0G  514M  1.5G  27% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M  8.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           2.0G     0  2.0G   0% /tmp
tmpfs           393M   60K  393M   1% /run/user/999
/dev/loop1       28M   28M     0 100% /snap/snapd/7264
/dev/loop2       55M   55M     0 100% /snap/core18/1705
/dev/loop3      241M  241M     0 100% /snap/gnome-3-34-1804/24
/dev/loop4       63M   63M     0 100% /snap/gtk-common-themes/1506
/dev/loop5       50M   50M     0 100% /snap/snap-store/433
ubuntu@ubuntu:~$
기존 리눅스 시스템 주 파티션과 USB가 마운트되어 있지 않음을 확인합니다.


2-2-2하드웨어 장치 정보 확인

ubuntu@ubuntu:~$ sudo fdisk -l
Disk /dev/loop0: 1.93 GiB, 2049204224 bytes, 4002352 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop1: 27.9 MiB, 28405760 bytes, 55480 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop2: 54.97 MiB, 57614336 bytes, 112528 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop3: 240.82 MiB, 252493824 bytes, 493152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop4: 62.9 MiB, 65105920 bytes, 127160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop5: 49.8 MiB, 52203520 bytes, 101960 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sda: 1.102 TiB, 2199022206976 bytes, 4294965248 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8자리 영숫자-4자리 영숫자-4자리 영숫자-4자리 영숫자-12자리 영숫자

Device       Start        End    Sectors  Size Type
/dev/sda1     2048    1050623    1048576  512M EFI System
/dev/sda2  1050624 4294963199 4293912576    2T Linux filesystem


Disk /dev/sdb: 14.57 GiB, 15631122432 bytes, 30529536 sectors
Disk model: Cruzer Edge     
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8자리 영숫자-4자리 영숫자-4자리 영숫자-4자리 영숫자-12자리 영숫자

Device     Start      End  Sectors  Size Type
/dev/sdb1   2048 30527374 30525327 14.6G Microsoft basic data
ubuntu@ubuntu:~$ 

기존 주 파티션과 백업 USB의 장치(Device) 명을 확인합니다.


기존 리눅스 주 파티션 : /dev/sda2

USB : /dev/sdb1


3-3. 주 파티션과 USB 장치 마운트

3-3-1. 기존 리눅스 시스템 마운트 과정

기존 리눅스 시스템 마운트 디렉터리 생성

ubuntu@ubuntu:~$ sudo mkdir /mnt/tmp

기존 리눅스 시스템 마운트

$ sudo mount [옵션] [마운트할 장치명] [마운트 위치]


ubuntu@ubuntu:~$ sudo mount -o rw /dev/sda2 /mnt/tmp

이제 가상머신에서 기존에 사용 중이던 주 파티션을 우분투 LIVE 부팅 시스템에 마운트해주어야 합니다. 아래 명령어를 차례로 실행해줍니다.

위 명령어의 의미를 알아봅시다.

sudo mkdir /mnt/tmp

관리자 권한으로 /mnt/tmp 디렉토리를 생성

sudo mount -o rw /dev/sda2 /mnt/tmp

sudo mount : 관리자 권한으로 마운트 실행

-o rw : 읽고 쓰기 옵션을 추가

마운트 명령에서 사용된 -o rw는 mount 명령의 옵션 설정 항목입니다. -o는 옵션을 추가한다는 의미이고 바로 뒤이어 나오는 rw는 읽고 쓰기(read/write)가 가능하다는 의미입니다. 참고로 ro가 있는데 이것은 읽기 전용(read only)이라는 의미 입니다.

/dev/sda2 /mnt/tmp : /dev/sda2 파티션을 /mnt/tmp에 마운트

/dev/sda2

EFI를 사용하는 시스템의 주 파티션

/dev/sda1

EFI를 사용하는 경우 EFI 부트 파티션

EFI를 사용하지 않는 경우 시스템 주 파티션



3-3-2. USB 마운트 과정

USB 마운트 디렉터리 생성

ubuntu@ubuntu:~$ sudo mkdir /media/USB

USB 마운트

ubuntu@ubuntu:~$ sudo mount /dev/sdb1 /media/ubuntu/USB

USB 내 디렉터리와 파일 정보 확인

ubuntu@ubuntu:~$ ls /media/ubuntu/USB
'System Volume Information'   backup_0808.tar.gz
ubuntu@ubuntu:~$ 


3-4. 마운트 정보 재확인

마운트된 장치 확인

ubuntu@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.5G   0% /dev
tmpfs           393M  1.4M  392M   1% /run
/dev/sr0        2.6G  2.6G     0 100% /cdrom
/dev/loop0      2.0G  2.0G     0 100% /rofs
/cow            2.0G  514M  1.5G  27% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M  8.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           2.0G     0  2.0G   0% /tmp
tmpfs           393M   60K  393M   1% /run/user/999
/dev/loop1       28M   28M     0 100% /snap/snapd/7264
/dev/loop2       55M   55M     0 100% /snap/core18/1705
/dev/loop3      241M  241M     0 100% /snap/gnome-3-34-1804/24
/dev/loop4       63M   63M     0 100% /snap/gtk-common-themes/1506
/dev/loop5       50M   50M     0 100% /snap/snap-store/433
/dev/sda2       2.0T  8.8G  1.9T   1% /mnt/tmp
/dev/sdb1        15G  4.4G  11G  30% /media/ubuntu/USB
ubuntu@ubuntu:~$




3-5. 시스템 복원

3-5-1. 기존 주 파티션 내용 삭제, 포맷

ubuntu@ubuntu:~$ cd /mnt/tmp
ubuntu@ubuntu:/mnt/tmp$ sudo rm -rf *
ubuntu@ubuntu:/mnt/tmp$ ls -a
.    ..
ubuntu@ubuntu:/mnt/tmp$ 
$ sudo rm =rf * 명령은 해당 디렉토리의 내용을 모조리 삭제하는 명령어입니다.당연히 이 명령은 함부로 사용해서는 안 되는 명령입니다.]


3-5-2. 시스템 백업 파일 복원

ubuntu@ubuntu:~$ cd /media/USB ubuntu@ubuntu:/media/USB$ ls 'System Volume Information' backup_0808.tar.gz ubuntu@ubuntu:/media/USB$ sudo tar zxvpf backup0808.tar.gz -C /mnt/tmp

비워진 기존 리눅스 시스템 파티션의 디렉터리에 백업 파일을 풀어줍니다.


3-5-3. 마운트한 장치 언마운트

ubuntu@ubuntu:/media/USB$ cd ~
ubuntu@ubuntu:~$ sudo umount /dev/sda2 /dev/sdb1
ubuntu@ubuntu:~$


이것으로 복원 작업은 마무리되었습니다. 이제 시스템을 종료하고 가상머신을 재부팅하면 시스템이 무사히 복원된 것을 확인할 수 있습니다.