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 를 확인해봐도 된다.

죽어도 마운트가 되지 않는다면?

** Openwrt 를 판올림 한 뒤, /etc/config/fstab 을 수정해도 /overlay 로 마운트 되지 않을 때가 있다. 공식 문서의 Trouble Shooting 을 참고하면 오류를 해결할 수 있다.

과정은 생략, 결론만 옮겨보면, 외부 디스크의 루트와 etc 에 있는 .extroot-uuid 를 지워야만 한다.

mount /dev/sda1 /mnt
rm -f /mnt/.extroot-uuid /mnt/etc/.extroot-uuid
umount /mnt

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 에 문제가 생겼을 경우 부팅이 되지 않는다.

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

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

아무도안아무도안
Author: 아무도안

2 thoughts on “Openwrt : Extroot; 외부 드라이브를 root 화.

  1. 안녕하세요, OpenWrt 초기화 내용을 찾던 중 들르게 되었습니다.
    지금 공유기를 사용하지 못하는 상황에 처해있는데 의견주신다면 감사하겠습니다.

    공유기 모델은 ipTIME의 A1004ns 모델이고 OpenWrt 펌웨어와 Luci를 설치해서 인터넷이 잘 되었습니다. DNS 서버를 설정하고 리부팅했는데 그 이후부터 인터넷이 안되었고 CLI만 접속 가능한 상태가 되었습니다.

    다시 Luci를 설치하려 했지만 인터넷이 안돼서 불가능했고 Failsafe 모드로 들어가서 공장초기화를 하려고 했는데 다음과 같은 메시지가 나왔습니다.

    root@(none):~# firstboot
    This will erase all settings and remove any installed packages. Are you sure? [N/y]
    y
    MTD partition ‘rootfs_data’ not found
    root@(none):~#

    혹시 무슨 문제인지 알 수 있을까요? OpenWrt 가이드에서 공장 초기화에 대한 내용은 있는데 위와 같이 MTD partition에 대한 내용은 못찾아서요.

    초기화만 할 수 있어도 처음부터 단계를 진행하면 되는데 그게 안돼서 멘붕입니다;

    답변 주신다면 대단히 고맙겠습니다.

    1. 죄송합니다. 제가 알고 있는 openwrt 에 대한 지식은 여기에 써 있는게 다입니다.
      필요하신 사항은 아마도, openwrt 홈페이지를 자세히 살펴보시면 나오리라 생각합니다만.

      DNS 작업을 하셨다고 하셨는데, /etc/config/dhcp, /etc/config/network 등을 살펴보시면 혹시 해법이 보일 지도 모르겠군요.

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