Yongrok

DebWrt를 이용한 홈 서버 구축 본문

컴퓨터

DebWrt를 이용한 홈 서버 구축

Yongrok 2013.03.27 14:52

DebWrt를 이용한 홈 서버 구축


DebWrt는 무선 공유기와 같은embedded 장치에서 Debian GNU/Linux(리눅스의 일종[각주:1]) 를 실행시킬 수 있게 해 준다.[각주:2]  Debian 리눅스의 특징으로는 패키지(운영체제에 설치되는 소프트웨어)의 관리가 용이하다는 점이다. 프로그램 설치 파일이 .deb 파일로 존재하게 되고 이를 dpkg 프로그램을 이용해 설치할 수 있다. 또한 APT 라는 소프트웨어를 사용해 인터넷에 존재하는 저장소에서 직접 소프트웨어를 다운받아 자동으로 설치할 수 있다. 패키지 관리 시스템은 소프트웨어 설치에 필요한 prerequisite 소프트웨어까지 관리하면서 시스템의 패키지 dependency를 유지해 준다.


왜 DebWrt로 홈서버를 구축하는가?


위에서 언급했듯, Debian Linux는 패키지 관리 시스템에 강점을 가진다. 홈 서버를 구축하기 위해 필요한 Apache, PHP, Mysql 과 같은 웹서버, 서버 사이드 프로그래밍 언어, 데이터 베이스 등의 패키지를 설치하는데 APT 패키지 관리 시스템을 활용하면 간편하게 설정이 가능하다.


DebWrt를 설치 할 수 있는 장비 리스트


모든 무선 공유기가 DebWrt를 지원하는 것은 아니다.[각주:3]  본 문서에서는 ASUS RT-N16을 가지고 설정한다.


RT-N16에 DebWrt 설치하기


개요


RT-N16의 시본 Flash Disk로는 Debian Linux를 올릴 수 없다. 외장 메모리가 필요하며, 이에 따라 USB를 이용한 외부 저장장치(USB 메모리)에 파일 시스템을 구축하고, RT-N16의 펌웨어를 DebWrt 펌웨어로 바꾼다. 이렇게 하면 공유기는 부팅 시, 필요한 커널을 로딩한 후, USB를 통해 부팅을 하게 된다.


준비물


    • ASUS RT-N16[각주:4] 

      꼭 ASUS RT-N16이어야 하는 것은 아니고, DebWrt를 지원하는 공유기이면 가능하다. 다만, 본 글에서 다루는 설정 방식과는 약간 차이가 있을 수 있다.


    • USB 메모리 2GB 이상

Debian Linux를 올리는데 기본 1기가 정도가 필요하고, 추가적인 서버 구축 및 DB 운용이 1GB 이상의 용량이 필요하다. 참고로 USB 3.0은 잘 인식되지 않을 수 있다.


USB HDD 설정


ASUS RT-N16에 적합한 root file system 파일과 module 다운로드 


http://dev.debwrt.net/wiki/AsusRT-N16?version=71 에서 root file system 과 module 다운로드가 가능하다.[각주:5]  debwrt-modules-brcm4716-None-3.3.7-testing-2.1-1-09092012.tar.gz 모듈과 debwrt-rootfs-mipsel-2.0-1.tar.bz2 파일시스템을 다운로드 한다.


준비한 USB 메모리의 파티션을 다음과 같이 설정


DebWrt 펌웨어가 설치된 공유기는 부팅시 연결된 장치 중 DEBWRT_ROOT라고 Label이 붙은 장치를 찾아 부팅하한다. 그러므로 파티션의 Label에 주의하자. 


 

 Label

Partition Type 

비고 

 파티션1

DEBWRT_ROOT 

Linux - ext3 

Rest of available size 

 파티션2 

DEBWRT_SWAP 

Linux swap 

128MB 


USB를 꽂은 후 터미널에서 dmesg 명령어로 디바이스 확인.


usb가 어떤 장치파일(그림에서는 sdb)로 인식되는지 확인


파티션 조정 툴을 이용해 USB 장치의 파티션을 설정


어떠한 파티션 툴을 사용해도 좋지만(ext3, swap 등의 리눅스 파티션을 만들 수만 있다면), 만약 어떤 툴을 사용해야 할 지 모르겠다면, 아래와 같이 우분투 소프트웨어 센터에서 GParted Partition Editor를 다운받아 활용할 수 있다.






DEBWRT_ROOT 파일 시스템에 다운로드 받은 root file system과 modules 파일의 압축을 푼다.


cd [DEBWRT_ROOT가 마운트된 경로]
tar xxvf [다운로드받은경로]/debwrt-rootfs-*.bz2
tar xzvf [다운로드받은경로]/debwrt-modules-*.gz --no-same-owner


Firmware 설정


사용할 펌웨어도 마찬가지로 http://dev.debwrt.net/wiki/AsusRT-N16?version=71 에서 다운로드가 가능하다. debwrt-firmware-brcm4716-squashfs-09092012.trx  파일을 다운로드 받은 후, ASUS firmware restoration tool 을 이용해 router를 diagnosis mode 로 설정하고 firmware를 설치한다.



1. 라우터의 파워 플러그를 뽑는다.


2. PC의 IP 설정을 다음과 같이 변경한다.

IP: 192.168.1.2  (192.168.1.1 이 아닌 192.168.1.?? 로만 설정하면 됨)

Netmask: 255.255.255.0

Gateway: 192.168.1.1


3. PC의 Ethernet 포트와 라우터의 LAN1 포트를 연결한다.


4. 라우터의 뒷면에 restore 버튼을 누른 채, 전원을 연결한다.


5. 수 초간 기다리면, power light 가 느리게 깜빡이면서 diag mode로 진입하게 된다.


6. ASUS firmware restoration tool을 실행하고, 원하는 firmware를 선택해 설치한다

Firmware restoration tool은 Asus 공식 홈페이지에서 다운로드 받을 수 있다.

http://support.asus.com/download.aspx?SLanguage=en&m=RT-N16&os=30




설치 확인


설치가 정상적으로 이뤄졌다면, USB를 꽂고 부팅하는 경우 Router가 다음과 같은 설정으로 동작하게 된다.


사용자 계정 정보

user: root

password: debwrt

네트워크 

LAN1 포트 IP 주소: 192.168.1.1

WAN 포트 및 WLAN 인터페이스는 비활성화

서비스 

SSHD, telnetd


위와 같이 정상적으로 설정이 되었다면, PC와 Router를 Ethernet으로 연결해서 (PC의 IP는 192.168.1.2로 설정, Firmware 설정 부 참조) ssh나 telnet을 통해 연결해 터미널에 로그인 할 수 있다.


문제 해결


만약 설정이 정상적으로 이뤄지지 않았다면, 라우터가 제공하는 시리얼 포트를 통해 시리얼 통신으로 부팅 과정을 확인하고, 터미널에 접근할 수 있다. 주로 발생하는 문제는 USB 파일시스템의 잘못된 설정으로 인한 Debian 부팅의 실패와, Firmware 설치 실패로 인한 부팅 실패이다.


라우터 네트워크 설정 및 홈 서버 구축


네트워크 설정


DebWrt를 설치했다면, 처음에는 네트워크 설정이 되어 있지 않아, WAN 기능이 비활성 상태이며 WLAN 인터페이스도 동작하지 않는다. 이런 기본적인 설정을 위해 http://dev.debwrt.net/wiki/AsusRT-N16?version=71 페이지의 Initial Configuration Script 를 참고한다. 홈페이지에 업로드 된 해당 스크립트를 그대로 실행하면 정상 동작하지 않아, 다음과 같이 스크립트를 정리한다. 스크립트를 실행하기 전 WAN 포트에 인터넷 연결이 가능하고, DHCP로 IP를 받아올 수 있는 LAN포트를 연결한다.


#!/bin/sh
 
#RT-N16 Initial Configuration Script - usage: sh ./rtn16_config.sh
#From: Stephen Hinton 
#Date: Sept 20, 2012
#Updated by Yongrok Kim  , March 20, 2013
 
#Welcome message and admin priv's
echo "--DebWrt RT-N16 initial configuration script--"
sleep 5
 
#Bring up network connection
echo "Bringing up network connections. This stage of the script will take 30+ seconds"
 
echo "# -LOOPBACK-" >> /tmp/interfaces.script
echo "auto lo" >> /tmp/interfaces.script
echo "iface lo inet loopback" >> /tmp/interfaces.script
echo "     " >> /tmp/interfaces.script
echo "# -ETH0-" >> /tmp/interfaces.script
echo "auto eth0" >> /tmp/interfaces.script
echo "iface eth0 inet manual" >> /tmp/interfaces.script
echo "    pre-up ifconfig eth0 0.0.0.0 up" >> /tmp/interfaces.script
echo "    pre-up modprobe switch-robo; exit 0" >> /tmp/interfaces.script
echo "    pre-up echo 1 > /proc/switch/eth0/reset" >> /tmp/interfaces.script
echo "    pre-up echo 1 > /proc/switch/eth0/enable_vlan" >> /tmp/interfaces.script
echo "    pre-up echo "1 2 3 4 8" > /proc/switch/eth0/vlan/2/ports" >> /tmp/interfaces.script
echo "    pre-up echo "0 8"       > /proc/switch/eth0/vlan/3/ports" >> /tmp/interfaces.script
echo "    post-down ifconfig eth0 down" >> /tmp/interfaces.script
echo "     " >> /tmp/interfaces.script
echo "# -VLAN2(LAN)-" >> /tmp/interfaces.script
echo "auto vlan2" >> /tmp/interfaces.script
echo "iface vlan2 inet static" >> /tmp/interfaces.script
echo "    address  192.168.1.1" >> /tmp/interfaces.script
echo "    netmask  255.255.255.0" >> /tmp/interfaces.script
echo "    gateway  192.168.1.1" >> /tmp/interfaces.script
echo "    nameserver 192.168.1.1" >> /tmp/interfaces.script
echo "    vlan-raw-device eth0" >> /tmp/interfaces.script
echo "     " >> /tmp/interfaces.script
echo "# -VLAN3(WAN)-" >> /tmp/interfaces.script
echo "auto vlan3" >> /tmp/interfaces.script
echo "iface vlan3 inet dhcp" >> /tmp/interfaces.script
echo "    vlan-raw-device eth0" >> /tmp/interfaces.script
 
/etc/init.d/networking stop
mv /etc/network/interfaces /etc/network/interfaces.bak
ln -s /tmp/interfaces.script /etc/network/interfaces
/etc/init.d/networking start
sleep 30
 
echo "You should see positive ping responses below, if not this means that you do not have an active internet connection and this script will fail."
ping -c 5 www.google.com
sleep 5
 
#Sync clock with time server
if dpkg-query -l "ntpdate" | grep -q ^.i; then
   echo "ntpdate is already installed"
else
   echo "Installing ntpdate"
   aptitude -y install ntpdate
fi
echo "Syncing with time server"
ntpdate -u 0.us.pool.ntp.org
sleep 5
 
#Patch Sources.list, interfaces.broadcom and dnsmasq files
patchinstalled=0
if dpkg-query -l "patch" | grep -e ^.i; then
   echo "patch is already installed"
else
   echo "Updating aptitude"
   aptitude -y update
   echo "Installing patch (will be removed when script is finished)"
   aptitude -y install patch
   patchinstalled=1
fi

echo "Updating aptitude with newly patched sources.list"
aptitude -y update
 
#Check whether debwrt-net is installed, if not download and install it and its dependencies
echo "Checking for debwrt-net and it's dependencies"
 
if dpkg-query -l "robocfg" | grep -e ^.i; then
   echo "robocfg is already installed"
else
   echo "Installing robocfg"
   wget http://www.debwrt.net/download/packages/mipsel/robocfg_1.0.1_mipsel.deb -O /tmp/robocfg_1.0.1_mipsel.deb
   dpkg -i /tmp/robocfg_1.0.1_mipsel.deb
fi
 
if dpkg-query -l "broadcom-wl" | grep -e ^.i; then
   echo "broadcom-wl is already installed"
else
   echo "Installing broadcom-wl"
   wget http://www.debwrt.net/download/packages/mipsel/broadcom-wl_5.10.56.27.3-2_mipsel.deb -O /tmp/broadcom-wl_5.10.56.27.3-2_mipsel.deb
   dpkg -i /tmp/broadcom-wl_5.10.56.27.3-2_mipsel.deb
fi
 
if dpkg-query -l "dnsmasq" | grep -e ^.i; then
   echo "dnsmasq is already installed"
else
   echo "Installing dnsmasq"
   aptitude -y install dnsmasq
fi
 
if dpkg-query -l "libnl" | grep -e ^.i; then
    echo "libnl is already installed"
else
    echo "Installing libnl"
    wget http://www.debwrt.net/download/packages/mipsel/libnl_1.1-1_mipsel.deb -O /tmp/libnl_1.1-1_mipsel.deb
    dpkg -i /tmp/libnl_1.1-1_mipsel.deb
fi
 
if dpkg-query -l "libnl-tiny" | grep -e ^.i; then
    echo "libnl-tiny is already installed"
else
    echo "Installing libnl-tiny"
    wget http://www.debwrt.net/download/packages/mipsel/libnl-tiny_0.1_mipsel.deb -O /tmp/libnl-tiny_0.1_mipsel.deb
    dpkg -i /tmp/libnl-tiny_0.1_mipsel.deb
fi
 
if dpkg-query -l "hostapd" | grep -e ^.i; then
   echo "hostapd is already installed"
else
   echo "Installing hostapd"
   wget http://www.debwrt.net/download/packages/mipsel/hostapd_1.0_mipsel.deb -O /tmp/hostapd_1.0_mipsel.deb
   dpkg -i /tmp/hostapd_1.0_mipsel.deb
   aptitude hold hostapd
fi
 
if dpkg-query -l "swconfig" | grep -e ^.i; then
   echo "swconfig is already installed"
else
   echo "Installing swconfig"
   wget http://www.debwrt.net/download/packages/mipsel/swconfig_0.1_mipsel.deb -O /tmp/swconfig_0.1_mipsel.deb
   dpkg -i /tmp/swconfig_0.1_mipsel.deb
fi
 
if dpkg-query -l "debwrt-net" | grep -e ^.i; then
   echo "debwrt-net is already installed"
else
   echo "Installing debwrt-net"
   wget http://www.debwrt.net/download/packages/mipsel/debwrt-net_0.2_all.deb -O /tmp/debwrt-net_0.2_all.deb
   dpkg -i /tmp/debwrt-net_0.2_all.deb
   aptitude hold debwrt-net
fi

#Download patches
echo "Downloading patchfiles"
wget http://dl.dropbox.com/u/29682150/patches/sources.patch -O /tmp/sources.patch
wget http://dl.dropbox.com/u/29682150/patches/debwrt-net.patch -O /tmp/debwrt-net.patch

echo "Patching files and enabling dnsmasq"
patch -p0 < /tmp/sources.patch
patch -p0 < /tmp/debwrt-net.patch

#Backup old interfaces file, move new one into place
echo "Enabling new interfaces file"
rm /etc/network/interfaces
ln -s /etc/network/interfaces.broadcom /etc/network/interfaces
 
#Enable wireless LED (Power LED is controlled by interfaces file)
if dpkg-query -l "libnvram" | grep -e ^.i; then
   echo "libnvram is already installed"
else
   echo "Installing libnvram"
   wget http://www.debwrt.net/download/packages/mipsel/libnvram_1.0_mipsel.deb -O /tmp/libnvram_1.0_mipsel.deb
   dpkg -i /tmp/libnvram_1.0_mipsel.deb
fi
 
if dpkg-query -l "nvram" | grep -e ^.i; then
   echo "nvram is already installed"
else
   echo "Installing nvram"
   wget http://www.debwrt.net/download/packages/mipsel/nvram_1.0_mipsel.deb -O /tmp/nvram_1.0_mipsel.deb
   dpkg -i /tmp/nvram_1.0_mipsel.deb
fi
 
echo "Enabling wireless LED"
nvram set wl0gpio7=8
nvram set sb/1/leddc=0x5A000A
nvram commit
 
#Set SSID
STRING1="ssid DebWrt"
STRING2="-s DebWrt"
echo "Please enter your desired wireless network name (Do not include any spaces)"
read NETNAME
NEWSTRING1="ssid "${NETNAME}
NEWSTRING2="-s "${NETNAME}
DPATH="/etc/network/interfaces"
for f in $DPATH
do
   if [ -f $f -a -r $f ]; then
      sed -i "s/$STRING1/$NEWSTRING1/g" "$f"
      sed -i "s/$STRING2/$NEWSTRING2/g" "$f"
      echo "Network name set successfully"
   else
      echo "Error: Cannot read $f, network name has not been changed"
   fi
done

#Set wireless password
OLDPASSWORD="debwrtdebwrt"
echo "Please enter your desired wireless password (Do not include any spaces)"
read NEWPASSWORD
DPATH="/etc/network/interfaces"
for f in $DPATH
do
   if [ -f $f -a -r $f ]; then
      sed -i "s/$OLDPASSWORD/$NEWPASSWORD/g" "$f"
      echo "Password set successfully"
   else
      echo "Error: Cannot read $f, password has not been changed"
   fi
done
 
#Set timezone
if dpkg-query -l "tzdata" | grep -q ^.i; then
   echo "Set time-zone"
   dpkg-reconfigure tzdata
fi
 
#Reset root password
echo "Resetting root password"
passwd
 
#Reboot the router
echo "Router is rebooting..."
reboot
 
exit 0

위 스크립트를 실행하다 보면 robocfg와 hostapd 등의 소프트웨어 설치도중 maintainer의 application을 설치할 것인지 물어보는데, 그냥 엔터를 치면 된다. Sourcelist의 패키지로 업데이트 하는 경우 dependency가 깨져서 오히려 정상 동작하지 않는 것 같다


마지막에는 WLAN의 SSID, Password를 입력하라는 메시지가 뜨고, 이후 타임존과 root 계정의 암호를 변경한 뒤 재부팅 된다

여기까지 동작해 설정을 완료하였다면, LAN 포트로는 DHCP를 통해 아이피를 받고 인터넷에 접속할 수 있어야 하며, WLAN 인터페이스도 동작해서 WiFi를 통해 인터넷 사용이 가능할 것이다


홈 서버 구축


네트워크 설정이 완료되고 나면 해당 라우터에 WAS를 구축한다. 아래와 같은 script 를 실행한다. 설치가 되는 도중 mysql-server의 root 암호를 설정하는 창이 나온다. 원하는 root password를 입력하면 된다.

apt-get update
apt-get install apache2 php5 php5-mysql mysql-server







  1. http://en.wikipedia.org/wiki/Debian [본문으로]
  2. http://www.debwrt.net/ [본문으로]
  3. http://dev.debwrt.net/wiki/TableOfSupportedHardware?version=37 [본문으로]
  4. http://wiki.openwrt.org/toh/asus/rt-n16 [본문으로]
  5. http://www.debwrt.net/download/releases/2.0/ 에서도 다운로드가 가능하지만, 이는 ASUS RT-N16에서 정상 동작하지 않는다. ASUS RT-N16은 공식 DebWrt 가 지원하는 것이 아니고, 사용자들이 modify한 module 하에서 동작하기 때문이다. [본문으로]
0 Comments
댓글쓰기 폼