Create TOC

2016년 12월 19일

Raspbian/L2TP 서버 설정

iOS VPN 정책이 바뀌면서 ipTime의 VPN 기능을 사용할 수 없게 되었다. iOS에서 VPN을 사용할 수 있도록 Raspberry Pi에 L2TP 서버 설정을 한다.

패키지 설치

$ sudo apt-get install openswan xl2tpd ppp lsof rng-tools

네트워크 설정

포트 포워딩

공유기에서 UDP 500, 4500 포트를 Raspberry PI로 포트포워딩 한다.

Raspbian 설정

우선 아래 명령들을 실행한다.

$ sudo -s
# iptables --table nat --append POSTROUTING --jump MASQUERADE
# echo "net.ipv4.ip_forward = 1" |  tee -a /etc/sysctl.conf
# echo "net.ipv4.conf.all.accept_redirects = 0" |  tee -a /etc/sysctl.conf
# echo "net.ipv4.conf.all.send_redirects = 0" |  tee -a /etc/sysctl.conf
# for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
# exit

설정이 잘 되어있는지 확인한다.

$ sudo sysctl -p

부팅시에도 설정이 동작하도록 /etc/rc.local 파일에 아래 내용을 추가한다.

for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
iptables --table nat --append POSTROUTING --jump MASQUERADE

L2TP 설정

openswan 설정

예제 설정을 복사한다.

$ sudo cp /etc/ipsec.d/examples/l2tp-psk.conf  /etc/ipsec.d/l2tp-psk.conf

/etc/ipsec.conf파일을 열어서 맨 마지막에 아래 줄을 추가한다.

include /etc/ipsec.d/l2tp-psk.conf

그리고 protostack 값을 찾아서 아래와 같이 바꾼다.

protostack=netkey

/etc/ipsec.d/l2tp-psk.conf 파일을 열어서 아래 값들을 바꾼다.

conn L2TP-PSK-noNAT
 dpddelay=30
 dpdtimeout=120
 left=
 leftprotoport=17/%any
 forceencaps=yes

conn passthrough-for-non-l2tp
 left=
 leftnexthop=<공유기 내부 IP 주소>

/var/lib/openswan/ipsec.secrets.inc 파일을 편집에서 서버 접속시 사용할 비밀문자열을 지정한다.

192.168.1.112  %any:   PSK "복잡한문자열"

설정에 문제가 없는지 확한다.

$ sudo ipsec verify

xl2tpd 설정

/etc/xl2tpd/xl2tpd.conf파일을 열어 아래 값들을 바꾼다.

[global]
ipsec saref = yes

[lns default]
ip range = <할당하고 싶은 ip 대역. 192.168.0.201-192.168.0.250>
length bit = yes
require chap = yes
refuse pap = yes
name = <적당한이름. MyVPN>
pppoptfile = /etc/ppp/options.l2tpd.lns

아래와 같은 내용으로 /etc/ppp/options.l2tpd.lns파일을 만든다.

ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
asyncmap 0
auth
crtscts
lock
idle 1800
mtu 1200
mru 1200
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
nodefaultroute
connect-delay 5000

/etc/ppp/chap-secrets 파일을 열어서 접속할 때 사용할 id, 비밀번호를 설정한다.

# Secrets for authentication using CHAP
# client    server  secret          IP addresses

아이디 l2tpd   비밀번호   *

서비스 설정

$ sudo update-rc.d -f ipsec remove
$ sudo update-rc.d ipsec defaults

서비스 재시작

$ sudo /etc/init.d/xl2tpd restart
$ sudo /etc/init.d/ipsec restart

2016년 11월 28일

nginx에 let's encrypt 인증서 적용

/etc/nginx/sites-available에 원하는 이름의 설정 파일을 만들고 아래와 같이 설정한다.

server {
 listen 443 ssl;
 listen [::]:443 ssl;
 server_name 서버명;
 root /var/www/html;

 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
 add_header X-Frame-Options DENY;
 ssl on;
 ssl_certificate /etc/letsencrypt/live/서버명/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/서버명/privkey.pem;

 #OCSP Stapling
 ssl_dhparam /etc/nginx/ssl/서버명.dhparam;
 ssl_stapling on;
 ssl_stapling_verify on;
 ssl_trusted_certificate /etc/letsencrypt/live/서버명/fullchain.pem;
 resolver 8.8.8.8 8.8.4.4;

 ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128  -GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECD  HE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-  SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES25  6-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

 ssl_prefer_server_ciphers on;
 ssl_session_timeout 1d;
 ssl_session_cache shared:SSL:10m;

 # 이후 원하는 설정 추가
}

dhparam파일도 만든다.

$ sudo mkdir /etc/nginx/ssl
$ sudo openssl dhparam -out /etc/nginx/ssl/서버명.dhparam 2048

서버 설정 파일을 활성화시킨다

$ sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

설정에 문제가 없는지 테스트 해본다.

$ sudo nginx -t

Raspbian/Let's encrypt 설정

Raspbian에서 Let's encrypt 인증서를 설치하는 방법을 기술한다.

letsencrypt 설치

$ sudo -s
# gpg --keyserver pgpkeys.mit.edu --recv-key  8B48AD6246925553      
# gpg -a --export 8B48AD6246925553 | apt-key add -
# gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010      
# gpg -a --export 7638D0442B90D010 | apt-key add -
# echo "deb http://httpredir.debian.org/debian jessie-backports main contrib non-free" > /etc/apt/sources.list.d/debian-jessie-backports.list
# exit
$ sudo apt-get update
$ sudo apt-get install letsencrypt -t jessie-backports

인증서 생성

인증서 생성 전에 외부에서 433 포트로 접속 가능하도록 설정해야 한다.

$ sudo letsencrypt certonly --agree-tos --email 이메일주소 --standalone --domains 서버명

생성에 성공하면 /etc/letsencrypt/archive/서버명 디렉토리에 인증서가 저장되고 /etc/letsencrypt/live 디렉토리에 링크가 생성된다.

인증서 갱신

apt-get으로 letsencrypt을 설치한 경우에는 /etc/cron.d/certbot이 등록되기 때문에 갱신에 대해 따로 설정하지 않아도 된다.

현재 환경에서 인증서 갱신이 되는지는 아래 명령으로 테스트해보면 된다.

$ sudo cert-bot renew --dry-run

2016년 11월 18일

nginx에서 sub-directory에 proxy pass 설정

nginx에서 제공하는 reverse proxy기능을 사용하면 특정 sub-directory에 대한 응답을 다른 서버에서 가져와서 보여줄 수 있다.

아래와 같이 설정하면 http://내서버/abcde/foo.html 요청을 받는 경우 http://127.0.0.1:1245/foo.html 에서 내용을 가져와서 보여준다.


server {
 ....
 location /abcde/ {
  access_log off;
  error_log off;
  rewrite ^/abcde(/.*)$ $1 break;
  proxy_pass http://127.0.0.1:1245;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_redirect off;
 }
}

2016년 11월 1일

Windows에서 meld 한글이 깨지는 문제 수정

Meld 사용시 encoding 설정을 해주지 않으면 한글이 깨지는 경우가 있다. 아래와 같이 레지스트리를 설정해주면 된다.

키이름HKEY_CURRENT_USER\Software\GSettings\org\gnome\meld
값 이름detect-encodings
값 종류REG_SZ
['CP949', 'UTF-8', 'UTF-16']

2016년 10월 11일

Raspbian/Tvheadend 빌드

tvheadend에 h264_omx 코덱을 사용할 수 있게 빌드하는 방법을 기술한다.

빌드 환경 구성

$ apt-get install git cmake build-essential debhelper pkg-config fakeroot libavahi-client-dev libssl-dev libcurl4-gnutls-dev liburiparser-dev  libogg-dev libtheora-dev libvorbis-dev

빌드

$ git clone https://github.com/tvheadend/tvheadend.git
$ cd tvheadend

소스를 받고 빌드 전 아래와 같이 Makefile.ffmpeg 파일을 수정한다.

diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg
index e07ef2d..ff99604 100644
--- a/Makefile.ffmpeg
+++ b/Makefile.ffmpeg
@@ -573,6 +573,9 @@ $(LIB_ROOT)/$(FFMPEG)/.tvh_build: \
                --enable-gpl \
                --extra-cflags="$(ECFLAGS)" \
                --extra-libs="$(ELIBS)" \
+               --enable-omx-rpi --enable-mmal \
+               --enable-decoder="h264_mmal" \
+               --enable-encoder="h264_omx" \
                --pkg-config="$(ROOTDIR)/support/pkg-config.ffmpeg" \
                $(foreach component,$(COMPONENTS),--enable-$(component)) \
                $(foreach extlib,$(EXTLIBS),--enable-$(extlib)) \

h264_omx가 profile을 지원하지 않기 때문에 transcoding.c파일도 수정해야 한다.

diff --git a/src/plumbing/transcoding.c b/src/plumbing/transcoding.c
index 630bb62..ffb9657 100644
--- a/src/plumbing/transcoding.c
+++ b/src/plumbing/transcoding.c
@@ -1347,8 +1347,11 @@ transcoder_stream_video(transcoder_t *t, transcoder_stream_t *ts, th_pkt_t *pkt)
       av_dict_set(&opts, "preset",  t->t_props.tp_vcodec_preset, 0);
       tvhinfo(LS_TRANSCODE, "%04X: Using preset %s", shortid(t), t->t_props.tp_vcodec_preset);

-      // All modern devices should support "high" profile
-      av_dict_set(&opts, "profile", "high", 0);
+      if (0 != strcmp(ocodec->name, "h264_omx"))
+         {
+        // All modern devices should support "high" profile
+        av_dict_set(&opts, "profile", "high", 0);
+      }

       if (t->t_props.tp_vbitrate < 64) {
         // encode with specified quality and optimize for low latency

Makefile.ffmpeg, transcoding.c 파일 수정이 끝나면 아래와 같은 방법으로 빌드한다.

$ AUTOBUILD_CONFIGURE_EXTRA=--enable-ffmpeg_static\ --disable-libx264_static\ --disable-libx265\ --disable-libvpx\ --disable-libtheora_static\ --disable-libvorbis_static\ --disable-bintray_cache ./Autobuild.sh

빌드가 완료되면 아래와 같이 패키지를 설치한다.

$ cd ..
$ sudo dpkg -i tvheadend_4.1-2261~ga9bc3bc-dirty_armhf.deb

Raspbian/ffmpeg 빌드

raspiberry pi 3에서 사용할 ffmpeg를 빌드하는 방법을 설명한다.

빌드 환경 구성

패키지 설치

$ apt-get install git cmake build-essential libomxil-bellagio-dev libx264-dev libass-dev libfreetype6-dev libmp3lame-dev

MMAL 설치

$ git clone https://github.com/raspberrypi/userland.git
$ cd userland
$ ./buildme

빌드된 파일은 /opt/vc에 설치된다.

빌드

$ sudo apt-get install  libx264-dev libass-dev libfreetype6-dev libmp3lame-dev
$ git clone git://source.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
$ ./configure --enable-libfreetype --enable-gpl --enable-nonfree --enable-libx264 --enable-libfaac --enable-libmp3lame --bindir=/usr/local/bin --enable-static --enable-omx-rpi --enable-mmal
$ make -j4
$ sudo make install

빌드가 완료되면 아래와 같이 실행해서 codec을 확인해본다.

$ ffmpeg -codecs | grep "\(mmal\|omx\)"
ffmpeg version N-81883-gbeb877b Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.9.2 (Raspbian 4.9.2-10)
  configuration: --enable-libfreetype --enable-gpl --enable-nonfree --enable-libx264 --enable-libass --enable-libmp3lame --bindir=/usr/local/bin --enable-static --enable-omx-rpi --enable-mmal
  libavutil      55. 32.100 / 55. 32.100
  libavcodec     57. 60.101 / 57. 60.101
  libavformat    57. 51.102 / 57. 51.102
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 63.100 /  6. 63.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  2.100 /  2.  2.100
  libpostproc    54.  0.100 / 54.  0.100
 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_mmal ) (encoders: libx264 libx264rgb h264_omx )
 DEV.L. mpeg2video           MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_mmal )
 DEV.L. mpeg4                MPEG-4 part 2 (decoders: mpeg4 mpeg4_mmal )
 D.V.L. vc1                  SMPTE VC-1 (decoders: vc1 vc1_mmal )

Vim 8.0/Win32에서 vim-signify 오류 수정

한글 Windows 7 환경에서 Vim 8.0 x64 빌드를 사용할 경우 vim-signify 플러그인에서 오류가 발생한다.

lang mes C를 해도 메시지가 한글로 표시되기 때문에 나타나는 문제이다. 아래와 같이 소스를 수정해주면 문제가 해결된다.

diff --git a/autoload/sy/fold.vim b/autoload/sy/fold.vim
index 35028d8..a51ef54 100644
--- a/autoload/sy/fold.vim
+++ b/autoload/sy/fold.vim
@@ -100,7 +100,11 @@ function! s:get_lines() abort

   let lines = []
   for line in split(signlist, '\n')[2:]
-    call insert(lines, matchlist(line, '\v^\s+line\=(\d+)')[1], 0)
+    let tokens = matchlist(line, '\v^\s+line\=(\d+)')
+    if 0 == len(tokens)
+      let tokens = matchlist(line, '\v^\s+줄\=(\d+)')
+    endif
+    call insert(lines, tokens[1], 0)
   endfor

   return reverse(lines)
diff --git a/autoload/sy/sign.vim b/autoload/sy/sign.vim
index 6af68ff..2cd818b 100644
--- a/autoload/sy/sign.vim
+++ b/autoload/sy/sign.vim
@@ -30,9 +30,11 @@ function! sy#sign#get_current_signs() abort
     silent! execute 'sign place buffer='. b:sy.buffer
   redir END
   silent! execute 'language message' lang
-
   for signline in split(signlist, '\n')[2:]
     let tokens = matchlist(signline, '\v^\s+line\=(\d+)\s+id\=(\d+)\s+name\=(.*)$')
+    if 0 == len(tokens)
+      let tokens = matchlist(signline, '\v^\s+줄\=(\d+)\s+id\=(\d+)\s+이름\=(.*)$')
+    endif
     let line   = str2nr(tokens[1])
     let id     = str2nr(tokens[2])
     let type   = tokens[3]

수정 후 fold.vimcp949, sign.vimutf-8로 저장해야 한다.

Vim/Win32 메뉴 표시 언어를 영어로 고정

아래와 같은 내용을 _vimrc에 추가한다.


if has('win32')
 lan mes en_US
 if has('menu') && has('multi_lang') && has('gui_running')
  set langmenu=en_US
  source $ViMRUNTIME/delmenu.vim
  source $ViMRUNTIME/menu.vim
 endif
endif

2016년 7월 11일

Vim/Win32에서 CtrlSF 가 동작하지 않을때

Windows환경의 Vim x64에서 CtrlSF 플러그인이 동작하지 않으면 아래와 같이 shellescape을 적당히 바꾸어 준다.

--- a/autoload/ctrlsf/backend.vim
+++ b/autoload/ctrlsf/backend.vim
@@ -110,7 +110,11 @@ func! s:BuildCommand(args) abort
     endif
 
     " pattern (including escape)
-    call add(tokens, shellescape(ctrlsf#opt#GetOpt('pattern')))
+    if has('win32')
+  call add(tokens, '"' . ctrlsf#opt#GetOpt('pattern') . '"')
+ else
+  call add(tokens, shellescape(ctrlsf#opt#GetOpt('pattern')))
+ endif
 
     " path
     call extend(tokens, ctrlsf#opt#GetPath())
--- a/autoload/ctrlsf/opt.vim
+++ b/autoload/ctrlsf/opt.vim
@@ -139,7 +139,11 @@ func! ctrlsf#opt#GetPath() abort
             let resolved_path = expand(path, 0, 1)
 
             for r_path in resolved_path
-                call add(path_tokens, shellescape(r_path))
+    if has('win32')
+     call add(path_tokens, '"' . r_path . '"')
+    else
+     call add(path_tokens, shellescape(r_path))
+    endif
             endfo
         endfo
     else
@@ -151,7 +155,11 @@ func! ctrlsf#opt#GetPath() abort
         if empty(path)
             let path = expand('%:p')
         endif
-        call add(path_tokens, shellescape(path))
+  if has('win32')
+   call add(path_tokens, '"' . path . '"')
+  else
+   call add(path_tokens, shellescape(path))
+  endif
     endif
 
     return path_tokens

raspberrypi-ui-mods 설치 후 pkexec 문제

raspberrypi-ui-mods 설치 후 pkexec에서 추가한 계정이 표시되지 않는다. sudo 관련 정책파일을 추가해서 발생하는 문제다. 아래처럼 정책 파일을 추가해주면 된다.
$ cd /etc/polkit-1/localauthority.conf.d
$ sudo cp 51-desktop-sudo.con 61-desktop-policy-fix.conf

2016년 6월 22일

Raspbian/autofs 설정

설치

$ sudo apt-get install autofs
$ sudo mkdir /etc/auto.master.d

설정

설정이 끝나면 autofs를 다시 시작해야 한다.

디버깅

설정을 수정하면서 테스트하고 싶을 때는 아래와 같이 디버깅 모드를 사용한다.

$ sudo systemctl stop autofs
$ sudo automount -f -d

usb storage

/media/sda1으로 mount 하도록 설정한다. 아래 설정은 미디어가 vfat으로 포맷된 것을 가정하고 작성되었다.

  1. /etc/auto.master.d/media.autofs파일을 만든다

    /media  /etc/auto.master.d/media --timeout 60
    
  2. /etc/auto.master.d/media파일을 만든다.

    sda1 -fstype=auto,async,nodev,nosuid,umask=000 :/dev/sda1
    

WebDav

/mnt/net/davfs/box으로 mount 하도록 설정한다.

  1. davfs2 패키지를 설치한다.

    $ sudo apt-get install davfs2
    
  2. /etc/davfs2/secrets에 접속할 webdav 정보를 추가한다.

  3. /etc/auto.master.d/davfs.autofs파일을 만든다.

    /mnt/net/davfs /etc/auto.master.d/davfs --timeout 60
    
  4. /etc/auto.master.d/davfs파일을 만든다.

    box -fstype=davfs,uid=${UID},gid=${GID},rw,noexec,user,async :https://dav.box.com/dav
    

Raspbian/DHT22 센서 사용하기

DHT22 센서는 GPIO 4에 연결했다고 가정한다.

pigpio

GPIO 에서 값을 읽으려면 root 권한이 펼요하지만 pigpio를 사용하면 사용자 계정에서도 값을 읽을 수 있다.

설치

$ sudo apt-get install pigpio python-pigpio

설정

$ sudo systemctl enable pigpiod.service

시작

$ sudo systemctl start pigpiod.service

DHT22.py

설치

pigpio 샘플에 DHT22 를 다루는 코드가 있다.

$ wget https://raw.githubusercontent.com/joan2937/pigpio/master/EXAMPLES/Python/DHT22_AM2302_SENSOR/DHT22.py

수정

DHT22.py에서 atexit 관련 코드를 삭제한다.

그리고 GPIO 4에서 값을 읽도록 코드를 수정한다.

@@ -254,7 +254,7 @@ if __name__ == "__main__":

    pi = pigpio.pi()

-   s = DHT22.sensor(pi, 22, LED=16, power=8)
+   s = DHT22.sensor(pi, 4)

    r = 0

테스트

$ python DHT22.py
1 54.0 28.5 0.20 0 0 0 0
2 54.5 28.5 0.20 0 0 0 0
3 54.6 28.5 0.20 0 0 0 0
4 54.7 28.5 0.20 0 0 0 0

2016년 5월 22일

Raspbian/python과 pypy에서 pip 각각 사용하기

package가 아니고 따로 pip를 설치했다면 제거한다.

$ sudo pip uninstall pip

python을 위해 pip package 설치한다.

$ sudo apt-get install python-pip

pypy를 위해서 pip를 설치한다.

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo pypy get_pip.py

python과 pypy를 위한 alias를 ~/.bash_aliases에 만든다.

alias pip = 'sudo -H python -m pip'
alias pypy_pip = 'sudo -H pypy -m pip'

2016년 3월 17일

Debian/UltraNav 스크롤 버튼 활성화

UltraNav의 가운데 버튼(파란 버튼)을 누른 상태에서 스틱을 움직이면 스크롤이 되도록 하려면 아래와 같이 설정한다.

우선 장치 이름을 알아야 한다.

$ xinput --list
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ Microsoft Microsoft Wireless Optical Mouse® 1.00 id=8 [slave  pointer  (2)]
⎜   ↳ Synaptics Inc. Composite TouchPad / TrackPoint id=11 [slave  pointer  (2)]
⎜   ↳ Synaptics Inc. Composite TouchPad / TrackPoint (Stick) id=12 [slave  pointer  (2)]
⎣ Virtual core keyboard                    id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Power Button                             id=7 [slave  keyboard (3)]
    ↳ Lite-On Tech IBM USB Travel Keyboard with UltraNav id=9 [slave  keyboard (3)]
    ↳ Lite-On Tech IBM USB Travel Keyboard with UltraNav id=10 [slave  keyboard (3)]

이름 확인 후 ~/.xinputrc파일에 아래 내용을 추가한다.

tpset() { xinput set-prop "Synaptics Inc. Composite TouchPad / TrackPoint (Stick)" "$@"; }

tpset "Evdev Wheel Emulation" 1
tpset "Evdev Wheel Emulation Button" 2
tpset "Evdev Wheel Emulation Timeout" 200
tpset "Evdev Wheel Emulation Axes" 7 6 4 5
tpset "Device Accel Constant Deceleration" 0.95

2016년 3월 7일

Raspberry Pi/Tvheadend 설정

현재 소유중인 USB TV 수신 카드(Dvico FusionHDTV5 USB Gold)를 Raspberry Pi에 연결하고, Tvheadend를 설정해서 다른 PC에서 TV 방송을 볼 수 있게 설정한다.

TV 수신 카드 설정

firmware 설치

$ sudo wget http://www.linuxtv.org/download/dvb/firmware/dvb-usb-bluebird-01.fw /lib/firmware

펌웨어 설치 후 USB TV 수신 카드를 다시 연결한다.

채널 검색

dvb-apps 패키지를 설치한다.

$ sudo apt-get install dvb-apps

아래와 같이 파일을 복사한다.

$ cp /usr/share/dvb/dvb-legacy/atsc/us-Cable-Standard-center-frequencies-QAM256 ~/kr-Cable-Standard-center-frequencies-8VSB

편집기로 kr-Cable-Standard-center-frequencies-8VSB파일을 열어서 QAM256을 8VSB로 변경한다.

변경이 끝나면 아래와 같은 방법으로 채널을 검색한다.

$ scan /usr/share/dvb/dvb-legacy/atsc/us-ATSC-center-frequencies-8VSB >> ~/channels.conf
$ scan ~/kr-Cable-Standard-center-frequencies-8VSB >> ~/channels.conf

검색 후 ~/channel.conf을 열어보면 아래와 비슷하게 채널 정보가 들어와 있다.

MBC:123012500:8VSB:17:20:1
:129012500:8VSB:33:36:2
:135012500:8VSB:17:20:1

"채널이름:주파수:나머지 정보" 형식을 가지고 있는데 이 중 주파수를 나중에 Tvheadend 설정시 사용한다.

Tvheadend 설정

저장소 추가

저장소에 대한 자세한 설명은 Tvheadend 사이트를 참고한다.

/etc/apt/sources.list.d 디렉토리에 아래와 같은 내용으로 tvheadend.list파일을 생성한다.
deb http://dl.bintray.com/tvheadend/deb jessie release

설정이 끝나면 package 정보를 업데이트 한다.

$ sudo apt-get update

설치

$ sudo apt-get install tvheadend

패키지를 설치할 때 관리자 id와 비밀번호를 입력해야 하는데, 원하는 값을 입력하면 된다. 나중에 다시 바꾸길 원하면 아래와 같은 명령을 입력하면 된다.

$ sudo dpkg-reconfigure tvheadend

설정

http://127.0.0.1:9981 로 접속해서 관리자 id와 비밀번호를 입력하면 관리 페이지를 볼 수 있다. 페이지 접속 후 Configuration 탭을 선택해서 필요한 설정을 해야 한다.

계정 설정

관리자 외에 TV를 시청할 계정을 추가한다.

iOS 기기에서 시청하기 위해서는

  • Web Interface
  • Streaming
  • Advanced Streaming
설정을 check 해주고 Streaming Profile을 matroska로 설정해줘야 한다.

그리고 kodi를 위해서 HTSP Streaming 설정도 check 해준다.

TV adapters 설정

TV adapters 설정에 들어가서 LG Electronics LGDT3303 VSB/QAM Frontend: ATSC #0을 선택하고 Enabled을 check 해준다.

Networks 설정

Networks 설정에 들어가서 Add을 누르고 ATSC Network을 추가한다.

Muxes/Services 설정

Network 추가 후 Muxes 설정으로 자동으로 Mux가 추가되어 있고 Scan 결과가 나오는데 대부분 실패했다. 자동으로 추가된 Mux를 정리하고 위에서 검색한 주파수를 이용해 Mux를 등록한다.

등록한 Mux의 Scan 결과가 OK가 나오면 Services 탭에서 검색된 채널이 표시되는 것을 확인해야 한다. Services 에 추가된 것을 확인하면 EPG 설정을 해야 한다.

EPG 설정

https://nas.moe/archives/1010를 참고해서 설정한다.

우선 Tvheadend 설정 페이지에서 EGP Grabber 설정을 들어가 XMLTV 설정을 check 해준다.

그다음 n2xml.py 파일을 받아온다. 파일을 받아온 후 아래와 같이 /usr/local/bin에 복사한다.

$ sudo cp n2xml.py /usr/local/bin
$ sudo chmod +x /usr/local/bin/n2xml.py

파일 복사 후 하루에 한번 실행하도록 /etc/cron.daily/n2xml 파일을 만든다.

#!/bin/sh

N2XML=/usr/local/bin/n2xml.py
CHANLIST=/usr/local/etc/chanlist.json
XMLTVSOCK=/home/hts/.hts/tvheadend/epggrab/xmltv.sock

if [ -x $N2XML ]; then
        if [ ! -f $CHANLIST ]; then
                $N2XML -u 1 -e 1 --chanlist $CHANLIST > /dev/null 2>&1
        fi
        if [ -S $XMLTVSOCK ]; then
                $N2XML -a --chanlist $CHANLIST -s $XMLTVSOCK > /dev/null 2>&1
        fi
fi

파일을 만든 후 실행 속성을 부과한다.

$ sudo chmod +x /etc/cron.daily/n2xml

속성 부과 후 한번 실행해준다.

$ sudo /etc/cron.daily/n2xml

그 후에 Tvheadend 설정 페이지에서 logout 후 다시 login 한다. 그 다음 Channel 페이지에 가서 Channel을 추가하면 된다.

Tvheadend 클라이언트 설정

iOS

TvhClient앱을 설치하면 된다.

설치 후 Tvheadend 서버를 추가하면 아래와 같이 채널 목록이 표시된다.

채널을 선택하면 해당 채널에 대한 상세한 방송 정보가 표시된다.

Play을 선택하면 메뉴가 하나 뜨는데 내장된 VLC로 볼 수도 있고 외부 플레이어 (NPlayer)로 링크를 넘겨서 재생할 수도 있다.

내장 VLC로도 재생이 잘 된다.

Kodi

Windows, OS/X, Linux 에서는 Kodi를 설정해서 시청하는 것이 제일 편하다.

설정 - 애드온 - PVR 클라이언트 에서 Tvheadend HTSP Client을 설치하고 설정한다.

설정 - TV - 일반사용함으로 설정한다.

설정이 끝나면 첫 화면에 TV 관련 메뉴가 표시된다.

채널 목록을 보고 시청이 가능하다.

방송 정보도 한번에 볼 수 있다.

2016년 3월 2일

raspbian/docker/node.js

docker 설치

raspbian에 포함된 docker.io 패키지를 설치하고 이미지를 받아보려고 하면 "Could not reach any registry endpoint" 오류가 나면서 이미지를 받아올 수 없다. docker.io가 버전이 너무 낮아서 발생한 문제이다.

docker.io 패키지 대신 http://blog.hypriot.com/downloads/ 에서 deb 파일을 받아서 설치한다.

$ sudo apt-get purge docker.io
$ wget http://downloads.hypriot.com/docker-hypriot_1.10.1-1_armhf.deb
$ sudo dpkg -i docker-hypriot_1.10.1-1_armhf.deb

참고로 docker.io 패키지를 삭제할 때 sudo apt-get purge docker.io으로 완전 삭제하지 않으면 충돌이 발생할 수 있다.

계정 설정

docker 설치 후 docker를 사용할 계정을 docker그룹에 추가한다.

$ sudo adduser 사용하는id docker

그룹 추가 후 다시 로그인 한다.

node.js

$ docker pull hypriot/rpi-node