Развертывание SD-карты PetaLinux через usbipd-win в WSL2

Развертывание SD-карты PetaLinux через usbipd-win в WSL2

Содержание

1. Общие сведения

Документ описывает работу с SD-картой PetaLinux через usbipd-win в WSL 2. Порядок действий зависит от версии Windows:

  • Windows 11 — полный цикл развёртывания SD-карты: настройка usbipd-win и драйвера VBoxUsbMon, проброс картридера, разметка MBR, форматирование, автомонтирование и запись образов PetaLinux.
  • Windows 10 — подключение уже подготовленной SD-карты к WSL 2 и работа с её разделами BOOT и rootfs (монтирование, /etc/fstab, безопасное отключение).

Общая часть в обоих случаях — проброс USB-картридера из Windows в WSL 2 средствами usbipd-win.

2. Windows 11

2.1. Параметры тестового стенда

  • Хост (Windows 11 Pro): IP 192.168.11.20, сборка 26200 (ядро 10.0.26200).
  • Гостевая система (WSL2 Ubuntu): IP 192.168.11.21.
  • Устройство: USB-картридер Genesys Logic (VID:PID 05e3:0747, шина 5-1).
  • SD-карта: 32 ГБ, схема разделов MBR (DOS).
  • Раздел 1 (/mnt/sd_boot): FAT32 (2 ГБ), флаг bootable.
  • Раздел 2 (/mnt/sd_rootfs): ext4 (~27 ГБ), под распаковку rootfs.tar.gz.

2.2. Настройка Windows 11 (PowerShell от имени Администратора)

2.2.1. Установка пакета usbipd-win

winget install dorssel.usbipd-win

Каталог установки по умолчанию: C:\Program Files\usbipd-win\.

2.2.2. Регистрация и запуск драйвера ядра VBoxUsbMon

Регистрация драйвера в диспетчере служб и перевод в автозапуск исключают ошибку Win32Exception (2): CreateFile.

Проверка наличия драйвера:

PS C:\Program Files\usbipd-win\Drivers> Get-ChildItem -Filter "*usbmon*.sys"

Вывод Windows:

    Каталог: C:\Program Files\usbipd-win\Drivers

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        05.10.2025     20:07         196704 VBoxUSBMon.sys

Регистрация службы драйвера ядра:

PS C:\Program Files\usbipd-win\Drivers> sc.exe create VBoxUsbMon type= kernel start= demand binPath= "C:\Program Files\usbipd-win\Drivers\VBoxUSBMon.sys"

Вывод Windows:

[SC] CreateService: успех

Запуск службы драйвера ядра:

PS C:\Program Files\usbipd-win\Drivers> sc.exe start VBoxUsbMon

Вывод Windows:

Имя_службы: VBoxUsbMon
        Тип                : 1  KERNEL_DRIVER
        Состояние          : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        Код_выхода_Win32   : 0  (0x0)
        Код_выхода_службы  : 0  (0x0)
        Контрольная_точка  : 0x0
        Ожидание           : 0x0
        ID_процесса        : 0
        Флаги              :

Проверка состояния службы драйвера ядра:

PS C:\Program Files\usbipd-win\Drivers> sc.exe query VBoxUsbMon

Вывод Windows:

Имя_службы: VBoxUsbMon
        Тип                : 1  KERNEL_DRIVER
        Состояние          : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        Код_выхода_Win32   : 0  (0x0)
        Код_выхода_службы  : 0  (0x0)
        Контрольная_точка  : 0x0
        Ожидание           : 0x0

Перевод драйвера ядра в режим автозагрузки:

PS C:\Program Files\usbipd-win\Drivers> sc.exe config VBoxUsbMon start= auto

Вывод Windows:

[SC] ChangeServiceConfig: успех

2.2.3. Настройка автозапуска службы usbipd

Настройка типа запуска службы:

PS C:\Users\admin> sc.exe config usbipd start= auto

Вывод Windows:

[SC] ChangeServiceConfig: успех

Запуск службы:

PS C:\Users\admin> Start-Service -Name usbipd

Команда выполняется без вывода в консоль при успешном запуске.

Проверка статуса службы:

PS C:\Users\admin> Get-Service -Name usbipd

Вывод Windows:

Status   Name               DisplayName
------   ----               -----------
Running  usbipd             USBIP Device Host

2.2.4. Привязка USB-картридера (Shared)

Проверка списка подключённых устройств:

PS C:\Users\admin> usbipd list

Вывод Windows:

Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-3    10c4:ea60  Silicon Labs CP210x USB to UART Bridge (COM3)                 Not shared
2-4    1d6b:a4a7  POROSVOC, USB-устройство ввода                                Not shared
2-5    8087:0029  Intel(R) Wireless Bluetooth(R)                                Not shared
4-1    03fd:0013  Xilinx Platform Cable USB II Firmware Loader                  Not shared
5-1    05e3:0747  Запоминающее устройство для USB                               Shared
8-1    046d:c31c  USB-устройство ввода                                          Not shared
8-3    046d:c05a  USB-устройство ввода                                          Not shared

Persisted:
GUID                                  DEVICE
b1f7a009-ebdd-4f21-b403-d2964c66bf6e  Запоминающее устройство для USB

Примечание: если статус устройства Not shared, выполните usbipd bind --busid 5-1.

2.3. Настройка и подключение в WSL2 (Ubuntu)

Все действия выполняются под пользователем root.

2.3.1. Установка пакетов ядра

apt-get update
apt-get install -y linux-tools-generic hwdata parted dosfstools e2fsprogs

2.3.2. Захват USB-устройства с хоста 192.168.11.20

Подключение картридера по сети:

root@wsl:~# usbip attach -r 192.168.11.20 -b 5-1

При успешном выполнении команда завершается с кодом возврата 0 без вывода текста.

Проверка появления блочного устройства в Linux:

root@wsl:~# lsblk

Вывод консоли:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 364.8M  1 disk
sdb      8:16   0 144.5M  1 disk
sdc      8:32   0    12G  0 disk [SWAP]
sdd      8:48   0     1T  0 disk /mnt/wslg/distro
                                 /
sde      8:64   1  29.3G  0 disk
└─sde1   8:65   1  29.3G  0 part

2.4. Разметка MBR и форматирование под PetaLinux

2.4.1. Очистка и создание разделов

umount /dev/sde* 2>/dev/null
wipefs -a /dev/sde

parted --script /dev/sde \
  mklabel msdos \
  mkpart primary fat32 4MiB 2048MiB \
  set 1 boot on \
  mkpart primary ext4 2048MiB 100%

partprobe /dev/sde

Проверка геометрии разделов:

root@wsl:~# lsblk /dev/sde

Вывод консоли:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sde      8:64   1 29.3G  0 disk
├─sde1   8:65   1    2G  0 part
└─sde2   8:66   1 27.3G  0 part

2.4.2. Форматирование файловых систем

mkfs.vfat -F 32 -n "BOOT" /dev/sde1

mkfs.ext4 -F -L "rootfs" -O ^64bit,^metadata_csum /dev/sde2

2.4.3. Получение постоянных идентификаторов UUID

root@wsl:~# blkid /dev/sde1 /dev/sde2

Вывод консоли:

/dev/sde1: LABEL_FATBOOT="BOOT" LABEL="BOOT" UUID="DBB7-8096" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="4f7f33da-01"
/dev/sde2: LABEL="rootfs" UUID="5a5d8fc7-8fe6-469c-827d-a9caa85f17dc" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4f7f33da-02"

2.5. Автомонтирование через /etc/fstab

2.5.1. Создание каталогов монтирования

mkdir -p /mnt/sd_boot /mnt/sd_rootfs

2.5.2. Добавление конфигурации в /etc/fstab

Флаг nofail обязателен, чтобы гостевая ОС не уходила в emergency mode, если USB-устройство не проброшено.

cat << 'EOF' >> /etc/fstab

UUID=DBB7-8096                             /mnt/sd_boot    vfat    defaults,nofail,umask=000,uid=1000,gid=1000   0   0
UUID=5a5d8fc7-8fe6-469c-827d-a9caa85f17dc  /mnt/sd_rootfs  ext4    defaults,nofail,noatime                        0   2
EOF

2.5.3. Применение и проверка состояния

mount -a

Проверка смонтированных файловых систем:

root@wsl:~# df -h | grep /mnt/sd

Вывод консоли:

/dev/sde1       2.0G  4.0K  2.0G   1% /mnt/sd_boot
/dev/sde2        27G   24K   26G   1% /mnt/sd_rootfs

2.6. Запись образов PetaLinux и безопасное отключение

2.6.1. Развертывание артефактов сборки

Перейдите в каталог проекта PetaLinux с готовыми бинарными файлами (<petalinux_project>/images/linux/):

cp BOOT.BIN boot.scr image.ub /mnt/sd_boot/

tar -pxf rootfs.tar.gz -C /mnt/sd_rootfs/

2.6.2. Сброс кэша и корректное отключение картридера

Перед извлечением карты сбросьте буферы ввода-вывода и освободите виртуальный порт:

sync

umount /mnt/sd_boot /mnt/sd_rootfs

usbip detach -p 00

2.6.3. Готовые алиасы автоматизации для ~/.bashrc

Добавьте следующие макросы в конфигурационный файл оболочки для выполнения рутинных операций одной командой:

cat << 'EOF' >> ~/.bashrc

alias sd-mount='usbip attach -r 192.168.11.20 -b 5-1 && mount -a && df -h | grep /mnt/sd'

alias sd-umount='sync && umount /mnt/sd_boot /mnt/sd_rootfs && usbip detach -p 00'
EOF

source ~/.bashrc

sd-mount подключает устройство с хоста 192.168.11.20, монтирует разделы по UUID и проверяет их доступность.

sd-umount гарантирует целостность файловой системы перед переносом SD-карты в слот целевой платы.

2.7. Безопасное извлечение картридера

Важно: физически вынимать картридер нельзя, пока он не отмонтирован в WSL. Поскольку разделы были смонтированы, в оперативной памяти Linux остаётся кэш записи. Если выдернуть устройство сейчас, повредится суперблок ext4 или таблица FAT32.

Выполните процедуру безопасного отключения в WSL перед извлечением.

2.7.1. Сброс дискового кэша и отмонтирование разделов

В терминале WSL сбросьте буферы записи и отключите разделы:

sync
umount /mnt/sd_boot /mnt/sd_rootfs

Проверка: выполните lsblk /dev/sde — в столбце MOUNTPOINTS должно стать пусто.

2.7.2. Освобождение виртуального USB-порта

В терминале WSL отключите устройство:

usbip detach -p 00

Проверка: выполните lsblk — диск /dev/sde должен полностью исчезнуть из системы.

Как только команда usbip detach -p 00 выполнена, картридер можно безопасно извлекать из USB-порта компьютера.

3. Windows 10

3.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

3.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.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-картой.

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

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

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

Получаем:

/mnt/sd_boot
/mnt/sd_rootfs

3.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-устройства.

3.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.

3.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

3.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

3.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-карте.

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

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

cd ~

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

umount /mnt/sd_rootfs

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

umount /mnt/sd_boot

Проверить:

mount | grep '/mnt/sd_'

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

3.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

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

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

usbipd detach --busid 7-4

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

3.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_'

3.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

3.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

3.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 │
└──────────────────────────────┘

3.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

3.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