2013-10-11

라즈베리파이를 NAS 타임머신으로 사용하기

#### 이 방법은 추천하지 않습니다. 재미로만 해 보시고, 중요한 백업은 하지 마세요. 한달에 한번 꼴로 에러가 납니다. hfsp가 netatalk로 제대로 구현이 안 되어 무결점 보장이 안 되는 것 같습니다. 되도록이면 USB방식의 외장하드를 사용해서 백업하세요 ####

라즈베리파이를 타임머신 NAS로 사용하기. 애플 순정 AFP를 사용하는 방법이라 안정성이 훌륭하다.

Screen Shot 2013 10 11 at 12 20 45 PM

맥에서 외장 하드를 포맷한다. 이미 되 있으면 안 해도 된다. Mac OS Extended (Journaled) 이나 case sensitive를 추천하는데, 대소문자를 구분한다고 한다. 하지만 귀찮아서 그냥 하던 대로 저널로 했다.

맥에서 하드를 분리하고, 파이에 하드를 꼽는다. 레포를 업데이트하고 필요한 것을 설치한다.
sudo apt-get update
sudo apt-get install hfsplus hfsutils hfsprogs


타임머신 마운트 할 디렉토리를 만든다.
sudo mkdir /mnt/TimeMachine

마운트 하는 방법이 2가지가 있는데, 수동으로 마운트 하는 방법으로 하겠다. 방법1은 편하지만, 해당 하드가 없으면 fstab에서 인식을 못해서 부팅이 안 된다. 그러므로 방법1을 건너뛰고 방법2로 가길 바란다.

### 방법1, 자동마운트, 하드가 없으면 부팅이 안됨 (비추천, 그러나 소개한다)

UUID를 확인한다. 애플은 모든 기기마다 UUID를 부여한다. 이게 있어야 애플에서 추천하는 AFP 방식으로 타임머신을 사용할 수 있다.
sudo blkid

확인한 UUID를 입력한다.
sudo nano /etc/fstab

맨 끝에다 추가한다.
UUID="여기에UUID입력" /mnt/TimeMachine hfsplus rw,force,exec,auto,users 0 3

### 방법2, 수동으로 마운트 하는 방법. 귀찮지만 하드가 없어도 부팅이 된다. (길지만 추천하는 방식이다)

수동 마운트 방식이다. /dev/sda2는 상황마다 다르니 sudo blkid로 확인한다.
sudo mount -o force /dev/sda2 /mnt/TimeMachine/

하드에 문제가 없는지 확인하는 방식.
sudo fsck.hfsplus /dev/sda2

언마운트하는 방법
umount -f /dev/sda2

자 방법을 알았으니 스크립트를 수동으로 추가해 보자.
sudo nano /etc/init.d/부팅시-추가할-스크립트-이름

내 스크립트다. jong-TimeMachine이라는 이름의 스크립트다. /dev/sda2는 상황에 맞게 바꾼다.
#! /bin/sh
# /etc/init.d/jong-TimeMachine

### BEGIN INIT INFO
# Provides: mount
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Simple script to start a program at boot
# Description: A simple script from www.stuffaboutcode.com which will start / stop a program a boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here
# Carry out specific functions when asked to by the system
case "$1" in
start)

echo "..............................."
echo "mounting hfsplus TimeMachine..."
echo "..............................."
# mount hdd
sudo mount -o force /dev/sda2 /mnt/TimeMachine/

echo "..............................."
echo "checking hfsplus TimeMachine..."
echo "..............................."
# check hdd
sudo fsck.hfsplus /dev/sda2
;;

stop)
echo "................................."
echo "unmounting hfsplus TimeMachine..."
echo "................................."
# kill application you want to stop
umount -f /dev/sda2
;;
*)
echo "Usage: jong-TimeMachine {start|stop}"
exit 1
;;
esac

exit 0
저장하고 나온다. Ctl-o, Ctrl-x

이제 실행 가능하게 퍼미션을 추가한다.
sudo chmod 755 /etc/init.d/jong-TimeMachine

실행이 되나 테스트를 해보자.
sudo /etc/init.d/jong-TimeMachine start

실행은 start, 멈추는 건 stop이다. stop 해보고 잘 되면 다시 start한다.
sudo /etc/init.d/jong-TimeMachine start
sudo /etc/init.d/jong-TimeMachine stop


시작프로그램에 등록한다.
sudo update-rc.d jong-TimeMachine defaults

시작프로그램에서 제거방법.
sudo update-rc.d jong-TimeMachine remove

라즈베리파이를 재부팅 해보자
sudo reboot

제대로 동작하는지 테스트 폴더를 만든다.
mkdir /mnt/TimeMachine/test

읽고 쓰기 권한이 있는지 확인한다. mount를 실행하여 확인한다. 이런 식으로 결과가 나오는데, rw가 있는지 확인을 해야 한다. 나의 결과는 이렇다.
/dev/sda2 on /mnt/TimeMachine type hfsplus (rw,relatime,umask=22,uid=0,gid=0,nls=utf8)

맥에서 접속하여 사용할 것이기에 맥 사용자에게 소유권을 부여한다.
sudo chown -R pi /mnt/TimeMachine

맥과 라즈베리파이가 통신을 하려면 Netatalk와 Avahi가 필요하다. 필요한 것들을 설치하자.
sudo apt-get install avahi-daemon libavahi-client-dev libdb5.3-dev db-util db5.3-util libgcrypt11 libgcrypt11-dev

소스를 다운받는다. Netatalk 3.0이다. 3.0.1이 아니다.
cd
wget http://sourceforge.net/projects/netatalk/files/netatalk/3.0/netatalk-3.0.tar.bz2


다운받은 소스를 압축을 풀고 해당 폴더로 간다.
tar xvfj netatalk-3.0.tar.bz2
cd netatalk-3.0


컴파일 한다. 짜증나게도 시간이 많이 걸린다. 총 20분 정도 걸리는 듯. 모든 과정 중 가장 짜증 나는 부분이다.
./configure -with-init-style=debian -with-zeroconf
make
sudo make install


타임머신을 맥과 AFP로 공유하기 위해 Netatalk를 설정한다.
sudo nano /usr/local/etc/afp.conf

다음과 같이 바꾼다.
;
; Netatalk 3.x configuration file
;

[Global]
; Global server settings

### host name
hostname = 넷상에서표시될이름을정한다

### pi's static ip address
afp listen = 파이의IP주소를적는다

log file = /var/log/netatalk.log
log level = default:info

[Homes]
basedir regex = /home
cnid scheme = dbd
; Display each user home directory in this format
home name = Home: $u

[Time Machine]
; Our Time Machine volume

### 타임머신으로 쓸 폴더
path = /mnt/TimeMachine

cnid scheme = dbd
file perm = 0660
directory perm = 0770
time machine = yes


서비스를 실행한다. Netatalk와 Avahi서비스를 실행한다. 이미 실행중이라고 나오면 start를 restart로 바꾼다.
sudo /etc/init.d/netatalk start
sudo /etc/init.d/avahi-daemon start


시작프로그램에 Netatalk를 등록한다. 에러메세지 같은 게 나오는데 괜찮다.
sudo /etc/init.d/update-rc.d netatalk defaults

마지막으로 맥과 연결하기. 맥으로 간다. 라즈베리파이와 맥이 같은 네트워크상에 있는지 확인한다. 다시 말하면 같은 공유기에 물려 있어야 한다는 것이다.

맥의 파인더에서 Connect to Server를 누른다. 단축키 Cmd+k
afp://파이의IP주소

팝업창이 뜨며 아이디와 비밀번호를 묻는다. 파이의 id와 비밀번호를 입력한다.

Screen Shot 2013 10 11 at 12 20 00 PM

타임머신으로 가서 Select Disk에 타임머신이 있을 것이다.

Screen Shot 2013 10 11 at 12 19 28 PM

끝

참고:
http://www.appilogue.kr/2844433
http://garmoncheg.blogspot.de/2012/11/time-capsule-for-25.html
http://www.stuffaboutcode.com/2012/06/raspberry-pi-run-program-at-start-up.html

RPi VNC Remote

라즈베리파이의 startx를 다른 컴퓨터로 리모트해서 쓸 수가 있다. 옛날 네이트온 원격지원과 같은 개념이다. GUI를 쓸 수 있다는 장점이 있다.

 

설치한다 tightvncserver

sudo apt-get install tightvncserver

 

실행한다

tightvncserver

 

암호 물어본다 > 암호입력

보기전용 암호 만들꺼냐? > 아니오 

 

sudo reboot

 

서버 시작하기: 라즈베리파이에서 / 1은  모니터 Display를 뜻함

vncserver :1 -geometry 1024x720 -depth 24

 

뷰어 시작하기: 리모트 컴퓨터에서

Chicken of the VNC

 

Host: 라즈베리파이의 주소를 적는다

Display: 앞에서 시작한 디스플레이 번호:1

Password: 앞에서 설정한 비밀번호

Screen Shot 2013 10 10 at 11 17 54 PM

실행된 모습

Screen Shot 2013 10 10 at 11 20 41 PM

 

서버 종료하기: 라즈베리파이에서 / 1은  모니터 Display를 뜻함

vncserver -kill :1

 

부팅때 마다 자동으로 VNC 서버가 실행하게 만들기

 

스크립트 만들기

sudo nano /etc/init.d/jong-VNC

 

이것을 입력한다.

#!/bin/sh

### BEGIN INIT INFO
# Provides: tightvncserver
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop tightvncserver
### END INIT INFO

# More details see:
# http://www.penguintutor.com/linux/tightvnc

### Customize this entry
# Set the USER variable to the name of the user to start tightvncserver under

export USER='pi'

### End customization required

eval cd ~$USER

case "$1" in
start)
su $USER -c '/usr/bin/tightvncserver :1 -geometry 1024x720 -depth 24'
echo "Starting TightVNC server for $USER "
;;

stop)
pkill Xtightvnc
echo "Tightvncserver stopped"
;;

*)
echo "Usage: /etc/init.d/jong-VNC {start|stop}"

exit 1
;;

esac

exit 0

 

저장하고 나와서 실행 가능하게 만든다.

sudo chown root:root /etc/init.d/jong-VNC
sudo chmod 755 /etc/init.d/jong-VNC
sudo chmod +x /etc/init.d/jong-VNC

 

부팅 기본 옵션으로 넣는다. (삭제는 defaults 대신에 remove)

sudo update-rc.d jong-VNC defaults

 

끝

RPi 3g as WiFi router

이것의 목적은 이렇다.

3g > usb0 > RPi > eth0 > Router > WiFi

즉 3g로 테더링한 인터넷을 이더넷을 통해 루터로 보낸다. 즉 3g 테더링 인터넷을 와이파이 공유기로 모두가 공유할 수 있다. 속도도 꽤 빠르다. 그럼 시작해 보자.

 

준비물: GUI 환경을 쓰기 때문에 모니터와 마우스를 준비하자.

 

먼저 랜선을 꼽아서 eth0으로 연결한다.

 

업데이트한다.

sudo su

apt-get update

apt-get dist-upgrade

 

재부팅

sudo reboot

 

네트워크 매니저 설치

apt-get install network-manger

 

재부팅

sudo reboot

 

네트워크 매니저 그놈 어플렛 설치

apt-get install network-manger-gnome

이걸 설치하려고 하면, 뭔가 더 설치할꺼냐고 물어본다. y를 2번 눌러야 한다. 처음에 안돼서 두번째 재부팅후 시도하니 되었다.

 

재부팅

sudo reboot

 

인터넷 설정을 네트워크 매니저에게 위임하려면 lo 빼고 전부 비활성화 한다.

sudo nano /etc/network/interfaces

 

이것만 남기도 다 지운다.

auto lo

iface lo inet loopback

 

재부팅

sudo reboot

 

랜선을 뽑고 공유기를 eth0에 연결한다.

 

관리자 root로 그래픽 쉘을 시작한다.

sudo su

startx

 

연결한다 eth0

eth0 > edit > IPv4 Settings > Method: Shared to other computers > save...

 

연결한다 usb0

 

터미널에서 ping체크 해보고 이상 없으면 OK.

ping google.com

 

재부팅 하면 완성! 자동으로 잡힌 셋팅값은 재부팅 해도 저장된다.

 

---- 결과정리 ----

내용 /etc/network/interfaces

auto lo

iface lo inet loopback

 

내용 ifconfig

eth0 Link encap:Ethernet HWaddr b8:27:eb:e1:f6:c0
inet addr:10.42.0.1 Bcast:10.42.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25201 errors:0 dropped:0 overruns:0 frame:0
TX packets:20849 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:16213543 (15.4 MiB) TX bytes:19343689 (18.4 MiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:40 errors:0 dropped:0 overruns:0 frame:0
TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3696 (3.6 KiB) TX bytes:3696 (3.6 KiB)

usb0 Link encap:Ethernet HWaddr 0e:fe:e7:f6:77:75
inet addr:192.168.42.105 Bcast:192.168.42.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20833 errors:0 dropped:0 overruns:0 frame:0
TX packets:25072 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:18872645 (17.9 MiB) TX bytes:17652179 (16.8 MiB)

 

내용 sudo iptables -t nat -S

-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.42.0.0/24 ! -d 10.42.0.0/24 -j MASQUERADE

 

내용 sudo iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT
-A FORWARD -d 10.42.0.0/24 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.42.0.0/24 -i eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth0 -j ACCEPT
-A FORWARD -o eth0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth0 -j REJECT --reject-with icmp-port-unreachable

 

참고:

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=66&t=27414

2013-10-09

라즈베리파이 속도를 50% 높이자! 오버클럭 터보모드

라즈베리파이 속도가 조금 느리다. 그래서 오버클럭을 해보자!

기본 설정 창을 연다.
$ sudo raspi-config

그러면 다음과 같은 창이 뜬다.
Screen Shot 2013 10 09 at 1 15 37 PM
7번 오버클럭을 선택해 준다.
Screen Shot 2013 10 09 at 1 15 56 PM
경고가 뜬다. 망가질 수도 있다 뭐 이런 얘기다. 하지만 싸니까 망가져도 그만~
Screen Shot 2013 10 09 at 1 16 09 PM
터보모드를 설정한다. 거의 50%의 성능향상을 체감할 수 있다.
Screen Shot 2013 10 09 at 1 16 17 PM
재부팅 할꺼냐고 물어본다. 예스를 누른다.
Screen Shot 2013 10 09 at 1 16 47 PM
재부팅 된다. 그러면 빨라진다.

 

컴파일 시간이 오래 걸려서 했는데, 오히려 하다가 에러가 난다. 웬만하면 하지 말길 ㅠㅠ

pdlisp object for Pd, MacOS에서 컴파일하기

pdlisp는 박성민이 만든 lisp 객체다. 사용이 아주 간편하다. lisp 스크립트를 pd에서 사용할 수 있다. 최대 장점은 실시간 사용이 완벽하다는 것이다. 10ms 단위의 빠른 계산도 무리가 없다. 내가 공부하는 프랑크푸르트의 전자음악 교수 Orm Finnendahl도 이 것에 대해 극찬하였다.


사용법은 프로젝트 사이트에 가서 다운 받아 사용하면 된다.

여기서 알아볼 것은 컴파일 해서 사용하는 법이다. 기능을 추가하거나, 코드를 발전시켜 보려면 이 과정이 꼭 필요하다.

방법을 소개하겠다.

----

OS Ver:
Mac OS X 10.8.5 Mountain Lion

준비물:
Xcode를 설치한 후 Command line tool도 설치한다.
homebrew
Pd-0.45-3 (버젼은 무관하다. 어자피 header만 따오기 때문에. 단, 꼭 32bit로 한다.)
ecl-13.5.1 (source)
pdlisp (source)


----

1. gcc 컴파일러를 설치한다. Mountain Lion에는 기본으로 llvm이 들어있고, gcc-4.2가 없다! 따로 설치를 해 줘야 한다. 먼저 homebrew를 설치해야 하는데, 공식적인 방법은 이렇다. http://brew.sh/ 에서 참고하거나 밑의 설치 스크립트를 쓰면 된다.

$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"


gcc-4.2설치 (박성민 권장)

$ brew tap homebrew/dupes && brew install apple-gcc42


2. 설치된 gcc-4.2의 폴더 위치를 알아내야 한다.

gcc경로 알아내기

$ locate gcc-4.2

알아낸 경로는 내 경우엔 /usr/local/Library/ENV/4.3 이었다. 다음에 나오는 export에 정확히 적어준다.

3. ecl을 다운받고 ecl 압축풀고 폴더로 간다. export CC=컴파일러위치 (박성민 권장)

$ export CC=/usr/local/Library/ENV/4.3/gcc-4.2 
$ export CFLAGS="-arch i386"
$ export LDFLAGS="-arch i386" 
$ CC=gcc-4.2 ./configure --disable-shared
$ make$ make install


### 경고! ./configure --disable-shared 이렇게안하면 ecl이 동적(dynamic) 라이브러리로 된다. 그럼 pd external object를 못 만든다. 반드시 주의한다.
### 확인! /usr/local/lib/ecl-13.5.1/에 librt.a 과 libcmp.a 확인, 있으면 정적라이브러리(static)으로 설치된 것이다.

설치되는 경로 /usr/local/lib/ecl-13.5.1/

ecl은 설치 완료 되었다. 다음 단계로 간다.
-----------

4. Pd로 링크를 해줘야 한다. 다운받은 Pd 폴더를 알아낸다. 경로만 파악하면 된다.

내 경우엔 여기였다. 하지만 다를 수도 있으니 꼭 확인을 해보자. 0.45-3을 다른 숫자로 바꾸면 아마 될 것이다. /Applications/Pd-0.45-3.app/Contents/Resources/src 이것을 잘 기억해 놓는다.

-----------

5. pdlisp 컴파일하기

자 본론이다. pdlisp를 다운받고 압축을 푼 뒤에 그 디렉토리로 간다.

$ export PD_INCLUDE=/Applications/Pd-0.45-3.app/Contents/Resources/src ### 경로는 앞서 4번과정에서 알아낸 것을 사용한다.
$ export ECL_LIBS=/usr/local/lib/ecl-13.5.1 ### 앞서 알아낸 경로를 입력해 준다.
$ make


만들어진 파일
pdlisp.pd_darwin

성공했다. pdlisp-help.pd를 Pd로 실행하면 된다. 단, 그 폴더에 pdlisp.pd_darwin과 help.lisp 파일이 존재해야 한다.

사용법은 기회가 되면 다시 설명하겠다. 멋진 작업을 해준 박성민에게 감사를 표한다.

해보고 안되면 저나 박성민에게 문의해 주세요.

2013-10-08

pure data에서 unix command 사용하기!

얼마 전에 awk에 대해 공부했다.

pure data에서도 사용할 수 있다!

awk은 unix 공통이라 가능하다. 윈도우에서 가능한지는 모르겠다.

여기 코드가 있다. 이걸 돌려보겠다.

#! /Users/jong/Desktop/shell-test.sh
ls -al | awk '{ print $5 }';




이 코드를 sh 파일로 저장한다. chmod +x로 실행 가능하게 하면 sh 추가실행 없이 된다, 하지만 안 해도 앞에 sh 붙여주면 그만!

pd-extended에 포함된 shell 이라는 객체가 있다.

Pd 코드는 대략 이렇다.

[sh 파일의/절대경로/파일.sh(
|
[shell]
|
[print]


Pd의 콘솔로 출력 결과를 확인해 볼 수가 있다.



다음은 주의사항이다.

1. 맥에서 path를 절대 경로로 입력해야 한다. ~/Desktop같이 ~/ 홈폴더 안 된다 ㅠㅠ
2. chmod +x로 executable 하게 만들 경우 sh를 빼고 [shell]로 보낼 수가 있다.


캡쳐 실수: [~/Desktop/shell-test.sh( now works가 아니라 IT'S NOT WORKS.
즉 안된다는 말이다. 꼭!! 절대경로로 입력해야 한다!!

다음은 전체 테스트 샷


마지막으로 pure data forum에서 도움을 준 sunji에게 감사한다.

이것으로 pd에서도 unix command를 쓸 수 있게 되었다. perl, awk 등등 많은 것을 시도해 볼 수 있을 듯. Text to Music에서 시도해 보자!

ToDo: Perl코드도 돌려보기

참고:
http://puredata.hurleur.com/viewtopic.php?pid=38682#p38682

더 볼것: 괜찮은 KLDP 한국어 문서
http://wiki.kldp.org/wiki.php/Awk

grep으로 특정 기간의 log를 출력하기

여기 더미 가짜 로그가 있다.

### file: grep-test
2013-01-09 19:58:33 install fff
2013-02-09 19:58:35 install ffff
2013-03-09 19:58:35 install aaaaaa
2013-04-09 19:58:36 install 2e2e
2013-05-09 19:58:36 install 3r3r
2013-06-09 19:58:37 install 3r3r
2013-07-09 19:58:37 install fefef
2013-08-09 19:58:37 install 4r534r
2013-09-09 19:58:38 install ef
2013-10-09 19:58:39 install 3r3r
2013-11-09 19:58:39 install fef
2013-12-09 19:58:39 install grgrgr
###

코드를 실행한다. 10월부터 12월까지의 로그다. 기간은 /^2013-1[012]-/로 표현된다.

grep ' install' grep-test | awk '/^2013-1[012]-/ { print $0 }'

결과가 출력 된다.

2013-10-09 19:58:39 install 3r3r
2013-11-09 19:58:39 install fef
2013-12-09 19:58:39 install grgrgr

응용1: 05부터 07까지 출력
grep ' install' grep-test | awk '/^2013-0[5-7]-/ { print $0 }'

응용2: 09부터 12까지 출력
grep ' install' grep-test | awk '/^2013-(09|1[0-2])-/ {print $0;}'

대략 감 잡았다. 도움을 주신 최호진 님께 감사드린다.

awk는 perl에도 영감을 준 중요한 언어(?)라고 한다. grep과 같이 쓰면 파싱 하는데 좋을 것 같다.