Install OpenWrt to Xiaomi Redmi AX6000

Install OpenWrt to Xiaomi Redmi AX6000

차일피일 미뤄오던 OpenWrt 설치를, 사용중이던 공유기 사망으로 급하게 진행하게 되었다.

OpenWrt를 설치하는 이유는 Xiaomi firmware의 기능 및 성능에 대한 불만족도 있겠지만, 무엇보다 중국제품이기 때문이라는건 모두 알고 있을태니... 생략~

OpenWrt를 설치할까 X-Wrt를 설치할까 살짝 고민 하긴 했지만, 결국OpenWrt로 마음이 기울었고 OpenWrt wiki page를 보고 설치를 해보았다.

#downgrade firmware

해당 F/W의 취약점을 이용해서 telnet/ssh를 enable 할 수 있으며, 1.0.48 버전이 권장되고 있다.
https://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rb06/miwifi_rb06_firmware_847e9_1.0.48.bin

캡쳐해놓은 이미지가 없는 관계로, 간단히 말로하면,
펌웨어를 미리 PC에 다운로드 한 후, 샤오미 펌웨어 업로드 페이지에서 해당 파일을 선택 후, 진행하면 다운그레이 안된다는 팝업이 뜨면, 웹브라우저에서 url 주소 끝에 숫자를 -1한 값으로 변경한다.
ex) url이 1으로 끝나면 0로 변경, 2로 끝나면 1로 변경

how to get token

웹브라우저에서 "192.168.31.1" 주소로 접속 및 로그인 하였을때 주소창에 보여지는 url 중 "stok="에 해당 하는 숫자로된 문자열이 token이다.
이는 공유기를 리붓할때마다 바뀌므로 설치 과정 중 여러번 확인해야 한다.

how to reboot

웹브라우저 주소창에 아래 url에 자신의 token을 대입하여 실행한다.

http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3b%20reboot%20%3b%20

enable telnet/ssh

1. enable dev/debug mode

확인된 {token}을 이용해 웹브라우저를 이용해 아래 명령들을 순서대로 수행

a. get token
b. writes magic bytes to crash partition.
http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3B%20echo%20pVoAAA%3D%3D%20%7C%20base64%20-d%20%7C%20mtd%20write%20-%20crash%20%3B%20
c. reboot

2. enable telnet/ssh

a. get token
b. set Bdata to enable telnet/ssh persistently
http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3B%20bdata%20set%20telnet_en%3D1%20%3B%20bdata%20set%20ssh_en%3D1%20%3B%20bdata%20commit%20%3B%20
c. reboot
d. connet to 192.168.31.1 using telnet

1.telnet_to_ax6000

e. edit /etc/init/d/dropbear

2.enable_ssh

f. upload Firmware OpenWrt sapshot install & Firmware OpenWrt snapshot Upgrade to Redmi AX6000
scp -O openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-stock-initramfs-factory.ubi [email protected]:/tmp

scp -O openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-stock-squashfs-sysupgrade.bin [email protected]:/tmp

리눅스 PC에서 scp 명령으로 공유기에 firmware 바이너리를 업로드 해야 하는데, 내가 사용한 리눅스가 scp 명령을 지원하지 않아서, 그냥 개인 Synoloy NAS 웹서버에 firmware를 올려 두고 wget 명령으로 대체 했다.

wget http://192.168.31.xxx/openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-stock-initramfs-factory.ubi /tmp/

wget http://192.168.31.xxx/openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-stock-squashfs-sysupgrade.bin /tmp/

ssh를 셋팅하는 이유가 파일 업로드를 편하게 하기 위해서인데...
생각해보니 리눅스 환경에서 할게 아니라 윈도우 환경에서 Mobaterm으로 하는게 더 편했을 것 같다.

install OpenWrt (stock layout)

OpenWrt에서 제공하는 partition/file system에 대한 layout이 2가지가 있는데,
Stock layout은 공급업체의 파티션 구성표와 공급업체 펌웨어 복원 기능을 유지하므로 낭비되는 공간이 있고,
U-boot mode layout은 Stock layout에 비해 사용 가능한 공간을 보다 효율적으로 사용하지만 다시는 공급업체 펌웨어로 되돌릴 수 없다고한다.
나는 Stock layout용만 설치 하였다.

1. get ubi

FYI, UBI에 대해 궁금하다면, https://openwrt.org/docs/techref/flash.layout#ubi_unsorted_block_images 를 참고 하면 될것 같은데,
읽어보진 않았지만 대충 Android Virtual A/B Update처럼 F/W를 update를 위해 partition을 두개로 관리하고 있는 듯...

cat /proc/cmdline

위 명령에 대한 출력에서 firware값이 1인지(ubi1) 0인지(ubi0) 확인한다.

2. setup nvram

if ubi1 (firmware=1),
nvram set boot_wait=on
nvram set uart_en=1
nvram set flag_boot_rootfs=0
nvram set flag_last_success=0
nvram set flag_boot_success=1
nvram set flag_try_sys1_failed=0
nvram set flag_try_sys2_failed=0
nvram commit
else,
nvram set boot_wait=on
nvram set uart_en=1
nvram set flag_boot_rootfs=1
nvram set flag_last_success=1
nvram set flag_boot_success=1
nvram set flag_try_sys1_failed=0
nvram set flag_try_sys2_failed=0
nvram commit

Boot Control를 위한 값들을 nvram에 저장 하고 있는 것으로 보인다.

3. flash firmware for install

if ubi1 (firmware=1),
ubiformat /dev/mtd8 -y -f /tmp/openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-stock-initramfs-factory.ubi
else,
ubiformat /dev/mtd9 -y -f /tmp/openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-stock-initramfs-factory.ubi

메모리 장치인 MDT가 뭔지에 대해서는, 나~중에 https://openwrt.org/docs/techref/flash.layout#mtd_memory_technology_device_and_mtdsplit 읽어 볼 생각이 있지만...

4. reboot

난 그냥 터미널에서 reboot 명령을 사용했다.

5. set boot control

fw_setenv boot_wait on
fw_setenv uart_en 1
fw_setenv flag_boot_rootfs 0
fw_setenv flag_last_success 1
fw_setenv flag_boot_success 1
fw_setenv flag_try_sys1_failed 8
fw_setenv flag_try_sys2_failed 8
fw_setenv mtdparts "nmbm0:1024k(bl2),256k(Nvram),256k(Bdata),2048k(factory),2048k(fip),256k(crash),256k(crash_log),30720k(ubi),30720k(ubi1),51200k(overlay)"

6. upgrade firmware

sysupgrade -n /tmp/openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-stock-squashfs-sysupgrade.bin

The End

정상적으로 OpenWrt 설치를 완료 ㅋㅋ
주의할점은, 리붓 할때마다 token이 바뀐다는 것과
OpenWrt Firmware를 설치 후에는 공유기 IP가 "192.168.31.1"에서 "192.168.1.1"로 바뀌며, 무선 접속을 위한 SSID 설정이 기본적으로 disable 된 상태가 되므로 랜선을 사용해야 하며, OpenWrt wiki page에 공유된 snapshot에는 web ui를 luci가 포함되어 있지 않다는 점이다.
설치시간보다 글로 남기는데 더 많은 시간이 걸렸다는...
추가 기본 설정에 대한 이야기는 다음에 계속~~~