Openwrt : Extroot; 외부 드라이브를 root 화.

한정된 공유기의 Flash 공간을, USB 포트등을 이용해서 외부 드라이브로 확장시켜 줄 수가 있다. 헌데.. 일장일단이 있기에 주의가 필요하다.

Openwrt 를 쓰면서 느낀 건데, 문서화가 꽤 잘되어 있어서 어려운 점이 별로 없다. 방법도 CLI 로 하는 법, Luci 로 하는 법등등이 모두 나와 있는 경우가 많아서 입맛대로 고를 수도 있다. 다만! ArchLinux 문서처럼 자세하지는 않고, ‘왜?’ 에 대한 의문은 빠진 경우가 많다.

하나 하나 알아가는 수밖에.

이 글은 Openwrt Document: Extroot configuration 를 내 지식 선에서 정리했다.


기기 별로 대동소이하겠지만, OpenWrt 는 다음과 같이 읽기만 하는 rootfs 파티션과, 쓰기가 가능한 rootfs_data 파티션을 제공한다.
이 중 rootfs_data 파티션은 /overlay 에 마운트되어 있고, 여기 디렉토리가 / 로 Bind 드 되어 있는 듯 하다. (이 부분에 대한 확실한 설명은 찾질 못했다.)

이게 무슨 말이냐 하면, /etc 디렉토리는 사실 /overlay/upper/etc 인데, 왜 이렇게 설정이 되었는지에 대한 정보가 아직 내 눈에 보이진 않는다.
일반 리눅스라면 /etc/fstab 에 저런 정보가 있어서 한 눈에 쉽게 알 수 있는데, 여기는.. 아직 잘 모르겠다.

아무튼, /overlay 영역은 내부 저장장치로 마운트 되어 있는데, 이걸 외부 저장장치로 바꿔서 좀 더 광활한 환경을 만들어 쾌적하게 쓰고 싶다! 이게 이 글의 골자가 되겠다.

헌데, 여기서 문제가 생길 수도 있다. 외부 장치가 뭐든, 고장나거나 일시 불능 상태가 될 가능성이 있다. SD 카드라면 더더욱 그럴 수 있고, SSD 라도 확률은 떨어지지만 마찬가지다.
이런 불행한 사태에 직면했을 때, 그래도 공유기는 제 역할을 다 해야 하므로, 그럴 수 있게끔 설정을 해야 한다.
즉, 외부 SD 카드로 루트를 변경했는데, 카드가 고장나서 당장 카드를 빼고 공유기를 재부팅해야만 할 상황이 생겼다. 그랬는데 기껏 해놨던 설정이 모두 날아가버렸다면..
집에서 쓰는 공유기라도 이런 일이 벌어진다면 몇년간 묵혀놨던 짜증이 발끝에서부터 밀려오게 된다.
하물며 업무용이라면..???

그리하여 첫번째.
기본 설정은 모두 끝내놓은 상태에서 다음 작업을 진행한다.
기본 설정이라함은, DHCP, DNS, 네트웍, VPN 등등을 말한다. 즉, 루트가 확장된 뒤에 추가할 기능은, 있으면 편하고, 없어도 그런대로 쓸 수 있을 정도에 머물러야만 뒤 탈이 없다.

두번째는, 네트웍을 통해 확장된 루트의 파일들을 보관해놓아야 한다. 가능하면 UUID 까지. 그래야 사고가 생기더라도 유연하게 새 제품으로 바꿔칠 수가 있다. (UUID 는 tune2fs 로 변경해줄 수 있으므로, 새 드라이브의 파일 시스템을 만들고 예전 UUID 를 사용하도록 바꿔줄 수가 있다. 이러면 OpenWrt 기기에 삽입했을 때 달리 해줄 일이 없게 된다.)

자! 이제 본격 시작.


8MB 이상 플래시 메모리를 가진 기기를 전제로, 필수 프로그램 설치

opkg update && opkg install block-mount kmod-fs-ext4 kmod-usb-storage kmod-usb-ohci kmod-usb-uhci

ext4 가 아닌 다른 파일시스템도 사용할 수는 있는데, 그냥 일단은 ext4 로 하기로 한다.
위에서도 언급했지만, 다른 기본 설치는 모두 끝났고, 현재 공유기가 다른 손볼 데 없이 잘 돌아가고 있다는 전제가 우선되어야만 한다.

rootfs_data 파티션 찾아내고, 다른 위치로 마운트.

먼저, 현재 /overlay 가 어느 장치로부터 마운트되었는지 알아내야 한다.
여러가지 방법이 있는데, 편한대로 골라잡으면 된다.

cat /etc/mtab
cat /proc/mtd
lsblk
mount

내 경우는 /dev/mtdblock11 에 overlay 가 자리잡고 있었다.

찾아냈으면 이제 이 장치를 다른 디렉토리에 마운트한다. 다른 디렉토리로 바꾸는 이유는, /overlay 에 새 장치를 넣어줘야 하기 때문이다.

uci 를 사용하진 않고, 그냥 /etc/config/fstab 파일을 편집하는 방법을 택했다.

config mount 'rwm'
	option target '/rwm'
	option device '/dev/mtdblock11'

이제 /etc/config/fstab 은, /rwm/upper/etc/config/fstab 이 된다. 그래서, 새로 추가할 /overlay 용 장치를 변경하거나 중지하려면 여기를 건드려야 한다고 하는데.. 이게 확 와닿질 않는다. 왜 이 파일을 건드려야 하나..? (아무튼 일단은 넘어가고.)

새로 추가할 디스크의 uuid 찾아내기.

여기도 여러 방법이 있는데, Openwrt 문서에선 block info 를 추천했다.
디스크는 이미 다른 PC 에서 Ext4 로 포맷된 상태라는 전제가 깔려있다.

block info
/dev/mtdblock2: UUID="9fd43c61-c3f2c38f-13440ce7-53f0d42d" VERSION="4.0" MOUNT="/rom" TYPE="squashfs"
/dev/mtdblock3: MOUNT="/overlay" TYPE="jffs2"
/dev/sda1: UUID="fdacc9f1-0e0e-45ab-acee-9cb9cc8d7d49" VERSION="1.4" TYPE="ext4"

여기에 보이는 /dev/sda1 과, 그에 따른 UUID 가 다음 작업에 필요한 요소들이다.
이제 이 파티션을 /overlay 에 새롭게 마운트 시켜준다. 역시 /etc/config/fstab 에 추가한다.

config mount
	option target '/overlay'
	option uuid 'fdacc9f1-0e0e-45ab-acee-9cb9cc8d7d49'
	option enabled '1'

option enabled ‘1’ 이 반드시 필요한지 아닌지는 잘 모르겠다. 넣지 않고 재부팅해서 제대로 작동하지 않으면 넣어본다.

새 시스템에 이전 파일 복사

마지막으로, 이 새 파일시스템에 현재 /overlay 를 동일하게 복사해줘야 한다.

mount /dev/sda1 /mnt
cp -a -f /overlay/. /mnt
umount /mnt

대망의 reboot 만 남았다.

확인?

역시 여러가지 방법이 있지만, mount, df /overlay 등을 쓸 수도 있고, Luci – System – Mount Points 를 확인해봐도 된다.

opkg 상태 디스크에 저장

기기가 재부팅되면 opkg install 을 바로 할 수가 없고, 매번 opkg update 를 먼저 해줘야 한다. 이건 이 정보가 /var/opkg-lists 에 저장되는데, 이 위치가 디스크가 아닌 램이어서 재부팅하면 날아가기 때문이다.
이 위치를 디스크 영역을 바꿔주면 이런 수고가 줄어든다.

Luci(System – Software – Configuration) 에서 해도 되고, /etc/opkg.conf 를 직접 편집해도 된다.

원래 값 : lists_dir ext /var/opkg-lists
바꿀 값 : lists_dir ext /usr/lib/opkg/lists

작업이 끝나면 opkg update 를 실행하고, /usr/lib/opkg/lists 가 생성되었는지 확인한다.

스왑 파일?

Ext4 파일 시스템에는 스왑파일을 만들어서 스왑파티션처럼 쓸 수도 있다. 당장 필요하진 않아서 아직 시도해보지 않았다.

USB 디스크 이상 시..?

만약 USB 디스크에 문제가 생겨서 Extroot 를 사용하지 못하게 된다하더라도(예를 들어, 디스크를 기기에서 뺀 후 시동), 기존 Flash 파일시스템을 사용해서 부팅이 가능하고, 기본 설정해 놓은 환경도 모두 제대로 유지된다.
왜 이게 가능한지 잘 이해가 안된다. /etc/config/fstab 은 틀림없이 새 디스크를 사용하게끔 설정을 해놨는데.. 일반 리눅스라면 fstab 에 문제가 생겼을 경우 부팅이 되지 않는다.

이 부분에 대해선 좀 더 공부가 필요하겠다.

아무튼, 이걸로 큰 산을 또 하나 넘었네.

안녕하세요. 글 남겨주셔서 고맙습니다.