Подключение SD-карты к WSL 2 через USB-кардридер

1. Окружение

Используется:

  • Windows 10.0.19045.6456
  • WSL 2.7.14.0
  • ядро WSL 6.18.33.2-2
  • дистрибутив Ubuntu-22.04
  • usbipd 5.3.0
  • пользователь WSL: petalinux
  • WSL работает в режиме networkingMode=bridged
  • IP Windows-адаптера vEthernet (WSL-Bridge): 192.168.70.20

Конфигурация WSL:

[wsl2]
memory=24GB
swap=16GB
processors=12

networkingMode=bridged
vmSwitch=WSL-Bridge
dhcp=true

USB-кардридер:

VID:PID = 05e3:0747
BUSID   = 7-4

SD-карта содержит два раздела:

/dev/sde
├── /dev/sde1   2 GB     vfat   BOOT
└── /dev/sde2   27.3 GB  ext4   rootfs

2. Подключение USB-кардридера к WSL

В Windows PowerShell определить устройство:

usbipd list

В списке должно быть примерно:

BUSID  VID:PID    DEVICE
7-4    05e3:0747  Запоминающее устройство для USB

Обычная команда:

usbipd attach --wsl --busid 7-4

При networkingMode=bridged она может завершиться ошибкой:

usbipd: error: Networking mode 'bridged' is not supported.

Поэтому используется IP Windows-хоста:

usbipd attach --wsl --busid 7-4 --host-ip 192.168.70.20

После успешного подключения в WSL проверить USB:

lsusb

Должно появиться:

Bus 001 Device 002: ID 05e3:0747 Genesys Logic, Inc. USB Storage

3. Определение SD-карты

В WSL выполнить:

lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINTS,MODEL,TRAN

SD-карта должна определиться примерно так:

sde    29.3G                    STORAGE DEVICE usb
├─sde1  2G     vfat   BOOT
└─sde2  27.3G  ext4   rootfs

Дополнительно проверить:

sudo fdisk -l /dev/sde

Результат:

Disk /dev/sde: 29.3 GiB, 31457280000 bytes
Disk model: STORAGE DEVICE
Disklabel type: dos

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sde1          2048  4196351  4194304    2G  c W95 FAT32 (LBA)
/dev/sde2       4196352 61439999 57243648 27.3G 83 Linux

Важно: перед монтированием необходимо убедиться, что /dev/sde действительно является SD-картой.

4. Создание точек монтирования

Создать каталоги:

sudo mkdir -p /mnt/sd_boot
sudo mkdir -p /mnt/sd_rootfs

Получаем:

/mnt/sd_boot
/mnt/sd_rootfs

5. Определение UUID разделов

Выполнить:

sudo blkid /dev/sde1 /dev/sde2

Для данной SD-карты:

/dev/sde1: LABEL_FATBOOT="BOOT" LABEL="BOOT" UUID="5A09-1803" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="f5144c79-01"

/dev/sde2: LABEL="rootfs" UUID="e4528724-63c6-4b9a-a5f0-8c122b3c168e" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5144c79-02"

Использовать именно UUID, а не /dev/sde1 и /dev/sde2.

Причина: имя устройства /dev/sde может измениться при следующем подключении USB-устройства.

6. Настройка /etc/fstab

Открыть:

sudo nano /etc/fstab

Добавить следующие две строки:

UUID=5A09-1803 /mnt/sd_boot vfat defaults,user,noauto 0 0
UUID=e4528724-63c6-4b9a-a5f0-8c122b3c168e /mnt/sd_rootfs ext4 defaults,user,noauto 0 0

Здесь:

  • UUID=... — идентификатор раздела;
  • /mnt/sd_boot — точка монтирования раздела BOOT;
  • /mnt/sd_rootfs — точка монтирования rootfs;
  • vfat — файловая система первого раздела;
  • ext4 — файловая система второго раздела;
  • user — разрешает обычному пользователю монтировать и размонтировать раздел;
  • noauto — не монтировать автоматически при запуске WSL.

7. Проверка /etc/fstab

Проверить, что строки записаны правильно:

grep -E '/mnt/sd_(boot|rootfs)' /etc/fstab

Ожидается:

UUID=5A09-1803 /mnt/sd_boot vfat defaults,user,noauto 0 0
UUID=e4528724-63c6-4b9a-a5f0-8c122b3c168e /mnt/sd_rootfs ext4 defaults,user,noauto 0 0

8. Монтирование SD-карты пользователем petalinux

Перейти в домашний каталог:

cd ~

Монтировать раздел BOOT:

mount /mnt/sd_boot

Монтировать rootfs:

mount /mnt/sd_rootfs

Проверить:

mount | grep '/mnt/sd_'

Должно быть примерно:

/dev/sde1 on /mnt/sd_boot type vfat (...)
/dev/sde2 on /mnt/sd_rootfs type ext4 (...)

Проверить содержимое:

ls -la /mnt/sd_boot
ls -la /mnt/sd_rootfs

Теперь SD-карта доступна:

/mnt/sd_boot
/mnt/sd_rootfs

9. Работа с PetaLinux

Раздел BOOT:

cd /mnt/sd_boot

Раздел Linux rootfs:

cd /mnt/sd_rootfs

Например:

ls -la /mnt/sd_boot
ls -la /mnt/sd_rootfs/etc

Можно работать с файлами PetaLinux непосредственно на SD-карте.

10. Правильное размонтирование

Перед размонтированием необходимо выйти из каталогов SD-карты:

cd ~

Сначала размонтировать rootfs:

umount /mnt/sd_rootfs

Затем раздел BOOT:

umount /mnt/sd_boot

Проверить:

mount | grep '/mnt/sd_'

Если команда ничего не вывела, оба раздела размонтированы.

11. Если umount сообщает target is busy

Если появляется:

umount: /mnt/sd_rootfs: target is busy

Найти процесс, использующий раздел:

fuser -vm /mnt/sd_rootfs

или:

lsof +D /mnt/sd_rootfs

Закрыть найденные программы и терминалы.

Обязательно выйти из каталога:

cd ~

Затем повторить:

umount /mnt/sd_rootfs
umount /mnt/sd_boot

Не использовать без необходимости:

umount -f

12. Отключение USB-кардридера от WSL

После успешного размонтирования обоих разделов перейти в Windows PowerShell:

usbipd detach --busid 7-4

После этого USB-кардридер можно физически отключить.

13. Повторное подключение SD-карты

При следующем подключении SD-карты к Windows.

Windows PowerShell — проверить устройство:

usbipd list

Найти:

7-4    05e3:0747    Запоминающее устройство для USB

Подключить:

usbipd attach --wsl --busid 7-4 --host-ip 192.168.70.20

WSL — проверить:

lsblk

После определения SD-карты смонтировать:

mount /mnt/sd_boot
mount /mnt/sd_rootfs

Проверить:

mount | grep '/mnt/sd_'

14. Полный рабочий цикл

Windows PowerShell:

usbipd list
usbipd attach --wsl --busid 7-4 --host-ip 192.168.70.20

WSL:

lsusb
lsblk
mount /mnt/sd_boot
mount /mnt/sd_rootfs

Работа с SD-картой:

ls -la /mnt/sd_boot
ls -la /mnt/sd_rootfs

Завершение работы:

cd ~
umount /mnt/sd_rootfs
umount /mnt/sd_boot

Проверка:

mount | grep '/mnt/sd_'

Windows PowerShell:

usbipd detach --busid 7-4

15. Что делать при следующем запуске WSL

После перезапуска Windows или WSL запись в /etc/fstab сохраняется.

Повторно выполнять настройку /etc/fstab не требуется.

Нужно только:

  • подключить USB-кардридер к Windows;
  • выполнить usbipd attach;
  • в WSL выполнить mount;
  • после работы выполнить umount;
  • выполнить usbipd detach.

То есть обычный рабочий цикл состоит всего из следующих команд.

Windows:

usbipd attach --wsl --busid 7-4 --host-ip 192.168.70.20

WSL:

mount /mnt/sd_boot
mount /mnt/sd_rootfs

После работы:

cd ~
umount /mnt/sd_rootfs
umount /mnt/sd_boot

Windows:

usbipd detach --busid 7-4

16. Схема подключения

┌──────────────────────────────┐
│          Windows             │
│                              │
│  vEthernet (WSL-Bridge)      │
│  192.168.70.20               │
└──────────────┬───────────────┘
               │
               │ USB / usbipd
               │
┌──────────────▼───────────────┐
│       USB Card Reader        │
│       VID:PID 05e3:0747      │
│       BUSID 7-4              │
└──────────────┬───────────────┘
               │
               │
┌──────────────▼───────────────┐
│           WSL 2              │
│                              │
│          /dev/sde            │
│             │                │
│      ┌──────┴──────┐         │
│      │             │         │
│  /dev/sde1     /dev/sde2     │
│    vfat           ext4       │
│     BOOT         rootfs      │
│      │             │         │
│      ▼             ▼         │
│ /mnt/sd_boot  /mnt/sd_rootfs │
└──────────────────────────────┘

17. Важные правила безопасности

Для обычного подключения и отключения SD-карты не требуется выполнять:

fdisk
mkfs
dd
parted

и другие команды изменения разметки или файловой системы.

Команды:

mount
umount

не изменяют структуру разделов SD-карты.

Перед отключением USB-кардридера необходимо:

  • закрыть файлы на SD-карте;
  • выйти из /mnt/sd_boot и /mnt/sd_rootfs;
  • выполнить umount обоих разделов;
  • убедиться, что mount | grep '/mnt/sd_' ничего не выводит;
  • только после этого выполнить в Windows:
usbipd detach --busid 7-4

18. Итоговая конфигурация

SD-карта:

/dev/sde
├── /dev/sde1
│   ├── filesystem: vfat
│   ├── label: BOOT
│   ├── UUID: 5A09-1803
│   └── mount: /mnt/sd_boot
│
└── /dev/sde2
    ├── filesystem: ext4
    ├── label: rootfs
    ├── UUID: e4528724-63c6-4b9a-a5f0-8c122b3c168e
    └── mount: /mnt/sd_rootfs

Конфигурация /etc/fstab:

UUID=5A09-1803 /mnt/sd_boot vfat defaults,user,noauto 0 0
UUID=e4528724-63c6-4b9a-a5f0-8c122b3c168e /mnt/sd_rootfs ext4 defaults,user,noauto 0 0

Основной принцип работы:

Windows
   │
   ├── usbipd attach
   │
   ▼
USB Card Reader
   │
   ▼
WSL 2
   │
   ▼
/dev/sde
   ├── sde1 → /mnt/sd_boot
   └── sde2 → /mnt/sd_rootfs

Для отключения:

WSL
   │
   ├── umount /mnt/sd_rootfs
   ├── umount /mnt/sd_boot
   │
   ▼
Windows
   │
   └── usbipd detach --busid 7-4