라즈베리파이 PIXEL 데스크탑에서 사용할 수 있는 화면 캡쳐 프로그램 scrot 사용법을 정리합니다.


scrot는 SCReenshOT의 약자이며, 말 그래도 화면 캡처를 하는 프로그램입니다. 기본적으로 텍스트 기반의 프로그램이며 일단 터미널 창에서 scrot -h 라고 입력하면 도움말을 보여주는데, 중요한 명령어가 위로 빨리 올라가버리니까 scrot -h | more 라고 입력하여 명령어를 확인합니다.


개인적으로 자주 쓰는 옵션은 -d, -u, -b 입니다.


-d는 delay를 의미하고, 보통 -d 5 처럼 바로 뒤에 숫자를 쓰면 해당하는 시간(초단위) 이후에 캡쳐를 합니다. 예를 들어, 웹브라우저가 떠있는 전체 화면을 캡쳐하려면 터미널 창을 하나 띄우고 여기에 scrot -d 5 라고 입력하고 터미널 창을 최소화하여 기다립니다.


-u 옵션은 현재 활성화된 왼도우만을 캡쳐하고 싶을 때 사용합니다. 예를 들어, 터미널 창을 2개 띄워놓고 ls 화면을 캡쳐하려면 다른 창에서 scrot -d 5 -u 라고 입력하고, 5초 안에 ls 명령을 내린 터미널 창을 클릭하여 활성화 시킵니다.


그런데 -u 옵션만 사용하면 윈도우 타이틀바와 테두리를 함께 캡쳐하지를 않네요. 뭔가 약간 어색해서, 보통은 -b 옵션을 같이 줘서 border까지 함께 캡쳐를 합니다. scrot -d 5 -u -b 라고 입력해도 되고, scrot -d 5 -ub 라고 입력해도 됩니다.


이렇게 캡쳐한 화면은 바로 위 터미널 ls 화면에 보라색 글씨로 나타난 것처럼 <날짜>-<시간>-<해상도>_scrot.png 형태의 이름으로 저장됩니다. 화면 캡쳐니까 png 파일 포맷이 적당해보입니다.


단축키도 지원을 하는데요, PrtSc 키를 누르면 전체 화면을 저장합니다. 음.. PrtSc 키에 대해서 scrot 화면 캡쳐를 하는 것은 ~/.config/openbox/lxde-pi-rc.xml 파일에서 키바인딩이 기본으로 되어 있기 때문인데요..


만약 ALT + PrtSc 키에 대해 현재 활성화된 화면 캡쳐를 수행하도록 하고, CTRL + PrtSc 키에 대해 윈도우 선택 또는 사각형 영역 지정 캡쳐를 수행하려면 아래와 같이 lxde-pi-rc.xml 파일을 편집하면 됩니다. (287~296라인) 그리고 재부팅 또는 openbox --reconfigure 명령을 입력하면 됩니다.



Posted by kkokkal
:

작년 4월인가에 라즈베리파이3B 모델을 사고, 라즈베리파이 전용 카메라 모듈도 구입을 했습니다. 이때만해도 8M 카메라 모듈이 나오기 전이라 5M 모듈만 있을 때였죠. 이거 사자마자 거의 같은 가격으로 8M 모듈이 발표되서 슬펐던 기억이 있는데.. 암튼 그때만해도 라즈베리파이에 카메라를 붙이고 OpenCV를 깔아서 뭐라도 해볼 요량이었지만, 어쩌다 보니 카메라를 사놓고 별것 해보지도 못하고 구석에 쳐박아 두었었네요.


이번에 다시 라즈비안 OS를 새로 깔고 새마음으로 라즈베리파이에 카메라를 붙였습니다. OpenCV는 이미 깔아놨고, 이번에는 라즈베리파이 카메라를 사용해보려고 합니다. 라즈베리파이카메라를 사용하기 위해 raspicam라는 이름의 라이브러리를 사용할 것입니다. raspicam 라이브러리에 대한 설명은 아래 링크를 참고합니다.

http://www.uco.es/investiga/grupos/ava/node/40


위 사이트에 쓰여있듯이 raspicam은 BSD 라이센스를 따르기 때문에 자유롭게 이용이 가능하고, 일반 C++ 인터페이스뿐만 아니라 OpenCV 인터페이스도 지원합니다. raspicam 라이브러리도 소스 코드를 다운받아서 직접 빌드를 진행해야 라이브러리 파일이 생성됩니다. 설치와 관련되어서는 아래 블로그 설명이 잘 되어 있네요.

http://webnautes.tistory.com/956


소스 코드 다운로드부터 빌드까지 명령어를 백업을 위해 아래에 정리해두겠습니다.

pi@GoPiGo:~ $ wget https://downloads.sourceforge.net/project/raspicam/raspicam-0.1.6.zip
pi@GoPiGo:~ $ unzip raspicam-0.1.6.zip
pi@GoPiGo:~ $ cd raspicam-0.1.6
pi@GoPiGo:~/raspicam-0.1.6 $ mkdir build && cd build
pi@GoPiGo:~/raspicam-0.1.6/build $ cmake .. 2>&1 | tee cmake_messages.txt


위와 같은 cmake 설정을 하고나면 화면에 출력되는 메시지가 cmake_messages.txt 파일에도 함께 저장됩니다. 이때 CREATE OPENCV MODULE=1 이라는 메시지가 출력이 되어야 raspicam 라이브러리가 OpenCV를 인식하고, OpenCV에서 함께 사용할 수 있도록 라이브러리를 생성합니다. cmake_messages.txt 파일의 전체 내용을 아래 [더보기]에 나타내었습니다.


cmake가 정상적으로 동작하였으면 이제 실제 빌드 작업을 수행합니다. 기본적으로 make -j2 명령을 입력하면 되고, 혹시나 하는 마음에 빌드 메시지도 함께 기록합니다. 빌드가 완료되면 sudo make install 명령으로 실제 라이브러리를 시스템 폴더에 복사합니다.

pi@GoPiGo:~/raspicam-0.1.6/build $ make -j2 2>&1 | tee build_messages.txt
pi@
GoPiGo:~/raspicam-0.1.6/build $ sudo make install
pi@GoPiGo:~/raspicam-0.1.6/build $ sudo ldconfig


위 사진은 sudo make install 명령을 입력했을 때의 모습입니다. 일단 raspicam 라이브러리 설치가 완료되었습니다. 참 쉽죠? :-)


그러면 이제 raspicam 라이브러리와 OpecCV 라이브러리를 이용하여 카메라 입력을 받고 간단한 얼굴 검출 프로그램을 만들어보겠습니다. 홈디렉토리 아래에 coding/opencv/facedetect 디렉토리를 만들고, 여기에 main.cpp 파일을 생성합니다. main.cpp 파일은 아래와 같이 작성합니다.

#include <opencv2/opencv.hpp>
#include <iostream>
#include <raspicam/raspicam_cv.h>

using namespace cv;
using namespace std;
 
int main(int argc, char* argv[]) {
	raspicam::RaspiCam_Cv cam;

	cam.set(CV_CAP_PROP_FORMAT, CV_8UC3);
	cam.set(CV_CAP_PROP_FRAME_WIDTH, 640);
	cam.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
	
	if (!cam.open()) {
		cerr << "Camera open failed!" << endl;
		return -1;
	}

	CascadeClassifier cascade("haarcascade_frontalface_default.xml");

	if (cascade.empty()) {
		cerr << "Failed to open xml file!" << endl;
		return -1;
	}

	Mat frame, gray, reduced;
	int64 t1, t2;
	bool do_flip = false;
	
	while (1) {
		cam.grab();
		cam.retrieve(frame);
		
		if (do_flip)
			flip(frame, frame, -1);

		t1 = getTickCount();
		
		cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
		resize(gray, reduced, Size(0, 0), 0.5, 0.5);
		
		vector<Rect> faces;
		cascade.detectMultiScale(reduced, faces, 1.1, 3, 0, Size(40, 40));
		
		for (size_t i = 0; i < faces.size(); i++) {
			Rect rc;
			rc.x = faces[i].x << 1;
			rc.y = faces[i].y << 1;
			rc.width = faces[i].width << 1;
			rc.height = faces[i].height << 1;
			
			rectangle(frame, rc, Scalar(0, 0, 255), 3);
		}
		
		t2 = getTickCount();
		cout << "It took " << (t2 - t1) * 1000 / getTickFrequency() << " ms." << endl;

		imshow("frame", frame);
		
		int k = waitKey(1);
		if (k == 27)
			break;
		else if (k == 'f' || k == 'F')
			do_flip = !do_flip;
	}

	cam.release();
	destroyAllWindows();
}


소스 코드가 그리 길지는 않죠? 일단 raspicam::RaspiCam_Cv 객체를 생성해서 카메라를 열고, 매 프레임마다 Haar Cascade Classifier로 얼굴을 검출합니다. 속도 향상을 위해서 매 프레임을 가로, 세로 1/2 크기로 줄인 다음에 얼굴을 검출하고, 검출된 얼굴 영역을 화면에 보여줄 때 다시 좌표를 2배 확대합니다. 제가 라즈베리파이에 카메라를 거꾸로 달아놔서 'f' 키를 누르면 영상을 flip 하여 얼굴 검출을 수행합니다.


Makefile은 아래와 같이 수정합니다.

CC = g++
CFLAGS = -g -Wall
SRCS = main.cpp
PROG = $(notdir $(CURDIR))

OPENCV = `pkg-config opencv --cflags --libs`
LASPICAM = -lraspicam -lraspicam_cv
LIBS = $(OPENCV) $(LASPICAM)

.PHONY: all clean

$(PROG):$(SRCS)
    $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS)

all: $(PROG)

clean:
    rm -f $(OBJS) $(PROG)


이제 터미널 창에서 make 명령을 입력하면 프로그램을 빌드하여 facedetect라는 실행 파일을 생성합니다.

위에서 haarcascade_frontalface_default.xml 파일은 OpenCV를 설치할 때 /usr/local/share/OpenCV/haarcascades 디렉토리에 만들어집니다. 그러므로 cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml . 명령으로 현재 폴더로 복사하면 됩니다.


이제 터미널 창에서 ./facedetect 명령으로 프로그램을 실행하면 아래처럼 얼굴을 검출합니다.


왼쪽 상단에 나타난 창은 htop 프로그램인데요, 4개의 코어가 다 동작하는 것을 확인할 수가 있구요... 한 프레임에서 얼굴을 찾는데 대략 130~200 ms 정도의 시간이 걸리는 것을 확인할 수 있습니다.


약간의 속도 향상을 위해서 소스 코드에서 cascade.detectMultiScale(reduced, faces, 1.1, 3, 0, Size(40, 40)); 부분을 cascade.detectMultiScale(reduced, faces, 1.2, 3, 0, Size(60, 60), Size(240, 240)); 형태로 수정하고 프로그램을 다시 돌려보니 조금 빨라졌네요. :-)


Posted by kkokkal
:

라즈베리파이에 OpenCV를 깔았으니 간단한 OpenCV 프로그램을 만들어보겠습니다. 간단한 엣지 검출 예제를 만들어보면서 소스 코드 편집, 빌드, 실행 방법등을 정리해보겠습니다. 


일단 저는 소스 코드 편집을 vi 에디터를 사용하는데요, 라즈베리파이에 기본으로 깔리는 vi는 정확하게 vim.tiny 입니다. 그런데 vim.tiny는 syntax coloring을 지원하지 않네요. 그러므로 vim 패키지를 새로 설치했습니다. 명령어는 sudo apt-get install vim 입니다.


프로그래밍 테스트를 할 폴더를 하나 만들고, 특히 OpenCV 관련 코딩을 모아놓을 폴더도 하나 만들도록 합니다. 새로 만들 예제 프로그램은 canny라는 이름의 디렉토리에 만들겠습니다.

pi@GoPiGo:~ $ mkdir coding && cd coding
pi@GoPiGo:~/coding $ mkdir opencv && cd opencv
pi@GoPiGo:~/coding/opencv $ mkdir canny && cd canny
pi@GoPiGo:~/coding/opencv/canny $


여기에서 vi main.cpp 명령을 입력해서 아래와 같이 소스 코드를 입력합니다.


이번에는 Makefile을 생성하고, 아래와 같이 내용을 입력합니다.

CC = g++
CFLAGS = -g -Wall
SRCS = main.cpp
PROG = $(notdir $(CURDIR))

OPENCV = `pkg-config opencv --cflags --libs`
LIBS = $(OPENCV)

.PHONY: all clean

$(PROG):$(SRCS)
    $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS)

all: $(PROG)

clean:
    rm -f $(OBJS) $(PROG)

** 위에서 들여쓰기 되어 있는 부분은 TAB을 사용해야 합니다. **


이 Makefile은 현재 폴더에서 main.cpp 파일을 컴파일하고, OpenCV 라이브러리를 사용하고, 결과 파일 이름은 현재 디렉토리 이름과 동일한 형태로 생성합니다. 즉, 현재 디렉토리 이름이 canny이니까 main.cpp 파일을 빌드해서 canny라는 이름의 실행 파일을 생성합니다. Makefile을 이용해서 빌드를 하려면 터미널 창에서 make라고만 입력하면 됩니다.


순조롭게 canny 실행 파일이 생성이 되었습니다. 이제 ./canny 명령을 입력해서 실행을 하면 아래처럼 2개의 창이 나타나면서 캐니 엣지 검출 결과를 보여줍니다.


참 쉽죠??


그나저나 캐니 엣지 검출기의 실행 속도가 궁금해졌습니다. 그래서 소스 코드에 아래와 같이 캐니 엣지 검출기 실행 시간을 측정해봤습니다.

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(void)
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return -1;
	}

	int64 t1 = getTickCount();

	Mat dst;
	Canny(src, dst, 50, 150);

	int64 t2 = getTickCount();
	cout << "It took " << (t2 -t1) * 1000 / getTickFrequency() << " ms." << endl;

	imshow("src", src);
	imshow("dst", dst);

	waitKey(0);
	return 0;
} 


위에서 getTickCount(), getTickFrequency() 함수를 조합해서 Canny() 함수의 실행 시간을 측정하였고, 그 결과는 아래와 같습니다.


자세히 보면 왼쪽 아래 터미널 창에 "It took 12.5726 ms." 라고 출력이 되어 있는 것을 볼 수 있는데요.. 512x512 크기의 영상에 대해서 12msec 정도 걸린 것이니 그렇게 아주 나쁘지는 않은 것 같습니다. 근데 몇 번을 더 해보니까 12ms 시간대로 나오는 경우는 거의 없네요. 대부분 16~24ms 정도로 측정이 되었습니다.



Posted by kkokkal
:

라즈베리파이에서 사용하는 공식 OS 라즈비안 Jessie는 Debian 리눅스 Jessie를 기반으로 라즈베리파이에 맞게끔 커스터마이징된 OS이기 때문에 어쨋든 리눅스입니다. 소스 컴파일도 리눅스답게 gcc 또는 g++을 사용하고, apt-get 같은 명령어를 이용하여 패키지를 설치하구요.


요즘의 리눅스는 GUI가 기본이고 GUI 환경의 파일관리자가 기본으로 제공되지만, 라즈베리파이를 서버처럼 사용하고 주로 putty 같은 터미널 프로그램으로 접속해서 관리하는 경우에는 전통적인 텍스트 환경에서 명령어 기반의 파일 관리를 (어쩔 수 없이) 해야하는 경우가 많습니다. cp, mv, rm, rmdir 같은 명령어를 사용해서 파일을 복사하고 옮기고 지우는 작업을 하는 건데요.. 이것도 익숙해지면 할만하기는 하지만 가끔은 좀 더 편한 인터페이스가 있으면 좋겠다는 생각이 드는건 어쩔 수 없습니다.


그래서 라즈베리파이에서 사용할 수 있는 텍스트 기반 GUI를 지원하는 파일 관리자를 사용하는 방법을 알아보려고 합니다. 제가 설치할 프로그램은 mc와 linm인데요, 먼저 mc부터 설치를 해보겠습니다.


mc는 Midnight Commander라는 이름의 파일 관리 프로그램이구요, https://midnight-commander.org/ 에서 자세한 정보를 얻을 수 있습니다. mc 설치는 apt-get 명령을 이용하여 쉽게 설치할 수 있습니다. 터미널 창에서 sudo apt-get install mc 라고 입력하면 됩니다.


설치가 끝나고 터미널 창에서 mc를 실행하면 다음과 같은 화면이 나타납니다.


화면 색깔이라던가 위에 파일 목록이 나타나고, 아래쪽에 명령어를 입력할 수 있는 콘솔이 나타난다는 등의 모양새가 예전 도스 시절의 norton commander와 거의 유사합니다.


그런데 저는 노턴 코맨더를 사용하던 쪽이 아니었습니다. 주로 mdir을 사용하던 사람이었는데요, 리눅스에서도 이런 대결 구도(?)가 재현되네요. Mdir의 리눅스 클론(?)이 바로 linm 입니다.


linm은 아마도 http://kldp.net/projects/mls 사이트에서 프로젝트가 관리되고 있었나봅니다만, 현재는 연결이 되지 않고 있구요, 다만 자세한 정보는 https://wiki.kldp.org/wiki.php/LinM 페이지에서 볼 수 있습니다. linm은 현재 Kyu-Ung Lee 님의 프로젝트 페이지에서 소스 코드와 *.deb 파일을 다운로드 받을 수 있습니다.

https://launchpad.net/~kyu419/+archive/ubuntu/ppa/+packages


저는 라즈베리파이에 linm을 설치할 것이기 때문에 위 페이지에서 linm - 0.8.1-1-0ubuntu12 항목 아래에 있는 linm_0.8.1-1-0ubuntu12_armhf.deb 파일을 다운로드 받았습니다. (https://launchpad.net/~kyu419/+archive/ubuntu/ppa/+files/linm_0.8.1-1-0ubuntu12_armhf.deb) 그리고 이 파일을 FTP 프로그램을 이용하여 제 라즈베리파이로 옮겼습니다. 그리고 putty 프로그램으로 라즈베리파이에 접속해서 sudo dpkg --install linm_0.8.1-1-0ubuntu12_armhf.deb 명령을 입력하여 설치를 진행했습니다. (위에 위키 페이지에서는 zlib1g, openssl, libncurses, libncursesw5, libsmbclient 같은 패키지를 미리 설치해야 한다고 설명이 되어 있습니다만, 라즈베리파이에서 libncurses 같은 패키지가 잘 설치가 안되기도 하고, 또 굳이 얘네들 패키지를 설치하지 않고 곧바로 linm_0.8.1-1-0ubuntu12_armhf.deb 파일을 설치해도 잘 설치가 되더군요.)



설치가 끝나고 터미널 창에서 linm을 입력하면 아래와 같은 화면이 나타납니다.


화면 구성이나 색깔이 예전 도스의 mdir과 똑같습니다. 뭔가 아련한 느낌까지 들 정도네요. ㅎㅎ putty에서 linm을 실행하면 처음에 세로 줄이나 가로줄이 좀 깨지는 경우가 있는데, ALT+L 키를 눌러서 라인 코드를 바꿔주니까 깔끔하게 잘 나타납니다. (또는 F12를 눌러서 옵션 메뉴 아래 라인 코드 바꾸기를 선택하세요.) 화면을 분할하려면 Ctrl+W 키를 눌러주면 됩니다. 프로그램을 종료하려면 Ctrl+Q를 누릅니다.


개인적으로는 linm의 모양새가 더 친근해서 mc 보다는 linm을 사용합니다. 근데 linm은 화살표로 파일간 이동을 할 때 비정상적으로 비프음을 내는 경우가 많습니다. 근까 아래 화살표를 길게 누르다보면 맨 마지막 파일에 다다랐을 때 '딩~' 하는 소리가 나는 것은 그러려니한데, 보통 파일 이동 중간쯤에서도 '딩~' 소리가 나는 경우가 많아서, 뭔가 이상한 느낌을 주게 합니다. (putty의 문제인지...) mc는 그런 오동작이 없고, 또 메뉴 선택이나 파일 선택을 마우스를 이용해서 할 수도 있다는 장점이 있긴 하네요.



Posted by kkokkal
:

라즈베리파이를 Samba를 설치하면 Windows 운영체제에서 손쉽게 네트워크 연결을 해서 파일을 읽거나 쓰는 것이 충분히 가능하지만, 경우에 따라서는 FTP 연결이 필요한 경우가 있습니다. 라즈비안 제시를 설치하고 SSH를 enable 설정하면 SFTP를 사용할 수 있는 것으로 알고 있지만, 개인적으로 주로 totalcmd 프로그램의 FTP 기능을 사용하고 있어서 SFTP가 아닌 일반 FTP 서버를 새로 설치하려고 합니다.


라즈베리파이에서 많이들 사용하는 FTP 서버는 vsftp입니다. vsftp를 설치하기 위해서는 터미널에서 sudo apt-get install vsftpd 명령을 입력합니다.


설치가 완료되면 vsftp 데몬의 설정을 일부 수정합니다. vsftp 설정은 /etc/vsftpd.conf 파일에 저장되어 있으며, 텍스트 편집기를 이용하여 아래 2개 설정에 대한 주석을 해제합니다.

write_enable=YES
local_umask=022


설정이 완료되었으면 vsftpd를 재시작합니다. 재시작 명령어는 sudo /etc/init.d/vsftpd restart 입니다.






Posted by kkokkal
:

인터넷 검색하다가 찾은 사이트인데, 알아두면 언젠가 쓸만할 것 같아서 기록을 남겨둡니다.

http://www.makeuseof.com/tag/15-useful-commands-every-raspberry-pi-user-should-know/


* 버전 정보 보기

pi@RaspberryPi3:~ $ cat /proc/version
Linux version 4.9.31-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #1005 SMP Thu Jun 8 13:02:15 BST 2017

pi@RaspberryPi3:~ $ uname -a
Linux RaspberryPi3 4.9.31-v7+ #1005 SMP Thu Jun 8 13:02:15 BST 2017 armv7l GNU/Linux


* CPU 정보 보기

pi@RaspberryPi3:~ $ cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

Hardware        : BCM2835
Revision        : a02082
Serial          : 000000009ff5eecb


* 메모리 정보 보기 (현재 Kodi 동작 중)

pi@RaspberryPi3:~ $ cat /proc/meminfo
MemTotal:         750636 kB
MemFree:          291612 kB
MemAvailable:     600900 kB
Buffers:          152888 kB
Cached:           200668 kB
SwapCached:            0 kB
Active:           165568 kB
Inactive:         256416 kB
Active(anon):      69072 kB
Inactive(anon):     4948 kB
Active(file):      96496 kB
Inactive(file):   251468 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        102396 kB
SwapFree:         102396 kB
Dirty:                44 kB
Writeback:             0 kB
AnonPages:         68384 kB
Mapped:            74800 kB
Shmem:              5588 kB
Slab:              24476 kB
SReclaimable:      12760 kB
SUnreclaim:        11716 kB
KernelStack:        1512 kB
PageTables:         1960 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      477712 kB
Committed_AS:     512672 kB
VmallocTotal:    1310720 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
CmaTotal:           8192 kB
CmaFree:            6796 kB


* CPU 온도 체크

pi@RaspberryPi3:~ $ vcgencmd measure_temp
temp=53.7'C


* ARM/GPU 메모리 크기

pi@RaspberryPi3:~ $ vcgencmd get_mem arm
arm=752M
pi@RaspberryPi3:~ $ vcgencmd get_mem gpu
gpu=256M


Posted by kkokkal
:

가끔 인터넷에서 대용량 파일을 배포할 때 토렌트를 사용하는 경우가 있습니다. 불법적으로 돌아다니는 영화도 주로 토렌트로 공유가 되구요, 우분투나 라즈비안 Jessie 이미지도 토렌트를 이용하여 다운로드 받을 수 있습니다. 사실 토렌트 기술 자체는 꽤 괜찮은 기술이죠. 대용량 파일을 꽤 빠르게 다운받게 해주니까요.


여하튼 라즈베리파이에도 토렌트 클라이언트를 설치할 수 있습니다. 저는 라즈베리파이 하나를 서버처럼 사용할 것이기 때문에 라즈베리파이에 토렌트 클라이언트를 설치해놓으면 밤낮으로 쉬지않고 자료를 다운받게 되니 편리합니다. 라즈베리파이에서 주로 사용되는 토렌트 클라이언트 프로그램은 transmission입니다. transmission 프로그램을 설치하려면 터미널 창에서 sudo apt-get install transmission-daemon 명령어를 입력합니다.


위 그림에서 첫 번째 줄에 쓰여 있는 명령어 dpkg -l | grep transmission 명령은 현재 시스템에 transmission이라는 문자열이 들어가 있는 패키지가 설치되어 있는지를 확인하는 명령입니다. transmission-daemon을 설치했었는지가 문득 헷갈려서..


일단 transmission-daemon 프로그램을 설치하였으면 이번에는 transmission 설정 파일을 일부 편집해야 합니다. transmission-daemon 프로그램의 설정 파일은 /etc/transmission-daemon/settings.json 이고, 관리자 권한으로 수정해야 하므로 sudo vi /etc/transmission-daemon/settings.json 명령어를 입력하여 파일을 수정할 수 있습니다. 다만 이미 실행되고 있는 transmission-daemon을 일단 멈쳐야 합니다. 그러므로 다음과 같은 순서로 명령어를 입력합니다.

pi@RaspberryPi3:~ $ sudo /etc/init.d/transmission-daemon stop
[ ok ] Stopping transmission-daemon (via systemctl): transmission-daemon.service.
pi@RaspberryPi3:~ $ sudo vi /etc/transmission-daemon/settings.json


settings.json 파일에서 개인적으로 수정을 하였거나 관심을 가져야할 셋팅 정보를 아래에 정리했습니다.

"download-dir": "/mnt/TOSHIBA/Downloads", (<- "/var/lib/transmission-daemon/downloads")
"incomplete-dir": "
/mnt/TOSHIBA/Downloads/incomplete", (<- "/var/lib/transmission-daemon/Downloads")
"incomplete-dir-enabled": true, (<- false)
"rpc-password": "패스워드", (트랜스미션을 재시작하면 암호화되어 저장됨)
"rpc-port": 9091, (기본값임)
"rpc-username": "pi", (<- "transmission")
"rpc-whitelist-enabled": false, (<- true)


settings.json 파일 편집이 끝나면 transmission-daemon을 재시작합니다.

pi@RaspberryPi3:~ $ sudo /etc/init.d/transmission-daemon restart
[ ok ] Restarting transmission-daemon (via systemctl): transmission-daemon.service.


transmission-daemon을 재시작하였으면 이제 실제로 대용량 파일을 다운받아보겠습니다. 일단 transmission-daemon이 제공하는 웹 인터페이스에 접속을 해겠습니다. 앞서 setting.json 파일에서 rpc-port 라는 것을 9091번을 지정했는데, 웹 브라우저를 이용하여 이 포트로 접속을 하면 transmission 화면이 나타납니다. 예를 들어 위에서 설정한 라즈베리파이에 접속하려면 http://192.168.25.16:9091/ 로 접속을 합니다. 물론 내부 네트웍이니까 외부에서는 접속이 안되구요, 접속을 하면 앞에서 설정한 사용자 이름과 암호를 물어봅니다. 사용자 이름과 암호를 잘 입력하면 아래 그림과 같은 웹사이트로 접속이 되구요..


위 그림에서 주소창 바로 아래 툴바 아이콘 중에서 맨 왼쪽의 폴더 열기 같은 모양의 아이콘이 *.torrent 파일을 추가하는 인터페이스 모양입니다. *.torrent 파일 뿐만 아니라 마그넷 주소도 추가할 수 있습니다. https://www.raspberrypi.org/downloads/raspbian/ 사이트에서 라즈비안 Jessie 토렌트 파일을 다운받고, 다운받은 2017-04-10-raspbian-jessie.zip.torrent 파일을 업로드하면 아래 그림처럼 2017-04-10-raspbian-jessie.zip 파일을 다운로드 시작합니다.



Posted by kkokkal
:

개인적으로 라즈베리파이 하나는 Kodi를 활성화시키고 외장 하드를 달아서 멀티미디어 서버로 사용할 예정이라 외장 하드를 연결하는 방법을 정리해보겠습니다.

 

작년에 처음 라즈베리파이를 이용하여 Kodi 환경을 구성할 때 샀던 외장 하드는 도시바 칸비오 커넥트2(CANVIO Connect2) 2TB Black 제품입니다. 지금 다시 검색을 해보니 USB 3.0을 지원하는 모델이네요. 라즈베리파이에만 붙여쓰기에 뭔가 아까운 제품이군요. 기록을 위해 제품 사양을 백업해둡니다.

 

 

작년에 처음 라즈베리파이에 외장 하드를 달려고할 때 걱정했던 것은 혹시나 외장 하드가 전력이 약해서 제대로 동작하지 않으면 어쩌나 하는 것이었는데요, 다행히 동영상 파일이 제대로 읽히지 않는 문제 같은 것은 없었습니다. (지금 확인해보니 Kodi용으로 사용하던 라즈베리파이에는 5V/2.2mA 충전기를 사용하고 있었네요. 이번에 새로 셋업을 하면서 테스트했던 충전기는 5V/1.8mA 짜리였는데도 동작은 잘 했었습니다.)

 

PIXEL 윈도우가 떠있는 환경에서 라즈베리파이에 외장 하드를 연결하면 자동으로 인식하고 마운트까지 해줍니다.

 

[확인] 버튼을 눌러서 실제로 확인을 해보면 /media/pi/TOSHIBA 디렉토리로 마운트가 되어 있습니다. 제 외장 하드는 도시바 제품이고 레이블이 TOSHIBA로 되어 있어서 /media/pi/TOSHIBA 라는 폴더로 마운트가 됩니다.

 

실제로 마운트된 하드 디스크의 정보를 확인하려면 터미널 창에서 sudo lsblk -o UUID,NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,MODEL 명령 또는 sudo blkid 명령을 입력해봅니다.

외장 하드가 /dev/sda1 장치로 연결되어 있고, /media/pi/TOS로 시작하는 이름으로 마운트가 되었다는 것을 확인할 수 있습니다. (실제로는 /media/pi/TOSHIBA 입니다. 터미널 창을 크게 만들면 전체 이름이 제대로 출력됩니다.) 또한 UUID가 E8~~~62이고, 파일 시스템이 ntfs인 것도 확인할 수 있습니다. 이 정보를 이용하여 라즈베리파이가 부팅할 때마다 자동으로 외장 하드를 마운트하도록 시스템 설정을 바꿀 겁니다.

 

일단 외장 하드의 파일 시스템이 ntfs인데요, ntfs 파일 시스템으로 된 외장 하드의 내용을 읽는 것은 기본 설정으로도 가능하지만 파일을 쓰기 위해서는 ntfs-3g 패키지를 추가로 설치해야 합니다. 그러므로 터미널 창에 sudo apt-get install ntfs-3g 명령을 입력합니다.

 

시스템이 부팅될 때 외장 하드를 자동 마운트를 하게 하려면 /etc/fstab 파일을 편집해야 합니다. (fstab은 file system table 약자입니다.) 보통은 "특정 UUID의 외장 하드를 OOO 디렉토리로 마운트를 하고 기본 속성은 XXX 형태로 설정해라"라는 의미의 명령줄을 입력해야하는데요, 이를 위해 먼저 마운트를 위한 디렉토리를 만들어야 합니다. 저는 /mnt/ 디렉토리 밑에 TOSHIBA 디렉토리를 만들고, 여기에 외장 하드를 마운트하도록 설정했습니다.

위에서 fstab 파일에 적어놓은 마운트 속성은 라즈베리파이 공식 사이트에 나와있는 설명을 일단 그대로 적었습니다. 나중에 필요하면 수정을 하면 되겠죠. fstab 파일 편집이 끝나면 시스템을 재부팅해서 /mnt/TOSHIBA 디렉토리에 외장 하드 파일이 나타나는지 확인하면 됩니다.

 

참고로 라즈베리파이 공식 사이트에서 설명하는 외장 하드 추가 방법은 아래 링크를 참고하면 됩니다.

https://www.raspberrypi.org/documentation/configuration/external-storage.md

 

(2017년 6월 20일 추가)

이전에 라즈베리파이 공식 사이트 설명을 참고해서 /etc/fstab 파일을 설정하였는데요, 이때 사용한 옵션이 그닥 좋은 옵션이 아닌 것 같습니다. 특히나 umask=000 으로 설정하면 디렉토리 뿐만 아니라 모든 파일의 권한이 777로 설정되면서 실행까지 가능한 형태로 생성이 됩니다.

 

아, 그 전에 ntfs 파일 형식을 사용하면 일반적인 리눅스에서 사용하는 파일 퍼미션 관련 설정(chown, chmod 등)을 할 수가 없네요. 그래서 ext4로 포맷을 해야하나 잠시 고민을 했었습니다만, 어차피 내부적으로만 사용하는 것이니 그냥 현재 ntfs 형식을 사용하기로 했습니다. (귀차니즘...)

 

그렇다 하더라도 모든 파일 권한이 777로 설정되는 것은 아닌 것 같습니다. 게다가 기존의 방식이라면 파일 소유주가 root입니다. 뭔가 너무 이상한 느낌이 들어서, fstab 매뉴얼을 뒤져봤습니다. 우분투 문서 쪽에 설명이 잘 되어 있더군요.

https://help.ubuntu.com/community/Fstab

이 내용을 기반으로 /etc/fstab 파일을 아래와 같이 변경했습니다. 이렇게 변경하면 외장 하드에 모든 파일과 디렉토리는 pi 소유로 생성되고, 파일은 664, 디렉토리는 777 형태로 생성이 됩니다. 일단은 이 형태로 써봐야겠습니다.

proc            /proc           proc    defaults          0       0
PARTUUID=9a0c5809-01  /boot           vfat    defaults          0       2
PARTUUID=9a0c5809-02  /               ext4    defaults,noatime  0       1
UUID=E8B88C56B88C2562 /mnt/TOSHIBA   ntfs   defaults,uid=pi,gid=pi,dmask=000,fmask=113,users,rw 0 0
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

 

Posted by kkokkal
:

삼바(samba)는 Windows 운영체제를 사용하는 PC에서 Linux 또는 UNIX 서버에 접속하여 파일이나 프린터를 공유하여 사용할 수 있도록 해 주는 소프트웨어이다. 1991년 호주의 박사과정 학생이었던 앤드루 트리젤(Andrew Tridgell)이 개발하였다.  (from 위키백과)

samba는 MS Windows 운영체제에서 리눅스를 네트워크 드라이브 같은 형태로 접속해서 사용할 수 있게 해주는 프로그램입니다. 라즈베리파이에 samba를 설치하면 같은 네트워크에 물려있는 Windows PC에서 탐색기를 실행하여 아래 그림처럼 해당 라즈베리파이(여기서는 RASPBERRYPI3)를 볼 수 있고, 실제로 RASPBERRYPI3 아이콘을 더블클릭하면 기본 사용자 pi 홈디렉토리를 탐색할 수 있습니다.


일단 samba는 기본 설치되어 있는 것이 아니므로 터미널 창에서 sudo apt-get install samba samba-common-bin 명령어를 입력해서 따로 설치해야 합니다.


설치가 완료되면 기본 사용자인 pi에 대하여 삼바 암호를 설정합니다. samba 암호 설정 명령어는 sudo smbpasswd -a pi 입니다. 아래 그림과 같이 암호를 2번 물어봅니다.


일단 삼바 설치까지는 잘 되었는데요, 이번에는 Windows에서 실제로 samba 접속을 해서 사용할 때 좀 더 편리하게 사용할 수 있도록 일부 설정을 변경하려고 합니다. 삼바 관련 설정은 /etc/samba/smb.conf 파일을 편집하면 되구요, 시스템 설정 파일이기때문에 관리자 권한으로 편집을 해야 합니다. sudo vi /etc/samba/smb.conf 명령을 입력해서 아래와 같이 편집을 합니다.

smb.conf 파일은 [global], [homes], [printers] 등의 섹션으로 나누어져 있는데요, 일단 [global] 섹션 맨 아래, [homes] 섹션 바로 위에 follow symlinks = yes, wide links = yes, unix extensions = no 같은 설정을 추가합니다. 저는 나중에 라즈베리파이에 외장 하드를 달고 심볼릭 링크를 이용하여 외장 하드에 접근할 예정이라 이를 위한 용도로 심볼릭 링크 관련 설정을 추가한 것이구요..

그 밑에 [pi] 섹션을 새로 만들어서 pi 유저로 접속할 때 사용할 설정을 추가했습니다. 대충 속성 이름을 보면 무슨 의미인지는 알 수 있을 것 같네요. mask에 대해서 잘 모르시는 분들은 리눅스(유닉스)에서 파일 권한(file permission) 쪽을 공부하시면 좋을 것 같습니다. (몇몇 블로그에 0777 권한을 사용하는 설명이 있는데요, 딱히 권장하지는 않습니다.)


smb.conf 파일 편집이 끝나면 이제 samba를 다시 시작합니다. 터미널 창에 sudo /etc/init.d/samba restart 명령을 입력하면 samba가 다시 시작되고, Windows PC에서 접속이 가능해집니다. 필요하다면 네트워크 드라이브 연결을 해서 사용할 수도 있습니다.




Posted by kkokkal
:

집에서 라즈베리파이 하나에는 외장 하드를 달고 Kodi를 설치해서 멀티미디어 서버로 활용할 계획인지라 유동 IP가 아닌 고정 IP를 설정하여 사용하려고 합니다. 말 그대로 아무리 재부팅을 하더라도 IP 주소가 바뀌지 않고 (내가 설정한 값으로) 고정이 되어 있게 만드는 것입니다.


일단 현재 라즈베리파이가 WiFi가 연결은 되어 있다는 가정하에, 터미널 창에서 ifconfig 명령을 입력해봅니다. (WiFi 연결은 "라즈베리파이 최초 부팅 후 기본 설정" 게시글 맨 아래에 적어두었습니다.)

ifconfig 명령은 리눅스에서 네트워크 인터페이스 설정을 보여주는 명령어인데요, 위 그림에서 관심을 가지고 봐야 하는 것은 wlan0입니다. wlan0가 무선 인터넷 연결 설정을 의미하고, 노란색 박스 부분이 제 라즈베리파이의 IP 주소입니다. 우리집 내부 네트워크에서만 사용되는 내부 IP 주소죠. 예전에 이사하기 전에 살던 집에서 IPTIME 공유기를 사용할 때에는 192.168.0.xxx 형태였는데, 이번에 BTV 공유기에서는 192.168.25.xxx 형태로 내부 IP를 잡네요. 만약 고정 IP를 설정하지 않으면 라즈베리파이를 재부팅할때마다 맨 마지막 번호인 16이 계속 바뀔 수 있어서 서버로 사용하기에 적합하지 않습니다.


기왕 192.168.25.16으로 주소가 할당되었으니 항상 이 주소를 사용하도롤 네트워크 설정을 변경해보겠습니다. 네트워크 설정은 /etc/network/interfaces 파일에서 수정할 수 있으며, 이 작업은 슈퍼유저 권한이 필요하니 sudo 명령으로 편집기를 실행해야 합니다. 저는 vi가 편하니까 다음과 같이 입력하여 편집했습니다.

pi@RaspberryPi3:~ $ sudo vi /etc/network/interfaces


그리고 /etc/network/interfaces 파일을 다음과 같은 형태로 수정합니다.

위 그림에서 녹색 박스 안쪽을 수정하면 됩는데요, 먼저 박스에서 첫 번째 줄 맨 뒤를 원래 manual이었던 것을 static으로 변경하고, 그 아래 주소들을 적절하게 변경합니다. address 항목에 원하는 내부 IP 주소를 입력하고, 나머지 항목들은 적절하게 입력하면 됩니다. 보통 IP 주소 4개의 필드 중에서 1, 2, 4번 필드는 위와 동일할 것이고, 세 번째 필드만 원래 할당되었던 주소의 것을 복사해서 사용하면 됩니다.


/etc/wpa_supplicant/wpa_supplicant.conf 파일에는 이미 설정한 적이 있는 WiFi AP에 대한 정보가 저장이 되어 있습니다. 실제로 sudo cat /etc/wpa_supplicant/wpa_supplicant.conf 명령으로 파일 내부를 살펴보면 아래 그림과 같은 내용이 출력됩니다.


이제 재부팅을 하고 다시 ifconfig 명령으로 IP 주소를 확인하여 아까 설정한 주소가 맞는지 확인해보면 됩니다.

Posted by kkokkal
: