Windows Subsystem for Linux(WSL)でのマウント方法|外部ドライブやWindowsフォルダにアクセス

Linux

WSL(Windows Subsystem for Linux)は、Windows上でLinuxを手軽に動かせる便利な環境です。

でも「LinuxのシェルからWindowsのファイルにアクセスしたい」「USBメモリや別ドライブをマウントしたい」と思ったとき、どう操作すればよいか迷ってしまうことはありませんか?

この記事では、WSL上でWindowsのドライブや外部メディアをマウント・利用する方法をわかりやすく解説します。

スポンサーリンク

WSLとマウントの基本概念

WSLにおけるファイルシステムの仕組み

WSLでは、WindowsとLinuxの2つの異なるファイルシステムが共存しています。これらを橋渡しするのが「マウント」機能です。

ファイルシステムの種類

ファイルシステム説明アクセス方法
Windows NTFSWindows標準のファイルシステム/mnt/c, /mnt/d
WSL内部Linux用のファイルシステム/home, /var, /etc
ネットワーク共有SMB、NFSなどの共有フォルダカスタムマウントポイント
外部メディアUSB、SD カードなどカスタムマウントポイント

WSL1 vs WSL2 の違い

WSL1の特徴

  • WindowsカーネルでLinuxシステムコールを翻訳
  • ファイルI/Oが高速(Windows側)
  • Linux固有機能に制限あり

WSL2の特徴

  • 実際のLinuxカーネルを仮想化で実行
  • 完全なLinux互換性
  • ファイルシステムマウント機能が豊富

マウントポイントの概念

# マウントポイントの確認
mount | grep drvfs

# 結果例:
# C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000)
# D: on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000)

重要なポイント

  • マウントポイント:Linuxからアクセスするためのパス
  • drvfs:WindowsドライブをLinuxから扱うためのファイルシステムタイプ
  • 権限設定:uid、gidでアクセス権限を制御

WSLでWindowsファイルシステムにアクセスする

自動マウントされている /mnt 領域

WSLを起動すると、WindowsのCドライブやDドライブは自動的に以下のようにマウントされます。

Windows側WSL上のパス用途
C:\/mnt/cシステムドライブ
D:\/mnt/dデータドライブ
E:\/mnt/e外付けドライブ等

実用的なアクセス例

Windowsのデスクトップにアクセス

# Windowsデスクトップに移動
cd /mnt/c/Users/$(whoami)/Desktop

# または環境変数を使用
cd "/mnt/c/Users/$USER/Desktop"

# ファイル一覧表示
ls -la

Windowsのドキュメントフォルダ

cd "/mnt/c/Users/$USER/Documents"

# 日本語環境の場合
cd "/mnt/c/Users/$USER/ドキュメント"

プログラムファイルへのアクセス

# Program Files
cd "/mnt/c/Program Files"

# Program Files (x86)
cd "/mnt/c/Program Files (x86)"

Windowsファイルの操作例

ファイルの検索とコピー

# Windows側のPDFファイルを検索
find /mnt/c/Users/$USER -name "*.pdf" -type f 2>/dev/null

# Windowsのファイルを WSL内にコピー
cp "/mnt/c/Users/$USER/Documents/report.pdf" ~/

# WSL内のファイルをWindowsにコピー
cp ~/script.sh "/mnt/c/Users/$USER/Desktop/"

ファイル権限の扱い

# Windows側ファイルの権限確認
ls -la /mnt/c/Users/$USER/Documents/

# 実行権限を付与(WSL内で)
chmod +x /mnt/c/Users/$USER/scripts/myscript.sh

# Windows側で作成したファイルをWSL内で編集
nano /mnt/c/Users/$USER/Documents/config.txt

日本語ファイル名・パスの扱い

日本語環境での注意点

# 日本語パスはクォートで囲む
cd "/mnt/c/Users/$USER/デスクトップ"

# タブ補完を活用
cd "/mnt/c/Users/$USER/ド<Tab>"

# スペースを含むパスの扱い
cd "/mnt/c/Program Files/Microsoft Office"

文字エンコーディング対応

# 日本語ファイル名のファイル検索
find /mnt/c -name "*日本語*" -type f 2>/dev/null

# iconv でエンコーディング変換
iconv -f SHIFT_JIS -t UTF-8 /mnt/c/data/sjis_file.txt > utf8_file.txt

外部ドライブとUSBメモリのマウント

WSL2での手動マウント

基本的なマウントコマンド

# USBドライブ(Dドライブ)をマウント
sudo mount -t drvfs D: /mnt/usb

# オプション付きマウント
sudo mount -t drvfs D: /mnt/usb -o uid=1000,gid=1000,fmask=133,dmask=022

# マウント確認
mount | grep usb

マウントオプションの説明

オプション説明
uid=1000ファイル所有者のユーザーID現在のユーザーに設定
gid=1000ファイル所有者のグループID現在のグループに設定
fmask=133ファイル権限マスク644 (rw-r–r–)
dmask=022ディレクトリ権限マスク755 (rwxr-xr-x)
metadataLinuxメタデータを保存WSL2で推奨

実用的なマウント例

# USBメモリをマウント(読み書き可能)
sudo mkdir -p /mnt/usb
sudo mount -t drvfs E: /mnt/usb -o uid=$(id -u),gid=$(id -g),fmask=113,dmask=002

# ネットワークドライブをマウント
sudo mkdir -p /mnt/network
sudo mount -t drvfs '\\server\share' /mnt/network

# 外付けHDDをマウント
sudo mkdir -p /mnt/external
sudo mount -t drvfs F: /mnt/external -o metadata

WSL2でのLinuxネイティブファイルシステム

物理ディスクの直接マウント

ディスクの確認

# Windows PowerShell(管理者権限)で実行
GET-CimInstance -query "SELECT * from Win32_DiskDrive"

# またはdiskpartを使用
diskpart
list disk

WSLでのマウント

# ext4ファイルシステムをマウント
wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4

# 読み取り専用でマウント
wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4 --options "ro"

# マウント確認
ls -la /mnt/wsl/

サポートされているファイルシステム

ファイルシステム読み取り書き込み備考
ext4最も安定
ext3互換性良好
ext2シンプル
XFS高性能
Btrfs⚠️実験的
ReiserFS⚠️非推奨

実用的なLinuxファイルシステム操作

# ext4 USBドライブをマウント
wsl --mount \\.\PHYSICALDRIVE3 --partition 1 --type ext4

# マウントされたドライブにアクセス
cd /mnt/wsl/PHYSICALDRIVE3p1

# Linuxコマンドで操作
sudo chown -R $USER:$USER /mnt/wsl/PHYSICALDRIVE3p1/data
chmod 755 /mnt/wsl/PHYSICALDRIVE3p1/scripts/*.sh

# ファイルシステムの状態確認
df -h /mnt/wsl/PHYSICALDRIVE3p1

高度なマウント設定とカスタマイズ

/etc/wsl.confでの自動マウント設定

基本設定ファイル

# /etc/wsl.conf を編集
sudo nano /etc/wsl.conf
[automount]
# 自動マウントを有効化
enabled = true

# マウントポイントの設定
root = /mnt/

# マウントオプション
options = "metadata,uid=1000,gid=1000,umask=022,fmask=11,case=off"

# クロスディストリビューション共有
mountFsTab = true

[network]

# ホスト名解決 generateHosts = true generateResolvConf = true

[interop]

# Windows実行ファイルの実行許可 enabled = true appendWindowsPath = true

詳細オプション解説

automountセクション

  • enabled: 自動マウントの有効/無効
  • root: マウントポイントのルートディレクトリ
  • options: デフォルトマウントオプション
  • mountFsTab: /etc/fstabの処理

おすすめオプション組み合わせ

# 開発者向け設定
options = "metadata,uid=1000,gid=1000,umask=002,fmask=113,case=dir"

# 一般ユーザー向け設定
options = "uid=1000,gid=1000,umask=022,fmask=133,case=off"

カスタムマウントポイントの作成

スクリプトによる自動マウント

#!/bin/bash
# mount_drives.sh - カスタムマウントスクリプト

# 関数定義
mount_drive() {
    local drive_letter=$1
    local mount_point=$2
    local options=${3:-"uid=$(id -u),gid=$(id -g),fmask=113,dmask=002"}
    
    if [ ! -d "$mount_point" ]; then
        sudo mkdir -p "$mount_point"
    fi
    
    if ! mountpoint -q "$mount_point"; then
        sudo mount -t drvfs "${drive_letter}:" "$mount_point" -o "$options"
        echo "Mounted ${drive_letter}: to $mount_point"
    else
        echo "$mount_point is already mounted"
    fi
}

# USBドライブの自動マウント
mount_drive "E" "/mnt/usb"
mount_drive "F" "/mnt/backup"

# ネットワークドライブ
sudo mount -t drvfs '\\nas\documents' /mnt/nas-docs

echo "Mount script completed"

systemdサービス化(WSL2)

# サービスファイル作成
sudo nano /etc/systemd/system/custom-mount.service
[Unit]
Description=Custom Drive Mount Service
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mount_drives.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
# サービス有効化
sudo systemctl enable custom-mount.service
sudo systemctl start custom-mount.service

ネットワーク共有のマウント

SMB/CIFS共有の接続

# 認証情報ファイル作成
sudo nano /etc/samba/credentials
username=your_username
password=your_password
domain=your_domain
# 権限設定
sudo chmod 600 /etc/samba/credentials

# SMB共有をマウント
sudo mount -t cifs //server_ip/share_name /mnt/smb \
  -o credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8

NFS共有の接続

# NFS必要パッケージインストール
sudo apt update
sudo apt install nfs-common

# NFSマウント
sudo mount -t nfs server_ip:/path/to/share /mnt/nfs \
  -o vers=3,proto=tcp,rsize=32768,wsize=32768

永続的なネットワークマウント

# /etc/fstab に追加
sudo nano /etc/fstab
# SMB共有
//server/share /mnt/smb cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8 0 0

# NFS共有
server:/path/to/share /mnt/nfs nfs vers=3,proto=tcp,rsize=32768,wsize=32768 0 0

アンマウント(取り外し)の方法

基本的なアンマウント操作

通常のアンマウント

# マウントポイントを指定してアンマウント
sudo umount /mnt/usb

# デバイスを指定してアンマウント
sudo umount /dev/sdb1

# 強制アンマウント(注意して使用)
sudo umount -f /mnt/usb

# 遅延アンマウント(使用中でもアンマウント予約)
sudo umount -l /mnt/usb

WSL2専用のアンマウント

# 物理ドライブのアンマウント
wsl --unmount \\.\PHYSICALDRIVE2

# 特定パーティションのアンマウント
wsl --unmount \\.\PHYSICALDRIVE2 --partition 1

# 全体のアンマウント
wsl --unmount

アンマウント前の確認作業

使用中プロセスの確認

# マウントポイントを使用しているプロセス確認
sudo lsof /mnt/usb

# または
sudo fuser -v /mnt/usb

# プロセスを終了
sudo fuser -k /mnt/usb

安全なアンマウント手順

#!/bin/bash
# safe_unmount.sh - 安全なアンマウントスクリプト

MOUNT_POINT=$1

if [ -z "$MOUNT_POINT" ]; then
    echo "Usage: $0 <mount_point>"
    exit 1
fi

echo "Checking processes using $MOUNT_POINT..."
PROCESSES=$(sudo lsof "$MOUNT_POINT" 2>/dev/null | wc -l)

if [ "$PROCESSES" -gt 1 ]; then
    echo "Warning: $((PROCESSES-1)) processes are using $MOUNT_POINT"
    sudo lsof "$MOUNT_POINT"
    read -p "Force unmount? (y/N): " response
    if [[ "$response" =~ ^[Yy]$ ]]; then
        sudo fuser -k "$MOUNT_POINT"
        sleep 2
    else
        echo "Unmount cancelled"
        exit 1
    fi
fi

echo "Unmounting $MOUNT_POINT..."
sudo umount "$MOUNT_POINT"

if [ $? -eq 0 ]; then
    echo "Successfully unmounted $MOUNT_POINT"
else
    echo "Failed to unmount $MOUNT_POINT"
    exit 1
fi

パフォーマンス最適化とベストプラクティス

マウントオプションによる最適化

読み取り専用マウント

# 読み取り専用で高速マウント
sudo mount -t drvfs D: /mnt/readonly -o ro,noatime

# バックアップドライブの読み取り専用マウント
sudo mount -t drvfs E: /mnt/backup -o ro,noatime,norelatime

書き込み最適化

# 書き込み性能を重視したマウント
sudo mount -t drvfs D: /mnt/workspace -o rw,relatime,metadata

# 大容量ファイル操作用
sudo mount -t drvfs D: /mnt/bigfiles -o rw,noatime,cache=loose

ファイルシステム別の最適化

NTFS最適化

# NTFS最適化マウント
sudo mount -t drvfs D: /mnt/ntfs \
  -o uid=1000,gid=1000,fmask=113,dmask=002,case=dir

ext4最適化

# ext4最適化マウント
wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4 \
  --options "defaults,noatime,data=writeback"

監視とトラブルシューティング

マウント状況の監視

#!/bin/bash
# mount_monitor.sh - マウント状況監視スクリプト

echo "=== WSL Mount Status ==="
echo

echo "1. Auto-mounted Windows drives:"
mount | grep drvfs | while read line; do
    echo "  $line"
done

echo
echo "2. Custom mount points:"
mount | grep -v drvfs | grep -E "(cifs|nfs|ext[234]|xfs)" | while read line; do
    echo "  $line"
done

echo
echo "3. Disk usage:"
df -h | grep -E "(mnt|wsl)"

echo
echo "4. Active processes on mount points:"
for mp in $(mount | grep -E "(mnt|wsl)" | awk '{print $3}'); do
    if [ -d "$mp" ]; then
        processes=$(sudo lsof "$mp" 2>/dev/null | tail -n +2 | wc -l)
        if [ "$processes" -gt 0 ]; then
            echo "  $mp: $processes processes"
        fi
    fi
done

自動修復スクリプト

#!/bin/bash
# mount_repair.sh - マウントエラー自動修復

repair_mount() {
    local mount_point=$1
    local device=$2
    local fs_type=$3
    local options=$4
    
    echo "Repairing mount: $mount_point"
    
    # アンマウント試行
    if mountpoint -q "$mount_point"; then
        sudo umount "$mount_point" 2>/dev/null
    fi
    
    # プロセス強制終了
    sudo fuser -k "$mount_point" 2>/dev/null
    
    # 再マウント
    sleep 2
    sudo mount -t "$fs_type" "$device" "$mount_point" -o "$options"
    
    if [ $? -eq 0 ]; then
        echo "Successfully repaired $mount_point"
    else
        echo "Failed to repair $mount_point"
    fi
}

# 使用例
repair_mount "/mnt/usb" "E:" "drvfs" "uid=1000,gid=1000,fmask=113"

セキュリティとアクセス制御

権限管理

ユーザー権限の設定

# 特定ユーザーのみアクセス可能
sudo mount -t drvfs D: /mnt/private -o uid=1000,gid=1000,fmask=177,dmask=077

# グループアクセス許可
sudo mount -t drvfs D: /mnt/shared -o uid=1000,gid=1000,fmask=113,dmask=002

セキュアマウントの実装

# 暗号化ディスクのマウント
sudo cryptsetup luksOpen /dev/sdb1 secure_drive
sudo mount /dev/mapper/secure_drive /mnt/secure

# セキュアアンマウント
sudo umount /mnt/secure
sudo cryptsetup luksClose secure_drive

監査とログ

マウント操作のログ記録

# rsyslog設定
sudo nano /etc/rsyslog.d/50-wsl-mount.conf
# WSL mount logging
local0.* /var/log/wsl-mount.log
# ログ出力関数
log_mount_operation() {
    local operation=$1
    local mount_point=$2
    local device=$3
    
    logger -p local0.info "WSL_MOUNT: $operation $device to $mount_point by $(whoami)"
}

# 使用例
log_mount_operation "MOUNT" "/mnt/usb" "E:"

まとめ

Windows Subsystem for Linux(WSL)でのマウント機能を使いこなすことで、WindowsとLinuxの境界を意識せずに作業できる環境が構築できます。

重要なポイント

基本機能

  • 自動マウント:Windowsドライブは /mnt/c, /mnt/d に自動マウント
  • 手動マウントmount -t drvfs でカスタマイズ可能
  • ネイティブ対応:WSL2では wsl --mount でLinuxファイルシステムも利用可能

実用的な活用

  • 開発環境:WindowsとLinuxツールチェーンの併用
  • データ移行:異なるファイルシステム間でのデータ交換
  • バックアップ:Linuxツールを使ったWindowsファイルのバックアップ

最適化とセキュリティ

  • パフォーマンス調整:適切なマウントオプションの選択
  • 権限管理:uid、gid、umaskによる細かな制御
  • 自動化:スクリプトとシステムサービスによる運用自動化

コメント

タイトルとURLをコピーしました