삽질하는플머

Synology USBStation2 사용기 2. AMP 설치.

이런저런잡다구리/Synology-nas

아래 글을 먼저 읽고 오세요~ ^^;

"Synology USBStation2 사용기 1. 전원 꽂고 optware 깔기."



짤방은 재활용 쓰레기장에서 득템한 외장케이스. 앞부분 래치가 부러져 하드를 고정할 수 없어 버려진 듯. 

하우징 쇠 부분에 드릴로 구멍을 뚫고 클립을 펼쳐 관통시켰더니 잘 고정된다. e-sata, usb 지원. 

함께 입양된 1TB 하드를 넣어 USBStation2 에 물려줌. 



USBStation2의 포지션은 어디까지나 NAS가 아닌 NAS Adapter 라고 하지만, 성능면에 DS110j와 별반 다르지 않은데도 웹서비스가 빠졌다는 점은 아무리 생각해도 좀 깬다. 저렴한 버팔로 NAS도 아파치와 PHP, MySQL 정도는 기본으로 들어가 있는데 말이지... 그리고 들여다 보면 알겠지만 이미 아파치의 httpd 도 두 개나 돌고 있다. 기능이 충분한데도 넣지 않는 건 순전히 정책적인 결정이라고 생각한다. 


그러나 이미 우리 손에 쥐어진 ipkg 라는 전가의 보도!! AMP도 얼마든지 올려볼 수 있다. (버전이 좀 낮기는 해도...)


일단 관련 패키지들 설치. 


# ipkg install apache php mysql sqlite openldap-libs php-apache phpmyadmin 



우분투처럼 깔면 깔린 그대로 돌아가면 좋겠지만... 아쉽게도 몇가지 손을 봐줘야 한다. 

/opt/etc/apache2/httpd.conf 파일을 편집.


먼저 구동시 에러를 내는 74라인의 mod_ext_filter.so 모듈 로딩하는 부분은 앞에 '#'을 붙여 주석처리. 


# LoadModule ext_filter_module libexec/mod_ext_filter.so



USBStation2 에서 웹 기본 포트인 80번 포트는 이미 관리페이지인 5000번으로 리다이렉션 시키는 용도로 사용중이다. 

기본 내장된 아파치가 이 작업을 하는데 어디서 띄우는지는 아직 확인하지 못했다. (귀찮아서...) 어차피 가정용 ISP에서 80포트 막아둔 곳도 많고 필요하다면 공유기에서 포워딩하면 되니까 리슨포트는 8000 그대로 둔다. DS110j와의 가격차이를 생각하면 이 정도 쯤이야 패널티라고 생각하지 뭐.  


Listen 8000



서버명은 다음과 같이 수정. 


ServerName *:8000



LoadModule 어쩌구가 잔뜩 적혀있는 119라인 근처에 다음 두 줄을 추가해준다. 

AddType application/x-httpd-php .php
LoadModule php5_module libexec/libphp5.so


<IfModule dir_module> 부분을 찾아 다음과 같이 수정해준다. (235라인 근처...)

<IfModule dir_module>
    DirectoryIndex index.html index.htm index.cgi index.php index.php3
</IfModule>


아파치 구동. 


# /opt/sbin/apachectl start



http://usbstation2:8000 에 접속해보자. It works! 라는 반가운 메시지가 나오면 일단 성공! 




웹 서비스 루트 기본값은 /opt/share/www 이다. 여기에 다음 내용을 담은 test.php 파일을 만들어주자. 


# vi /opt/share/www/test.php


<?php

phpinfo();

?>



http://usbstation2:8000/test.php 에 접속해서 다음과 같은 화면이 나오면 최종 성공!! 





여기까지 잘 되었다면 조금 전에 설치한 phpmyadmin 도 제대로 동작할 것이다.

http://usbstation2:8000/phpmyadmin/ 에 접속 테스트. 





이제 DB에 적절한 권한을 설정하고 미디어위키를 깔건 그누보드를 깔건 마음대로 가지고 놀면 된다. 


Synology USBStation2 사용기 1. 전원 꽂고 optware 깔기.

이런저런잡다구리/Synology-nas

클리앙 장터에서 1TB 하드와 함께 쿨매로 나온 USBStation2 를 손에 넣게 되었다. 

흔히 NAS Adapter 라고도 불리는 이 제품은, 기계 자체에 펌웨어가 내장되어있어 단순히 외장하드를 연결해 주는 것 만으로도 바로 사용할 수 있는 멋진 물건이다. 






하드웨어 설치는 간단한 편인데 아답터가 에러 @_@!! 

전원 부분이 얇아 220v 소켓에 꽂으면 싸구려 중국제마냥 덜렁거려 아무래도 적당한 녀석으로 바꿔줘야 할 듯 싶다. 


책상속에 마침 곰팡이가 핀 2GB USB 메모리가 보이길래 함께 꽂아주었다. 




DS110j의 경우 부팅이 끝나면 삑~! 하고 비프음이 나오는데, USBStation2는 그딴 거 없다!! 

POWER 와 DISK 램프의 깜박임이 완료된 후 기본 호스트명인 usbstation2 에 핑을 날려본다. 




웹브라우저를 띄우고 http://usbstation2 에 접속. 초기 접속 아이디는 admin 이며 암호는 없다. 




깔려있는 DSM 버전은 3.2-1944, USBStation2 는 최신버전 DSM 4.0의 지원대상에서 제외되었다.
아쉬움을 뒤로하고 제어판에서 DSM 3.2-1968 버전을 내려받는다. 




업데이트를 마치고 재부팅한 뒤 네트워크 이름을 usbstation2 에서 my-storage 등으로 적당히 변경. 

표준 시간대 설정하고 NTP서버와 동기화를 선택해 시간은 자동으로 맞춰지도록 한다. 

제어판 - 사용자에서 admin 과 guest 에 적절한 암호를 설정. 

나머지 설정도 적당히 마무리 짓고... 마지막으로 제어판 - 터미널에서 SSH 서비스를 활성화 한다. 




PuTTy 로 접속 테스트. 





제어판 -> 외부 장치에서 뒷면에 꽂아둔 2GB 메모리를 EXT4 파티션으로 포멧한다. 

이 공간은 optware 용으로 사용할 것이다. 




구글에서 USBStation2와 optware 로 검색해서 건진 마르님의 멋진 따라하기. 


http://blog.naver.com/amarese/140153263988

http://cafe.naver.com/synologynas/13207


기왕에 DSM 버전도 가능한 최신버전으로 업했으니... 
두번째 링크에 isul 님이 남겨주신 댓글을 참조해 수정펌이 아닌 정펌에 optware를 올리는 방법을 찾아보자. 



이하 작업은 root 로 로그인한 뒤 진행. SSH로 root 접속시 암호는 admin에 설정한 것과 동일하다. 


USB메모리에 @optware 라는 폴더를 만들어 준다. 


# cd /volumeUSB2/usbshare

# mkdir @optware



/volume1 은 USBStation2의 플래시 영역이다. 앞에서 만들어준 @optware 디렉토리에 대한 심볼릭 링크를 여기에 만들어준다. 


# mkdir /volume1/system

# cd /volume1/system

# ln -s /volumeUSB2/usbshare/@optware



/opt 에 이 심볼릭 링크를 마운트 한다. 


# mount --bind "/volume1/system/@optware" "/opt"



이제 부트스트랩 작업. (참조: http://lycons.iptime.org/tc/49)


# wget http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/syno-mvkw-bootstrap_1.2-7_arm.xsh

# sh syno-mvkw-bootstrap_1.2-7_arm.xsh



/opt/etc/ipkg.conf 파일을 열고 마지막에 다음 라인을 추가. 


src cs08q1armel http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable



/etc/profile 열고 마지막에 다음과 같이 수정 또는 추가. 


PATH=/opt/bin:/opt/sbin:$PATH



ipkg 의 업데이트. 


# ipkg update

# ipkg upgrade



/etc/rc.local 에 붉게 적힌 내용 추가. 재부팅 후에도 동작하도록 해준다. 


#!/bin/sh


until [ -d /opt/bin ];

do

  sleep 5

  mount --bind "/volume1/system/@optware" "/opt"

done


# Optware setup

[ -x /etc/rc.optware ] && /etc/rc.optware start


exit 0



USB 마운트가 성공해서 /opt/bin 디렉토리가 생길 때 까지 5초마다 한번씩 마운트를 시도를 되풀이 하고 있다. 

원래 마르님의 글에서는 2초면 충분하다고 했는데, 내가 가진 일부 하드의 경우 40초 이상이 필요한 경우도 있어 꼼수를 부림. 


이제 재부팅. 


# reboot



df -h 명령으로 /opt 에 /volume1/system/@optware 가 제대로 마운트 되었는지 살핀다. 





ipkg 테스트 겸 설치해보는 nano. 


# ipkg install nano

# nano





마지막 산이 하나 더 남아있다. USBStation2 는 저가형 답게 공유폴더를 따로 지정할 수 없고 USB에 접속한 스토리지 자체가 통째로 공유되는 방식이다. 때문에 탐색기로 방금 optware 를 설치한 2GB 메모리를 들여다 보면 속살이 모두 드러나 조금 곤란하다. 




공유기능을 끄는 것도 불가능하다. 물론 탐색기 환경에 나타나지 않도록 설정할 수는 있지만 그래도 찜찜하다. 

정책 때문이라고 해도 왠치 치사하다는 느낌이 든다. 뭐 Synology의 장점은 맘에 안들면 고쳐 쓰면 된다는 거니... 


볼륨 루트 밑에 새 공유 디렉토리 public을 생성한다. 


# mkdir /volumeUSB2/usbshare/public



/usr/syno/etc/smb.conf 파일을 열고 다음과 같이 수정. 


......

[usbshare2] <<-- 이 부분도 맘에 드는 이름으로 바꿔주자

        invalid users=nobody,nobody

        valid users=nobody,guest,admin,nobody

        comment="Power Quotient International Co., Ltd"

        path=/volumeUSB2/usbshare/public

        guest ok=yes

        browseable=yes

        fileindex=no

        mediaindex=yes

......



삼바 데몬 재구동. 


# /usr/syno/etc/rc.d/S80samba.sh restart



다시 탐색기로 접근해 보면 더이상 불필요한 내용은 표시되지 않는다. 
비슷한 요령으로 USBStation2에서 제한된 여러개의 공유디렉토리 기능을 흉내낼 수 있으며, 이렇게 만들어낸 각 공유디렉토리는 DSM 내부에서 얼마든지 사용자권한이나 탐색기에서 표시여부 등을 수정해줄 수 있다. 


하지만 재부팅하면 말짱 도루묵 @_@ !!! 

chmod 444로 쓰기 권한을 빼앗아도 이 파일은 부팅과 동시에 재작성된다. 

고민하다가... 수정한 설정파일을 백업하고, optware 가 구동될 때 새로 생성된 설정과 바꿔치운 뒤 삼바를 재구동하는 방법을 쓰기로 함. 


일단 설정파일 백업. 


# cp /usr/syno/etc/smb.conf /usr/syno/etc/smb.conf.myconf



/etc/rc.local 을 다시 열고 다음 내용을 추가한다. 


#!/bin/sh


# mount usb's optware directory

until [ -d /opt/bin ];

do

  sleep 5

  mount --bind "/volume1/system/@optware" "/opt"

done


cp /usr/syno/etc/smb.conf /usr/syno/etc/smb.conf.org  

cp /usr/syno/etc/smb.conf.myconf /usr/syno/etc/smb.conf

/usr/syno/etc/rc.d/S80samba.sh restart


# Optware setup

[ -x /etc/rc.optware ] && /etc/rc.optware start


exit 0



이후 사용자 설정등을 변경하거나 할 때는 다시 smb.conf.myconf 를 복사해 두어야 한다. 약간의 귀차니즘이 느껴지네... 


오늘은 여기까지... 다음번에는 USBStation2에 이유없이 금지된 웹서비스 대신 APM을 올려보자. 



Synology NAS DS110j: SSH 접속시 한글 파일 제대로 표시하기.

이런저런잡다구리/Synology-nas

DS110j 에 SSH로 접속해보면, 한글로 된 파일명이 모두 '?' 로 출력되어 참 보기 숭하다. 




Synology+nas+locale 로 검색, DS-710+ 에 로케일 설정 방법이 설명된 게시물을 건졌다. 구글 만세!


http://www.jlancer.net/board/article_view.jsp?article_no=1591&board_no=37&table_cd=EPAR01&table_no=01

http://www.jlancer.net/board/article_view.jsp?article_no=1592&board_no=37&table_cd=EPAR01&table_no=01




위 글을 참조해 DS110j 에 로케일을 설정해보자. 먼저 Putty의 코드페이지는 UTF-8로 설정. 




Synology NAS GPL Source 페이지에 가서 자신의 DSM 버전에 맞는 툴체인을 내려받는다. 




위 경우는 3.1이므로 "Home/DSM 3.1/Marvell 88F628x Linux 2.6.32" 내의 gcc421_glibc25_88f628x.tgz 파일을 내려받아 압축을 푼다. 


# tar -xzf gcc421_glibc25_88f628x.tgz



이 툴체인은 x86 리눅스에서 NAS용 프로그램을 빌드할 수 있는 크로스 컴파일 환경이다. 

다음 기회에 해부해보도록 하고, 일단 arm_linux 용 localelocaledef 실행파일  및 i18n 디렉토리를 시스템으로 복사한다. 


# cp arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/bin/locale* /bin/

# cp -R arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/usr/share/i18n/ /usr/share/



locale 명령을 실행시켜보자. 

# locale -a
C
POSIX


localedef 로 새 로케일을 추가하고 잘 되었는지 및 확인.

# localedef -c -f UTF-8 -i en_US en_US.UTF-8
# locale -a
C
en_US.utf8 
POSIX    


재부팅 후 다음 명령을 실행시키고 

# export LANG=en_US.utf8
# export LC_ALL=en_US.utf8


한글이름 파일을 만들어보자. 제대로 동작하면 성공. 

# touch 한글한글.txt
# ls -l



bash 셸을 설치했다면 위의 LANG, LC_ALL 설정을 /opt/etc/profile 파일에 넣어주면 재부팅해도 제대로 동작한다. 




Synology NAS DS110j 에 mono 올리기

이런저런잡다구리/Synology-nas



Synology NAS 에 mono 를 올리면 아주 신나는 일이 많이 생길 것 같아. 
닷넷 바이너리가 직접 돌아간다면 윈도에서 작업한 이런 저런 물건들을 쉽게 돌려볼 수 있잖아~ 
ipkg system이 설치된 DS110j 는 "ipkg install mono" 명령으로 2.4 버전의 모노를 설치할 수 있지만
닷넷 4.0 바이너리를 구동하려면 mono 버전이 2.8 이상이 되어야 하니... 직접 빌드하는 방법을 찾아보자. 

일단 구글을 뒤적뒤적. Synology DS211 에 mono-2.11.0 을 올리는 방법이 잘 정리된 아주 멋진 블로그를 건짐. 

http://blog.hexad.dk/2012/03/mono-211-binary-build-for-synology-211.html



이 글을 적는 시점에서 최신버전은 2.11.1 이니 그걸로 해보자. 과정은 위의 링크와 동일.
먼저 빌드에 필요한 패키지들을 설치한다. 

# ipkg install wget make automake autoconf bison glib libc-dev libstdc++ m4 gcc gawk textutils gettext zlib



mono 2.11.1 의 소스를 내려받고 압축을 푼다. 그리고 빌드 준비. 

configure 에서 --prefix 파라미터를 통해 /usr 가 아닌 /opt/mono-2.11 에 설치한다. 
혹시 나중에 제거할 일이 생겨도 이렇게 해 두면 편하다. 


# wget "http://download.mono-project.com/sources/mono/mono-2.11.1.tar.bz2"

# tar -xf mono-2.11.1.tar.bz2

# cd mono-2.11.1

# ./configure --prefix=/opt/mono-2.11.1



다음 파일들을 편집기에서 열어준다. 


mono/metadata/Makefile

mono/mini/Makefile

mono/profiler/Makefile



아래 라인을 찾아서 


LDFLAGS = 



-lrt 플래그를 추가해준다. 이유는 여기를 클릭. 


LDFLAGS = -lrt 



ipkg 에서 제공되는 pthreads 라이브러리에 문제가 있기 때문에, 빌드를 위해서는 원래의 pthreads 로 바꿔주어야 한다. 

방법은 다음과 같다. 

# mkdir /opt/arm-none-linux-gnueabi/lib_disabled
# mv /opt/arm-none-linux-gnueabi/lib/libpthread* /opt/arm-none-linux-gnueabi/lib_disabled
# cp /lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/
# ln -s /opt/arm-none-linux-gnueabi/lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/libpthread.so
# ln -s /opt/arm-none-linux-gnueabi/lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/libpthread-2.5.so


DS110j 는 아주 느린 환경이므로 빌드는 지루한 작업이다. 
혹시라도 중간에 네트웍에 문제가 생겨 SSH 연결이 끊기면 말짱 황이므로 screen 의 사용을 적극 권장한다. 

# ipkg install screen


screen은 딱 네가지만 기억하면 된다. 실행은 screen, 디태치는 Ctrl+A+D, 다시 붙일 때는 screen -r, 종료는 exit. 
좀 더 자세한 사용기는 여기를 클릭

이제 빌드 시작. 

# make


정말 하루 종일 걸린다. 헥헥... 다 끝났으면 다음 명령으로 /opt/mono-2.11.1 에 설치

# make install


인생을 좀 편하게 살기 위해 몇개의 심볼릭 링크를 만들어주자. 

# ln -s /opt/mono-2.11.1/bin/mono /opt/bin/mono
# ln -s /opt/mono-2.11.1/bin/mcs /opt/bin/mcs
# ln -s /opt/mono-2.11.1/bin/gmcs /opt/bin/gmcs


실행시켜보면 

# mono --version







설치가 끝났으니 제대로 굴러가는지 테스트를 해 봐야지. 
SharpDevelop 를 실행시키고 간단한 콘솔프로그램을 만들어 보자. 



윈도에서 실행시킨 모습. 





컴파일된 console.exe 를 NAS 로 옮겨서 돌려보자. 

# mono ./console.exe



지난번 포스트에서 테스트했던 간단한 C# 에코서버도 물론 잘 동작한다. 



초기 구동은 아무래도 느리지만, 반응은 제법 빠릿빠릿 하다. 아주 만족스럽네.
간단한 채팅서버나 작은 게임서버 정도는 충분히 돌릴 수 있을 듯. 



Synology NAS의 MySQL 테이블 대소문자 구분 설정

이런저런잡다구리/Synology-nas

윈도의 MySQL 에서 작성한 DB 스키마를 Synology NAS 의 MySQL로 옮겨 테스트 하자마자 쏟아지는 에러. 

CREATE TABLE 또는 CREATE DATABASE 에서 대소문자를 예쁘게 구분해봐야 저장될 때는 소문자로 저장되는게 어찌 희안하더라니... 

윈도의  MySQL 에서는 SQL문 내의 테이블과 데이터베이스에서 대소문자를 구분하지 않지만, NAS의 리눅스에서는 구분하고 있다. 

일단 SQL문을 뜯어고쳐 대소문자를 맞춰주기는 했는데... 덕분에 아무래도 유기농 코드가 잔뜩 만들어진 듯...  (벌레 벌레~)

윈도와 리눅스의 MySQL 설정이 달라서 애를 먹은 게 한두번이 아니었지만... 그래도 이건 좀 아니잖아. 

이 설정을 동일하게 맞추는 방법이 없을까 하고 뒤져보니  lower_case_table_names 를 살펴보란다. 


http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html



이 변수의 기본값이 윈도와 맥에서는 1로, 리눅스에서는 0으로 설정된다고 한다. 각 값의 의미는 다음과 같다. 


의미
0테이블과 데이터베이스 이름들은 CREATE TABLE 또는 DATABASE 문에 정의된 문자로 디스크에 저장되며 이름 비교시 대소문자를 구분한다.
1테이블과 데이터베이스 이름들은 소문자로 저장되고 이름 비교시 대소문자를 구분하지 않는다.
2테이블과 데이터베이스 이름들은 CREATE TABLE 또는 DATABASE 문에 정의된 문자로 디스크에 저장되며 이름 비교시 대소문자를 구분하지 않는다.


가성비가 떨어지는데도 불구하고 Synology NAS를 좋아하는 건, SSH 연결을 지원하기 때문이지.
부트스트랩을 통해 이런저런 도구들도 마음대로 설치할 수 있고...

http://lycons.iptime.org/tc/49


요새는 QNAP 것도 끌리는데... 어디 출장 나가는 사람 없나... 가격 차이가 이건 뭐 두배나 나니...


아무튼 SSH로 접속한 다음 my.cnf 를 찾아보자. 응? 그렇게 생긴 파일이 하나도 없네??

my*.cnf 로 검색해보니 다섯개의 파일이 튀어나온다. 


# find / -name my*.cnf

/usr/syno/mysql/share/mysql/my-huge.cnf

/usr/syno/mysql/share/mysql/my-small.cnf

/usr/syno/mysql/share/mysql/my-innodb-heavy-4G.cnf

/usr/syno/mysql/share/mysql/my-large.cnf

/usr/syno/mysql/share/mysql/my-medium.cnf



현재 사용중인 물건은 메모리 128M짜리 DS-110j



my-medium.cnf 을 설정파일로 사용하면 되겠군. 이 파일을 /ect/my.cnf 로 복사한다. 


# cp /usr/syno/mysql/share/mysql/my-medium.cnf /etc/my.cnf



my.cnf 파일을 열고 [mysqld] 항목 아래에 다음 설정을 추가. 


lower_case_table_names = 1



NAS의 mysql 데몬 재구동은 다음과 같이. 


/usr/syno/etc/rc.d/S21mysql.sh restart



제대로 설정되었는지 확인하려면 아래 SQL을 실행. 


SHOW VARIABLES LIKE  'lower_case_table_names'


Variable_nameValue
lower_case_table_names1


우분투의 경우도 요령은 동일하다.