Raspbian Wheezy : Python 설치

Raspbian과 Python

raspbian-wheezy에는 Python 2.7과 Python 3.2가 설치되어 있습니다.

Python tools

파이썬으로 개발하며 필요한 도구를 설치해서 사용하면 좋습니다. 파이썬 패키지 관리 도고, 가상 개발 환경 등의 설치를 통해서

APT로 설치

라즈비안에서 사용하는 파이썬 패키지들은 apt를 이용해서 라즈비안 저장소의 다양한 패키지를 사용할 수 있습니다. apt로 파이썬 패키지를 설치해 사용할 수 있는데 Python 2.x와 Python 3.x의 호환을 위해서 Python 2.x는 ‘python-‘ 접두어를 사용하고 Python 3.x 패키지들은 ‘python3-‘ 를 사용합니다.
예를 들어 picamera 패키지는 python-picamera와 Python 3.x 버전을 위해서 python3-picamera가 있습니다.

사전 준비

기본 개발자 모듈이 설치 안되어 있다면 설치한다.

1
$ sudo apt install build-essential

Python 개발을 위해서는 리눅스에 파이썬 헤더가 필요하다. 그래서 python-dev 패키지를 설치해 준다.
Jessie에서 Python3.4 헤더는 설치가 되어 있다.

1
2
$ sudo apt-get install python3-dev
python3-dev is already the newest version.

python2 개발환경을 위해서 헤더를 설치하려면

1
2
3
4
$ sudo apt install python-dev

The following extra packages will be installed:
libexpat1-dev libssl-dev libssl-doc python2.7-dev

pip

전통적인 파이썬 패키지 도구인 PIP(Python Package Index, PyPI)를 이용하면 폭넓게 범위를 넓힐 수 있습니다.

Raspbian Jessie : 기본으로 제공
apt를 이용해 저장소에 있는 외부 패키지를 설치해 사용할 수 있습니다. 그렇지만 개발에 필요한 모든 패키지가 라즈비안 저장소에 있지 않거나 오래된 버전일 수 있습니다.

Python2.x용 pip는 python-pip를 설치하고 Python3.x pip는 python-pip3 를 설치합니다.

1
2
$ sudo apt-get install -y python-pip
$ sudo apt-get install -y python3-pip

Pip 소스로 설치

혹은 pip를 최신 소스로 부터 직접 설치하려면 다음같이 실행합니다.

1
$ wget https://bootstrap.pypa.io/get-pip.py

시스템에 설치된 python 버전 마다 sudo로 pip를 설치애야 합니다. Python3 을 위한 pip를 설치한다.

1
2
$ sudo python3 get-pip.py
Successfully installed pip-8.1.2 setuptools-24.0.3 wheel-0.29.0

다음은 Python2를 위한 pip를 설치합니다.

1
$ sudo python2.7 get-pip.py

Raspbian에서 사용자 계정에서 pip 설치하면 퍼미션 에러가 발생한다.
OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python2.7/dist-packages/pip-7.1.2.dist-info’
sudo 명령으로 설치해야 한다.

pip 설치 참조

https://pip.pypa.io/en/latest/installing.html
http://stackoverflow.com/questions/6587507/how-to-install-pip-with-python-3

슈퍼사용자로 pip 설치시 사용자 계정에서 사용하기 불편한 점이 많다. 그래서 가상 개발환경을 구성해 사용자 계정에서 제약없이 사용하도록 한다.

pip 사용

pyhthon2, python3 버전이 설치되어서 pip도 역시 해당 버전이 별도로 설치되어 있습니다. 다음 버전 저보를 출력하면 어떤 버전인지 확인이 가능합니다.

1
2
3
4
$ pip3 --version
pip 8.1.2 from /usr/local/lib/python3.5/dist-packages (python 3.5)
$ pip2 --version
pip 8.1.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)

특정 파이썬 버전의 패키지 모듈을 설치한다면 해당 pip 버전을 호촐하는게 정확합니다.

upgrade pip

pip 는 다음 같이 업그레이드 해야 합니다.

1
$pip install -U pip

On Windows [5]:

1
$python -m pip install -U pip

Python 버전 관리자

다양한 파이썬 버전을 위해 환경 구성을 해주는 유틸리티.

  • pyenv : “Simple Python Version Management”, 로컬에 다양한 파이썬 버전을 설치하고 사용할 수 있도록 한다. pyenv를 사용함으로써 파이썬 버전에 대한 의존성을 해결할 수 있다.

  • virtualenv : “Virtual Python Environment builder”, 로컬에 다양한 파이썬 환경을 구축하고 사용할 수 있도록 한다. 일반적으로 Python Packages라고 부르는 ( pip install을 통해서 설치하는 ) 패키지들에 대한 의존성을 해결할 수 있다.

virtualenv와 virtualenvwrapper를 사용할 것이다.

  • autoenv : 만약 pyenv와 virtualenv를 통해서 의존성을 해결한다고 하더라도 작업할때마다 설정해주는 것은 귀찮은 작업이다. 특정 프로젝트 폴더로 들어가면 자동으로 개발 환경을 설정해주는 autoenv라는 스크립트를 활용하자.

여기서는 virtualenv를 설치하고 virtualenvwrapper를 사용해서 모듈을 설치하고 관리한다. 그러기 위해서 먼저 시스템의 기본 /usr/bin/python 버전을 확인하고 해당 버전의 pip 모듈을 사용해서 virtualenv 와 virtualenvwrapper 를 설치한다.

virtualenv

virtualenv는 가상의 파이썬 작업환경을 만들어 준다. 작업환경을 따로따로 만들어주면 해당 환경 내의 파이썬으로 무슨 짓을 해도 시스템 파이썬이나 다른 가상의 작업환경에게 영향을 주지 않는다.
pip로 설치할 수 있습니다.

pip는 시스템의 site-packages 폴더에, /usr/lib/python2.7/site-packages에 모듈을 설치한다. virtualenv를 이용하면 분리할 수 있다.

단, 현재 python2.7과 python3.4가 공존하는 상태에서 virtualenv는 python2.x를 기반으로 만들어 져서 /usr/bin/python을 찾는데 그래서 다음 같이 pip2 버전으로 virtualenv를 설치해 준다.

1
$ pip install virtualenv

virtualenv는 python 버전에 관계 없이 하나만을 설치해 두면 된다.

virtualenvwrapper

virtualenvwrapper는 virtualenv 통합 환경을 좀 더 쉽게 접근할 수 있도록 도와줍니다. ‘virtualenv’ 가 설치된 글로벌 사이트 패키지 위치에 설치되야 합니다. 아마 관리자 권한이 필요할 것입니다.

라즈비안에서는 sudo로 설치해 주어야 한다. 다름 같이 pip로 설치합니다.

1
$ sudo pip install virtualenvwrapper

이제 일반 사용자 환경에서 python 개발환경을 구축해 보자.

셀 환경 구성하기

쉘 (.bashrc, .profile, 등)에 다음 라인을 추가합니다.

1
2
3
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh

그리고 쉘 환경을 로딩하기 위해서 다시 로그인 하거나 다음 같이 source 명령을 이용해도 좋습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ source .profile
ebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 23 18:17:41 2015 from 192.168.219.103
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/premkproject
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postmkproject
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/initialize
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/premkvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postmkvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/prermvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postrmvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/predeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postdeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/preactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/get_env_details

다음 에러가 발생하면 쉘에 VIRTUALENVWRAPPER_PYTHON 를 추가해 준다.

/usr/bin/python: No module named virtualenvwrapper
virtualenvwrapper.sh: There was a problem running the initialization hooks.

If Python could not import the module virtualenvwrapper.hook_loader,
check that virtualenvwrapper has been installed for
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python and that PATH is

Quick-Start

다음 같이 virtualenvwrapper 를 사용할 수 있습니다.

  1. workon 명령으로 실행 가상 환경 목록 혹은 변경한다.
1
$workon
  1. 실행 가상 환경 ‘raspberrypi2’ 생성
1
2
3
4
5
6
7
8
9
10
11
$ mkvirtualenv -p python2 raspberrypi2
New python executable in raspberrypi2/bin/python2.7
Also creating executable in raspberrypi2/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/preactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/postactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/get_env_details

(raspberrypi2)pi@raspberrypi ~ $ # 실행 가상 환경 쉘
  1. 프로젝트 환경을 빠져 나오려면 ‘deactivate’를 실행한다.
1
(raspberrypi2):~$ deactivate
rpi.gpio
1
(raspberrypi2)$pip install rpi.gpio

이제 이 디렉토리 밑에서 코드 작업을 하고 사용하면 됩니다.

다른 Python 버전 환경 만들기

1
2
3
4
5
6
$ mkvirtualenv -p python3 rpi_py3
Running virtualenv with interpreter /usr/bin/python3
New python executable in rpi_py3/bin/python3
Also creating executable in rpi_py3/bin/python
Installing setuptools, pip...done.
...

virtualenv 사용

위의 설명과 같이 고립된 작업환경을 만들려면 디렉토리 구조를 잘 구성해야 합니다. 다음 같이 라즈베리파이 프로그램을 작업할 ‘Blinke’ 디렉토리를 만듭니다. Blinken은 LED를 깜박이는 작업을 수행할 것입니다.

1
2
3
4
5
6
7
$mkdir blinken
$cd blinken
$virtualenv env
New python executable in env/bin/python
Installing setuptools, pip...done.
$. env/bin/activate
(env)$

마지막 명령으로 가상환경을 활성화시키면 프롬프트 앞에 (env)가 표시됩니다. 가상환경을 바탕으로 환경 설정이 동작한다는 것을 의미합니다. 이제 필요한 파이썬 패키지 및 프로그램을 설치하고 개발을 할 수 있습니다.

독립된 DJango 환경 이용하기
1
2
3
4
5
$ mkdir django_tests
$ cd django_tests
$ virtualenv --no-site-packages env
$ source env/bin/activate
(env)$

다시 시스템 파이썬으로 복귀하고 싶으면 deactivate를 실행합니다.

1
(env)$ deactivate

다른 버전의 Python 환경 만들기

1
$ sudo python3 get-pip.py

python3의 virtualenvwrapper를 설치한다.

1
2
3
$ sudo pip3 install virtualenvwrapper
Collecting virtualenvwrapper
Using cached virtualenvwrapper-4.7.1-py2.py3-none-any.whl

mkvirtualenv에서 python3의 환경을 하나 설치한.다.

1
2
3
4
5
6
$ mkvirtualenv -p python3 rpi_py3
Running virtualenv with interpreter /usr/bin/python3
New python executable in rpi_py3/bin/python3
Also creating executable in rpi_py3/bin/python
Installing setuptools, pip...done.
...

가상환경 복사하기

cpvirtualenv oldenv newenv
rmvirtualenv oldenv

pyvenv

3.3에서부터 pyvenv에 기본으로 설치되어 있다. 다만 3.3에서는 pip를 가상 환경을 만들 때마다 설치해주어야 한다. 3.4에서는 pip까지 기본으로 설치되어 있다.

1
2
3
4
5
$ mkdir django_tests
$ cd django_tests
$ pyvenv-3.4 env
$ source env/bin/activate # env의 파이썬 활성화
(env)$ deactivate # 시스템 파이썬으로 복귀

라즈비안 시스템과 파이썬

파이썬을 이용하면 시스템 관련 정보를 활용할 수 있습니다.

라즈페리파이 모델 확인하기

cpuinfo를 살펴보면 현재 라즈베리파이 모델을 확인할 수 있습니다.

1
2
3
4
$cat /proc/cpuinfo
...
Hardware : BCM2708
Revision : 0003

출력 결과에서 Revision을 살펴보면 라즈페리파이 모델을 확인할 수 있습니다. 이 리비전 번호를 다음 링크의 테이블에서 찾아 보면 확인이 가능합니다.

Python으로 오에스 확인하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
>>> import os
>>> print os.name
posix
>>> import sys
>>> sys.platform
linux2
>>> import platform
>>> platform.system()
'Linux'
>>> platform.release()
'3.18.7+'
>>> platform.machine()
'armv6l'

참조

Tmux cheatsheet

  • 2017-07-14: 윈도우에서 session 관리
  • 2017-07-10: tmux copy & paste
    {:.right-history}

터미널 명령은 $ tmux 로 표현하고, Tmux window 에서 Prefix key 키 조합은 는 C{:.keyword} 표기하고, Meta key인 AltM{:.keyword}으로 표기한다 - Tmux Start 참조.

자세히 보기

Tmux Start

2017-07-10: tmux-continum 추가
{:.right-history}

Tmux는 terminal multiplexer로 서버에 여러 프로그램을 세션에 저장하고, 다른 작업 혹은 연결을 끊었다 다시 접속해서 세션을 열어 작업을 이어갈 수 있다.

[그림. Tmux 실행 모습 (tmux.github.io)]

설치

여기서는 tmux 2.x 이상을 사용한다.

  • Ubuntu 14.04, Raspbian Jessie, Armbian 등에서 tmux가 1.8, 1.9 버전이 제공
  • Ubuntu 15, 16 Xenivior 버전은 Tmux 2.1
  • macOS는 brew 를 사용한다.

Tmux 2.3 설치

이전 Ubuntu 14.04, Raspbian 등에서 tmux가 1.8, 1.9 버전이 제공되는데 package manager 같은 기능을 사용할 수 없다. 소스로 빌드해서 사용할 수 있다.

Ubuntu 14.04 desktop, orangepi plus, raspberry pi jessie 초기 버전에서 빌드

소스 설치

혹시 모르니 기존 낮은 버전의 tmux를 삭제하고 시작해 보자.

1
$ sudo apt remove --purge tmux

소스를 https://github.com/tmux/tmux/releases/ 에서 최신 버전으로 다운로드 하고 빌드한다.

1
2
3
4
5
6
7
sudo apt update
sudo apt install -y libevent-dev libncurses-dev
wget https://github.com/tmux/tmux/releases/download/2.3/tmux-2.3.tar.gz
tar xvzf tmux-2.3.tar.gz
cd tmux-2.3/
./configure && make
sudo make install

deb 바이너리 설치

단, libtinfo5 6.x 설치시 의존성 라이브러리 문제로 패키지 삭제 문제 발생!!!

https://launchpad.net/ubuntu/yakkety/amd64/tmux/2.2-3 에 빌드되어 있는 바이너리를 Ubuntu 14.04 설치하기 위해서 다음 패키지 버전이 필요하다.

Depends on:

  • libc6 (>= 2.14)
  • libevent-2.0-5 (>= 2.0.10-stable)
  • libtinfo5 (>= 6)
  • libutempter0 (>= 1.1.5)

기본 설치후 업그레이드를 했다면 libc6 버전은 문제가 없는듯.

1
2
$ sudo apt-cache show libc6
$ sudo apt-cache show libtinfo5

Ubuntu14.04.4 LTS 버전의 libtinfo5는 5.9로 다음 같이 설치해 준다.

1
$ wget http://launchpadlibrarian.net/271601076/libtinfo5_6.0+20160625-1ubuntu1_amd64.deb

그리고 tmux 2.2 버전의 deb 를 다운로드한다.

1
$ wget http://launchpadlibrarian.net/263289132/tmux_2.2-3_amd64.deb

설치

1
2
$ sudo dpkb -i libtinfo5_6.0+20160625-1ubuntu1_amd64.deb
$ sudo dpkb -i tmux_2.2-3_amd64.deb

이제 tmux 명령으로 다중 터미널 명령을 사용할 수 있다.

macOS에서 tmux 설치

homebrew를 사용해서 tmux를 설치한다. 2017년 현재 2.4 버전이 설치된다.

1
$ brew install tmux

이제 tmux 명령으로 시작할 수 있다.

시작

tmux 를 시작하면 하나의 세션에 하나의 윈도우가 만들어 진다.

1
2
$ tmux                   # 세션을 시작하고 참가한다.
$ tmux new -s foo # 세션 foo를 시작하고 참가한다

세션에 참가하면 하나 혹은 그 이상의 윈도우에서 Pane을 배치해 사용할 수 있다.


[그림. Tmux window layout]

Control와 Meta key

Tmux 세션 참가후 Window에서는 Prefix key로 Session, Window, Pane 관련 명령을 키로 조합해 사용한다. 기본 Prefix key는 Control+b key고 옵션으로 사용하는 Meta key는 Alt 키 이다.

여기서 Prefix key는 C와 조합으로 표기하고, Meta key인 AltM으로 표기한다.

윈도우 명령 control, meta 키 조합과 병행해 윈도우에서 명령모드를 사용할 수 있다. 명령모드는 C-: 키로 시작하고, 명령모드에서 명령 자동 완성을 지원한다.


[그림. Window command mode]

Pane 다루기

윈도우는 수직/수평으로 구획을 나눌수 있다. C-“ 키로 현재 Pane 아래에 수평으로 새 Pane을 나눈다. 그리고 **C-%**키로 수직으로 새 Pane을 나눌 수 있다.


[그림. Tmux Window Pane]

  • C-q : pane 번호를 표시하고 번호를 눌러서 이동
  • C-o : pane을 순서대로 이동
  • C-방향키 : 해당 방향으로 이동
  • C-M-방향키 : 해당 방향으로 크기 조절
  • C-M-1~5 : 몇 가지 미리 설정된 레이아웃을 고를 수 있고, prefix space로 이 레이아웃을 순서대로 - 돌아가며 선택 가능
  • C-z : 특정화면만 확대하기 다시 예전 Panes상태로 돌아오기

Pane을 지우려면 터미널 exit 명령 혹은 C-x 키로 빠져 나올 수 있다.

Window 다루기

윈도우는 명령모드에서 new-window 혹은 C-c 키로 새 윈도우를 추가할 수 있다.


[그림. new Window ]

윈도우 사이의 이동은 윈도우 번호에 따라 단축키 C-0,1,2…9를 사용하거나 C-w로 윈도우 목록에서 선택해 이동할 수 있다.

  • C-n, C-p : 다음 윈도우, 이전 윈도우로 이동
  • C-l : 직전 사용하던 윈도우로 이동
  • C-w : 윈도우 리스트를 띄우고 선택
  • C-, : 윈도우 이름 바꾸기

세션 사용중에 세션을 빠져 나오려면 C-d 로 detach 하거나, 명령모드 C-:에서 detach 명령을 준다.

복사와 스크롤

Tmux 화면 버퍼는 한 화면분 밖에 안되서, 이전 화면 내용을 보려면 스크롤 기능을 켜야 한다. C+[ 키는 스크롤 키고, 우측상단에 페이지 표시가 나타난다. 키보드 방향키나 Page Up/Down키로 스크롤이 가능하다.

세션 연결

세션은 하나 혹은 그 이상 만들고 attach 명령으로 세션에 참가할 수 있다.

1
2
3
4
$ tmux new -s foo -d     # 세션 foo를 시작하고 빠져나온다.
$ tmux ls # 세션 목록을 출력한다.
0: 1 windows (created Fri May 12 10:26:00 2017) [80x24] (attached)
foo: 1 windows (created Fri May 12 10:34:18 2017) [80x24]

터미널에서 세션에 참가하려면 attach 명령과 대상 세션을 지정해 준다. 대상 세션은 tmux ls 명령에 표시되는 세션번호 혹은 세션이름을 지정한다.

1
2
3
$ tmux attach
$ tmux attach -t 0 # 세션 0번에 참여한다
$ tmux attach -t foo # 세션 foo에 참여한다.

세션을 완전히 종료 시키려면, tmux 세션에서 명령모드 C-: 에서 kill-session 명령을 실행한다.
혹은 다른 터미널에서 세션번호 혹은 세션 이름으로 종료한다.

1
$ tmux kill-session -t 3   # 세션번호 3을 종료한다.

설정파일 .tmux.conf

사용자 홈디렉토리에 .tmux.conf 파일에 tmux에 대한 설정을 명시할 수 있다.

Control + a 사용하기

Capslock키를 Control 키로 대체해 사용하면, Control+a 키 조합이 편하다. .tmux.conf 에 키 조합을 변경한다.

1
2
3
4
5
#Control+a에 'prefix' 연결
set -g prefix C-a
#send-prefix를 Control+a에 전달
bind C-a send-prefix
unbind C-b

위에서 prefix는 C-a 로 재배치된다.

Mouse On/Off

1
2
3
4
5
6
7
8
9
# Toggle mouse on with META m
bind m \
set-option -g mouse on \;\
display 'Mouse: ON'

# Toggle mouse off with META M
bind M \
set-option -g mouse off \;\
display 'Mouse: OFF'

Plugin manager

Tmux Pluin Manager 를 설치하고, tmux 기능을 확장할 수 있다.

tpm 설치

먼저 사용자 홈 디렉토리에 저장한다.

1
$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

다음 설정을 tmux.conf 에 저장한다.

1
2
3
4
5
6
7
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

plugin 관리

플러그인 설치를 위해서 C-I (대문자) 를 실행
플러그인 업그레이드를 위해서 C-U 를 실행

  • 플러그인 목록에서 플러그인을 선택하고 C-M-u (소문자)

Tmux-Resurrection

tmux-resurrect{:.keyword}는 tmux 세션을 백업/복구 할 수 있는 플러그인이다. tmux.conf에 다음을 추가

1
set -g @plugin 'tmux-plugins/tmux-resurrect'

플러그인 설치를 위해서 C-I 를 실행하면 설치를 시작한다.

Resurrection 플러그인으로 백업/복구하는 키는 다음 같이 지정되어 있다:

  • C-s : save
  • C-r : restore

Tmux-continuum

tmux-resurrect{:.keyword} 에서 저장한 환경을 자동으로 저장/복구할 수 있는 플러그인이다.

tmux-continuum{:.keyword} 의 주요 기능은:

  • tmux{:.keyword} 환경을 15분 마다 자동 저장
  • 컴퓨터/서버 시작시 tmux{:.keyword} 자동 시작
  • tmux{:.keyword} 시작시 자동 복구
  • tmux 1.9 이상, bash, tmux-resurrect plugin

설치

.tmux.conf 파일에 아래 플러그인을 추가:

1
2
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

tmux 에서 플러그인 설치를 위해서 C-I (대문자) 를 실행

그리고 .tmux.conf 파일에 continuum-restore 을 on으로 해준다.

1
set -g @continuum-restore 'on'

tmux 세션을 모두 나와서 tmux 서버를 모두 kill-session 같은 명령으로 종료시킨후 tmux를 다시 시작하면 .tmux/resurrect 에 저장된 마지막 세션이 복구되는 것을 확인할 수 있다.

이제부터 15분 마다 자동 저장하고 서버를 재시작한 후에 tmux를 다시 시작하면 저장한 환경을 자동으로 복구해 준다.

tmux status 표시

tmux-continuum 의 상태를 tmux status line에 표시할 수 있다.

1
set -g status-right 'Continuum status: #{continuum_status}'

Linux에서 tmux 자동 시작

tmux-continuum 은 Linux systemd, macOS 에서 자동 시작을 지원한다.

Linux는 .tmux.conf 파일에 다음 부트 옵션을 추가한다.

1
set -g @continuum-boot 'on'

그리고 현재 실행중인 세션에 변경한 설정을 적용하려면

1
$ tmux source-file ~/.tmux.conf

macOS에서 tmux 자동 시작

.tmux.conf 파일에 다음 부트 옵션을 추가한다.

1
set -g @continuum-boot 'on'

그리고 현재 실행중인 세션에 변경한 설정을 적용한다.

1
$ tmux source-file ~/.tmux.conf

맥이 재시작 하면 자동으로 Terminal.app 이 실행된다. 터미널 크기는 다음 옵션으로 지정한다:

1
2
3
4
set -g @continuum-boot-options 'fullscreen' # terminal window will go fullscreen
set -g @continuum-boot-options 'iterm' # start iTerm instead of Terminal.app
set -g @continuum-boot-options 'iterm,fullscreen' # start iTerm in fullscreen

다중 tmux 서버는 지원하지 않는다.

tmux 로 서버를 하나 시작하고, tmux -S /tmp/foo 같이 다른 소켓을 사용했다고 자동 저장/복구가 별도로 진행되지 않는다. [^10]

여기까지 설정한 내용은 qkboo/tmux.conf gist 에서 확인 가능.


### 설정 저장

tmux 설정을 위힌 default 파일이 존재하지 않는다는 점이다. 그래서 tmux 기본 설정을 어딘가 추출해서 보관해두면 다시 돌아오는데 편리하다. 현재 tmux에 설정된 값은 다음 명령어로 추출할 수 있다.

1
$ tmux show -g | sed 's/^/set-option -g /' > ~/.tmux.current.conf

tmux.conf를 적용하는 명령은 source-file이다.

1
$ tmux source-file ~/.tmux.current.conf

Tmux 관련글

  1. Tmux 시작
  2. Tmux cheatsheet

참고

Ubuntu/Debian ARM Cross compile 환경

이 글은 우분투, 리눅스 박스에서 GNU ARM Cross compiler 를 설치하고 관리하는 방법을 다루고 있다.

2018-05-17: sidebar.nav/linux 사용
{: .right-history}

ARM Cross compiler 설치

우분투/데비안 리눅스에서 제공하는 ARM Toolchain 환경은 Linaro 툴체인을 바탕으로 만들어져 있어서 두가지 버전으로 제공된다. Hard Float을 지원하는 버전과 그렇지 않은 버전이다.[^1]

자세히 보기

find 명령 usages

find 명령에서 자주 사용하는 쓰임새를 요약했다.

2018-05: rm, i-node 내용 추가
{:.right-history}

find 명령

find 명령 요약

주어진 이름으로 찾아 화면에 출력한다. -name 은 대소문자 구분한 이름을 준다.

1
find ./ -name '*.xml' -print

주어지는 이름의 패턴은 *? 를 사용할 수 있다.

찾은 결과를 받아 명령의 입력으로 실행할 수 있다. 다음은 현재 디렉토리 밑에서 .c 파일을 찾아 md5sum 으로 해시 값을 출력한다. -iname은 대소문자 구분을 하지 않는다.

1
2
find -iname "*.c" -exec md5sum {} \;
d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c

검색시 탐색 깊이는 -maxdepth 혹은 -mindepth를 사용할 수 있다.

1
find -maxdepth 2 -iname "*.c" -exec md5sum {} \;

어떤 파일을 제외한 것만 찾을 수 있다:

1
find -maxdepth 1 -not -iname "mycprogram.c"

파일의 퍼미션으로 찾을 수 있다.

1
2
3
find . -perm -g=r -type f -exec ls -l {} \;
find . -perm g=r -type f -exec ls -l {} \;
find . -perm 040 -type f -exec ls -l {} \;

찾은 후 삭제하기:

1
find ./ -name 'Debug' -exec rm -rf {} \;

find 명령으로 i-node를 통해서 지우기:

아래 처럼 특수문자로 “~” or “a b c” 등의 이상한 파일이 있을 경우 inode를 확인해 삭제에 유용하다.

1
2
3
4
$ ls -i
$ 32471 a b c
$ find . -inum 32471 -exec rm -rf {} ';'
$ find . -inum 32471 -exec rm -rf {} \;

회피문자 파일 이름 삭제하기

???? 같이 지워지지 안는 파일 같은 경우도 i-node로 삭제할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
~$ ls -ali
~$ ls -ali
total 2068
42467329 drwxr-xr-x 11 qkboo qkboo 4096 Jun 20 22:54 .
2 drwxr-xr-x 10 qkboo qkboo 4096 Jun 1 12:56 ..
42467482 drwxr-xr-x 2 qkboo qkboo 12288 Jul 2 2016 .Picasa3Temp
42598444 drwxrwxrwx 3 qkboo qkboo 4096 Mar 29 23:45 ??????
42475521 drwxr-xr-x 4 qkboo qkboo 4096 Jun 20 22:52 Design_Assets
42467936 drwxr-xr-x 14 qkboo qkboo 4096 Mar 4 16:39 Incoming

~$ find . -inum 42598444 -exec rm {} \;

파일 형식으로 검색

옵션 -type 은 파일 형식으로 찾을 수 있다. 파일 형식은:

b block special
c character special
d directory
f regular file
l symbolic link
p FIFO
s socket

일반 파일

1
find . -type f

소켓 형식의 파일

1
find . -type s

디렉토리 형식

1
find . -type d

숨겨진 파일만 검색도 가능하다.

1
find . -type f -name ".*"

역시 숨겨진 디렉토리만 찾을 수 도 있다.

1
find -type d -name ".*"

파일 크기로 검색

옵션 -size 를 사용해서 파일의 크기로 찾을 수 있다.

아래는 어떤 크기 보다 크거나, 작은 파일을 찾아 준다.

1
2
3
find -size +100M     # 보다 큰 파일
find -size -100M # 보다 작은 파일
find -size 100M # 같은 크기의 파일

다음 같이 응용해 볼 수 있다. 100MB 보다 큰 파일을 찾아 삭제한다:

1
find / -type f -name *.zip -size +100M -exec rm -i {} \;

파일의 수정된 시간을 기준

모든 파일의 수정된 시간 정보를 알 수 있다. test_1.txt의 시간을 기준으로 검색해 보자.

1
2
ls -lrt test_1.txt
-rw-r--r-- 1 gtko gtko 0 2011-02-01 02:26 test_1.txt

옵션 -newer 에 대상 파일을 주면 해당 파일을 생성한 날짜 이후의 결과만을 표시하게 된다.

1
2
3
4
5
find -newer test_1.txt
.
./dir2
./dir2/file2
./dir2/file3

자주 사용할 만한 find 명령

유용한 find 명령들 alias로 만들어 사용하기도 한다.

a.out 인 파일 지우기

1
alias rmao="find . -iname a.out -exec rm {} \;"

c프로그램의 core 파일

1
alias rmc="find . -iname core -exec rm {} \;"

큰 파일 삭제…

1
2
3
4
alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"

iconv 와 결합

iconv로 파일 인코딩을 변환할 수 있는데, 많은 파일을 한번에 처리하기 위해서 find와 결합해 찾은 모든 파일의 파일 인코딩을 변환할 수 있다.

다음은 .c 파일을 찾아 인코딩을 euc-kr에서 utf-8로 변환하는 명령이다.

1
find ./ -name '*.c' -exec iconv -feuc-kr -tutf-8 {} -o {} \;

find 를 사용하지 않는다면, 디렉토리 안에 있는 모든 파일의 인코딩을 변환하고자 할 때는 shell 조건문과 섞어서 사용할 수 있다.

1
$ for F in './*.sql'; do iconv -c -feuc-kr -tutf-8 $F -o $F; done

참조

Linux find command examples

update-alternatives 명령 사용

이 글은 우분투, 리눅스 박스에서 여러버전의 도구를 관리할 수 있는 update-alternatives 를 다루고 있다.

update-alternative

update-alternative 유틸리티로 리눅스 기본 제공 개발 환경의 gcc, cross compiler용 gcc 등 여러 버전의 gcc를 사용할 수 있게 구성할 수 있다.
이들 버전의 환경을 교체해서 사용하기를 원한다. update-alternative 도구를 사용할 수 있다.

update-alternative 사용

여러 버전의 gcc를 update-alternative를 사용해서 선택적으로 사용할 수 있다. gcc 로 등록된 현재 버전 목록을 질의 한다.

1
$ update-alternatives --query gcc

등록

여기서 사용하는 여러 gcc 버전들을 설치한 후에 다음과 같은 명령어로 등록을 할 수 있다.

1
update-alternatives --install <link> <name> <path> <priority>
  • 실행파일 이름으로 /etc/alternatives/ 을 가리킨다. (예: /usr/bin/pager)
  • 해당 링크 그룹의 대표 이름으로, 여러 가지 버전의 패키지들을 대표하는 이름으로 보면 될 것 같다.(예: pager)
  • alternatives 로 실제 연결할 실행파일 이름으로, 시스템에 설치한 패키지의 실행파일 이름이다.(예: /usr/bin/less)
  • automatic 모드에서 어떤 것을 자동으로 선택해서 사용할지 결정할 때 사용되는 우선순위로, 높은 수가 더 높은 우선순위이다.

gcc 등록

Ubuntu 14.04 최신 버전에 gcc4.7, 4.8 를 사용하려고 설치했다고 가정한다.

1
2
3
sudo apt-get update
sudo apt-get install gcc-4.7 g++-4.7
sudo apt-get install gcc-4.8 g++-4.8

그리고 gcc 그룹에 4.8를 우선도가 높게 50으로 준다.

1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8

여기서 gcc를 master로 g++을 slave로 준비했다. --slave 옵션은 --install 로 지정한 master에 종속해서 여러개의 슬레이브를 마스터에 추가할 수 있고, 마스터의 링크가 바뀌면 슬레이브도 함께 바뀐다.

두번째 버전은 gcc-4.7 버전을 우선도가 40 정도로 하자.

1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 50 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7