---
layout: post
title: "자잘한 도움말 #12 WSL에서 USB 저장 장치 접근하기"
description: "WSL, WSL 마운트, 리눅스, Linux, WSL mount, 외장 하드, 외장 SSD, Plug and Play, 플러그 앤 플레이, 빌 게이츠의 굴욕"
date: 2023-11-07 18:00:00 +0900
categories: [Micro]
---

## TL;DR

- 윈도우 PC에 USB를 꽂으면 윈도우에서는 자동으로 인식이 되지만(Plug & Play), WSL은 인식하지 못한다.
  - 가상 머신은 하드웨어에 직접 접근하기 어렵다.
- 리눅스 쉘에서 별도의 명령어를 사용해 USB 장치를 WSL에 연결(마운트, mount)해 줘야 한다.

```sh
# 윈도우에 D 드라이브로 잡힌 저장 장치를 WSL에 연결
sudo mount -t drvfs D: /mnt/d/

# 연결 해제
sudo umount /mnt/d
```

## 이하 그리 중요하진 않은 내용들

### 이동식 디스크

![이동식이 누군가요 ㅡㅡ](https://i.postimg.cc/7Ym7vTfq/Ea-FOby6-U0-AAhi-ZJ.jpg)  
{: .center .w-half .rounded-edge-16}

[WSL 가상 디스크 압축에 대해 다룬 적](/micro/2023/07/05/micro-tip-9.html)이 있다. 하지만 아무리 압축한다고 해도 결국 PC 용량은 물리적으로 부족해지기 마련이다. 그럴 때 유용한 것이 바로 이동식 디스크. 요즘엔 정식 명칭이 USB 드라이브던가, 아무튼 일반적으로 USB(Universal Serial Bus) 포트를 통해 연결하는 외장 저장 장치. TMI지만 한 9년 전 어떤 행사에서 경품으로 1TB짜리 외장하드를 받고는 "이것이 내가 지금까지 손에 쥐어본 숫자 중 가장 크다."라고 말했는데, 이제는 가방에 1TB짜리 SSD와 4TB짜리 SSD를 같이 넣어 다니며 일을 하고 있구나.

### `/mnt/c/`! `/mnt/d/`?

![CDrive](https://i.postimg.cc/26k538zg/c-drive.webp)  
{: .center .w-half .rounded-edge-16}

윈도우에서는 기본적으로 로컬 디스크를 "C:" 라는 논리적 경로로 지칭한다. 그리고 여기에 추가적인 파티션을 생성하거나, 외장 저장 장치가 연결되면 "D:", "E:" 같은 경로에 할당된다. 왜 "A:", "B:"에서 시작하지 않는지에 대해서는 [나무위키에 잘 정리되어 있으니](https://namu.wiki/w/C%20%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B8%8C) 시간이 남아돈다면 심심풀이로 한 번 읽어보자. 아무튼 윈도우를 사용할 때 우리는 C 드라이브를 사용하는 것에 익숙하다.

WSL은 가상 머신으로 엄밀히 따지면 윈도우의 파일 시스템과는 격리되어 있다. 하지만 WSL에선 `/mnt/c/` 라는 경로를 통해 큰 어려움 없이 윈도우에 존재하는 파일에 접근할 수 있다. 즉 `/mnt/c/`라는 경로는 WSL이 자동으로 윈도우의 C 드라이브에 접근할 수 있도록 연결해준 경로이다. WSL이 아니라 Linux 계열 OS가 바로 설치된 PC나 인스턴스가 있다면 해당 경로가 기본으로 제공되지 않는다는 점을 확인할 수 있을 것이다.

![마운트](https://i.postimg.cc/HsX22Ccv/image.png)  
{: .center .rounded-edge-16}

물리 > 논리(윈도우) > 논리(WSL/VM)의 흐름으로 저장 장치가 연결된다고 생각했을 때, 두 수준 사이에서 발생하는 연결을 **마운트(Mount)**라고한다. 조금 더 정확히 설명하자면, 위 그림에서 앞선 단계의 저장 장치 혹은 그 저장 장치의 일부 영역을 운영체제의 파일 시스템 구조에 연결하는 것을 의미한다. `/mnt` 경로는 Mount의 준말이다. 정리해서, WSL은 자동으로 윈도우의 C 드라이브를 `/mnt/c/`에 마운트해 준다는 것을 알 수 있다.

문제는 여기에서 시작된다. 나는 내 노트북에 외장 SSD를 연결하고 그것이 윈도우에서 D 드라이브로 연결된 것을 확인했다. 그리고 WSL의 쉘에서 `/mnt/d/` 경로에 접근을 시도했다. **"지정된 경로를 찾을 수 없음."**

### Plug and Play

<div class="center">
<iframe class="youtube-iframe" width="560" height="315" src="https://www.youtube.com/embed/yeUyxjLhAxU?si=xQJjJl6mUhus9kWt" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br/>
<span>전설의 PnP 기능 발표 프레젠테이션</span>
</div>

플러그 앤 플레이(Plug and Play). 이름 그대로 USB를 꽂으면(Plug) 별다른 설정 없이 바로 장치에서 사용할 수 있도록(Play) 만드는 기술이다. 사실 요즘엔 자주 들을 일 없는 이름이다. 숨 쉬듯이 자연스러운 일이 된지 오래되었기 때문. 요점은, 위 영상 처럼 까딱 잘못하다간 블루 스크린을 발생시킬지도 모르는 일을 사실 OS가 대신 처리하고 있다는 이야기다.

하지만 WSL에는 그 기능이 닿지 않는다. WSL은 VM이기 때문에 장치의 변화를 직접 인식하기가 어렵다. "아니 어차피 윈도우는 USB를 인식할 건데 그 이벤트를 WSL에 전달하면 되지 않나?" 싶지만, WSL의 설계 이념, 윈도우 PC에서 리눅스 환경의 제공이란 이념에 따라 그 인식을 사용자가 필요한 경우에만 직접 수동으로 하도록 되어있다. 여기서 리눅스 환경이란 아마 리눅스 서버 환경에 가까운 듯하고, 사실 생각해 보면 WSL을 사용할 정도의 컴퓨터 관련 지식이 있는 사용자에게 USB 연결을 직접 맡기는 것이 보안적인 측면에서도 더 유리하겠구나 납득되긴 한다.

### `mount`

말이 길었지만 아무튼, WSL에 설치된 리눅스에서 USB 외장 저장 장치를 마운트 하는 방법을 알아보자. 아주 쉽다.

```sh
sudo mount -t drvfs D: /mnt/d/
```

0. `sudo`, SuperUser DO  
1. `mount`는 이름 그대로 장치를 마운트 하는 리눅스 명령어다.  
2. `-t`는 마운트할 장치의 파일 시스템 유형을 지정하는 옵션이다.  
3. `drvfs`는 [DrvF](https://learn.microsoft.com/ko-kr/windows/wsl/wsl-config#what-is-drvfs), WSL과 Windows 파일 시스템 간의 상호 운용성을 지원하도록 설계된 WSL의 파일 시스템 플러그 인이다.  
4. `D:`는 윈도우에서 인식된 드라이브 이름을 뜻한다.  
5. `/mnt/d/`는 마운트할 WSL 내 경로를 뜻한다.

```sh
sudo umount /mnt/d
```

연결 해제 또한 수동으로 해줘야 한다. 사실 윈도우에서도 "하드웨어 안전하게 제거" 같은 기능을 사용하니 그리 특별한 일은 아니긴 하다.


## 내가 배운 것

이번 주제를 정한 이유는 내가 [Hack](/category/3.Hack.html) 카테고리를 만든 이유와 일맥상통하는 부분이 있다. 처음 WSL에서 D 드라이브에 바로 접근이 안된다는 사실을 알고 나서 검색하는 데에 조금 어려움을 겪었던 기억이 있다. '어... USB가.. WSL에.. 인식이.. 안되는 것.. 같아..' 이러다가 검색을 잘못하면 이상한 스크립트 파일 하나 깔아버릴지도 몰라. 이정도로 과장된 일은 일어나지 않았겠지만, 구글에 장황하게 문제를 설명하려다 "마운트"라는 단어 하나를 떠올리자 마자 문제가 명령어 단 한 줄로 해결되었다는 것이 당시에 좋은 기억으로 남아있었다.

- 마운트(Mount)란 무엇인가.
- OS는 생각보다 더 많은 일을 한다.
  - Plug and Play
  - 하지만 USB를 수동으로 인식시켜야 할 때도 있다.
- **용어**의 중요성: 검색을 더 쉽게 만들어 줍니다.
