컴퓨터

DD-WRT 공유기에서 OPKG 사용하기

Selnis 2011. 7. 6. 17:43

들어가며

OpenWRT 를 이용하여 웹서버를 구축하였다가 설정을 잘못 건드리는 바람에 벽돌이 되어버린 이후로, 리셋 버튼과 펌웨어 영역의 변경이 불가능한 DD-WRT를 공유기에 올려서 이용하고 있습니다.

사용하다 보니 초기에는 공유기 자체의 펌웨어를 건드릴 수 없다보니 불편하게 느껴졌었는데, 기기를 재기동만 시키면 원래대로 돌아와 주니 마음 놓고 이것 저것 실험해볼 수 있어서 좋더군요.

허나, OpenWRT의 opkg 가 DD-WRT의 ipkg보다 여러모로 편리한 점이 많기 때문에, 이를 DD-WRT 에서도 이용해 볼 생각을 하게 되었고, 결국 구글링을 통해 세 가지 방법을 짜집기 하여 포스팅 하였습니다.

[참조한 문서들]
http://g300nh.blogspot.com/2010/06/software-installation-on-dd-wrt-part-1.html
https://forum.openwrt.org/viewtopic.php?id=28488


준비물

WinSCP
Putty
OpenWRT의 library 파일
넉넉한 공간의 USB 드라이브
WinSCP 와 Putty 는 홈페이지의 다운로드 페이지 링크를, OpenWRT의 library 파일은 제 블로그 계정에서 다운로드 링크를 걸어 두었습니다.


시작하기

  1. WinSCP 를 이용해 공유기에 접속합니다.
    설정은 Putty와 동일하게 설정하면 됩니다. (SSH)



  2. 접속하는데 성공하였다면 루트로 이동하여 bin, etc, lib, tmp, usr 폴더를 선택, USB 드라이브에 폴더 하나를 만들어서 그 폴더 안에 복사하도록 합니다.
    저는 fck 라는 폴더를 만들어서 그 안에 넣었습니다.



  3. 복사를 마쳤다면 OpenWRT의 라이브러리를 넣어 줄 폴더 하나를 만듭니다.
    이름은 lib2 정도로 적당히 붙이겠습니다.



  4. 생성한 폴더에 OpenWRT의 라이브러리 파일들을 복사한 후, 공유기에 USB 드라이브를 마운트 시킵니다. (웹GUI 에서 /mnt/로의 자동 마운트를 강력 추천!)



  5. 이제 Putty를 이용하여 공유기에 접속합니다.



  6. 방금 USB 드라이브에 복사하였던 폴더들을 공유기 내부의 같은 이름을 가진 폴더들로 마운트를 시켜주어야 합니다.

    mkdir /mnt/fck/jffs
    mount /mnt/fck/jffs /jffs
    mount /mnt/fck/etc /etc
    mount /mnt/fck/bin /bin
    mount /mnt/fck/lib /lib
    mount /mnt/fck/usr /usr
    mount /mnt/fck/tmp /tmp
    jffs 폴더는 생성하지 않았으므로, mkdir 명령어를 이용하여 하나 만들어 주도록 합니다.



  7. 이제 ipkg.conf 파일과 ipkg 파일을 수정하여 ipkg가 제기능을 할 수 있도록 만들어 줄 차례입니다.
    mv /etc/ipkg.conf /etc/ipkg.conf.orig
    echo -e "src backfire http://downloads.openwrt.org/backfire/10.03.1-rc3/ar71xx/packages/\ndest root /\ndest ram /tmp" > /etc/ipkg.conf
    cp /bin/ipkg /bin/ipkg.orig
    cat /bin/ipkg.orig |sed -e "s/--passive-ftp //" > /bin/ipkg


  8. ipkg update 를 입력합니다.
    ipkg update



  9. 리스트의 업데이트가 완료될 때까지 기다렸다가, 업데이트가 완료되면 ipkg를 이용하여 opkg를 설치하도록 합니다.
    ipkg install opkg





  10. opkg가 정상 동작하려면 OpenWRT의 라이브러리가 필요하므로, 이를 마운트 시켜주도록 합니다.
    mount /mnt/fck/lib2/ /lib
    mount /mnt/fck/jffs /opt
    jffs를 opt로 마운트 시킨 이유는 opkg의 루트를 opt로 설정할 것이기 때문입니다.
    굳이 이럴 필요 없이, opkg.conf 의 루트 경로를 /mnt/fck, 즉, 루트와 마찬가지의 역할을 수행할 경로로 설정하는 것이 나을 것 같습니다.
    단, 마운트 된 경로를 여기에 또 넣으면 에러납니다. -_-a



  11. opkg.conf 파일을 생성해 주도록 합니다.
    echo -e "src/gz snapshots http://downloads.openwrt.org/backfire/10.03.1-rc3/ar71xx/packages/\ndest root /opt/\ndest ram /tmp\nlists_dir ext /tmp/var/opkg-lists" > /etc/opkg.conf

    echo -e "src/gz snapshots http://downloads.openwrt.org/backfire/10.03.1-rc3/ar71xx/packages/\ndest root /mnt/fck\ndest ram /tmp\nlists_dir ext /tmp/var/opkg-lists" > /etc/opkg.conf



  12. LD_LIBRARY_PATH와 PATH를 마운트 시킨 /opt/에 맞추어 지정해 줍니다.
    export LD_LIBRARY_PATH='/opt/lib:/opt/usr/lib:/lib:/usr/lib'
    export PATH='/opt/bin:/opt/usr/bin:/opt/sbin:/opt/usr/sbin:/bin:/sbin:/usr/sbin:/usr/bin'

    아마 이 과정은 필요 없을겁니다.
    혹시라도 에러나면 붙여넣어 보시기 바랍니다.



  13. opkg의 목록을 업데이트 시켜줍니다.
    opkg update

    만약 이 과정에서 rockf64 같은 에러가 발생한다면 OpenWRT의 라이브러리가 제대로 마운트 되지 않은 것입니다. 위의 과정 10을 참조하셔서 마운트 시켜주시기 바랍니다.



  14. 이제 opkg 를 이용하여 패키지 설치가 가능하게 되었습니다.
    만약 재부팅 후 다시 폴더들을 마운트 시키고 싶다면 다음과 같이 입력하시면 되겠습니다.
    mount /mnt/fck /opt
    mount /mnt/fck/etc /etc
    mount /mnt/fck/bin /bin
    mount /mnt/fck/lib2 /lib
    mount /mnt/fck/usr /usr
    mount /mnt/fck/tmp /tmp
    mount /mnt/fck/jffs /opt

    export LD_LIBRARY_PATH='/opt/lib:/opt/usr/lib:/lib:/usr/lib'
    export PATH='/opt/bin:/opt/usr/bin:/opt/sbin:/opt/usr/sbin:/bin:/sbin:/usr/sbin:/usr/bin'


문제점

현재 이 방식으로 패키지를 설치했을 때 발생하는 문제점은 다음과 같습니다.

패키지 스스로 이름을 변경할 수 없음

php-fastcgi 를 설치한 화면입니다.


그림과 같이 파일의 이름이 변경되지 않아, 직접 변경해 주어야 하는 번거로움이 있습니다.

Putty나 WinSCP 등을 이용하여 변경해 주면...


그림과 같이 정상 작동함을 확인할 수 있습니다.


마치며

ipkg 를 이용하여 패키지를 설치하면 그 패키지만이 설치되고 끝입니다.
그렇게 되면 해당 패키지의 정상적인 동작을 보장할 수 없죠.

하지만 opkg 를 이용하여 패키지를 설치하면 그 패키지에 필요한 패키지들까지 함께 설치가 됩니다.
opkg install php-fastcgi 를 입력하면 php5와 php5-cgi 등의 패키지들이 함께 설치되듯이 말이죠.