Openwrt : 최신 펌웨어 설치 및 설치 후 해야할 일들

내려받기

Luci 로 하든, CLI 로 하든 bin 파일은 필요하다.
내려받기, 검증, 설치에 대한 모든 사항은 Openwrt 문서에 잘 정리돼 있으나, 여기엔 중요사항만 뽑아놨다.

파일은 Openwrt Releases 모두 올라와있다. 현재 내게 필요한 파일은 판본/targets/ipq40xx 밑에 있다.

bin 파일을 내려 받고, 검증한다. 검증 방법이 다소 복잡하게 나와있는데, 너무 자동화(?)에 집착한게 아닌가 생각해서, 그냥 편하게 ‘눈’으로 할 수 있는 방법을 택했다.

  • https://downloads.openwrt.org/releases/판본/targets/기종명/generic/ 으로 이동하여 원하는 sysupgrade.bin 파일을 받는다. 이때, 반드시 /tmp 로 받아야 한다고 한다.
  • 옆의 sha256 hash 코드를 확인한다.
  • 받은 파일의 sha256 코드를 확인한다. sha256sum openwrt...bin
  • 두 코드 동일여부를 확인한다.

Openwrt 문서에는 반드시 /tmp 로 받은 뒤 진행해야 한다고 하는데, 난 그냥 일반 디렉토리를 이용했는데도 19.07.4, 19.07.5 모두 별 문제가 없었다. 허나, 앞으론 시키는 대로 해야겠네.

판올림

CLI 로 sysupgrade 를 실행해도 되고, Luci 로 해도 된다.

Luci:
Luci 로 하려면 내 기종에 맞는 펌웨어 파일(*.bin)을 미리 받아놓은 뒤, System – Backup/Flash Firmware 로 이동한 뒤 Flash new firmware image 로 진행하면 된다.

CLI:
CLI 도 미리 파일을 받은 뒤 명령을 내려준다.

sysupgrade -v <파일명.bin>

그런데, ssh 로 연결한 CLI 로 하면 sysupgrade 명령을 내리는 순간 ssh 연결이 끊어진다. (당연한 이치지만) 따라서, 진행이 되는지 아닌지 잔뜩 불안에 떨며 새까만 화면을 멍하니 지켜봐야 한다. Luci 로 해도 연결이 끊어지기는 마찬가지지만, 적어도 그게 눈에 잘 보이지는 않으므로..

아무튼, 어떤 방법을 사용해도 된다.

Extroot 를 하지 않았다면, 딱히 더 신경쓸 일은 없다.
그러나, Extroot 를 사용 중이라면, 다음 작업들을 반드시 해줘야 한다.

Dropbear 사용

Extroot 를 사용하면서, openssh 를 활성화해놨다면, 판올림 직후엔 openssh 를 사용할 수가 없다. 따라서 아래 두가지 작업들은 모두 Dropbear 로 해줘야 한다.
Dropbear 를 Disable 해놨다하더라도 펌웨어 판올림 후엔 자동으로 켜져있으니 그냥 접속하면 된다.

USB 드라이브를 사용하기 위한 프로그램 설치.

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

이 작업을 하지 않으면, 당연히 USB 드라이브 마운트가 되지 않는다.
lsblk 는 꼭 필요하진 않지만, 바로 아래 작업(USB Drive 를 찾기 위해. /dev/sda1 인지 혹 다르게 설정되어 있는지.)을 위해 필요하므로 설치하는 편이 좋다.
설치 후 재부팅한다.

.extroot 파일 지우기

Openwrt 문서에 나와 있는대로, 파일 하나(또는 2개)를 지워준다.

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

작업 후 재부팅.
이제, 예전처럼 외부 디스크가 / 로 잡히게 된다. mount 등으로 확인한다.

이제 openssh 를 쓸 수 있게 된다.


opkg 관련 설정 파일 수정

opkg.conf

opkg update 파일을 저장할 목적으로 /etc/opkg.conf 를 편집했다면, 그 부분도 확인한다.

dest root /
dest ram /tmp
#lists_dir ext /var/opkg-lists
lists_dir ext /usr/lib/opkg/lists
option overlay_root /overlay
option check_signature

주석처리된 부분이 원래 설정이고, /usr/lib/opkg/lists 쪽이 바꾼 설정이다.

distfeeds.conf 수정

이 파일은 우분투의 sources.list 와 같은 역할을 한다.
판올림이 되었으므로, 이것도 바꿔줘야 하는데, 외장으로 쓰던 디스크에는 이전 내용이 들어가 있으므로, 마찬가지로 새 내용으로 갱신해줘야 한다.

최신 설정은 /rom/etc/opkg 산하에 있다. 이 디렉토리를 통째로 /etc/opkg 로 복사해주면 된다.

커널 ipk 설치

아래 꽃삽질 내용 중에 장황하게 나와있는데, 커널 자체는 시스템 영역에 설치되어 있으므로 최신 커널이 알아서 잘 작동하게 되지만, ‘커널 등록 정보’는 USB 드라이브에 저장되어 있어, 구판을 쓰고 있는 효과가 나타난다. 이를 방지하기 위해, 커널용 ipk 파일을 수동으로 받고 설치해준다.

커널 파일은 openwrt 홈페이지에서 받을 수 있다. 현 시점에선 19.07.5 이지만, 판올림을 하면 달라지므로, 알아서 잘 찾아 받아야 한다.

받은 후, 아래와 같이 설치.

opkg install kernel_4.14.209-1-fa00c1231ac7d7840ec6ffe62dcad926_arm_cortex-a7_neon-vfpv4.ipk

꾸러미 판올림

위 작업이 모두 끝났으면, 이제야 비로소 꾸러미 판올림을 할 수 있게 된다.
제목이 꾸러미 판올림이긴 한데, 이 작업을 해줘야 USB Drive 에 설치돼 있는 이전 꾸러미들이 최신판으로 바뀌게 된다.

무슨 말인고 하니..
시스템 판올림으로 공유기 내부 메모리에 있는 꾸러미들은 모두 최신판이 되었다. 허나, Extroot 를 통해 그 꾸러미들을 외부 메모리로 옮겨서 사용 중이었기 때문에, 이 외부에 있는 꾸러미들도 최신판으로 바꿔줄 필요가 있다.
처음 Extroot 를 만들 때처럼 그냥 일괄 복사를 해줘도 되긴 하지만, 그냥 opkg 로 진행해도 무리는 없어 보인다.

아무튼, 이 작업을 하지 않으면 신/구 꾸러미가 섞이게 되므로, 반드시 하는 편이 좋다.

또, 위에 있는 대로 커널 설치를 먼저 따로 해주지 않으면, 아래 꽃삽질기에 있는 것처럼 의존성 문제가 발발(?)하게 된다.
따라서 위에서처럼 반드시 커널 꾸러미를 다시 설치해주고 아래 작업을 진행해야만 한다.

rm -f /usr/lib/opkg/lists/*
opkg update
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade

이 정도면 안전하게 판올림이 가능하리라 생각하는데..
다음에 한번 더 해보고, 보완할 부분이 있는지 확인하기로!


아래는 멋모르고 그냥 박치기해본 분투기이다.
저런 넘어짐과 깨짐이 있었기에 위와 같이 깔끔한 정리가 가능하지 않았겠는가.. ㅎㅎ

하여, 그냥 냅두기로 한다.


.. 이 붙은 이유는, 아직 이 작업에 익숙하지 않기 때문이다. 딱 한번 해봤고, 반나절 정도 뒷수습이 필요했다.

과거를 보니 대략 3~4개월만에 새 판이 나오는 모양인데, 이번이 첫경험(오오오~)이어서 얼렁뚱땅 넘어간 모양새가 됐다.
다음을 위하여, 나름대로 논리정연(?)하게 정리해보도록 한다.


미리해두면 조금은 도움이 될 수도?

꼭 필요할 듯 하지는 않지만, 판올림 전에, 설치되어 있는 프로그램들 목록을 뽑아놓으면 좀 쓸 데가 있지 않을까..

opkg list-installed > program_list
....

글쎄?

판올림

CLI 로 sysupgrade 를 실행해도 되고, Luci 로 해도 된다. Luci 로 하려면 내 기종에 맞는 펌웨어 파일(*.bin)을 받은 후, System – Backup/Flash Firmware 로 이동한 뒤 Flash new firmware image 로 진행하면 된다.

CLI 라면, 마찬가지로 파일을 받은 뒤 (아마도) sysupgrade xxx.bin 으로 가능할 듯 하다. 다음에는 이 방식으로 해봐야겠다.

설정?

설정파일은 그대로 유지된다. 즉, /upper 쪽은 바뀜이 없고, /rom 에만 새 파일이 설치된다.

이 얘기는, 설정파일도 그대로 남아있고, 따로 설치한 프로그램들도 구판이 그대로 있다는 뜻이 된다. 추가 설치한 프로그램들이 전혀 없다면 지금 이대로도 전혀 문제될게 없지만, 이것저것 탐욕스럽게(??) 갖다 붙여놓은 경우라면, 신경써줘야 할 게 꽤 많다.

특히나 외부 디스크를 마운트 시켜놓은 경우라면 더더욱!!
따라서, 이 글에선 USB 디스크로 /overlay 가 할당되어 있는 상황이라는 설정을 기준으로 한다.

외부 디스크 /overlay 로 할당

이미 이 방식으로 사용 중이라면, 펌웨어 판올림을 한 이후에 이 작업을 ‘즉각’ 해줘야 뒤 탈이 없다.

사실, /upper 는 바뀌지 않으므로 /etc/config/fstab, 즉 /upper/etc/config/fstab 도 그대로 있고, 펌웨어가 바뀌었더라도 저 설정은 그대로 유지가 된다.

그러나, 모종의 이유로 이전 설정이 그대로 유지되질 않는다.
이 내용이 Openwrt 문서에 나와 있는데, 파일 하나(또는 2개)를 지워야만 한다고 한다.

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

내 경우엔, /etc/.extroot-uuid 만 있었고, 이 파일을 지워주니 바로 제대로 인식이 됐다. 물론 reboot 은 필수.

커널 확인

이 글을 쓰는 시점에서 최신 커널은 4.14.195 이다. uname -r 로 확인 가능하다.

 uname -r
4.14.195

그런데.. 살짝 이상한 현상이 있다.
기존에 사용하던 외부 디스크를 /overlay 로 마운트하여 생긴 문제로 보이지만, okpg 에서 보이는 커널은 이전 판 그대로다.

opkg list-installed | grep kernel
kernel - 4.14.180-1-fa00c1231ac7d7840ec6ffe62dcad926

흠?
uname -r 이나, luci 에서 봐도 커널이 4.19 임은 확실한데, 어쩐 일인지 opkg 에서만은 이전 판으로 표시가 된다.
물론, 이건 기존 외부 디스크를 사용했을 때고, 펌웨어가 직접 올라간 내부 저장장치를 사용하게끔 설정하고 확인하면 최신판(4.19)로 나온다.

opkg 로 ‘kernel’ 을 강제 설치해보려 했지만, 그런 꾸러미가 없다는 오류만 나올 뿐.

pkg install kernel --force-reinstall
Removing package kernel from root...
Installing kernel (4.14.180-1-fa00c1231ac7d7840ec6ffe62dcad926) to root...
Collected errors:
 * opkg_download_pkg: Package kernel is not available from any configured src.
 * opkg_install_pkg: Failed to download kernel. Perhaps you need to run 'opkg update'?
 * opkg_install_cmd: Cannot install package kernel.

게다가 여전히 구판 커널(180)을 설치하려 하고 있다.

?? 해결책은 ??

https://downloads.openwrt.org/releases/19.07.4/targets/ipq40xx/generic/packages/ 로 이동하여, kernel.ipk 를 직접 받은 뒤 opkg 로 수동 설치해줬다.

opkg install kernel_4.14.195-1-fa00c1231ac7d7840ec6ffe62dcad926_arm_cortex-a7_neon-vfpv4.ipk

opkg list-installed | grep kernel
kernel - 4.14.195-1-fa00c1231ac7d7840ec6ffe62dcad926

원래 외장 디스크를 사용하려 할 때는 원본 /overlay 디렉토리를 외장 디스크로 복사해줘야 하는데, 사용하던 디스크라 이 작업을 생략했더니 이런 현상이 나타나는 모양이다.

사실 kernel_4.14.195…ipk 파일은 커널이 아니고, 그냥 정보만 담고 있는 일종의 가짜(Dummy) 파일로 보인다. 따라서 저 정보가 원 /overlay 어디에 저장되어 있는지만 알면 그걸 그대로 복사해줘도 될텐데.. 확실한 내용을 찾지는 못했다.

다만! /usr/lib/opkg/status 에 이런 내용이 있었다.

Package: kernel
Version: 4.14.195-1-fa00c1231ac7d7840ec6ffe62dcad926
Depends: libc
Status: install user installed
Architecture: arm_cortex-a7_neon-vfpv4
Installed-Time: 1606568371

Package: kernel
Version: 4.14.180-1-fa00c1231ac7d7840ec6ffe62dcad926
Depends: libc
Status: install user not-installed
Architecture: arm_cortex-a7_neon-vfpv4
Installed-Time: 1589653940
Auto-Installed: yes

Installed_Time 은 Epoch Time 인데, 확인해보니 내가 조금 전에 설치한 시간이 맞았다.

펌웨어가 설치한 (즉, /rwm/upper/usr/lib/opkg/status) 내용은 다음과 같았다.

Package: kernel
Version: 4.14.195-1-fa00c1231ac7d7840ec6ffe62dcad926
Depends: libc
Status: install user installed
Architecture: arm_cortex-a7_neon-vfpv4
Installed-Time: 1599409179
Auto-Installed: yes

이 Epoch 시간은, 다른 꾸러미들이 설치된 시간과 같았다.
따라서, 이 부분만 외부 디스크의 /usr/lib/opkg/status 로 옮겨줘도 될 듯은 한데…

선택은 다음 판에서!

이전 프로그램 판올림/재설치

이전에 설치한 프로그램들 역시 그대로 남아있긴 하다. 헌데, 아무튼 뭔가 제대로 돌아가지 않는 상황이 됐다. 이를 위해서 opkg 로 판올림 또는 재설치를 해줄 필요가 있다.

일단, opkg 저장소 확인을 해야 한다.
먼저 볼 파일은 /etc/opkg.conf

저장소 목록 파일 위치를 바꿔줬다면, 이 파일을 새로 생성해야할 필요가 있다. 아예 /usr/lib/opkg/lists 아래 모든 파일을 지우고, 새롭게 opkg 목록을 받아온다.

rm -f /usr/lib/opkg/lists/*

다음으로, 저장소 목록을 살펴본다. 이 내용은 /etc/opkg/distfeeds.conf 에 저장되어 있다.

19.07.4 현재 기본값은 다음과 같다.

src/gz openwrt_core http://downloads.openwrt.org/releases/19.07.4/targets/ipq40xx/generic/packages
src/gz openwrt_base http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/base
src/gz openwrt_luci http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/luci
src/gz openwrt_packages http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/packages
src/gz openwrt_routing http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/routing
src/gz openwrt_telephony http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/telephony

그런데.. 이전 판, 즉 19.07.3 일 때 설정과 한군데가 달랐다.

src/gz openwrt_core http://downloads.openwrt.org/releases/19.07.3/targets/ipq40xx/generic/packages
src/gz openwrt_kmods http://downloads.openwrt.org/releases/19.07.3/targets/ipq40xx/generic/kmods/4.14.180-1-fa00c1231ac7d7840ec6ffe62dcad926
src/gz openwrt_base http://downloads.openwrt.org/releases/19.07.3/packages/arm_cortex-a7_neon-vfpv4/base
src/gz openwrt_luci http://downloads.openwrt.org/releases/19.07.3/packages/arm_cortex-a7_neon-vfpv4/luci
src/gz openwrt_packages http://downloads.openwrt.org/releases/19.07.3/packages/arm_cortex-a7_neon-vfpv4/packages
src/gz openwrt_routing http://downloads.openwrt.org/releases/19.07.3/packages/arm_cortex-a7_neon-vfpv4/routing
src/gz openwrt_telephony http://downloads.openwrt.org/releases/19.07.3/packages/arm_cortex-a7_neon-vfpv4/telephony

그 딱 한군데는 커널 모듈에 관련된 내용인데.. 19.07.3 때 내가 임의로 저걸 추가한 건지, 아니면 원래 저리 돼 있었는지는 알 수가 없다. (기록이 안돼 있으니 아마도 기본으로 있었던 듯 한데..?)

19.07.4 에서, 커널 모듈 관련 프로그램들을 설치하려다 보니 오류가 발생했다. 저 저장소가 없어서 그런건지 아닌지는 확실하지 않지만.. 아무튼 그래도 뭔가 미심쩍어서 추가해줬다.

다만, 저 두 저장소에 올라와 있는 ipk 파일들을 대충 비교해 보니, 같은 파일들이 올라와 있다고 보여지고, 적어도 내가 확인해본 파일들은 해시값까지 똑같았다. 즉, kmod 저장소에 있는 파일들은 package 저장소에도 모두 있다고 보여진다.
따라서 굳이 추가하지 않아도 될 듯???

하지만, 다음 판올림때 다시 이 부분을 확인해보고, 그 때도 빠져있다면 그 상태에서 아래 방법대로 꾸러미 판올림을 먼저 진행해보고, 오류가 발생한다면 나중에 추가해주는게 좋겠다.

오류는 이런 식이었다.

satisfy_dependencies_for: Cannot satisfy the following dependencies for kmod-usb-core:
kernel (= 4.14.195-1-fa00c1231ac7d7840ec6ffe62dcad926)

이 저장소 위치는 https://downloads.openwrt.org/releases/19.07.4/targets/ipq40xx/ 에서 확인할 수 있다. 판 번호가 바뀌면 주소에서 19.07.4 부분에 그 판번호를 넣고 찾아가면 된다.

따라서, 19.07.4 용 최종 저장소는 다음과 같다.

src/gz openwrt_core http://downloads.openwrt.org/releases/19.07.4/targets/ipq40xx/generic/packages
src/gz openwrt_kmods https://downloads.openwrt.org/releases/19.07.4/targets/ipq40xx/generic/kmods/4.14.195-1-fa00c1231ac7d7840ec6ffe62dcad926
src/gz openwrt_base http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/base
src/gz openwrt_luci http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/luci
src/gz openwrt_packages http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/packages
src/gz openwrt_routing http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/routing
src/gz openwrt_telephony http://downloads.openwrt.org/releases/19.07.4/packages/arm_cortex-a7_neon-vfpv4/telephony

그리고 이제 opkg update 로 최신판 자료를 받아온다.

꾸러미 판올림/또는 재설치

이전에 쓴 글 내용대로, 다음 명령으로 판올림을 할 수 있다.

# 최신판 받기
opkg update

# 꾸러미 판올림 : 첫 시도
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade

# 위 명령으로 안되면,
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade --force-depends

일단 첫 명령으로 해보고 오류가 발생하면 두번째를 해본다.
내 경우엔 계속 의존성 관련 투덜거림(?)을 들어야만 했다. 일반 프로그램은 다 괜찮았는데, kmod 관련 꾸러미들은 대부분 이랬다.

–force-depends 로 일부분 해결이 됐고, 몇몇은 끝까지 성공하질 못했다.

마지막 방법으로, remove 후에 재설치를 했는데, 그제서야 성공할 수 있었다.
remove 에도 force 를 해줄 필요가 있었는데…

# 일반 삭제
opkg remove <꾸러미명>

# 강제 삭제
opkg remove <꾸러미명> --force-remove

# 의존된 꾸러미까지 모두 강제 삭제
opkg remove <꾸러미명> --force-removal-of-dependent-packages

wireguard, nfs 관련 꾸러미는 꼭 재설치를 해줘야 한다.


** 부족하지만 일단은 여기서 끝내기로 하고, 다음 번 판올림 때 좀 더 자세히 절차를 따라가며 정리해보기로..
아무튼, 펌웨어를 올려도 기존 설정이 그대로 남아 있어서 다행이다. 그걸 첨부터 다시 한다고 생각하면 정말이지..

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