3RD
TECH / BIKE / PHOTO / BOOKS / MOBILE
VAULT .NET

맥OS 폴더를 윈도우 드라이브로 마운트하기

개발 환경이 여러 기기에 분산되어 있으면 생각보다 자잘한 문제들이 많이 생긴다. 개발 서버 만들고 원격으로 그곳에서만 개발하면 만사해결될거라 생각했는데 여러가지 난관이 생기기 마련이다. 이번에는 클로드 디자인(Claude Design)으로 새 디자인 시스템을 로컬이 아닌 리모트 상태에서 만들려다 이슈가 발생했다.

상황은 이랬다. 클로드 디자인은 윈도우 노트북의 엣지 브라우저에서 실행 중인데, 정작 손봐야 할 프로젝트 파일은 맥OS로 돌아가는 맥미니 개발 서버에 있는 것. GitHub 주소야 그냥 입력하면 그만이지만, 로컬 폴더 선택 다이얼로그에서는 윈도우 로컬 경로만 보이고 맥미니 폴더는 당연히 안 나온다.

브라우저는 보안상 로컬 파일 시스템만 접근할 수 있다. SSH로 마운트된 원격 경로 같은 건 없는 거나 마찬가지.

언뜻 생각난 해결 방법은 두 가지. 파일을 복사해오거나, 맥미니 폴더를 윈도우 드라이브로 마운트하거나. 어차피 1회용 작업이라 복사를 해도 문제는 없지만 앞으로도 이런 일이 있을걸 대비할겸, 겸사겸사 맥OS 파티션을 윈도우 환경에서도 마운트 하는 방법을 찾아봤다.

WinFsp와 SSHFS-Win, 이게 뭔가

기본적으로 네트워크는 테일스케일 tailscale로 묶여 있다는 전제하에 설명하겠는데, 그외에 두가지 어플리케이션이 필요하다. winfsp, sshfs-win인데, 뭐하는 놈들인지 간략하게 아래에서 살펴보도록 하자.

FUSE — 이 모든 것의 시작

이야기는 윈도우보다 훨씬 앞서, 리눅스 진영에서 시작된다. 2001년, 헝가리 출신의 개발자 Miklos Szeredi가 FUSE(Filesystem in Userspace)를 세상에 내놨다. 아이디어 자체는 단순하다. 원래 파일 시스템은 운영체제 커널 영역에서 구현해야 해서 진입 장벽이 극히 높았는데, FUSE는 이걸 일반 사용자 영역(userspace)에서도 만들 수 있도록 브릿지를 제공한 것이다. 이후 FUSE는 리눅스 커널 2.6.14 버전(2005년)에 정식으로 편입됐고, 이 기반 위에서 SSHFS가 탄생한다. SSH 프로토콜을 통해 원격 서버의 디렉토리를 로컬처럼 마운트하는, 개발자들 사이에서 지금도 애용되는 바로 그 도구다.

문제는 이게 리눅스와 macOS 세상의 이야기라는 것. 윈도우에는 FUSE에 해당하는 공식 메커니즘이 없었다.

WinFsp — “윈도우용 FUSE를 제대로 만들자”

2015년 가을, Bill Zissimopoulos라는 개발자가 리눅스/macOS용 FUSE 파일 시스템을 윈도우로 포팅하려다 벽에 부딪혔다. 당시 비슷한 역할을 하는 Dokany라는 프로젝트가 있었지만, 파일 시스템 시맨틱이 올바르지 않고 불안정하고 느렸다. 결국 그는 처음부터 다시 만들기로 결심한다.

“Dokany를 일부 고쳐보려 했지만, 결국 윈도우에서 FUSE를 ‘제대로’ 구현하는 프로젝트를 처음부터 시작해야겠다는 결론에 이르렀다.” — Bill Zissimopoulos

그렇게 16개월의 개발, 1,750개의 커밋, 5만 줄의 코드 끝에 2017년 WinFsp 1.0이 공개됐다. 아이러니하게도 그는 맥(Mac)만 쓰는 환경에서 윈도우 파일 시스템 드라이버를 가상 머신으로 개발했다고. 배경도 남다른데, 그는 과거 Microsoft와 Netscape 출신으로, 이 프로젝트는 사실상 그의 개인 오픈소스 작업이었다.

WinFsp는 한마디로 “윈도우용 FUSE”다. 커널 레벨 파일 시스템 드라이버의 복잡한 내부를 개발자가 직접 다룰 필요 없이, 간단한 인터페이스로 윈도우에서 사용자 정의 파일 시스템을 만들 수 있게 해준다. GPLv3 오픈소스로 공개되어 있고, 2023년 v2.0으로 올라오면서 업그레이드 후 재부팅이 필요 없게 개선됐다. GitHub에서 별 7,000개를 넘긴, 이 분야에서는 사실상 표준으로 자리잡은 프로젝트다.

SSHFS-Win — 이 두 세계를 잇다

WinFsp가 나온 뒤, 같은 개발자(Bill Zissimopoulos)가 SSHFS-Win을 만들었다. SSHFS-Win은 리눅스의 SSHFS를 윈도우로 최소한으로 포팅한 것으로, 내부적으로는 POSIX 환경을 위해 Cygwin을 사용하고, 파일 시스템 마운트 기능은 WinFsp에 의존한다. 그래서 두 프로그램을 반드시 같이 설치해야 하는 것이다. WinFsp가 없으면 SSHFS-Win은 아무것도 할 수 없다.

정리하면 이렇다.

  • WinFsp — 윈도우에서 사용자 모드 파일 시스템을 가능하게 하는 드라이버 (기반)
  • SSHFS-Win — WinFsp 위에서 SSH 연결을 파일 시스템으로 변환해주는 도구 (실제 마운트)

준비물 확인

위에서 언급했지만 네트워크는 테일스케일 Tailscale로 묶여있다는 전제하에 진행한다. 대부분 원격 개발 환경은 테일스케일같은 로컬vpn 환경일테니 이 부분은 각자 환경에 맞춰서 세팅하시길 바란다. 어차피 지금 이 글을 읽고 있을 유저라면 알아서 다 세팅되어 있을테지만. 다시 내 얘기로 돌아오면, 이미 맥미니와는 Tailscale로 연결되어 있었고, VSCode Remote SSH로 맥미니 파일을 직접 편집하는 환경이 갖춰져 있었다. SSH 접속은 비밀번호 없이 키 인증으로 하고 있었는데, 이게 편하다면 편한데 이런 방식의 세팅을 할때는 살짝 확인이 필요하다.

설치 순서

의외로 설치 순서가 중요하다. WinFsp를 먼저 깔고, 그 다음에 SSHFS-Win을 설치해야 한다. 괜히 반대로 하고 제대로 안된다하지말고 처음부터 순서 지켜서 설치하도록 하자. 각 파일의 다운로드는 아래 링크를 참조하시길. 직접 찾고 싶으면 github에서 검색해도 된다.

마운트 시도, 그리고 삽질

설치 후 탐색기 → 내 PC → 우클릭 → 네트워크 드라이브 연결로 진입. 남는 드라이브 문자를 할당하고 주소 입력란에 아래 형식으로 입력했다. sshfs는 설치만 하면 별도의 세팅이 필요없어서 편리하다.

\\sshfs\유저이름@테일스케일주소\

비밀번호 입력창까지는 떴다. 근데 여기서 막혔다. 평소 맥미니 로그인 비밀번호를 넣었더니 계속 틀리다고 한다. 알고 보니 당연한 얘기였다. VSCode에서 SSH 접속할 때 키 인증을 쓰고 있고, 보안상 당연히 패스워드 접속은 disable 상태니까.

키 인증으로 마운트하기

찾아보니 다행히도(아니 당연하게도?) SSHFS-Win에는 인증키 접속 방법을 위한 옵션이 있다. \\sshfs 대신 \\sshfs.k 를 쓰면 SSH 키 인증을 사용한다. PowerShell에서 한 줄로 해결됐다.

net use Z: "\\sshfs.k\위와 동일"

C:\Users\계정명\.ssh\ 에 키 파일(id_rsa 또는 id_ed25519)이 있으면 자동으로 잡아준다. ssh 사용중이라면 .ssh 에 세팅을 해놨을거라 본다. 혹시나 이번이 처음이라면 관련 사항에 대해서 먼저 세팅을 진행하시길 바란다. 이후 명령어를 실행하고 탐색기를 열어보니 문제없이 할당된 드라이브 문자가 생겼다. 클로드 디자인 파일 선택 다이얼로그에서도 정상적으로 인식됐다.

외부에서 테일스케일과 연동해서 탐색기에 마운트된 모습. 잘 작동한다.

정리

Tailscale + SSHFS-Win 조합이면 네트워크만 연결되어 있으면 어디서든 원격 머신의 폴더를 로컬 드라이브처럼 쓸 수 있다. 파일을 복사해서 작업하는 것보다 훨씬 깔끔하고, 최신 파일이 어디 있는지 헷갈릴 일도 없다. 여담이지만 테일스케일은 정말이지 만능이다. 원격 작업에서 이만큼 편리한 어플리케이션이 있나 싶다.

핵심만 정리하면 이렇다.

  • WinFsp → SSHFS-Win 순서로 설치
  • 키 인증 사용 중이라면 \\sshfs 대신 \\sshfs.k 사용
  • Tailscale 도메인 주소(xxx.ts.net)를 그대로 사용 가능
  • 탐색기 GUI보다 PowerShell net use 명령어가 더 빠르고 확실함

그리고 중요한 부분 하나 더. 사실 글머리에서 언급했어야했는데, 새로운 방법을 발견하고 재미있어서 마지막 부분에 간신히 추가한다. 사실 원격으로 네트워크 드라이브를 연결하려면 테일스케일로 vpn 환경을 만들고 맥OS에서도 파일공유 SMB를 활성화하는게 제일 간단하고 확실하다. 파일시스템 자체가 SMB가 보안 측면을 제외하면 모든 면에서 더 뛰어난 방식이기도 하고. (그런데 보안은 테일스케일 사용하는 순간 자동적으로 해결된 셈이다.) 지금 소개하는 방법은 맥OS의 보안을 위해서 SMB 포트를 개방하기 싫고, SSH만을 사용하고자 하는 유저들을 위한 방법이라 하겠다. 이 부분을 잘 생각해서 환경에 맞춰서 유연하게 사용하시길 바란다는 말로 맺음한다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다