라즈베리파이에서 사용하는 공식 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을 설치할 것이기 때문에 위 페이지에서 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는 그런 오동작이 없고, 또 메뉴 선택이나 파일 선택을 마우스를 이용해서 할 수도 있다는 장점이 있긴 하네요.
제가 2016년 4월에 처음 Kodi를 설치했을 때에는, Kodi 버전이 15였습니다. apt-get install 명령으로 설치를 할 수 있었구요.. 그런데 Kodi에서 유투브 애드온을 설치해서 사용하다보니까 한글 키보드 입력이 되지 않아서, Kodi 소스 코드를 직접 빌드해서 Kodi 버전 16을 설치했었고, 얼마전까지 잘 사용하고 있었습니다. 그러다가 최근에 라즈비안을 새로 설치하면서 Kodi도 새로 설치를 하게 되었네요.
일단 라즈베리파이에 Kodi를 설치하려면 GPU 메모리를 160MB 이상으로 잡아주는 것이 좋습니다. 라즈베리파이 데스크탑 환경에서 [시작메뉴] -> [기본 설정] -> [Raspberry Pi Configuration] 메뉴를 실행하고, 아래 그림과 같이 Performance 탭에서 GPU 메모리를 충분히 크게 잡아줍니다. 물론 터미널에서 sudo raspi-config 명령을 사용해서 수정해도 됩니다.
그 다음부터는 아래 링크의 명령를 순서대로 따르면서 설치를 진행했습니다. 구글링을 꽤 해봤는데, 최신 버전의 Kodi 설치에 대한 글은 그리 많지 않더군요. 그나마 이 블로그의 내용이 가장 잘 정리가 되어있었습니다.
pi@RaspberryPi3:~ $ sudo cat /etc/apt/sources.list deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi deb http://pipplware.pplware.pt/pipplware/dists/jessie/main/binary / # Uncomment line below then 'apt-get update' to enable 'apt-get source' #deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi pi@RaspberryPi3:~ $
pi@RaspberryPi3:~ $ sudo usermod -a -G audio pi pi@RaspberryPi3:~ $ sudo usermod -a -G video pi pi@RaspberryPi3:~ $ sudo usermod -a -G input pi pi@RaspberryPi3:~ $ sudo usermod -a -G dialout pi pi@RaspberryPi3:~ $ sudo usermod -a -G plugdev pi pi@RaspberryPi3:~ $ sudo usermod -a -G tty pi
9. (Optional) 만약 Kodi 화면에서 Kodi 종료 뿐만 아니라 시스템 끄기, 시스템 재부팅 등의 메뉴를 추가하고 싶다면 /etc/polkit-1/localauthority/50-local.d/all_users_shutdown_reboot.pkla 파일을 생성하여 아래와 같이 입력
pi@RaspberryPi3:~ $ sudo cat /etc/polkit-1/localauthority/50-local.d/all_users_shutdown_reboot.pkla [Allow all users to shutdown and reboot] Identity=unix-user:* Action=org.freedesktop.login1.*;org.freedesktop.upower.*;org.freedesktop.consolekit.system.* ResultActive=yes ResultAny=yes ResultInactive=yes pi@RaspberryPi3:~ $
10. (Optional) 라즈비안이 부팅하자마자 Kodi를 자동으로 실행하게 하려면, 아래처럼 스크립트를 다운받아 /etc/init.d/kodi 형태로 생성하고, 이를 enable 시킴. 만약 자동 실행을 취소하려면 sudo systemctl disable kodi 명령을 입력.
OpenCV 설치와 관련된 블로그를 읽다보면 TBB를 함께 설치하라는 글을 종종 찾을 수가 있습니다. TBB는 Threading Building Blocks의 약자이고, Intel에서 만든 다중 코어, 멀티 쓰레드 라이브러리입니다. 대용량 데이터인 영상을 처리할 때 여러 개의 쓰레드를 사용하여 연산을 좀 더 빠르게 수행할 수 있게 해주는 역할을 하는 라이브러리 입니다.
TBB는 예전에는 GPL 라이센스를 따르다가 TBB 2017 버전부터는 Apache v2.0 라이센스를 따르기 때문에 사용하기가 좀 더 자유로와졌습니다.
그렇다면 OpenCV를 직접 빌드하여 설치할 때 TBB를 함께 설치하면 효과적이겠지요? 멀티 쓰레드를 사용하여 연산 시간이 몇 배 빨라질 수 있으니까요. 그렇지만 굳이 번거롭게 TBB를 설치하지 않아도 최신 버전의 OpenCV에서는 멀티 쓰레드 프로그래밍을 기본 지원합니다. 오늘은 이 부분에 대해 정리하려고 합니다.
즉, OpenCV 2.4.3 버전부터 TBB 뿐만 아니라 OpenMP, GCD, Concurrency 같은 멀티 쓰레드 기법을 이용하여 OpenCV 코드가 동작한다는 의미입니다. 일단 저는 Windows 운영 체제에서 Visual Studio를 주로 이용하는데요, Visual Studio 2010 버전 이상부터는 MS의 Concurrency라는 이름의 멀티 쓰레드 기법이 기본으로 적용됩니다. 즉, 굳이 TBB를 깔지 않아도 Concurrency 기법을 통해 병렬 프로그래밍이 동작한다는 의미이죠. (몇몇 블로그에서 소개하는 TBB 설치 관련 얘기는 2013년 이전에 사용되는 기법입니다. 현재는 굳이 TBB를 사용하지 않아도 된다는 것이죠)
실제로 OpenCV 소스 코드 중에서 <opencv>/modules/core/src/Parallel.cpp 파일을 보면 아래와 같은 형태로 코드가 작성이 되어 있습니다.
void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes)
{
CV_INSTRUMENT_REGION_MT_FORK()
if (range.empty())
return;
#ifdef CV_PARALLEL_FRAMEWORK
if(numThreads != 0)
{
ProxyLoopBody pbody(body, range, nstripes);
cv::Range stripeRange = pbody.stripeRange();
if( stripeRange.end - stripeRange.start == 1 )
{
body(range);
return;
}
#if defined HAVE_TBB
tbb::parallel_for(tbb::blocked_range(stripeRange.start, stripeRange.end), pbody);
#elif defined HAVE_CSTRIPES
parallel(MAX(0, numThreads))
{
int offset = stripeRange.start;
int len = stripeRange.end - offset;
Range r(offset + CPX_RANGE_START(len), offset + CPX_RANGE_END(len));
pbody(r);
barrier();
}
#elif defined HAVE_OPENMP
#pragma omp parallel for schedule(dynamic)
for (int i = stripeRange.start; i < stripeRange.end; ++i)
pbody(Range(i, i + 1));
#elif defined HAVE_GCD
dispatch_queue_t concurrent_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply_f(stripeRange.end - stripeRange.start, concurrent_queue, &pbody, block_function);
#elif defined WINRT
Concurrency::parallel_for(stripeRange.start, stripeRange.end, pbody);
#elif defined HAVE_CONCURRENCY
if(!pplScheduler || pplScheduler->Id() == Concurrency::CurrentScheduler::Id())
{
Concurrency::parallel_for(stripeRange.start, stripeRange.end, pbody);
}
else
{
pplScheduler->Attach();
Concurrency::parallel_for(stripeRange.start, stripeRange.end, pbody);
Concurrency::CurrentScheduler::Detach();
}
#elif defined HAVE_PTHREADS_PF
parallel_for_pthreads(pbody.stripeRange(), pbody, pbody.stripeRange().size());
#else
#error You have hacked and compiling with unsupported parallel framework
#endif
}
else
#endif // CV_PARALLEL_FRAMEWORK
{
(void)nstripes;
body(range);
}
}
즉, TBB, OpenMP, GCD, Concurrency, pthread 중 어느 것 하나만이라도 있으면 OpenCV는 멀티 쓰레드 형태로 동작을 하게 되고, 병렬 처리를 하기 때문에 빠르게 동작한다는 것이죠.
참고로 Visual Studio 버전이 2010 이상 버전이면 HAVE_CONCURRENCY가 자동으로 #define 됩니다. 라즈베리파이같은 리눅스 머신에서는 pthread가 자동으로 동작합니다.
그렇다면 TBB랑 OpenMP, Concurrency 같은 것들끼리 성능 차이가 얼마나 있을까요? 같은 병렬 프로그래밍이라고 하더라도 TBB가 더 효과적으로 잘 동작한다면 Visual Studio에서 기본 지원하는 Concurrency 보다는 TBB를 깔아서 쓰는 것이 더 좋지 않을까요?? 저도 이런 의문을 가지고 구글링을 열심히 해보았는데요, 뚜렷한 성능 비교 결과를 찾지 못했습니다. 그러나 좀 더 생각을 해보니, 어차피 OpenCV에서 큰 성능 향상을 얻으려면 병렬 프로그래밍보다는 CUDA 또는 OpenCL 쪽을 더 고민해보는 것이 맞지 않을까 생각합니다.
그래서 제 결론은, "Visual Studio 사용할 때에는 그냥 기본 Concurrency 라이브러리를 사용하자"입니다. 굳이 번거롭게 TBB를 깔지 않아도 됩니다. (TBB을 이용해서 빌드하면 프로그램 배포 시 tbb.dll 파일도 함께 배포해야 합니다.)
참고로 Visual Studio의 Concurrency에 대한 내용은 아래 유투브 동영상을 참고하시면 좋습니다. 아래 동영상에서 설명하는 Auto Parallelization이라는 것이 Concurrency와 같은 내용입니다.
지난 번 "Visual Studio 2017에서 OpenCV 3.2 빌드하기"에 이어 이번에는 OpenCV Extra module을 함께 빌드하는 방법을 정리해보겠습니다. 더불어 Python을 이용하여 OpenCV를 사용하기 위해 python 개발 환경을 만드는 것도 함께 알아봅니다.
추후 OpenCV를 Python 언어로 사용하려면 OpenCV를 빌드하기 전에 미리 Python을 컴퓨터에 설치해두어야
합니다. 개인적으로는 Python을 직접 설치하는 방법 대신, Anaconda를 설치하여 Python과 유용한 라이브러리를
한꺼번에 설치했습니다. 제가 설치한 Anaconda 버전은 4.4.0이고, 이 패키지에 들어있는 Python 버전은 3.6.1
입니다. Anaconda는 아래 링크에서 다운로드 할 수 있습니다.
참고로, Anaconda 4.4.0 버전을 설치할 때에는 Anaconda 관련 패스를 환경 변수에 추가하지 않는 것을 권장하는데요, 저는 그냥 환경 변수를 추가하여 설치를 했습니다.
이제 본격적으로 OpenCV를 빌드하는 방법을 알아보겠습니다. 먼저 OpenCV Extra modules 소스 코드를 다운로드 합니다. OpenCV Extra modules의 최신 소스 코드는 https://github.com/opencv/opencv_contrib 사이트에서 다운받을 수 있습니다. 다만 지금 빌드할 버전은 2016년 12월에 릴리즈된 OpenCV 3.2 버전이기때문에 아래 링크에서 소스 코드를 다운로드합니다.
위 사이트에서 Source code (zip) 으로 링크된 zip 파일을 다운로드하면 opencv_contrib-3.2.0.zip 이름으로 소스 코드가 다운로드 됩니다. 이 파일을 이전에 OpenCV 소스 코드 압축을 풀었던 C:\OpenCV 폴더에서 압축을 풉니다. 그러면 C:\OpenCV\opencv_contrib-3.2.0 폴더가 생기면서 그 아래에 여러 개의 폴더와 파일이 생성됩니다.
OpenCV Extra Modules와 함께 OpenCV 3.2를 빌드하는 방법은 "Visual Studio 2017에서 OpenCV 3.2 빌드하기"에서
설명한 방법과 거의 유사합니다. 가장 큰 차이점은 CMake 프로그램에서 Extra modules 소스 코드가 있는 폴더 위치를
지정해주어야 한다는 점인데요, 그 외에도 몇 가지 다른 점이 있으니 아래 내용을 잘 읽으시기 바랍니다.
소스 코드가 제대로 준비되었으면 이제 CMake를 실행합니다. 혹시 이전에 CMake에서 설정했던 내용이 기억되어 있을 경우 새로 빌드하는 과정에서 예상치못한 에러가 발생할 수도 있으니 [File] -> [Delete Cache] 메뉴를 한 번 실행하는 것을 권장합니다. 그리고 (예전에 했던 것과 동일하게) Where is the source code: 에는 C:\opencv\opencv-3.2.0 폴더를 선택하고, Where to build the binaries: 항목은 C:\opencv\mybuild 폴더를 선택합니다. 그리고 [Configure] 버튼을 클릭하고, "Visual Studio 15 2017 Win64" 항목을 선택합니다.
위 설정에서 중요한 것은 OPENCV_EXTRA_MODULES_PATH 항목을 C:/opencv/opencv_contrib-3.2.0/modules 로 지정하는 것입니다. C:/opencv/opencv_contrib-3.2.0/ 폴더가 아니라 그 아래에 있는 modules 폴더를 지정해야 합니다.
그리고 이전에 OpenCV 기본 소스 코드만 빌드할 때에는 BUILD_opencv_world 항목을 선택해서 빌드를 했지만, opencv_contrib 소스까지 함께 빌드할 때에는 BUILD_opencv_world 항목을 선택하면 에러가 발생합니다. 이는 OpenCV 3.2 릴리즈 버전의 소스 코드를 빌드할 때 발생하는 문제인데요, 일종의 버그라고 보시면 됩니다. 좀 더 최신의 OpenCV 소스 코드를 사용하여 빌드하면 BUILD_opencv_world 항목을 선택하여 빌드하여도 문제가 발생하지 않는데요, 일단 정식으로 릴리즈된 3.2 버전에 대해서는 위와 같은 형태로 선택하시는 것이 좋습니다.
Python과 관련된 설정을 살펴보면 Python3 관련 설정을 자동으로 되어 있고, Python2 관련 설정은 비어있는 것을 확인할 수 있습니다. (물론 이것은 제 시스템 설정과 관련된 것이고, 혹시라도 Python2를 설치하였다면 관련 항목이 보이는 것이 맞습니다.)
일단 위의 설정을 완료했으면 [Configure] 버튼을 다시 클릭합니다. 그리고 약간의 시간이 지나면 아래와 같은 화면이 나타납니다.
이전에 OpenCV 기본 소스만 설정할 때에는 [Configure] 버튼을 클릭하면 곧바로 모든 항목의 빨간색이 사라졌는데요, 이번에는 Extra modules 관련된 설정이 빨간색으로 새로 나타납니다. 특별히 설정을 변경할 것이 없다면 그대로 다시 [Configure] 버튼을 클릭합니다. 그리고 에러 발생 없이 모든 항목이 흰색으로 바뀌면 [Generate] 버튼을 클릭합니다. 아래에 제 PC의 설정을 아래 [더보기]에 요약해두었습니다.
FP16: Compiler support is available found IPP (ICV version): 9.0.1 [9.0.1] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win Could not find OpenBLAS include. Turning OpenBLAS_FOUND off Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) Could NOT find Matlab (missing: MATLAB_MEX_SCRIPT MATLAB_INCLUDE_DIRS MATLAB_ROOT_DIR MATLAB_LIBRARIES MATLAB_LIBRARY_DIRS MATLAB_MEXEXT MATLAB_ARCH MATLAB_BIN) VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file Caffe: NO Protobuf: NO Glog: NO freetype2: NO harfbuzz: NO Module opencv_sfm disabled because the following dependencies are not found: Eigen Glog/Gflags Tesseract: NO Check contents of vgg_generated_48.i ... Check contents of vgg_generated_64.i ... Check contents of vgg_generated_80.i ... Check contents of vgg_generated_120.i ... Check contents of boostdesc_bgm.i ... Check contents of boostdesc_bgm_bi.i ... Check contents of boostdesc_bgm_hd.i ... Check contents of boostdesc_binboost_064.i ... Check contents of boostdesc_binboost_128.i ... Check contents of boostdesc_binboost_256.i ... Check contents of boostdesc_lbgm.i ...
General configuration for OpenCV 3.2.0 ===================================== Version control: unknown
Extra modules: Location (extra): C:/opencv/opencv_contrib-3.2.0/modules Version control (extra): unknown
Video I/O: Video for Windows: YES DC1394 1.x: NO DC1394 2.x: NO FFMPEG: YES (prebuilt binaries) avcodec: YES (ver 57.64.101) avformat: YES (ver 57.56.100) avutil: YES (ver 55.34.100) swscale: YES (ver 4.2.100) avresample: YES (ver 3.1.0) GStreamer: NO OpenNI: NO OpenNI PrimeSensor Modules: NO OpenNI2: NO PvAPI: NO GigEVisionSDK: NO DirectShow: YES Media Foundation: NO XIMEA: NO Intel PerC: NO
Parallel framework: Concurrency
Other third-party libraries: Use IPP: 9.0.1 [9.0.1] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win Use IPP Async: NO Use Lapack: NO Use Eigen: NO Use Cuda: NO Use OpenCL: YES Use OpenVX: NO Use custom HAL: NO
OpenCL: <Dynamic loading of OpenCL library> Include path: C:/opencv/opencv-3.2.0/3rdparty/include/opencl/1.2 Use AMDFFT: NO Use AMDBLAS: NO
cvconfig.h is in: C:/opencv/mybuild -----------------------------------------------------------------
Configuring done Generating done
OpenCV.sln 파일이 정상적으로 생성되면 Visual Studio 2017에서 열어서 빌드 작업을 수행합니다. Debug 모드와 Release 모드로 각각 전체 솔루션 빌드를 수행하고, 이후 INSTALL 프로젝트를 따로 빌드합니다. Debug 모드에서는 Python 프로젝트가 실패하기 때문에 실패 1이 나타날 수 있습니다. Release 모드는 실패 없이 402건 모두 성공했습니다.
정상적으로 빌드가 완료되었기 때문에 Python에서도 OpenCV를 사용할 수 있습니다. 도스창을 열어서 테스트해보면 OpenCV 버전이 잘 출력되는 것을 확인할 수 있습니다.
라즈베리파이를 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 입니다.
OpenCV는 Open Source Computer Vision Library이고, 2500개가 넘는 최신 컴퓨터 비전 알고리즘과 머신 러닝 알고리즘을 지원합니다. OpenCV는 BSD 라이선스를 따르고 있기 때문에 학계 연구용이나 상업적인 용도로 자유롭게 사용할 수 있습니다. 2017년 6월 현재, OpenCV 최신 버전은 3.2이고, http://www.opencv.org/ 웹사이트에서 Windows용 설치 버전을 다운받을 수 있습니다. 그러나 OpenCV 3.2 Windows 설치 버전은 Visual Studio 2015 버전으로 빌드되어 있는 DLL, LIB 파일만을 제공하기 때문에 Visual Studio 최신 버전인 Visual Studio 2017에서 사용하려면 소스 코드를 직접 빌드하여 사용하는 것이 좋습니다.
OpenCV를 처음 접하는 분들에게 당부드리는 말씀
OpenCV는 2006년 처음 1.0 버전이 나온 후
2015년에 OpenCV 3.0이 발표되었습니다. 버전이 올라가면서 IplImage 구조체를 사용하는 C언어 인터페이스에서 Mat
클래스를 사용하는 C++ 인터페이스로 발전하였고, 내부적으로 많은 구조적인 변화가 생겼습니다. 그럼에도 아직까지도 OpenCV
1.x 버전의 문법으로 되어 있는 소스 코드가 인터넷에 많이 돌아다니고 있는 현실인데요, 이제 새로 OpenCV를 배우는 분들은
과거의 문법과 구조를 사용하지 마시고 최신 OpenCV 3.x 버전에 맞는 문법을 배우시라고 권해드리고 싶습니다.
OpenCV 라이브러리를 설치하는 과정은 다음 순서를 따릅니다.
Visual Studio 설치하기
CMake 설치하기
OpenCV 소스 코드 다운로드
CMake 프로그램으로 솔루션 파일, 프로젝트 파일 생성하기
Visual Studio에서 OpenCV 빌드하기
OpenCV 설치하기
Visual Studio 설치하기
2017년 현재, Visual Studio 최신 버전은 Visual Studio 2017입니다. https://www.visualstudio.com/ 사이트에 접속하면 Visual Studio 2017 Community Edition을 무료로 다운로드 받아 설치할 수 있습니다. Visual Studio를 설치하는 방법은 자세히 설명하지 않으며, 다만 설치시 "C++를 사용한 데스크톱 개발" 항목은 반드시 선택하여 설치해야 합니다.
CMake 설치하기
CMake 프로그램은 다양한 운영 체제 또는 프로그래밍 개발 환경에 적합한 Make 파일(또는 프로젝트, 솔루션 파일)을 생성하는 유틸리티입니다. 즉, OpenCV 소스 코드로부터 Visual Studio 2017용 솔루션 파일(*.sln)과 프로젝트 파일(*.vcxproj) 파일을 생성해주는 프로그램이라고 생각하시면 됩니다. CMake 프로그램은 https://cmake.org/download/ 사이트에서 다운로드 받을 수 있으며, 3.8.0 이상 버전을 사용하시면 됩니다. CMake 설치는 크게 복잡하지 않으며 자세한 설명은 생략합니다.
OpenCV 소스 코드 다운로드
OpenCV 최신 소스 코드는 https://github.com/opencv/opencv 에서 다운받을 수 있습니다. 다만 이 글에서 사용할 소스 코드는 OpenCV 3.2 버전으로 배포된 소스 코드입니다. OpenCV 3.2 버전의 소스 코드는 OpenCV 3.2 설치 버전에도 들어있지만, 아래 링크에서 순수한 소스 코드만 다운받을 수 있습니다. Windows 환경이니 편리하게 Source code (zip) 파일을 선택하여 다운로드 하시면 됩니다.
이제부터 본격적인 소스 코드 빌드를 위한 작업을 설명합니다. 저는 C 드라이브 아래 opencv 라는 폴더를 만들고, 그 아래에서 소스 코드 압축을 해제하고 빌드 작업을 수행할 것입니다. 그러므로 C:\opencv\ 폴더를 생성하고, 그 아래에 opencv-3.2.0.zip 파일의 압축을 해제합니다. 그러면 C:\opencv\opencv-3.2.0 폴더 아래에 여러 개의 폴더와 파일이 생성됩니다. 그리고 실제 빌드 작업은 C:\opencv\mybuild 라는 이름의 폴더를 만들고, 그 안에서 DLL 파일과 LIB 파일을 생성할 것입니다. 즉, 우선 디렉토리 구조를 아래 그림처럼 생성합니다. (일단 opencv_contrib-3.2.0 폴더는 신경쓰지 않아도 됩니다.)
이제 CMake (cmake-gui) 프로그램을 실행합니다. CMake 프로그램에서 Where is the source code: 에는 C:\opencv\opencv-3.2.0 폴더를 선택하고, Where to build the binaries: 항목은 C:\opencv\mybuild 폴더를 선택합니다. 아래 그림처럼 선택을 하였으면 왼쪽 아래 [Configure] 버튼을 클릭합니다.
[Configure] 버튼을 클릭하면 아래와 같은 창이 나오는데요, 상단의 콤보 박스 항목 중에서 "Visual Studio 15 2017 Win64"를 선택합니다. Visual Studio 2017 버전을 사용할 것이고, 64비트로 컴파일하고 빌드할 것입니다. 만약 사용하고 있는 Windows 운영체제가 아직도 32비트 버전이라면 64비트 버전으로 갈아타는 것을 추천합니다. 그 아래 옵션은 기본값을 그대로 사용하기로 하고 [Finish] 버튼을 클릭합니다.
CMake 프로그램은 현재 PC의 설정을 확인하고, 추가적으로 빌드에 필요한 파일을 인터넷을 통해 다운로드 받습니다. 얼마간의 시간이 흐르면 아래와 같은 그림이 나타납니다. 가운데 영역이 빨간색 배경으로 나온 것이 왠지 살짝 섬뜩한데요, 여기서 OpenCV 빌드를 위한 옵션을 선택할 수 있습니다. 이 과정이 OpenCV를 설치하는 과정 중에서 가장 중요한 부분입니다. 다소 생소해보일수도 있지만 주의깊게 잘 생각해서 옵션을 선택해야 합니다.
참고로 제 PC에서 나타난 Configuration message는 아래와 같습니다.
The CXX compiler identification is MSVC 19.10.25019.0 The C compiler identification is MSVC 19.10.25019.0 Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe -- works Detecting CXX compiler ABI info Detecting CXX compiler ABI info - done Detecting CXX compile features Detecting CXX compile features - done Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe -- works Detecting C compiler ABI info Detecting C compiler ABI info - done Performing Test HAVE_CXX_FSIGNED_CHAR Performing Test HAVE_CXX_FSIGNED_CHAR - Failed Performing Test HAVE_C_FSIGNED_CHAR Performing Test HAVE_C_FSIGNED_CHAR - Failed FP16: Compiler support is available Check if the system is big endian Searching 16 bit integer Looking for sys/types.h Looking for sys/types.h - found Looking for stdint.h Looking for stdint.h - found Looking for stddef.h Looking for stddef.h - found Check size of unsigned short Check size of unsigned short - done Using unsigned short Check if the system is big endian - little endian Looking for fseeko Looking for fseeko - not found Looking for unistd.h Looking for unistd.h - not found Check size of off64_t Check size of off64_t - failed Looking for assert.h Looking for assert.h - found Looking for fcntl.h Looking for fcntl.h - found Looking for io.h Looking for io.h - found Looking for jbg_newlen Looking for jbg_newlen - not found Looking for mmap Looking for mmap - not found Looking for search.h Looking for search.h - found Looking for string.h Looking for string.h - found Looking for unistd.h Looking for unistd.h - not found ICV: Unpacking ippicv_windows_20151201.zip to C:/opencv/mybuild/3rdparty/ippicv... ICV: Package successfully downloaded found IPP (ICV version): 9.0.1 [9.0.1] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win CUDA detected: 8.0 CUDA NVCC target flags: -gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-D_FORCE_INLINES Could not find OpenBLAS include. Turning OpenBLAS_FOUND off Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) Found PythonInterp: C:/ProgramData/Anaconda3/python.exe (found suitable version "3.6", minimum required is "2.7") Found PythonInterp: C:/ProgramData/Anaconda3/python.exe (found suitable version "3.6", minimum required is "3.4") Found PythonLibs: C:/ProgramData/Anaconda3/libs/python36.lib (found suitable exact version "3.6.0") Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) Could NOT find Matlab (missing: MATLAB_MEX_SCRIPT MATLAB_INCLUDE_DIRS MATLAB_ROOT_DIR MATLAB_LIBRARIES MATLAB_LIBRARY_DIRS MATLAB_MEXEXT MATLAB_ARCH MATLAB_BIN) VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file
General configuration for OpenCV 3.2.0 ===================================== Version control: unknown
Video I/O: Video for Windows: YES DC1394 1.x: NO DC1394 2.x: NO FFMPEG: YES (prebuilt binaries) avcodec: YES (ver 57.64.101) avformat: YES (ver 57.56.100) avutil: YES (ver 55.34.100) swscale: YES (ver 4.2.100) avresample: YES (ver 3.1.0) GStreamer: NO OpenNI: NO OpenNI PrimeSensor Modules: NO OpenNI2: NO PvAPI: NO GigEVisionSDK: NO DirectShow: YES Media Foundation: NO XIMEA: NO Intel PerC: NO
Parallel framework: Concurrency
Other third-party libraries: Use IPP: 9.0.1 [9.0.1] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win Use IPP Async: NO Use Lapack: NO Use Eigen: NO Use Cuda: YES (ver 8.0) Use OpenCL: YES Use OpenVX: NO Use custom HAL: NO
NVIDIA CUDA Use CUFFT: YES Use CUBLAS: NO USE NVCUVID: NO NVIDIA GPU arch: 20 30 35 37 50 52 60 61 NVIDIA PTX archs: Use fast math: NO
OpenCL: <Dynamic loading of OpenCL library> Include path: C:/opencv/opencv-3.2.0/3rdparty/include/opencl/1.2 Use AMDFFT: NO Use AMDBLAS: NO
Java: ant: NO JNI: NO Java wrappers: NO Java tests: NO
Matlab: Matlab not found or implicitly disabled
Documentation: Doxygen: NO
Tests and samples: Tests: YES Performance tests: YES C/C++ Examples: NO
Install path: C:/opencv/mybuild/install
cvconfig.h is in: C:/opencv/mybuild -----------------------------------------------------------------
Configuring done
저는 기본으로 선택된 옵션 중에서 아래 몇가지 항목을 추가로 설정했습니다.
BUILD_EXAMPLES: 선택
BUILD_opencv_world: 선택
WITH_CUDA: 선택 해제 (VS2017 지원 안함)
WITH_OPENGL: 선택
BUILD_opencv_world 옵션을 선택하면 opencv_core320.dll, opencv_imgproc320.dll, opencv_highgui320.dll 같이 여러 개로 생성되는 DLL 파일들이 하나의 opencv_world320.dll 파일로 합쳐져서 빌드가 됩니다. 그러므로 소스 코드를 작성할 때에도 하나의 opencv_world320.lib 파일만 링크해서 사용하면 되기 때문에 편리합니다. 다만 효율성과 용량의 문제를 고려한다면 BUILD_opencv_world 옵션을 사용하지 않는 것이 좋은 선택일 겁니다.
일단의 선택을 마치면 다시 [Configure] 버튼을 클릭합니다. 그러면 CMake 중앙의 빨간색 배경의 옵션들이 모두 흰색 배경으로 변경됩니다. 이제 [Generate] 버튼을 클릭하면 C:\opencv\mybuild 폴더에 OpenCV.sln 파일이 생성됩니다.
Visual Studio에서 OpenCV 빌드하기
Visual Studio 2017 Community Edition을 실행하여 OpenCV.sln 솔루션 파일을 오픈합니다. 또는 C:\opencv\mybuild 폴더에서 OpenCV.sln 파일을 더블클릭하면 Visual Studio 2017이 실행됩니다. 그러면 아래 그림같은 화면이 나타납니다.
그리고 위에 그림처럼 [빌드] -> [솔루션 빌드] 메뉴 항목을 선택하면 OpenCV 소스 코드를 빌드하기 시작합니다. 이 작업은 PC 사양에 따라 조금 다르겠지만 대략 20분 내외의 시간이 소요됩니다.
빌드 작업이 끝나면 아래 그림의 하단 출력창처럼 빌드: 성공 202, 실패 0, 최신 0, 생략 7 같은 메시지가 나타납니다. 성공 프로젝트 개수는 CMake 옵션을 어떻게 주었느냐에 따라 다를 수 있습니다. 다만 실패 작업이 너무 많이 나타난다면 opencv_world320d.lib 빌드가 잘 되었는지를 확인하고, 문제가 있다면 CMake 작업부터 다시 시도하기 바랍니다.
OpenCV 설치하기
Visual Studio에서 빌드가 정상적으로 완료가 되었다고해서 완전히 끝난 것이 아닙니다. OpenCV를 빌드하면 DLL과 LIB 파일들이 생성되는데, 이 파일들을 한 곳에 모아서 작업하는 것이 좋습니다. 특히 OpenCV에서 사용하는 헤더파일은 C:\opencv\opencv-3.2.0\modules 폴더 아래에 산재해있기 때문에 이 파일들을 정해진 폴더에 옮기는 작업을 수행해야 합니다.
이 작업은 OpenCV 솔루션 중에서 INSTALL이라는 이름의 프로젝트를 이용하여 수행할 수 있습니다. 아래 그림처럼 현재 열려있는 프로젝트 중에서 INSTALL 이라는 이름의 프로젝트를 마우스로 선택하고, 여기서 마우스 오른쪽 버튼을 클릭하여 [빌드] 메뉴를 선택합니다.
위 작업이 완료되면 c:\opencv\mybuild\install\ 폴더 아래에 OpenCV 관련 헤더 파일, DLL 파일, LIB 파일들이 모여지게 됩니다. DLL 파일은 c:\opencv\mybuild\install\x64\vc15\bin\ 폴더로 복사되고, LIB 파일은 c:\opencv\mybuild\install\x64\vc15\lib\ 폴더로 복사됩니다. 헤더 파일은 c:\opencv\mybuild\install\include\ 폴더 아래로 모두 모이게 되는데, 탐색기로 이 위치를 살펴보면 아래와 같습니다.
이제 OpenCV를 Visual Studio에서 Debug 모드로 빌드하는 작업이 완료되었습니다. 이 작업을 이제 Release 모드로도 똑같이 반복합니다. 아래 그림처럼 현재 구성을 Debug 모드에서 Release 모드로 변경하고, 다시 [빌드] -> [솔루션 빌드] 메뉴를 선택합니다. 그리고 빌드가 완료되면 다시 INSTALL 프로젝트를 빌드하면 됩니다.
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
가끔 인터넷에서 대용량 파일을 배포할 때 토렌트를 사용하는 경우가 있습니다. 불법적으로 돌아다니는 영화도 주로 토렌트로 공유가 되구요, 우분투나 라즈비안 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 파일에서 개인적으로 수정을 하였거나 관심을 가져야할 셋팅 정보를 아래에 정리했습니다.
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 파일을 다운로드 시작합니다.
개인적으로 라즈베리파이 하나는 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 디렉토리에 외장 하드 파일이 나타나는지 확인하면 됩니다.
참고로 라즈베리파이 공식 사이트에서 설명하는 외장 하드 추가 방법은 아래 링크를 참고하면 됩니다.
이전에 라즈베리파이 공식 사이트 설명을 참고해서 /etc/fstab 파일을 설정하였는데요, 이때 사용한 옵션이 그닥 좋은 옵션이 아닌 것 같습니다. 특히나 umask=000 으로 설정하면 디렉토리 뿐만 아니라 모든 파일의 권한이 777로 설정되면서 실행까지 가능한 형태로 생성이 됩니다.
아, 그 전에 ntfs 파일 형식을 사용하면 일반적인 리눅스에서 사용하는 파일 퍼미션 관련 설정(chown, chmod 등)을 할 수가 없네요. 그래서 ext4로 포맷을 해야하나 잠시 고민을 했었습니다만, 어차피 내부적으로만 사용하는 것이니 그냥 현재 ntfs 형식을 사용하기로 했습니다. (귀차니즘...)
그렇다 하더라도 모든 파일 권한이 777로 설정되는 것은 아닌 것 같습니다. 게다가 기존의 방식이라면 파일 소유주가 root입니다. 뭔가 너무 이상한 느낌이 들어서, 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
삼바(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에서 접속이 가능해집니다. 필요하다면 네트워크 드라이브 연결을 해서 사용할 수도 있습니다.