2017년 8월 12일 토요일

Raspberry Pi에서 USB 외장하드를 Root 파일 시스템으로 사용하기

 가지고 있던 아이맥을 SSD로 업그레이드하면서 원래 있던 3.5인치 하드디스크를 외장으로 Raspberry Pi(이하 R Pi)에 연결해서 써보려고 좀 알아보니 USB로 연결된 외장 하드가 Micro SD 카드보다 더 성능이 좋다고 한다. 게다가 Root 파일 시스템으로 외장 하드를 사용하는 게 더 나은 성능을 보인다는 얘기도 있고 해서 내가 가진 R Pi 장비에 적용해 보기로 했다.

준비 작업


 일단 현재 상태는 아래와 같다.
  1. Raspbian이 설치된 Micro SD로 부팅가능한 R Pi 3. (이전 모델도 문제는 없다.)
  2. 외장으로 사용할 3.5" 1 TB Hard Disk.
  3. 외부 전원을 사용하는 3.5" 외장 하드 케이스.
 간단히 설명을 해보면 현재 사용중이던 R Pi의 Root 파일 시스템을 현재 상태 그대로 외장 하드로 옮겨서 외장 하드를 Root 파일 시스템으로 사용하도록 설정 하는 것이다. 이렇게 얘기하면 복잡한 과정이 될 것 같지만 Brennen Bearnes라는 사람이 한 번에 모든 과정을 처리하는 스크립트를 만들어 놓았으니 걱정할 건 없다.

 여기서 주의할 것은 R Pi의 USB로부터 받는 전원이 약해서 외장 하드 케이스는 반드시 외부 전원을 따로 갖추고 있는 놈으로 사용해야 한다. (그렇지 않으면 정말 쓸데없는 고생을 하게 될 수도 있다.)

 그럼 먼저 R Pi의 남는 USB 포트에 외장 하드를 연결하고 전원을 연결하여 R Pi를 부팅하자. USB에 연결된 외장 하드는 다른 디스크 장치가 연결되어 있지 않다면 /dev/sda로 잡힐 것이다. 새로 연결한 디스크 안에 파티션이 몇 개 있다면 /dev/sda1, /dev/sda2로 전에 없던 장치들이 보일 것이므로 아래 명령으로 간단히 디스크 목록을 보고 새로 잡힌 장치가 무엇인지 알아내도록 한다.

 연결 전에는 없던 새로 잡힌 장치가 무엇인지 보면 된다. 리눅스를 어느정도 사용하는 사람이면 새로 잡힌 장치가 무엇인지 여러가지 방법을 알겠지만 대부분 이 정도로 충분하다. 아래 그림은 연결된 장치가 /dev/sda이고 그 안에 /dev/sda1 파티션이 한 개 있는 상태다. 일단은 연결된 장치가 /dev/sda라고 가정하고 계속하겠다.

스크립트 실행


 이제 준비는 끝났다. 터미널로 R Pi에 연결해서 아래 명령으로 GitHub를 통해서 배포하는 스크립트를 받아서 실행하면 된다. 만약 git가 설치되지 않은 상태라면 git 먼저 설치해야 한다. 아래 명령으로 설치한다.
$ sudo apt-get install git
 git가 설치되었으면 아래 명령으로 GitHub에서 스크립트를 받아 실행하도록 한다.
$ git clone https://github.com/adafruit/Adafruit-Pi-ExternalRoot-Helper.git
$ cd Adafruit-Pi-ExternalRoot-Helper
$ sudo ./adafruit-pi-externalroot-helper -d /dev/sda
 위의 마지막 명령으로 스크립트를 실행하면 아래와 같은 메시지들이 뜨면서 화면에 뜨면서 실행 과정을 볼 수 있다. 가끔 묻는 질문에 y를 누르고 진행 시키면 된다.

 스크립트가 출력하는 메시지들을 자세히 살펴보면 어떤 작업을 수행하는 지 대충 알 수 있다. 수행하는 작업을 간단히 정리해보면 아래와 같다.

  1. apt-get으로 disk, rsync, parted 를 설치한다. 작업을 수행하는 데 필요한 프로그램들이다.
  2. 외장 하드에 새로운 파티션을 하나 생성한다. 이전에 있던 데이터는 모두 사라지고 전체 디스크를 사용하는 파티션을 하나 생성(/dev/sda1)하므로 전에 있던 중요 데이터는 모두 백업해두어야 한다.
  3. 새로 생성한 파티션을 /mnt에 마운트하고 루트 파티션의 데이터를 모두 새로 생성한 파티션으로 복사한다.
  4. /etc/fstab 파일을 편집해서 새로 생성된 파티션이 항상 마운트되도록 설정한다.
  5. /boot/cmdline.txt 파일을 편집해서 새로 생성된 파티션이 Root 파티션이 되도록 설정한다.
 스크린에 출력된 마지막 메시지를 읽어보면 reboot를 하라고 되어있다. 자동으로 리부트를 하지는 않으므로 직접 리부팅하도록 한다.

 어떤 변화가 있었는지 자세히 알고 싶다면 /etc/fstab, /boot/cmdline.txt 파일을 열어서 직접 확인해보면 된다. 매우 간단하기도 하고 한 줄 밖에 안되는 수정사항이므로 열어보는 것이 이해하는데 도움이 된다. 

복원


 만약 어떤 문제가 있어서 다시 원래 상태로 돌아가고 싶다면  /etc/fstab, /boot/cmdline.txt을 복원하면 된다. /etc/fstab 파일의 경우 이전에 사용하던 SD 카드의 파티션을 스크립트가 주석처리해 두었으므로 이것을 해제하면 되고 /boot/cmdline.txt 파일의 경우는 이전 파일을 /boot/cmdline.txt.bak 파일로 백업해두었으므로 다시 교체하면 된다. 

마무리

 현재 상태에서 Root 파티션으로 외장 하드를 이용하고 있지만 부팅은 SD 카드를 이용해야 하기 때문에 SD 카드가 없어도 된다는 것은 아니다. 따라서 SD 카드에 있던 이전 Root 파티션은 나중에 있을지 모르는  복원 작업을 위해서 그대로 남겨두던가 아니면 새롭게 포맷해서 다시 마운트하여 사용할 수 있다. 

 SD 카드는 /dev/mmcblk0 장치로 잡혀있고 파티션은 /dev/mmcblk0p1, /dev/mmcblk0p2이다. /dev/mmcblk0p1 파티션은 boot 파티션이므로 건드리면 안되고 /dev/mmcblk0p2이 이전에 사용하던 Root 파티션이므로 이것을 포맷해서 사용할 수 있다. 만일을 대비해서 포맷하지 않고 그대로 마운트해서 사용해도 문제는 없다.

 포맷 및 마운트하는 명령은 아래와 같다. (umount 철자 주의)
# Format
$ sudo mkfs.ext4 /dev/mmcblk0p2

# Mount
$ sudo mount /dev/mmcblk0p2 /mnt

# Unmount
$ sudo umount /mnt

 어차피 SD 카드는 부팅에 필요하기 때문에 항상 꽂아놓고 사용할 것이므로 fstab을 편집해서 항상 mount가 되도록 해두는 게 좋다. 아래 한 줄을 /etc/fstab 파일의 마지막에 추가하여 항상 /sdcard에 마운트가 되도록 할 수 있다.

/dev/mmcblk0p2  /sdcard         ext4    defaults        0       0

0 개의 댓글:

댓글 쓰기