이제 서버에 OpenMediaVault(이하 OMV)를 설치할 차례다. OMV는 NAS 운영에 특화된 오픈소스 리눅스 패키지로, Debian 위에서 프론트엔드(서비스) 형식으로 돌아간다. OS처럼 처음부터 설치할 수도 있지만, Raspberry Pi로 설치하는 경우에는 보통 Debian을 먼저 설치한 후, 그 위에 추가 패키지 형식으로 올리는 경우가 많으므로 이번에는 이런 방식으로 사용한다.

OMV를 설치할 때는 순정 OMV만 설치하기보다 각종 플러그인 기능과 공식 제공 OMV-Extras(현재는 Docker 기반)를 포함하는 버전을 설치하기를 권장하므로, OMV-Extras 공식 위키의 설치 가이드를 참고하여 설치하였다.

1. Install

삽질

OMV는 OS가 설치된 디스크를 데이터 디스크 공간으로 사용할 수 없기 때문에 하나의 디스크에 OS와 데이터를 모두 담고 싶다면 사전에 파티셔닝을 통해 OS 공간과 데이터 공간을 나누어 두어야 한다. 그리고 나는 이 사실을 OMV 설치와 설정을 거의 마무리하는 단계에서 알게 되었다…

이미 OMV 설치와 기본 설정을 마친 상태에서 데이터 공간으로 마운트 할 수 있는 디스크가 없다는 사실을 깨달았다. Raspberry Pi Imager는 OS 설치 과정에 파티셔닝 관련 내용을 완전히 생략하고 설치 대상 디스크를 모두 OS 파티션으로 사용하기 때문에 사전에 fdisk 등으로 파티셔닝이 되어있는 상태라고 해도 Raspberry PI Imager로 OS를 설치하기 시작하면 디스크를 싹 밀고 OS를 설치해버리기 때문에 미리 OS를 설치 후 위험을 감수하고 온라인 파티셔닝을 하거나 해야하는데 그걸 누가 하겠는가? 그래서 그냥 원래 비상용으로 사용하려 했던 microSD를 다시 프로젝트에 포함시키는 수 밖에 없었다.

물론 microSD도 OS 설치와 OMV 구동은 가능하지만 문제는 수명이다. 제조사에 따라 차이가 있기는 하지만 NAS처럼 계속 켜두고 사용하는 기기에서 microSD의 수명은 1 ~ 2년 수준이다. 스타트 키트에 포함된 카드는 Sandisk 제품이라 아마 몇년은 더 쓰지 않을까 싶기는 한데 그래도 1년 이상 쓰고나면 언제 죽을지 모르는 상태가 되지 않을까싶다. microSD는 S.M.A.R.T.도 지원하지 않으니 정확한 상태를 확인할 수는 없지만, 그래도 실제 IO가 많이 발생하는 쪽은 데이터 디스크 쪽이니 극단적으로 수명이 문제가 되지는 않을 것이다.

아무튼, microSD에 다시 Raspberry Pi OS Lite를 설치하고 시작한다. 이 삽질 때문에 구매하지 않아도 될 SSD 외장 케이스까지 구매해버렸지만…


이전 글에서 한 것과 같이 기본적인 업데이트를 수행해주고, OMV 설치에 필요한 사전 설치 과정을 거친다. 이 과정에서 wget이나 curl이 필요하다. 개인적으로는 curl 쪽을 더 선호하는 편이다.

sudo apt install curl -y
curl -sSL https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/preinstall | sudo bash

이후 일단 재부팅을 한번 해준다.

sudo reboot

몇 분 후 다시 SSH 접속이 가능해지면 이제 본격적으로 OMV를 설치한다. 사실 설치 과정 자체는 사용자가 거의 할 것이 없다. 그냥 아래와 같이 설치 스크립트만 실행해주면 된다.

curl -sSL https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

설치 시 하나 주의해야할 점은 OMV 설치 후 나중에 무선 랜카드를 추가할 수 있기는 하지만 OMV 설치 시에는 반드시 유선 NIC를 이용해야 한다는 것이다. 물론 NAS를 사용할 때는 거의 반드시 유선 NIC를 사용하긴 하지만 Raspberry Pi 특성 상 Wi-Fi를 활용하는 경우가 많기 때문에 설치 가이드에서 이 부분을 중요하게 짚고 넘어가는 것 같다.

2. Configure

설치는 대략 10분 정도 걸리고, 설치가 끝난 후 자동으로 재부팅된다. 재부팅 후 몇 분 뒤 Raspberry Pi가 연결된 네트워크 주소로 접속해보면 아래와 같이 OMV Workbench 웹 UI가 나온다.

00.png

최초 로그인 시 아이디는 admin, 비밀번호는 openmediavault다. 로그인 후에는 제일 먼저 관리자 비밀번호부터 변경한다. 추가로 처음 OMV를 설정할 때는 편의를 위해 자동 로그아웃 시간(System > Workbench)을 늘려두는 것이 좋다.

로그인 후 처음 나오는 화면은 아직 아무것도 설정이 안된 상태라 휑하다.

01.png

settings page를 눌러 대시보드에 표시하고 싶은 항목들을 선택하면 나름 NAS용 패키지다운 화면을 볼 수 있다.

02.png

기본적인 설정은 사용자의 입맛대로 하면 되고, 이 글에서는 편리하거나 반드시 필요한 설정에 대해 다룬다.

Notification

먼저 System > Notification에서 볼 수 있는 알림 메일 설정을 해보자. 이 설정은 내 서버에 문제가 발생하거나 내가 확인해야할 사항이 생기면 자동으로 이메일을 보내주는 기능이다.

03.png

Google의 SMTP(smtp.gmail.com)를 사용하면 편하다. 설정값은 이미지와 동일하게 입력하면 되는데, 인증에 필요한 Google 비밀번호는 실제 계정의 비밀번호가 아니라 별도로 발급받은 앱 비밀번호가 필요하다. Google 계정에 2단계 인증 설정이 반드시 필요하며, 발급 직후에만 확인할 수 있는 16자리 앱 비밀번호를 OMV의 설정 입력란에 넣으면 된다.

설정을 저장 후(저장 후 Pending 상태의 모든 설정을 적용해야 실제 동작), Test 버튼을 눌러보면 설정한 이메일로 다음과 같은 이메일을 받을 수 있다.

04.png

알림을 받을 항목도 선택할 수 있는데, 대부분의 정보를 받는 것이 좋지만 Raspberry Pi 기준으로 급격한 CPU 사용 등은 가벼운 작업에도 발생할 수 있으므로 꺼두는 것이 좋다.

2_OpenMedaVault_05.png

Storage

제일 중요한 설정이다. Storage 아래에는 다음과 같은 항목들이 있다.

06.png

  • Disks: 현재 OMV에서 인식하고 있는 디스크 목록을 확인할 수 있다. 이 메뉴에서 데이터 디스크로 사용할 디스크를 깔끔하게 포맷시킬 수 있다. 이전에 삽질하면서 남아있는 OMV가 NVME에 남아있으므로 깔끔하게 밀어주고 작업한다.

  • S.M.A.R.T.: 디스크의 건강 상태를 확인할 수 있는 옵션으로, 최근에 출시되는 대부분의 SSD / HDD에 포함되는 기능이다. 성능 측정 주기와 내용 등을 설정할 수 있다. 현재는 SSD만 사용하고 있기 때문에 성능 측정이 그렇게 중요하지는 않고, 한달에 한 번 정도 Short self-test 해주는 정도면 충분하다.

  • File Systems: 실제로 사용할 공간을 포맷 / 마운트하는 메뉴다. 디스크에 이미 사용중이던 파일 시스템이 있으면 바로 마운트하면 되고, 지금처럼 깔끔하게 밀어버린 상태라면 새로 파일 시스템을 생성하여 마운트하면 된다. 포맷할 때는 Linux 환경 특성 상 EXT4 형식으로 포맷하는 것이 좋다(저널링 등 안정성 관점).

    07.png

  • Shared Folders: OMV의 가장 핵심이 되는 부분이다. 포맷을 통해 생성한 파일 시스템에 데이터들을 담을 디렉토리를 생성한다. 여기서 생성한 디렉토리를 이후 NFS, SMB, WebDAV 등에서 사용한다.

    OMV는 특성 상 하나의 디스크에 하나의 파일 시스템, 하나의 공유 폴더를 권장하는 것으로 보인다. 이번 프로젝트에서도 해당 철학에 따라 하나의 데이터 디스크(NVME), 하나의 파일 시스템(EXT4), 하나의 공유 폴더를 사용한다.

    08.png

저장소 설정까지 마친 후에는 NAS를 사용할 사용자와 권한 설정을 처리한다. 사용자 / 그룹 별로 각 공유 폴더에 접근할 수 있는 권한을 설정할 수 있다.

09.png

3. SFTP

기본적인 OMV 설정을 마쳤으니 이제 본격적으로 원격 접속이 가능한 NAS를 설정할 차례다. Windows와 iOS 기반 기기에서 Linux 파일 서버에 접속하는 것이 목적이므로, 우리의 선택지는 크게 세 개 정도 있다.

  1. WebDAV

    처음 이 프로젝트를 시작할 때 목표로 했었던 프로토콜이다. 이름이 익숙하지 않은 사람도 있을텐데, 처음 HTTP가 등장하던 시절과 달리 HTTP의 안정성과 여러 네트워크 기기의 신뢰도가 높아지면서 HTTP를 통해 인터넷에 저장된 문서를 편집하고 관리할 수 있는 공유 서버를 활용하고자 하는 시도가 있었고, 그 결과 RFC 4918로 표준화된 것이 이 WebDAV다.

    HTTPS를 사용하기 때문에 동일하게 443 포트를 기본으로 사용하며, 일반적인 웹 서버처럼 구축할 수 있다는 장점이 있다. OMV에서도 openmediavault-webdav라는 플러그인을 사용할 수 있다. WebDAV를 쉽게 설정하게 해준다.

    최종적으로 WebDAV를 사용하지 않은 이유는 신뢰할 만한 클라이언트 앱이 별로 없었기 때문이다. Windows 파일 탐색기에서 바로 사용할 수 있도록 해주는 클라이언트 프로그램들이 있는데, RaiDrive등 비자유 소프트웨어에는 몇 가지 선택지가 있긴 하지만 자유 소프트웨어 쪽에는 괜찮은 클라이언트가 없었다. iCloud 외에는 SMB만 지원하는 iOS의 파일 앱은 말할 것도 없다.

  2. SMB + WireGuard

    WebDAV를 포기한 후 다음으로 고려한 선택지인데, 일단 SMB는 과거 WannaCry 랜섬웨어의 주 공격 경로로 사용되었던 만큼, 인터넷에 포트를 공개해두는 것 자체가 보안적으로 매우 나쁜 선택이다. 하지만 내부망에서는 여전히 매우 괜찮은 파일 공유 프로토콜이기 때문에 아직도 여러 내부망에서는 사용되고 있는데, 이를 외부망에 연결하기 위해서 WireGuard 같은 VPN 구성하여 사용할 수 있다.

    OMV에서도 SMB는 기본 지원되고, WireGuard 또한 openmediavault-wireguard 플러그인을 지원한다. 애초에 Microsoft에서 개발한 기술인만큼 Windows 파일 탐색기는 Native로 지원되며, iOS 파일 앱에서도 다른 설정 없이 바로 사용이 가능하다.

    하지만 이 선택지도 생각보다 금방 포기했는데, 보안적인 측면에서는 VPN을 활용하는 것이 오히려 제일 안전하긴 하지만 홈 서버 하나 구축하자고 VPN까지 구성하는 것은 너무 멀리가는 것 같았다.

  3. SFTP

    결국 돌고 돌아서 다시 돌아온 것이 이 SFTP다. OpenSSH는 왠만한 대부분의 현대 OS에서 기본으로 지원하고 있고, SSH가 사용 가능하다면 바로 사용할 수 있다. SFTP 자체는 사실 별도의 프로토콜이라기 보다는 SSH와 동일한 프로토콜을 사용하는 일종의 파일 공유 프로그램으로 보는 것이 맞을 것이다.

    VPN을 사용하는 것보다는 못하지만 인터넷에 공개할 수 있는 프로토콜 중에서는 가장 안전한 방법 중 하나다. 물론 단점도 존재하는데, SSH 자체가 상당히 보수적인 보안 방식을 사용하기 때문에 대용량 파일 전송 시 속도나 안정성에서 조금 손해를 볼 수는 있다.

    SSH와 SFTP는 이미 이전부터 사용했던 방법이기 때문에 빠르게 구성할 수 있을 것이다.

OMV는 웹 UI에서도 SSH 설정을 기본 제공하고 있다. 외부에서 사용할 때도 그냥 외부에 공개된 UNIX 서버를 사용하듯이 사용하면 되는데, 기왕 홈 서버로 NAS를 구성하는 만큼 조금 더 현대적인 구성을 만들어보자.

System > Plugins에서 openmediavault-sftp를 검색하여 설치한다. 이 플러그인은 OMV 내부에서 sftp-server 대신 internal-sftp를 사용하게 해준다. 두 프로그램은 거의 동일한 소스코드로 생성된 프로그램이기 때문에 기능적인 차이는 없지만, internal-sftpchroot 기반의 사용자 jail 생성을 쉽게 해준다. 사용자 jail은 chroot로 설정한 경로를 마치 사용자가 루트 경로를 보듯이 만들어주는 방법으로, 사용자는 해당 경로 밖의 다른 공간은 마치 존재하지 않는 것처럼 사용할 수 있다. 현대적인 클라우드 스토리지같은 사용성을 제공하기 쉽다.

10.png

플로그인을 설치하면 Services 메뉴 아래에 Sftp 메뉴가 생긴다. 해당 메뉴에서 기본적인 SFTP 설정과 사용자 공유 폴더를 설정할 수 있다. openmediavault-sftp를 통해 동작하는 SFTP는 OpenSSH에서 제공하는 SFTP와는 별도로 동작하므로 SSH와 다른 포트로 설정되어야 한다. 해당 포트는 SFTP 접속만 받고 SSH 접속은 거부할 것이다. 플러그인의 SFTP를 사용할 사용자는 반드시 자동으로 생성되는 sftp-access 그룹에 속해있어야 한다는 것도 기억하자.

추가로 반드시 기억해야 하는 점은, Rsyslog는 반드시 사용 설정이 되어있어야 한다. 이 설정이 꺼져 있으면 이후 SFTP와 관련된 모든 설정들이 먹통이 되는 버그가 있다.

클라이언트

  • Windows

    FTP 서버를 마치 별도의 로컬 드라이브처럼 접속하도록 해주는 WinFSP라는 오픈소스 프로젝트가 있다. 이 프로젝트에서 제공하는 SSHFS-Win는 WinFSP와 동일하게 SFTP 서버를 로컬 드라이브처럼 사용할 수 있게 해준다.

    개인적으로 선호하는 winget을 통해서 편하게 설치할 수 있다.

    winget install SSHFS-Win.SSHFS-Win
    

    설치 완료 후 재부팅을 한 번 해주는 것이 좋다. 이후 파일 탐색기에서 This PC를 우클릭하여 Map network drive…를 선택한다.

    11.png

    서버 주소창에는 아래와 같이 UNC 문법을 사용한다.

    \\sshfs[.k]\<사용자>@<서버>[!<포트>]\[접속 주소]
    

    sshfs뒤에 .k를 추가하면 자동으로 Windows 사용자 홈 디렉토리의 .ssh에서 개인키를 찾아 인증에 사용한다. 이 때 개인키의 파일 이름은 반드시 id_rsa여야하고, passphrase가 없어야 한다는 점을 유의한다. 물론 이 규칙만 지키면 되고, 인증에 사용하는 알고리즘이 반드시 RSA일 필요는 없다. 키 기반 인증을 사용하지 않는다면 비밀번호를 묻는 창이 추가로 나온다.

    접속에 성공한 후에는 일반적인 로컬 드라이브와 동일하게 사용할 수 있다.

  • iOS

    iOS 파일 앱은 SFTP를 지원하지 않는다. 원격에서는 iCloud나 쓰라는 뜻인 것 같다. 어쩔 수 없이 상용 앱을 사용하는 수밖에 없는데, App Store에 SFTP 클라이언트를 검색하면 수많은 출처 불명의 앱들이 나오기 때문에 최대한 신뢰할 수 있는 앱을 선택하는 것이 중요하다.

    개인적으로 추천하는 클라이언트는 Termius다. 원래는 유료 앱이지만 최근들어 키 기반 인증 기능이나 SFTP 기능을 무료로 제공하고 있으며, 오랜 시간 Apple 진영 사용자들에게 사용되어온 신뢰할 수 있는 앱이다. 본사는 미국에 있는 것으로 보인다.

    추가로 추천하는 클라이언트는 Readdle 사의 Documents라는 앱이다. 우크라이나 출신 앱으로 각종 상용 클라우드 스토리지 뿐 아니라 SFTP를 포함한 다양한 파일 서버에 접속할 수 있다. Termius를 알기 전에는 개인적으로 자주 사용하던 앱이다.

이렇게 OMV를 설치하고 SFTP 기반의 파일 서버를 구축하였다. 이제 홈 서버에 웹 서비스를 추가하여 개인 블로그를 서빙해보자.