라즈베리파이 OS가 올라간 SD를 백업 & 용량을 줄여보자

이번 포스트에선 라즈베리파이용 OS를 설치한 SD 카드를 백업하고 그 백업파일의 용량을 줄여보도록 하겠다.

준비물:

1. OS가 설치된 SD 카드 & 리더기
2. Win32DiskImager (https://sourceforge.net/projects/win32diskimager/)
3. VirtualBox (https://download.virtualbox.org/virtualbox/6.0.0/VirtualBox-6.0.0-127566-Win.exe)
4. Ubuntu ios 파일 (버전은 상관없으나 18.04 추천, 만약 자신의 pc가 32비트면 16.04로 설치, http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso)

우선 Win32DiskImager를 이용해 설치했던 것처럼 백업을 받아보겠다. 방법은 아주 간단하다.

1) Win32DiskImager를 실행하고 백업할 SD 카드를 선택한다. 여기서 드라이브 레이블이 두가지가 뜨게 되는데, 파일 탐색기에서 드라이 이름이 boot 라고 뜨는 드라이브 레이블을 선택한다.
2) 폴더 버튼을 클릭하여 백업을 받을 경로와 백업 파일의 이름을 입력해준다 (파일 확장자는 .img로 해준다.)
3) Read 버튼을 클릭해여 백업을 받는다.

이렇게 백업을 다 받으면 분명 백업파일의 용량이 백업한 SD 카드와 용량이 비슷할 것이다. (8GB SD카드면 약 8GB 가량의 백업파일, 32GB SD면 약 32GB 가량의 백업 파일이 생성되었을 것이다.)

그런데 분명 우리가 라즈베리파이에서 실제 사용한 용량은 몇 GB에 불과했었는데, 왜 이렇게 큰 용량의 백업이 생성된 것일까?
그것은 Win32DiskImager에서 SD카드의 모든 볼륨의 데이터를 이미지화 시켰기 때문이다. 그러면 용량을 줄일 수는 없을까? (줄일 수 없으면 이 얘기를 꺼내지도 않았을 것이다 ㅋ)

백업 파일의 용량을 줄이기 위해선 리눅스가 설치된 PC가 필요하다.
그렇기 때문에 리눅스가 설치된 PC가 있으면 좋지만, 한국에서는 윈도우를 많이 쓰는 편이라 리눅스를 사용하는 일반인은 많지 않을 것이다. 그래서 우리는 VirtualBox로 가상머신을 돌려 리눅스를 윈도우 위에서 가상으로 사용할 것이다. (VirtualBox에 리눅스를 설치하는 과정은 실제 윈도우에 영향을 주지 않으니 윈도우가 날라갈 걱정은 할 필요가 없다)

VirtualBox에 Ubuntu를 설치하는 방법은 다른 페이지를 참고했으면 한다 (만약 Ubuntu 버전이 다르더라도 설치방법은 같다.)
그리고 호스트 PC와 가상머신이 파일을 쉽게 주고 받을 수 있게 공유 폴더도 설정하기 바란다. (이것도 다른 페이지 참고)

버추얼박스(VirtualBox) 우분투 설치하는 방법
https://extrememanual.net/7223

버추얼박스(VirtualBox) 공유폴더 사용하기 Host-Windows, Guest-Ubuntu(Linux)
http://noota.tistory.com/entry/%EB%B2%84%EC%B6%94%EC%96%BC%EB%B0%95%EC%8A%A4VirtualBox-%EA%B3%B5%EC%9C%A0%ED%8F%B4%EB%8D%94-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-HostWindows-GuestUbuntuLinux

리눅스 PC는 라즈베리파이 개발에 있어서 땔래야 땔 수 없는 존재이다. 만약 이번 기회로 처음 리눅스를 써보게 되는 것이라면, 삭제하지 말고 기본적인 명령어 정도는 익혀놔야 나중에 편할 것이다 (TMI.)

우선 공유 폴더를 통해서 백업파일을 가상머신으로 넘겨준다.

1) 우선 "ls -al 백업파일.img"를 입력하여 백업파일의 크기를 확인하자. 필자는 8GB SD카드를 사용했기 때문에 백업파일도 약 8GB이다.

2) 백업파일의 내부를 확인하기 위해 "sudo fdisk -l 백업파일.img"를 입력합니다. 여기서 우리가 봐야할 부분은 "백업파일.img2"의 Start 섹터이다. 이것을 따로 적어둔다 (필자의 경우 98304를 적어두면 되는 것이다.)

3) "sudo losetup /dev/loop0 백업파일.img -o $((적어둔_Start섹터*512))"를 입력하여 리눅스 파티션을 루프백 디바이스 마운트한다.

4) 만약 자신의 우분투에 Gparted가 설치되어있지 않다면 위 명령을 입력하여 설치한다.

sudo apt update
sudo apt install gparted

5) 이제 마운트한 루프백 디바이스의 파티션을 조정하기 위해 위 명령을 입력하여 Gparted를 실행한다.

sudo gparted /dev/loop0

6) /dev/loop0를 클릭하고 상단 메뉴에서 "Partition - Resize/Move"를 클릭한다.

7) 그러면 창이 하나 뜨는데, 여기서 /dev/loop0의 최대 크기와 줄일 수 있는 최소 크기를 확인 할 수 있.


8) 이제 /dev/loop0의 필요 없는 공간을 없애주기 위해 새로운 크기를 설정해주어야한다. 새로운 크기에 확인한 최소 크기를 입력하여도 되지만 혹시 모를 상황에 대비해 여유공간으로 200MB정도 더해서 입력하고 Resize 버튼을 클릭한다.

9) /dev/loop0를 클릭하고 상단 메뉴에서 "Edit - Apply All Operations"를 클릭한다.

10) 작업을 실행하면서 뜬 팝업을 닫지 말고 메뉴를 확장해서(세모모양) "resize2fs -p /dev/loop0 1392640K"에서 1392640K 부분을 따로 적어 둔다 (최종 파티션의 크기이다.) 적어두었다면 close를 클릭해 Gparted를 종류한다.

11) 이제 루프백 디바이스(백업파일의 리눅스 파티션)을 언마운트 하고, 이번에는 백업파일 전체를 마운트한다.

sudo losetup -d /dev/loop0
sudo losetup /dev/loop0 백업파일.img

12) fdisk를 실행하여 다음과 같이 옵션에 입력한다.

sudo fdisk /dev/loop0  (이게 fdisk 실행)

Command (m for help): d    ---------------------- (파티션 제거)
Partition number (1,2, default 2): 2

Command (m for help): n  ------------------------ (파티션 생성)
Partition number (2-4, default 2048): 2
First sector (2048-15523839, default 2048): 98304  ----------------- (백업파일 안에 리눅스 파티션의 Start 섹터, 필자의 경우 98304)
Last sector, +sectors or +size{K, M, G, T, P} (98304-15523839, default 15523839): +1392640K ----- (10에서 적어둔 최종 파티션의 크기, 필자의 경우 1392640K, 주의할 점은 +와 K를 꼭 빼먹지 말고 대소문자 구분하여 입력해야한다.)

Command (m for help): w  ------- (fdisk 종료)

13) "sudo fdisk -al /dev/loop0"를 입력하여 /dev/loop0의 섹터 값을 확인 하고 리눅스 파티션의 End 섹터 값을 따로 적어둔다 (필자의 경우 2883583이다.)

14) 루프백 마운트를 해제하고 truncate 명령으로 13에서 적어둔 End 섹터를 기준으로 백업파일을 자른다.

sudo losetup -d /dev/loop0
truncate -s $(((End_섹터값+1)*512)) 백업파일.img  ---- (필자의 경우 End_섹터값에 2883583을 입력하면 된다.)

15) "ls -al 백업파일.img"을 입력하여 백업파일의 크기를 다시 확인해보면 파일 크기가 줄어들었다는 것을 알 수 있다.