2016년 4월 12일 화요일

우분투 서버 에 ffmpeg 컴파일/설치

1. 각종 library 우선 설치
$ sudo apt-get install yasm frei0r-plugins-dev gnutls-bin libgnutls-dev libass-dev libgsm1-dev libmp3lame-dev libopencv-dev libopenjpeg-dev libopus-dev libpulse-dev libschroedinger-dev libsoxr-dev libspeex-dev libtheora-dev libv4l-dev libvorbis-dev libvpx-dev libx264-dev libxvidcore-dev libopenal-dev libcdio-paranoia-dev


2. ffmpeg.org 에서 source 받기
$ wget http://ffmpeg.org/releases/ffmpeg-3.0.1.tar.bz2
$ tar -xf ffmpeg-3.0.1.tar.bz2
$ cd ffmpeg-3.0.1


3. ffmpeg 빌드 및 설치
$ ./configure --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib/x86_64-linux-gnu/ --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --enable-bzlib --enable-frei0r --enable-gnutls --enable-libass --enable-libcdio --enable-libdc1394 --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopencv --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --enable-runtime-cpudetect --enable-nonfree --disable-debug --disable-stripping --disable-crystalhd --shlibdir=/usr/lib/x86_64-linux-gnu/ --enable-encoder=ac3
$ sudo make
$ sudo make install


4. 동영상 1280x720 크기로 resize 하면서 x264 코덱으로 로 re-encoding
$ ffmpeg -y -i "$1" -threads 0 -sn -vcodec libx264 -preset medium -crf 23 -tune film -sws_flags lanczos -vf "scale=1280:720" -acodec libmp3lame -ac 2 -ab 192k "$2"


2015년 7월 29일 수요일

HP 마이크로 서버 N54L 우분투 서버 설치

HP 마이크로 서버 N54L

나온지 꽤 지난 모델이지만 저렴하고 집에서 쓰기에는 차고 넘치는 성능.
 이렇게 생긴 것이고...

앞 뚜껑 열면 아래 왼쪽으로 메인보드에 USB 포트가 있어서 여기에 사은품으로 같이온 USB 메모리를 꼽고 거기에 OS 를 설치 함.
RAID 를 지원 하지만 기본은 off 되어 있고, 나도 사용할 생각이 없으므로 그냥 설치.

OS 설치

- 우분투 서버 14.04 LTS 64bit
  공식지원 OS 는 아니지만 별로 상관 없음
  download : http://www.ubuntu.com/download/server
- USB 메모리는 쓰기속도가 심하게 느리므로 설치 후 자주 writing 이 일어나는 /tmp 와 /var 를 각각 ramdisk 와 hdd 로 사용하기 위해 아래와 같이 추가.
  (hdd 의 uuid 는 $ sudo blkid 로 확인)
  @ /etc/fstab
  tmpfs        /tmp     tmpfs   size=128m   0  0
  UUID=xxxxx   /var     auto    defaults    0  2
- samba 와 ftp 에서 root directory 로 쓸 위치로 각 hdd 들의 디렉토리 들을 mount 하기 위해 이런식으로 수정.
  @ /etc/fstab
  UUID=yyyyy        /media/root   auto  defaults    0  2
  UUID=zzzzz        /media/sub    auto  defaults    0  2
  /media/root/aa    /media/sub/aa  none    bind
  /media/root/bb    /media/sub/bb  none    bind

서비스 설치

1. ssh
설치 과정중에 선택해 주면 기본적으로 설치 됨.
- 보안상 외부에서 root 로 접속 하는 것을 막고 특정 사용자만 접속 허용하기 위해 아래 같은 식으로 수정.
  @ /etc/ssh/sshd_config
  PermitRootLogin no
  AllowUsers user1 user2
- 재시작
  $ sudo service ssh restart

2. samba
역시 설치 과정중에 선택해 주면 기본적으로 설치 됨.
- guest 는 읽기만, user1 는 읽기/쓰기/실행 허용 하게 공유 하려면 아래와 같이 수정.
  @ /etc/samba/smb.conf
  [guest]
      comment = guest
      path = /media/root
      guest ok = no
      browseable = no
  [user1]
      comment = user1
      path = /media/root
      guest ok = no
      browseable = no
      create mask = 0774
      directory mask = 0775
      force create mode = 0774
      force directory mode = 0771
      valid users = %S
      writable = yes
      map archive = yes
- 재시작
  $ sudo service smbd restart
- 윈도우에서 접속
  \\ip주소\guest\ ==> guest 로 접속
  \\ip주소\user1\ ==> user1 로 접속

3. ftp
- vsftpd 설치
  $ sudo apt-get install vsftpd
- 접속 시 보일 root directory 지정, 해당 directory 에 write 권한 주고, 포트번호도 변경 위해 아래 처럼 수정.
  @ /etc/vsftpd.conf
  local_root=/media/root
  allow_writeable_chroot=YES
  listen_port=3210
- 재시작
  $ sudo service vsftpd restart

4. torrent
- transmission 설치
  $ sudo apt-get install transmission-cli transmission-common transmission-daemon
- 설정
  settings.json 파일을 찾아서 고친다.  /etc 밑에 생기는 경우도 있어서 확인 한번 해봐야 함.
  @ /var/lib/transmission-daemon/info/settings.json
  "blocklist-enabled": true,
  "blocklist-url": "http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz",
  "download-dir": "/media/root/tr/download", 
  "incomplete-dir": "/media/root/tr/incomplete",
  "incomplete-dir-enabled": true,
  "rpc-authentication-required": true,
  "rpc-username": "user",
  "rpc-whitelist-enabled": false,
  "rpc-password": "password",
  "trash-original-torrent-files": true,
  "umask": 2,
  "watch-dir": "/media/root/tr/watch",
  "watch-dir-enabled": true,
- 설정 시 주의 사항
  * $ sudo service transmission-daemon stop 으로 daemon 이 안죽을 수 있으므로 만약 안죽었으면 kill 로 죽이고 수정 해야 함. (daemon 이 내려갈 때 settings.json 이 덮어써지므로 꼭 먼저 내리고 수정 해야함.)
  * watch / incomplete / complete 디렉토리는 debian-transmission 이 rwx 권한을 가지게 해줘야 하므로, 위와 같은 설정 인 경우 아래처럼..
    $ sudo chown -R debian-transmission:root /media/root/tr
    $ sudo chmod -R 770 /media/root/tr
  * rpc-password 설정의 경우 settings.json 에 평문으로 암호를 적어 준 후 daemon 실행 하면 hash 로 바뀌어 저장 되므로 평문 암호 적은 후 꼭 한번은 실행 해 줘야 안전 하겠지....
- 재시작
  $ sudo service transmission-daemon stop
  $ sudo service transmission-daemon start

5. fail2ban
접속 실패가 일정 숫자 이상 되면 해당 ip 를 bantime 동안 block 한다.
중국쪽에서 꽤나 접속 시도가 많이 날아 오고 있음.
- 설치
  $ sudo apt-get install fail2ban
  $ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/fail.local
- 설정
  ssh 는 기본적으로 enable 되어 있으므로 vsftp 부분 추가로 enable 하고, ban time 도 늘림
  @ /etc/fail2ban/fail.local
  bantime = 36000
  ...
  [vsftpd]
  enabled = true
- 재시작
  $ sudo service fail2ban restart
- ban 당한 ip 목록 확인
  $ sudo cat /var/log/fail2ban.log* | grep "] Ban" | awk '{print $NF}' | sort | uniq -c | sort -n

기타 설정들...

- 주기적으로 뭔가를 실행해 줄 때 crontab 사용
  $ sudo crontab -e
  0 5  *   *   1,3,5     /usr/local/bin/do_something.sh
  라고 적으면  월/수/금 05:00 에 do_something.sh 를 실행.
- sudo 에 매번 암호 넣기 귀찮으면
  $ visudo
  user1 ALL=NOPASSWD: ALL
  라고 넣으면 user1 은 sudo 실행 시 암호 입력 skip

2014년 2월 12일 수요일

TAARNA @ HEAVY METAL

1981년작 애니메이션 [비교 - 아놀드 슈왈츠제네거의 코난이 1982년작, 난장이가 쏘아올린 작은공 영화화가 1981년, 김기영 감독의 마지막 하녀인 화녀'82 가 1982년(여기서 하녀는 나영희)]

옴니버스식 구성, 영화 제5원소의 택시기사 주인공의 원형이라든지, 화성 아닌 다른 세상의 존카터 같은 이야기, 비행기에서 좀비에 습격을 받는다 던가.. 이어지다가 마지막편이 가장 인상적인 타나(taarna).

타라 등장

제작에 로토스코핑 기법이 많이 이용 되었다고 하는데, 타나 역시 마찮가지이고 작업 모델은 Carole Desbiens.
타나 등장 후 옷 입는 장면은 이렇게 만들었는듯...



2013년 7월 31일 수요일

pogoplug mobile 대용량 hard 에 Archlinux 설치 하기

pogoplug 에 대용량 hdd 이용해 Archlinux 설치 하였음.
기본적으로 3TB 정도 되는 대용량이면 파티션 테이블을 GPT 로 구성되느데..
문제는 pogoplug 의 부트로더인 uboot 에서 GPT 를 인식 하지 못 하는듯...
다행히 GPT 는 MBR 영역은 비워 두므로 gptsync 를 이용해 파티션 정보를 MBR 에 적어 줄 수 있음.
이렇게 되면 MBR 만 인식 하는 시스템에서는 MBR 파티션이 있는 하드로 인식 될거고, GPT 를 인식 하는 시스템에서는 GPT 파티션이 온전히 인식 됨.
이때 MBR 에서 인식 할 수 없는 2TB 이상 파티션은 MBR 에는 기록 되지 않음.
그러므로 MBR 로 인식 되는 파티션에다가 Archlinux 를 설치 해야 함.
(정확히는 pogoplug series4 용 Archlinux 의 kernel image 인 uImage 가 위치할 장소만 해당 됨. 하지만 pogoplug series4 용 Archlinux 는 root file system 과 kernel image 를 동일 파티션에다가 때려 박아놨기 때문에 결국 그게 그거임..)

파티션 작업은 우분투 live CD 로 부팅 해서 작업 하였음.
원래 통으로 ntfs 로 쓰던 하드인데 원래의 ntfs partition 은 크기를 줄이고 ext3 partition 추가후 자료 옮기고 이전 ntfs partition 은 지우고... 등등 작업으로 파티션 구조가 복잡해 진 상태임.
파티션 1 : 없음... (-_-)
파티션 2 : linux 는 여기 설치 할 거임. (ext3)
파티션 3 : data 영역으로 쓸 거임.      (ext3)
파티션 4 : swap 영역으로 쓸 거임.      (swap)

1. 파티션 준비
일단 GPT 의 상태를 보면,
# parted /dev/sda unit s print  (GPT 테이블)
Current GPT partition table:
 #      Start LBA      End LBA  Type
Number  Start      End          Size         File system     Name  Flags
 2      264192s    33818623s    33554432s    ext3
 4      33818624s  38012927s    4194304s     linux-swap(v1)
 3      38012928s  5860532223s  5822519296s  ext3            Ba
 ==> GPT 를 인식하는 kernel 입장에서 봤을 때 2번째 partition 이 linux boot files system 이 위치할 장소 임.

# gptsync /dev/sda
실행 해서 MBR 테이블 생성 후 MBR 의 상태를 보면,

# fdisk -l /dev/sdg   (MBR 테이블)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      264191      132095+  ee  GPT
Partition 1 does not start on physical sector boundary.
/dev/sdb2   *      264192    33818623    16777216   83  Linux
/dev/sdb3        33818624    38012927     2097152   82  Linux swap / Solaris
==> MBR 만 인식 하는 uboot 입장에서 봤을 때 2번째 partition 이 uImage 가 위치 한 장소임.

2. pogoplug series4 용 Archlinux 설치 (pogoplug mobile 도 동일하게 사용 가능)
http://archlinuxarm.org/platforms/armv5/pogoplug-series-4
에 있는 installation 대로 설치 하되 ppv4-install.sh 에서 아래 부분 수정.
usb 0:1usb 0:2 으로 수정
ide 0:1ide 0:2 으로 수정
==> uboot 에서 uImage 위치 장소는 0번 device 의 1번 파티션 에서 2번 파티션으로 변경.
/dev/sda1 /dev/sda2 으로 수정
==> kernel 의 boot file system 은 1번 파티션에서 2번 파티션으로 변경.
!! 주의 : 하드 디스크의 구성 상황에 따라 잘 맞춰 줘야 함
          결국 pogoplug 의 firmware 를 변경 하는 risky 한 작업은 순전히
 ppv4-install.sh 를 실행 할 때 발 생 하는 거고 이렇게 uboot script 수정 부분은
 잘못 하면 벽돌이 될 수 있지...
 다만 alarm_revert 부분만 살아 있게 잘 수정 하면 설령 실패 하더라도
 usb (fat32 포맷에 revert 디렉토리) 꼽는 걸로 복원이 가능 함.



이후 Archlinux 설정들...


  • 사용자 계정 추가
useradd -d /home/[name] -s /bin/bash -m -k /etc/skel [name]
passwd [name]

  • 시간
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

  • sudo 권한
pacman -Sy sudo
visudo 실행
# %sudo ALL=(ALL) ALL
부분의 주석 처리 해제
groupadd sudo
vi /etc/group
sudo:x:1001:[name]

  • samba
pacman -Sy smbd nmbd
vi /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
server string = pogo
netbios name = pogo
security = user
null passwords = yes
map to guest = bad user
log file = /var/log/samba/%m.log
max log size = 50
dns proxy = no
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=131072 SO_SNDBUF=131072 SO_KEEPALIVE
disable netbios = yes
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
[homes]
browseable = yes
read only = no
valid users = %S

기존에 samba user 추가 하던 smbpasswd 가 deprecated 된것 같음.
대신 아래 명령어로 samba user 추가.
pbdedit -a -u [name]

systemctl start smbd nmbd
systemctl enable smbd nmbd
이제 pogoplug 의 주소로 접근해 보면 [name] 디렉토리 보이고 접근 될 거임.

  • ftp
pacman -Sy vsftpd
vi /etc/vsftpd
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
passwd_chroot_enable=YES
vi /etc/passwd
[name]:x:1000:1000::/home/./[name]:/bin/bash
// 저기 . 찍힌 위치가 해당 id 로 ftp 접속 했을 때 root directory 가 됨.
systemctl start vsftpd
systemctl enable vsftpd

  • hdd 절전
pacman -Sy hd-idle
vi /etc/conf.d/hd-idle
START_HD_IDLE=true
HD_IDLE_OPTS="-a sda -i 300 -l /var/log/hd-idle.log"
systemctl start hd-idle
systemctl enable hd-idle

  • torrent
pacman -Sy transmission-cli
systemctl start transmission
systemctl stop transmission
vi /var/lib/transmission/.config/transmission-daemon/settings.json
"download-dir": "/mnt/data/torrent",
"incomplete-dir": "/mnt/data/torrent",
"rpc-whitelist": "127.0.0.1, 192.168.*.*",
"rpc-whitelist-enabled": true,
"watch-dir": "/mnt/data/torrent",
"watch-dir-enabled": true
systemctl start transmission
systemctl enable transmission
==> 이제 /mnt/data/torrent 에 torrent 파일 넣으면 자동으로 받아 질 거임.

webui 접속
1) browser 에서 "http://pogoplug's ip:9091/transmission" 으로 접속
2) 409: conflict 에러 하면 나올 거임.
화면 최하단에 X-Transmission-Session-Id: SwnfFIUTEE12DLmAKwEo7qjaX92Je67bxg1akevokYdfI14H 같은게 나옴.
3) 이제 "http://pogoplug's ip:9091/SwnfFIUTEE12DLmAKwEo7qjaX92Je67bxg1akevokYdfI14H" 로 접속하면
web ui 가 나옴.

  • pogoplug 원 서비스 이용 하기
참고 : http://archlinuxarm.org/forum/viewtopic.php?t=3343
1) pacman -U http://dl.dropbox.com/u/15043728/pogoplug-3.3.0-1-arm.pkg.tar.xz
2) vi /etc/pogoplug.conf
vfsdir0=plugdata,/mnt/data
3) systemctl start pogoplug.service
4) http://my.pogoplug.com --> 활성화
5) cp /usr/local/cloudengines/bin/hbplug.conf /etc/pogoplug.conf
6) cat /etc/pogoplug.conf 해서 마지막 줄에 svcid 가 있는 것 확인 해야 함.

  • static ip 설정
vi /etc/network.d/wired-eth0
CONNECTION='ethernet'
DESCRIPTION='A basic static ethernet connection using iproute'
INTERFACE='eth0'
IP='static'
ADDR='192.168.219.11'
NETMASK='255.255.255.0'
GATEWAY='192.168.219.1'
DNS=('1.214.68.2 61.41.153.2')

  • fstab
vi /etc/fstab
사용 하드의 3번 파티션이 결국 주 data 저장 장소가 됨.
이것을 부팅 할 때 mount 시키기 위한 거임.
추가한 사용자 [name] 의 home directory 에도 동일 하게 mount 시키기 위해 아래와 같이 함.
swap 파티션 역시 부팅 때 자동으로 swap 장소로 사용 되게 하기위해 역시 fstab 에 추가 함.
# <file system> <dir>              <type>       <options>       <dump>  <pass>
/dev/sda4       none               swap         defaults        0       0
/dev/sda3       /mnt/data          ext3         defaults        0       2
/mnt/data       /home/[name]/data  none         bind

  • S.M.A.R.T
참고 : https://wiki.archlinux.org/index.php/S.M.A.R.T.
pacman -Sy smartmontools
sudo smartctl -a /dev/sda

  • 기타 짜지부리 한 것들...
vi .bashrc
alias ls='ls --color=auto'
alias ll='ls -al'
alias vi='vim'
PATH=$PATH:$HOME/bin

pacman -Sy vim
pacman -Sy htop
pacman -Sy mc
pacman -Sy gcc
pacman -Sy make

2012년 5월 13일 일요일

spin lock

  1. spin lock 의 정의 보면 SMP 에서만 사용함을 알 수 있다.
    • 구현에 있어 memory 관련 내용은 memory-barriers.txt 참조.
  2. 결국 이것은 SMP 에서 새로이 나타난 동기화를 해결 하기 위한 solution 이라는 관점으로 접근 하는것이 이해하기 좋다. 간단히 mutex 를 생각해 보면...

  • mutex
  1. semaphore 의 특수한 경우이지만 따로 보통 분리해서 다룬다.
    • 효율성 때문 mutex-design.txt 참조
  2. Rule
    • only one task can hold the mutex at a time
    • only the owner can unlock the mutex
    • multiple unlocks are not permitted
    • recursive locking is not permitted
    • a mutex object must be initialized via the API
    • a mutex object must not be initialized via memset or copying
    • task may not exit with mutex held
    • memory areas where held locks reside must not be freed
    • held mutexes must not be reinitialized
    • mutexes may not be used in hardware or software interrupt contexts such as tasklets and timers
  3. APIs
    •  DEFINE_MUTEX(name);
    •  mutex_init(mutex);
    •  void mutex_lock(struct mutex *lock);
    •  int  mutex_lock_interruptible(struct mutex *lock);
    •  int  mutex_trylock(struct mutex *lock);
    •  void mutex_unlock(struct mutex *lock);
    •  int  mutex_is_locked(struct mutex *lock);
    •  void mutex_lock_nested(struct mutex *lock, unsigned int subclass);
    •  int  mutex_lock_interruptible_nested(struct mutex *lock, unsigned int subclass);
    •  int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);

UP 에서 mutex 를 구현 한다는 것은 결국 atomic 하게 exchange 를 할 수 있으면 되는 거다.
보통 관련한 instruction 이 있지.
SMP 환경이라면, 아무리 atomic exchange instruction 이 있어도 다른 코어 가 동시에 접근 하는 것을 막을 수는 없지.
즉, mutex 의 구현안에 spin lock 을 이용한 SMP 보호 구역이 있어야 겠지.
물론 실제로도 그러하다.

spinlock 사용 되는 경우 보면...

code sample 1>

static DEFINE_SPINLOCK(xxx_lock);

unsigned long flags;

spin_lock_irqsave(&xxx_lock, flags);
... critical section here ..
spin_unlock_irqrestore(&xxx_lock, flags);

언제나 안전하다. irq 를 막기 때문에 아무도 침범 불가.

code sample 2>


   rwlock_t xxx_lock = __RW_LOCK_UNLOCKED(xxx_lock);


unsigned long flags;

read_lock_irqsave(&xxx_lock, flags);
.. critical section that only reads the info ...
read_unlock_irqrestore(&xxx_lock, flags);

write_lock_irqsave(&xxx_lock, flags);
.. read and write exclusive access to the info ...
write_unlock_irqrestore(&xxx_lock, flags);
이것은 RCU 로 대체 되었고, 제거 중이다.
- 참조 rcu.txt, listRCU.txt

code sample 3>

spin_lock(&lock);
...
spin_unlock(&lock)

irq 안막았기 때문에 아래와 같은 deadlock 가능.
spin_lock(&lock);
...
<- interrupt comes in:
spin_lock(&lock);

같은 걸 동일 cpu 에서 lock 해 버리면 deadlock 이 된다.



spinlock 의 사용시 irq 도 막을지 말지는 보호하려는 critical section 이 ISR 에서 참조 하는지 유무에 따라 결정 하면 된다.