삽질하는플머

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


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



우분투 10.04 + phpLiteAdmin 에서 SQLCipher 사용.

탐구생활/Others

phpLiteAdmin 은  sqlite 의 웹 어드민 툴로서 phpMyAdmin 에 익숙하다면 눈이 번쩍 뜨일만한 물건이다. 

이름부터 비슷하다. 사용법도 아주 유사하다. 

게다가 단일 php파일 하나로 되어있어 별다른 설치 없이 웹서버에 올리고 디렉토리에 쓰기 권한만 설정하면 동작한다. 


SQLCipher sqlite3 위에 OpenSSL 기반의 암호화를 지원하는 라이브러리이다. 

PRAGMA key = 'password' 명령을 실행한 뒤 이후 입력되는 테이블, 필드 정보는 모두 인코딩되어 저장된다. 

설정된 암호의 변경은 PRAGMA rekey = 'newpassword' 명령으로 처리할 수 있다. 


문제는, 기존에 만들어진 암호화되지 않은 DB파일에 암호를 설정하는 기능이 없다는 것. 

때문에 phpLiteAdmin 같은 sqlite 어드민 툴에서 작업한 내용을 적용하려면, 적절한 형식으로 출력한 뒤 다시 암호화된 DB파일에 밀어넣어주어야 한다. 적어도 기본 암호라도 설정할 수 있게 해주면 이후 이 파일의 키값만 새로 지정하는 방식으로 작업할 수 있을텐데... 


뭐 DB설계에 경험이 많다면야 이런 도구 없이도 좋은 스키마를 쭉쭉 뽑아내겠지만, 눈으로 봐야만 뭔가 만들 수 있는 나같은 놈에겐 다른 나라 이야기. 


안되면 되게 한다. 삽질은 그래서 의미를 가지지. 



먼저 우분투의 php5에서 sqlite 를 사용할 수 있게 하자. 


# sudo apt-get install php5-sqlite phpt-sqlite3



phpinfo()로 찍어보면 pdo_mysql, pdo_sqlite 가 설치되며 sqlite3 는 따로 설정되어있는 것을 볼 수 있다. 


PDO

PDO supportenabled
PDO driversmysql, sqlite, sqlite2

pdo_mysql

PDO Driver for MySQLenabled
Client API version5.1.61

pdo_sqlite

PDO Driver for SQLite 3.xenabled
SQLite Library3.7.10

........

SQLite

SQLite supportenabled
PECL Module version2.0-dev $Id: sqlite.c 293036 2010-01-03 09:23:27Z sebastian $
SQLite Library2.8.17
SQLite EncodingUTF-8

DirectiveLocal ValueMaster Value
sqlite.assoc_case00

sqlite3

SQLite3 supportenabled
SQLite3 module version0.7
SQLite Library3.7.10

DirectiveLocal ValueMaster Value
sqlite3.extension_dirno valueno value



phpLiteAdmin은 PDO, SQLite3, SQLiteDatabase 세종류의 모듈을 지원한다. 

이 드라이버의 설정은 phpLiteAdmin.php 의 130번째 줄 근처의 


define("FORCETYPE", false);


이 부분을 다음과 같이 수정해 강제로 설정할 수 있다. 


define("FORCETYPE", "PDO");


또는 


define("FORCETYPE", "SQLite3");



그런데 무슨 이유에서인지 이 부분을 SQLite3 로 설정하면 제대로 동작하지 않는다. 

PDO 모듈을 써서 생성된 파일을 메모장에서 열어보면 다음과 같다. 




앞부분에 보이듯 sqlite3 형식인 것으로 보아 PDO의 sqlite 가 sqlite3 를 기본으로 하는 것 같은데... 

좀 더 확실히 하기 위해 ldd로 pdo_sqlite.so 의 dependency 를 살펴보자. 


# cd /usr/lib/php5/20090626+lfs

# ldd pdo_sqlite.so

        linux-gate.so.1 =>  (0x00bfe000)

        librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x007d5000)

        libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x00a98000)

        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x002f4000)

        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x0045e000)

        /lib/ld-linux.so.2 (0x00e93000)

        libcrypto.so.0.9.8 => /lib/i686/cmov/libcrypto.so.0.9.8 (0x00110000)

        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00eb7000)

        libz.so.1 => /lib/libz.so.1 (0x006ca000)



예상대로 libsqlite3.so 를 참조하고 있다. 

phpLiteAdmin이 SQLite3 모듈로 잘 동작했다면 sqlcipher 를 기반으로 php5의 모듈을 재빌드해 올리기만 하면 될텐데 싶지만... 

그래도 그나마 다행이다. 


일단 sqlcipher 를 빌드하자. 


# sudo apt-get install tcl tcl-dev libssl libssl-dev

# git clone git://github.com/sqlcipher/sqlcipher.git

# cd sqlcipher

# ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"

# make

# sudo make install



윈도에서 빌드는 개삽질인데, 리눅스에서는 TCL만 깔아주면 한방에 끝나네~~
이제 pdo_sqlite.so 가 참조하는 라이브러리를 /usr/local/lib 에 생성된 libsqlite3.so.0.8.6 로 바꿔주면 되는데, 

어차피 sqlcipher는 sqlite3의 모든 기능을 가지고 있고 테스트머신에 이런저런 신경쓰기도 귀찮아서 그냥 /usr/lib 에 복사해 버렸다. 


# sudo cp /usr/local/lib/libsqlite3.so.0.8.6 /usr/lib/



내친김에 기존의 sqlite3 모듈도 새로 만들어 넣어두자. sqlcipher 홈페이지에 잘 설명되어있으니 그대로 따라하면 된다. 

다만 php-5.4.0/ext/sqlite3 소스에 config.m4 파일이 config0.m4 로 되어있으니 phpize 전에 이 이름을 바꿔주는 것만 신경쓰자. 

이렇게 만들어진 sqlite3.so 를 apt-get 으로 설치한 /usr/lib/php5/20090626+lfs/sqlite3.so 와 교체해주고 아파치를 재구동하면 완료. 




남은 문제는 phpLiteAdmin에서 언제, 어떻게 기본 암호를 설정해주느냐 하는 것. 

여기저기 살펴보니 660줄 근처에 Database class 에 정의된 쿼리에 대한 래퍼함수가 눈에 띈다. 이 함수 도입부분에 다음 코드를 추가하자. 


        ........

//generic query wrapper

public function query($query, $ignoreAlterCase=false)

{

$this->db->query("PRAGMA key = '1234';");

if (strtolower(substr(ltrim($query),0,5))=='alter' && $ignoreAlterCase==false) // ......

        ........



이제 수정된 phpLiteAdmin을 우분투의 아파치에서 접근할 수 있게 해주고 DB파일을 만들어보자. 


 



생성된 DB파일을 열어보면 알아볼 수 없도록 암호화되어 저장된 것을 알 수 있다. 




스키마 설계 및 기본정보 입력이 마무리된 파일은 나중에 "PRAGMA rekey" 명령으로 새 암호를 할당해 배포하면 됨. 



phpliteadmin.7z