- Драйверы устройств в Linux
- Часть 11: Драйверы USB в Linux
- Обнаружение устройства USB в Linux
- Разбираемся в секции, описывающей устройство USB
- Регистрация драйвера USB для флеш устройства
- Подведем итог
- How to Create a Bootable Windows 10 USB in Linux
- Creating a Bootable Windows 10 USB in Linux
- Prerequisite: Get Microsoft Windows 10 ISO and a USB of at least 8 GB in size
- Step 2: Properly format the USB for creating bootable Windows USB
- Step 3: Copy the content of the ISO to USB
- Alternate Method: Creating Windows 10 bootable USB in Linux using WoeUSB
- Step 1: Install WoeUSB application
- Step 2: Format USB drive
- Step 3: Using WoeUSB to create bootable Windows 10
- Step 4: Using Windows 10 bootable USB
Драйверы устройств в Linux
Часть 11: Драйверы USB в Linux
Оригинал: «Device Drivers, Part 11: USB Drivers in Linux»
Автор: Anil Kumar Pugalia
Дата публикации: October 1, 2011
Перевод: Н.Ромоданов
Дата перевода: июнь 2012 г.
Эта статья, которая является частью серии статей о драйверах устройств в Linux, поможет вам начать писать ваш первый драйвер USB в системе Linux.
Флеш устройство Пагса было именно тем устройством, которым Светлана воспользовалась, когда они сели вдвоем за изучение мира драйверов USB в Linux. Самым быстрым способом с ним разобраться был обычный способ Пагса — выбрать устройство USB и написать для него драйвер для того, чтобы с ним поэкспериментировать. Поэтому они выбрали флэш устройство (т.е. USB флешку), которое было под рукой — JetFlash от Transcend, с ID поставщика 0x058f и ID продукта 0x6387 .
Обнаружение устройства USB в Linux
Независимо от того, есть ли драйвер для устройств USB в Linux системе или его нет, допустимое устройство USB всегда будет обнаруживаться в системе Linux в пространстве аппаратных средств и в пространстве ядра, поскольку система создана (и выполняет обнаружение) в соответствии со спецификациями протокола USB. Обнаружение в аппаратном пространстве осуществляется хост контроллером USB — как правило, соответствующем шинным устройством, аналогичным устройству PCI в системах x86. Соответствующий драйвер хост-контроллера обнаруживает устройство и транслирует информацию низкоуровнего физического слоя в конкретную информацию более высокого уровня протокола USB. Затем информация протокола USB, касающаяся устройства и, имеющая специальный формат, заносится в общий слой ядра USB (драйвер usbcore) в пространстве ядра, что позволяет обнаруживать устройства USB в пространстве ядра даже в том случае, когда отсутствует драйвер конкретного устройства.
Дальше — дело различных драйверов, интерфейсов и приложений (которые различны в различных дистрибутивах Linux) отображать обнаруженные устройства в пользовательском пространстве. На рис.1 показана иерархия подсистемы USB в Linux.
Рис.1: Подсистема USB в Linux
Краткий список всех обнаруженных устройств USB можно получить с помощью команды lsusb , которую следует запустить в роли пользователя root. На рис.2 приведен такой список как для случая с флэш устройством, так и без него. Параметр -v в команде lsusb позволяет получить более подробную информацию.
Рис.2: Информация, выдаваемая командой lsusb
Во многих дистрибутивах Linux, таких как Mandriva, Fedora, . , драйвер usbfs сконфигурирован так, что он загружается по умолчанию. В результате можно с помощью команды cat /proc/bus/usb/devices из директория /proc извлечь конкретную информации об обнаруженном USB-устройстве, представленную в удобном виде. На рис.3 показан типичный пример такой информации, которая находится в специальной секции, описывающей флэш-устройство. В списке обычно присутствует по одному такому разделу для каждого допустимого устройства USB, обнаруженного в системе.
Рис.3: Фрагмент информации из proc, касающейся USB
Разбираемся в секции, описывающей устройство USB
Чтобы дальше разбираться с этими секциями, нужно в первую очередь понять, что такое допустимое устройство USB. Для всех допустимых устройств USB есть одна или несколько конфигураций. Конфигурация устройства USB похожа на профиль, причем в качестве конфигурации, используемой по умолчанию, обычно используется первая конфигурация. Таким образом, в Linux для каждого устройства по умолчанию поддерживается только одна конфигурация. Для каждой конфигурации в устройстве может быть один или несколько интерфейсов. Интерфейс соответствует функции, предоставляемой устройством.
Интерфейсов может быть столько, сколько есть функций, предоставляемых устройством. Так, скажем, устройство МФУ USB-принтер (многофункциональное устройство) может выполнять печать, сканирование и отправку факсов, и, скорее всего, для него будет, по крайней мере, три интерфейса, по одному для каждой из функций. Таким образом, в отличие от других драйверов устройств, драйвер USB устройства, как правило, связывается / пишется отдельно для каждого интерфейса, а не для устройства в целом — это значит, что для устройства USB может быть несколько драйверов устройств, причем для интерфейсов различных устройств может использоваться один и тот же драйвер, — хотя, конечно, для одного интерфейса не может быть более одного драйвера.
Вполне нормальной и достаточно обычной является ситуация, когда для всех интерфейсов устройства USB используется один и тот же драйвер USB. В записи Driver=. для директория proc (рис. 3) показано, что в драйвер отсутствует отображение интерфейса ( none ).
Для каждого интерфейса есть один или несколько источников / приемников данных. Источник / приемник данных (endpoint) похож на конвейер (pipe), используемый для передачи информации в зависимости от функции либо в интерфейс, либо из интерфейса устройства. В зависимости от типа информации, источники / приемники данных могут быть четырех типов: Control, Interrupt, Bulk и Isochronous.
Прим.пер.: Подробное описание указанных четырех типов источников / приемников данных будет приведено в следующей статье данной серии статей.
Согласно спецификациям протокола USB во всех допустимых устройствах USB должен быть неявно используемый источник / приемник данных с номером 0 (end-point zero) — единственный двунаправленный источник / приемник данных. На рис.4 приведена полная наглядная схема допустимого устройства USB, соответствующее приведенному выше объяснению.
Рис.4: Общий взгляд на устройство USB
Вернемся обратно к секциям устройств USB (рис. 3) — первая буква в каждой строке соответствует различным частям спецификации устройства USB. Например, D — устройству, C — конфигурации, I — интерфейсу, E — источнику / приемнику данных (endpoint) и т.д. Подробнее об этом и о многом другом смотрите в исходном коде ядра в файле Documentation/usb/proc_usb_info.txt .
Регистрация драйвера USB для флеш устройства
«Похоже, для того, чтобы можно было самостоятельно написать первый драйвер USB, потребуется узнать много всего о протоколе USB, — конфигурацию устройства, интерфейсы, конвейеры передачи данных, четыре типа передачи данных, а также многие другие обозначения, например, T, B, S, …, которые есть в спецификации устройств USB» — вздохнула Светлана.
«Да, но ты не беспокойся — со всем этим можно будет разобраться подробнее позже. Давай со всем этим разбираться последовательно — возьмем интерфейс флеш устройства, связанного с драйвером нашего USB-устройства ( pen_register.ko )» — утешил Пагс.
Как и в любом другом Linux-драйвере, здесь также требуется конструктор и деструктор — используется тот же самый шаблон драйвера, который использовался для всех драйверов. Но содержимое будет другим, поскольку это драйвер слоя аппаратного протокола, т.е. горизонтальный драйвер в отличие от символьного драйвера, который был одним из вертикальных драйверов, рассмотренных ранее. Разница лишь в том, что вместо регистрации и отмены регистрации в VFS, здесь это должно выполняться на уровне соответствующего протокола — в данном случае — в ядре USB; вместо того, чтобы предоставлять интерфейс пользовательского пространства, например, файл устройства, он должен подключиться к реальному устройству в пространстве аппаратных средств.
Интерфейсы API для ядра USB выглядят следующим образом (прототип в
):
В структуре usb_driver в соответствующих полях должны быть указаны имя устройства, идентификационная таблица, используемая для автообнаружения конкретного устройства, и две функции обратного вызова, которые вызываются ядром USB при горячем подключении и отключении устройства, соответственно.
Собираем все вместе в файл pen_register.c , который будет выглядеть следующим образом:
Затем можно повторить обычные шаги, выполняемые для любого Linux драйвера:
- Собираем драйвер (файл .ko ) с помощью запуска команды make .
- Загружаем драйвер с помощью команды insmod .
- Выдаем список загруженных модулей с помощью команды lsmod .
- Выгружаем драйвер с помощью команды rmmod .
Но, что удивительно, результат не будет таким, как ожидалось. Используйте команду dmesg и загляните в директорий proc для просмотра различных журналов и прочих подробностей. Это связано не с тем, что драйвер USB отличается от символьного драйвера, — здесь есть одна проблема. На рис.3 показано, что у флэш-устройства есть один интерфейс (с номером 0), который уже связан с обычным драйвером usb-storage.
Теперь, для того, чтобы связать наш драйвер с этим интерфейсом, нам нужно выгрузить драйвер usb-storage (т. е. выполнить команду rmmod usb-storage ) и переподключить флэш-накопитель. Как только это будет сделано, результаты станут такими, как ожидалось. На рис.5 показан фрагмент информации из журналов и из директория proc . Снова подключите и отключите (в горячем режиме) флеш устройство и пронаблюдайте, как действуют вызовы probe и disconnect.
Рис.5: Флеш устройство в действии
Подведем итог
«Наконец-то! Что-то действует!» — облегченно сказала Светлана. «Но мне кажется, что для того, чтобы собрать полный драйвер устройства USB, здесь есть еще много того, с чем следует разбираться (например, с идентификационной таблицей, обратными вызовами probe и disconnect и т. д.)».
«Да, ты права. Давай разбираться со всем по порядку и с перерывами » — ответил Пагс, прервав самого себя.
How to Create a Bootable Windows 10 USB in Linux
Last updated October 29, 2020 By Abhishek Prakash 417 Comments
Brief: This tutorial shows you how to create a bootable Windows 10 USB in Linux with and without a GUI tool called WoeUSB.
I have talked a lot about creating bootable USB of Linux in Windows. How about the other way round? How about creating a bootable Windows 10 USB in Linux?
If you are uninstalling Linux from dual boot or if you want to reinstall Windows completely or you simply want to have a Windows installation disk ready, you’ll need a bootable Windows 10 USB or DVD.
In this tutorial, I am going to show you how to create a Windows 10 bootable USB in Linux. I am using Ubuntu for this tutorial but the steps should be valid for other Linux distributions as well.
If you want to use WoeUSB graphical tool for creating Windows bootable USB, you can jump to that section directly. Personally, I don’t recommend WoeUSB.
Creating a Bootable Windows 10 USB in Linux
Prerequisite: Get Microsoft Windows 10 ISO and a USB of at least 8 GB in size
You can download Windows 10 ISO from Microsoft’s website. You have to specify the Windows 10 version, language and then you should see the link to download Windows 10.
Note that the Windows 10 ISO download link is valid for 24 hours only. So use a download manager in Linux to download the
5.6 GB file and finish it within 24 hours only.
Since the ISO and its content are more than 4 GB in size, I recommend a USB of at least 8 GB in size.
I have also made a video of this tutorial so that you can see the steps in action.
Step 2: Properly format the USB for creating bootable Windows USB
Insert your USB. You have to format it so make sure that you don’t have important data on the USB key.
In Ubuntu, press Super key (Windows key) and search for ‘Disks’. You have to use this tool to format the USB key.
In the Disks tool, make sure to select your USB drive and hit format.
It will ask to choose a partitioning scheme. It could be either MBR or GPT. Select one of them and hit Format.
It will show you a warning that you data will be erased.
Format the USB
The formatting of USB is not over yet. Now, you need to create a partition on the newly formatted USB.
Select the entire USB disk as the partition size.
Give a name to your USB and hit Create button.
Once done, your USB should be automatically mounted. It is now ready for creating bootable Windows 10 USB disk.
Files larger than 4 GB?
Newer Windows 10 ISO might have files larger than 4GB. In that case, FAT filesystem won’t work as it doesn’t allow a single file of size greater than 4 GB.
You should then format the USB in ExFAT format. This newer format allows files bigger than 4 GB.
Step 3: Copy the content of the ISO to USB
Now it’s time to copy the content of the Windows 10 ISO to the newly formatted USB.
You may ask, Abhishek, there is only one file and that is the ISO file itself. What are you talking about?
ISO is basically an archive format and you can see it’s content like any zip file in Linux. But to do that, you need to use ‘Disk Image Mounter’ tool that is installed by default in Ubuntu.
Go to your Windows 10 ISO, select it and right click on it. Now select ‘Open with other application’.
In the applications list, select Disk Image Mounter:
The ISO will be mounted. You may not see it in the left sidebar but if you click on the Other Locations, you should see it. Click on it to enter this mounted ISO folder.
You’ll see its content. All you need to do is to select all the files (Ctrl+A), copy it (Ctrl+C) and paste it in the USB drive (Ctrl+V).
Wait for the copying process to finish as it may take some time in copying 4-5 GB of data. Once it’s done, you have a bootable Windows 10 USB in your hand. Take out the USB and use it to any system you want, restart the system and change the boot settings to boot from the USB.
Alternate Method: Creating Windows 10 bootable USB in Linux using WoeUSB
You can also use a Graphical tool called WoeUSB for creating a bootable Windows USB in Linux. However, this tool might not work perfectly all the time. This is why I prefer the first method of mounting the Windows 10 ISO and copying its content to the USB.
If you are interesting in using WoeUSB, you can click on the next section to expand it and follow the steps.
You can also watch a video of creating Windows 10 bootable USB. Do subscribe to our YouTube channel for more Linux videos:
Let’s see how to create a bootable Windows 10 USB in Ubuntu and other Linux distribution.
Step 1: Install WoeUSB application
WoeUSB is a free and open source application for creating Windows 10 bootable USB. It is actually a fork of WinUSB tool that has been discontinued now.
Ubuntu and other Ubuntu-based Linux distributions such as Linux Mint, elementary OS etc have a PPA available. You can use the command below to install WoeUSB:
For other Linux distributions, you can check out the source code from the GitHub repository:
Step 2: Format USB drive
Now, plug in your USB key. You’ll have to format it first. I presume you know how to format a USB key in your Linux distribution.
Ubuntu users can simply right click on the USB and click format.
The important part here is that you should format it in NTFS:
Note: If you use Fat 32 file system for formatting, you may encounter the error below later on:
Step 3: Using WoeUSB to create bootable Windows 10
We have everything ready for us now. Start WoeUSB program.
Browse to the downloaded Windows 10 ISO file and select the USB drive on which you want to install it. Just click on Install to begin the process.
Note that it may take up to 15 minutes in creating the Windows 10 USB. Don’t get fooled by the ‘done’ on the screen.
That’s it. You should see a success message.
Step 4: Using Windows 10 bootable USB
Once the bootable USB is ready, restart your system. At boot time, press F2 or F10 or F12 repeatedly to go to the boot settings. In here, select to boot from USB.
You’ll see that Windows 10 is being booted and it gives you the option to install or repair your system. You know what to do now from here.
I hope you find this tutorial useful for creating bootable USB of Windows 10 in Linux . If you have questions or suggestions, please feel free leave a comment.
Like what you read? Please share it with others.