포고플러그에 데비안 등 리눅스 배포판을 설치하기 위한 uboot 업그레이드 방법을 정리해본다.


0. 배경 & 준비

- 참고 및 uboot 배포 링크: http://forum.doozan.com/read.php?3,12381

- 호환 기기: PogoV4/Mobile, PogoE02, GoFlexNet, GoFlexHome, Dockstar, iConnect, NetgearStora, HP-T5325, NSA310/310S/320/320S/325, Sheevaplug (무슨 플러그? 응?)

- 상기 uboot 배포 링크에서 아래 파일을 찾아 다운받고 포고플러그로 옮겨두어야 한다. 포고플러그 상에서 wget으로 받으면 좋은데, 불행히도 원본 파일이 dropbox link라서 그게 안되더라.

- linux-tools-installation-bodhi.tar.gz
- uboot.2016.05-tld-1.pogo_v4.bodhi.tar
- uboot.2016.05-tld-1.environment.bodhi.tar

편의 상 현 시점 최신 버전을 티스토리에 올렸고 위 링크를 카피하여 wget으로 받으면 된다. 그러나 파일명은 깨진다. 

마지막으로.. 자칫 벽돌이 될 수 있으니 주의를 당부함!!!


1. 안전한 Flashing 및 사고 발생 시 대처를 위해 미리 확인해야할 것들

포고플러그에 ssh로 접속하여 아래 내용 확인

- /etc/fw_env.config 확인

# cat /etc/fw_env.config

# MTD device name    Device offset   Env. size      Flash sector size    Number of sectors

/dev/mtd0            0xc0000         0x20000        0x20000

만약 상기 파일이 없을 경우 상기 내용대로 만들어주면 된다. 단, 위의 정보는 보기좋게 정리한 것으로, 띄워쓰기는 한칸씩만.. 나중에 uboot env를 올리는 위치를 기록해두는 것으로 부팅 시 uboot이 env를 어디서 찾아야하는지 알려주는 것이다.


- MTD 정보 확인

# cat /proc/mtd
dev:    size      erasesize   name
mtd0:  00200000   00020000   "u-boot"
mtd1:  00300000   00020000   "uImage"
mtd2:  00300000   00020000   "uImage2"
mtd3:  00800000   00020000   "failsafe"
mtd4:  07000000   00020000   "root"

mtd0를 제외하고는 리눅스 배포판 부팅에 아무런 개입을 안하므로, mtd0의 용량이 00100000 이상인 것만 확인하면 되고, 나머지 파티션 개수와 size는 달라도 상관이 없다.


- 백업

순정/구버전 uboot인 mtd0와 환경변수를 아래와 같이 백업한다.

# nanddump --noecc --omitoob -l 0x80000 -f mtd0 /dev/mtd0
# fw_printenv > old_envs.txt


순정 OS라면 아래 명령으로 환경변수를 저장할 수 있다.

# /usr/local/cloudengines/bin/blparam >  current_envs.txt


- mtd0 내에 bad block이 있는지 확인

부팅 시 파일시스템 체크를 이미 했으므로, dmesg 명령으로 bad block이 있는지 확인할 수 있다. 아래 예시는 4번 block에 bad가 있는 것이다. bad block이 있을 경우 flash하면 벽돌이 된다고 하는데, 영 불가능한 것은 아닌가 보더라.

# dmesg | grep -i 'bad'

[    2.413231] Scanning device for bad blocks
[    2.417731] Bad eraseblock 3 at 0x000000060000

1 block이 20000 sector이고, eraseblock 3에 bad block이 있으므로 4번째 block이 깨진 것이다. 이 경우 여기서 멈춰야 한다.


여기까지 진행한 확인사항, 백업파일 등을 포고플러그 밖으로 꺼내놓는 것이 좋다. 문제 발생 시 공부해야할 것이 참 많아지거든..



2. uboot, uboot env Flash

이 과정은 실수하면 벽돌이 된다. 오타 없이 주의해서 진행하자. 혹시나 에러 메시지가 출력될 경우 절대 전원을 끄지 않고, 해결 방법을 찾아보자.

- uboot 올리기

글 쓰는 시점 2016.05 버전이 최신이다. 호환 하드웨어가 거의 단종되다싶이 했고, 기능 상 거의 완벽해서 이제 추가 업데이트 여지가 거의 없어보인다.

# ./flash_erase /dev/mtd0 0 4
Erasing 128 Kibyte @ 60000 -- 100 % complete

# ./nandwrite /dev/mtd0 uboot.2016.05-tld-1.pogo_v4.mtd0.kwb
Writing data to block 0 at offset 0x0
Writing data to block 1 at offset 0x20000
Writing data to block 2 at offset 0x40000
Writing data to block 3 at offset 0x60000


- 기본 uboot env 올리기
/etc/fw_env.config 내용을 확인했던 것을 기억하자.
참고 및 uboot 배포 링크에서 uboot.2014.07-tld-3.environment.bodhi.tar 파일을 다운로드 받아 압축을 풀고, 이 중에서 environment.img 파일만 올려주면 된다.

# ./flash_erase /dev/mtd0 0xc0000 1
Erasing 128 Kibyte @ c0000 -- 100 % complete

#./nandwrite -s 786432 /dev/mtd0 uboot.2016.05-tld-1.environment.img
Writing data to block 6 at offset 0xc0000



3. uboot env 맞춤 설정

- 하드웨어 관련: 아래는 포고플러그 v4 기준

# fw_setenv arcNumber 3960
# fw_setenv machid f78
# fw_setenv mtdparts 'mtdparts=orion_nand:2M(u-boot),3M(uImage),3M(uImage2),8M(failsafe),112M(root)'
# fw_setenv ethaddr '00:25:xx:xx:xx:xx' 
   : 포고플러그 내장 랜카드, 기기 바닥에 적혀있음
# fw_setenv dtb_file '/boot/dts/kirkwood-pogoplug_v4.dtb'
   : 부트 디스크의 /boot/dts 에서 기기에 맞는 파일명을 직접 확인


- 넷콘솔 관련

uEnv를 지원하는 uboot과 함께라면 거의 만능이 되는 netconsole 관련 설정. mtd0(uboot)이 깨지기 전까지는 시리얼 케이블과 거의 동일한 복구 능력을 발휘한다. 강추
넷콘솔 관련 참고 자료: Use netconsole to troubleshoot uBoot without a serial cable

# fw_setenv serverip '192.168.0.40'
   : 넷콘솔 서버 ip 지정. 리눅스 추천하며 브릿지 모드의 가상머신이라도 될 듯 함.
# fw_setenv ipaddr '192.168.0.26'
   : 포고플러그가 사용할 ip주소


- 잡것: 그다지 중요치 않은 선택사항

# fw_setenv bootdev 'mmc'
   : 기본 부팅 디바이스인데, 실은 아래 devices 순서대로 uEnv.txt를 검색하고, uEnv.txt가 발견된 디바이스로 부팅해버리는 듯 하다. 즉.. bootdev는 의미가 없음..

# fw_setenv devices 'mmc usb ide'
   :  uEnv.txt를 검색할 후보 device들. 기왕이면 부팅 디스크를 앞에 두는 것이 좋지만 워낙 검색 속도가 빨라 큰 의미를 두지 않아도 됨.

# fw_setenv disks '0 1'
   : devices에 지정된 디바이스를 각각 몇개씩 확인할지 결정. usb의 경우 0번 device가 hub인 듯 하여 0 1 두개는 지정해두는 것이 좋겠다.


- systemd 사용하기

systemd를 사용하려면 /boot/uEnv.txt에 아래 내용을 적어준다. 물론 systemd를 설치해줘야한다.

custom_params=init=/bin/systemd


미래를 위해서 여기까지 수정한 uboot env 내용을 텍스트로 백업해두자. 벽돌 복구할 때 유용하게 쓰인다. 포고플러그 밖으로 뺴 놓는 것 잊지 말고.. 순정 OS에서 작업했다면 리부팅 전에 기기 외부로 백업하는 것이 좋다.

# fw_printenv > uboot.env.2017.08.03.txt


이제 리부팅 하면 새 uboot이 반길 것이다.