삽질하는플머

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# 에코서버도 물론 잘 동작한다. 



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



NAS 갖고놀기 - DS110j

이런저런잡다구리/Synology-nas
Synology의  NAS 는 X86, PPC, Arm 등 다양한 CPU를 사용한 제품이 있다. 그 중 ARM 기반의 DS110j 를 갖고 놀게 되었다. 




카페도 있다. 
http://cafe.naver.com/synologynas

대충 설치를 마치고 접속해보니 이것이야말로 신세경. 진작 써볼 껄... 

일단 SSH 접속부터 설정.  




부트스트랩을 올리는 방법이라는데 후덜덜하군. 

DS110j 의 CPU 정보는 여기서 확인. 독일어이므로 영어로 바꿔보자. 

여기에 나와있는 링크를 NAS의 Public 에 저장. 
http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable/syno-mvkw-bootstrap_1.2-7_arm.xsh

SSH로 접속해서 /volume1/public 으로 이동 후 과감하게 실행해보자.  ipkg 사용가능. 우햐~~ 뭐 이런~~
(루트권한 필요. su 또는 아예 root로 접속해 처리할 것) 
업데이트/업그레이드 실행. 

ipkg update
ipkg upgrade


몇년이 지나도 vi 는 익숙해지지 않는다. 발전이 없구먼... 암튼 nano 부터 깔아보자.  

ipkg install nano


히야~ nano 가 떴다~~




데몬 스크립트들은 /usr/syno/etc/rc.d 에 위치한다. 루트디렉토리에 etc, etc.defaults 가 별개로 있는 이유는 잘 모르겠네. 



로컬 네트웍상의 익명 rsync 서버로서 가지고 놀아보기.  


현 시점에서 /etc/rsyncd.conf 파일은 다음과 같이 되어있다. 

#motd file = /etc/rsyncd.motd
#log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
use chroot = no
[NetBackup]
path = /var/services/NetBackup
comment = Network Backup Share
uid = root
gid = root
read only = no
list = yes
charset = utf-8
auth users = root
secrets file = /etc/rsyncd.secrets


여기에 설정된 NetBackup 이 제대로 동작하는지 테스트 해 보자. 

C:\SyncWork-Test> rsync -avz --delete root@zh-storage::NetBackup
rsync: failed to connect to zh-storage: Connection refused (111)
rsync error: error in socket IO (code 10) at /home/lapo/packaging/rsync-3.0.7-1
src/rsync-3.0.7/clientserver.c(122) [Receiver=3.0.7]


rsync 데몬이 돌고있지 않은 상태이므로 일반 접속으로는 붙지 않는다. 
RSH 접속은 어떨까. 

C:\SyncWork-Test> rsync -avz --delete root@zh-storage:~/
root@zh-storage's password:
receiving incremental file list
drwxr-xr-x        4096 2010/11/02 17:18:18 .
-rw-r--r--          22 2010/11/02 17:18:18 .bashrc
-rw-r--r--          40 2010/11/02 17:17:21 .inputrc
-rw-r--r--         396 2003/09/04 18:49:39 .profile

sent 11 bytes  received 85 bytes  21.33 bytes/sec
total size is 458  speedup is 4.77


아주 잘 동작하는군... 현재 설정된 rsh 에서 대상의 rsync 를 구동시키기 때문이다. 
그리고 쩝... 현 시점에서 /var/services/ 에 NetBackup 이라는 디렉토리는 존재하지 않는다. 카페의 사용기를 보면 네트웍 백업을 활성화하면 나타나는 듯 한데... 이 펌웨어에는 그런 메뉴가 없다. 


NAS로 들어가서 rsync 데몬을 굴려보자. 

일단 /volume1/public/rsync-test 디렉토리를 만들고 /etc/rsyncd.conf 를 rsyncd.my.conf 로 복사. 내용을 다음과 같이 편집하자. 

pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
use chroot = no

[rsync-test]
path = /volume1/public/rsync-test
comment = rsync test directory
read only = no
list = yes
charset = utf-8


이제 rsync 를 데몬모드로 구동. 

rsync --config=/etc/rsyncd.my.conf --daemon


데몬이 도는지도 확인해보자. 

$ ps | grep rsync
30870 root      8000 S    rsync --config=/etc/rsyncd.my.conf --daemon
30980 root      2944 S    grep rsync
$ cat /var/run/rsyncd.pid
30870


앞에서 내렸던 명령을 다시 한 번 때려보자. 익명모드로 만들었으므로 유저없이 접근 가능. 

C:\SyncWork-Test>rsync -avz --delete zh-storage::rsync-test
receiving incremental file list
drwxrwxrwx        4096 2010/11/02 17:55:13 .

sent 32 bytes  received 68 bytes  66.67 bytes/sec
total size is 0  speedup is 0.00


잘 되는군. 위에서 read only = no 로 설정했으므로 보내기도 가능하다. 

C:\SyncWork-Test>rsync -avz --delete ./ zh-storage::rsync-test
sending incremental file list
./
rsync: failed to set times on "." (in rsync-test): Operation not permitted (1)
aaa.bmp
aaa.png
curl_stack.h
curl_stack.o
main.o

sent 151433 bytes  received 106 bytes  303078.00 bytes/sec
total size is 1513787  speedup is 9.99
rsync error: some files/attrs were not transferred (see previous errors) (code
3) at /home/lapo/packaging/rsync-3.0.7-1/src/rsync-3.0.7/main.c(1042) [sender=3
0.7]


문제는 이 명령어를 NAS 로그인과 동시에 실행시키는 건데... rc.d 는 /usr/syno/etc 에 있고 rc.local 은 /etc 에 존재... 
일단 /etc/rc.local 에 다음과 같이 추가하고 재부팅 해 보자. 

#rsync daemon
rsync --config=/etc/rsyncd.my.conf --daemon


(루트계정으로 로그온한 상태에서는 poweroff, reboot 명령이 먹는다.)

재부팅한 뒤 ps | grep rsync 때려보면 데몬이 잘 돌아가고 있는 게 보인다. 일단 해결. 

--------
2010.11.3

도움말을 읽다보니 이렇게 데몬을 띄우지 않아도 활성화되는 rsync 모듈이 이미 있는 듯 하다. 
/usr/syno/etc/rc.d/S84rsyncd.sh 이 그 물건이겠지. 

일단 위에서 띄운 데몬을 죽이고 관리화면에서 백업및 복원 -> 네트워크 백업서비스 활성화 를 켜보자. 




zh-storage> ps | grep rsync
22587 root      8000 S    /usr/syno/bin/rsync --daemon
22890 root      2944 S    grep rsync

rsync 데몬이 구동중이고, 이 설정파일은 위에서 살펴봤던 /etc/rsyncd.conf 를 사용할 것으로 보인다. 

이 서버스는 동종의 Synology 머신에서 백업을 때릴 때 받아주는 역할을 하므로, 자유도가 떨어진다. 
좀 더 살펴봐야겠지만, 나하고는 안어울림. 





한걸음만 더 나가보자... crond 를 써서 원격지에서 주어진 시간마다 특정 폴더를 자동으로 rsync로 동기화하는 것도 테스트. 
일단 rsync 와 달리 crond 는 기본적으로 떠있는 상태. 다행 다행~~

위에서 살펴본 것 처럼 /etc/rc.local 이 제대로 동작하므로 /etc/crontab 도 잘 동작할 것으로 보인다. 




WebDAV 설정법 참고



2010.11.6  Bash 설치

 http://isulnara.com/tt/202

Bootstrap 과 coreutils 가 먼저 설치되어있어야 한다. 설치 후 bash 깔 것. 

# ipkg install coreutils
# ipkg install bash

/etc/passwd 에서 root의 셸을 bash로 변경

root:x:0:0:root:/root:/opt/bin/bash

설정파일 링크. 

# ln -s /opt/etc/profile /root/.bash_profile
# ln -s /opt/etc/profile /root/.bashrc

/opt/etc/profile 수정 - 필요에 따라 적당히 수정
#
# Bash initialization script
#

PS1='[\u@\h:\w]# '
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/bin:/usr/syno/sbin:/opt/sbin:/opt/bin
LD_LIBRARY_PATH=/opt/lib:${LD_LIBRARY_PATH}

export PS1 PATH LD_LIBRARY_PATH

MANPATH=/opt/man:${MANPATH}

if [ `/usr/bin/id -u` -eq 0 ]; then
HOME=/root
else
HOME=/volume1/`/usr/bin/id -n -u`
fi

EDITOR=vim
PAGER=less
TERM=linux
TERMINFO=/opt/lib/terminfo
MANPAGER='less -isrR'
RSYNC_RSH=ssh

export PATH OUTPUT_CHARSET MANPATH HOME EDITOR PAGER TERM MANPAGER RSYNC_RSH TERMINFO

alias ll='ls -la --color=auto'


그리고 접속확인. 무엇보다 중요한 것은 현재 작업중인 연결을 끊지 말고 새 연결을 시도할 것
잘못되면 완전 초기화해야 할 수도 있기 때문임. 






2011.3.30. SVN 설정하기. 

http://forum.synology.com/wiki/index.php/Step-by-step_guide_to_installing_Subversion 

먼저 제어판에서 snvowner 라는 유저를 생성하자. 어드민권한도 줌. 
svn 폴더를 만들고 네트웍에서 감춤. svnowner 에 접근권한도 줌. 

SSH접속후 다음과 같이 입력해 설치. 
ipkg install svn

위 글에서는 SVN 데몬을 상시로 띄우는 것 보다는 inetd 를 써서 필요할 때만 쓰는 방법을 추천하고 있다. 

/etc/inetd.conf 파일에 다음 라인 추가. 

svn stream tcp nowait svnowner /opt/bin/svnserve svnserve -i -r /volume1/svn



/etc/services 파일에 다음 라인 추가. 

svn 3690/tcp # Subversion 
svn 3690/udp # Subversion



이 시점에서 reboot 한 번 해줌. 

 root로 SSH접속 후 다음과 svnowner 로 변경. 

su svnowner --> 잘 안되네...
/etc/passwd 에서 로그인용 셸을 지정해주어야 한다. 
svnowner:x:1026:100:SVN 관리자:/var/services/homes/svnowner:/sbin/nologin
다시 su svnowner

SVN을 테스트 해보자.

cd /volume1/svn 
svnadmin create test 

권한설정을 테스트 해보자. 
/volume1/svn/test/conf/passwd 파일을 열고 다음과 같이 입력. 

[users] 
testuser = 1234


 /volume1/svn/test/conf/svnserve.conf 파일에 다음과 같이 구성. 
 

[general] 
anon-access = none 
auth-access = write 
password-db = passwd 
realm = I am your test repository


exit 를 입력, root 로 돌아온다. 

이제 거북이 등 SVN 클라에서 위에 설정한 유저로 체크아웃. 

svn co svn://<IP of your Diskstation>/test <some localfolder>

로컬에서 테스트하려면 이렇게. 

svn co svn://127.0.0.1/test test

root의 암호를 물을 때는 그냥 엔터. 이후 유저와 암호를 위에서 설정한 값으로 입력. 

체크아웃된 test 디렉토리로 이동후 다음과 같이 해보세. 

echo "I am a Test" > test.txt
svn add test.txt
svn ci -m "Commit test"


커밋 잘된다. 거북이에서도 요령은 동일.


2011.5.4 추가. 
pre--revprop-change 라는게 있군. 이걸 설정해줘야 거북이 SVN에서 지난로그 수정하는게 된다. 
http://www.pyrasis.com/main/SubversionCommitMail-HOWTO
 
SVN 작업디렉토리 내 hook 디렉토리에 가서 다음과 같이 하자. 

cp pre-revprop-change.tmpl pre-revprop-change
chmod 755 pre-revprop-change






2011.3.31. 모니위키 이전을 위한 설정. 

아파치 설정파일은 /usr/syno/apache/conf 에 존재. httpd.conf  들여다봄.  
도큐멘트 루트는 다음과 같이 되어있다. 

DocumentRoot "/var/services/web"

이 디렉토리는 /volume1/web 으로 심볼릭 링크되어있음. 

웹 디렉토리 밑에 주렁주렁 깔아주는 것 보다 다른 곳에서 링크하는 게 나아보임.  /volume1/@hideweb/moniwiki 디렉토리 생성. 
웹서비스 재시작시 httpd.conf 는 원래대로 돌아가버리니  httpd.conf-user 파일을 편집. 

<IfModule alias_module>
    # Alias for MoniWiki

    Alias /MoniWiki/    "/volume1/@hideweb/moniwiki/"
    Alias /MoniWiki     "/volume1/@hideweb/moniwiki/"

    <Directory "/volume1/@hideweb/moniwiki">
        #Options Indexes MultiViews
        #Options MultiViews
        Options All

        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</IfModule>



시놀로지 관리자에서 서비스 재구동시켜봄. 잘 동작한다. 아싸~
 여기에 모니위키를 설치하면 됨. 
 




2012. 3. 27. 

SVN의 오래된 내용 정리하는 방법. 종택형님이 갈쳐줌.