Falluda, с загрузочной Windows флешкой не всегда все гладко. Если из официального обрза создаете, где только один boot.wim применяется, то тогда типовые программы для создания мультизагрузочных флешек отрабатывают нормально. Если же в ISO два boot.wim - могут начинаться катаклизмы. Можно флешку "ручками" создать. Для этого понадобятся: чистая флешка, сам ISO образ системы и некоторые дополнительные пакеты. Рассматриваем простой случай нужна флешка, которая может грузиться в режимах UEFI и Legacy, содержащая в себе образ системы Windows10 (только ее одной), брать
здесь. Берем флешку на 8 Гб (да, с солидным запасом против размеров образа), подключаем ее в свободный порт USB. Копируем с нее все важные данные, если они там есть, а затем выполняем ее разметку с удалением всего, что на ней было записано.
1. Подготовка флешки. Необходимо иметь в виду, что наиболее устойчиво грузятся флешки с разметкой MBR, имеющие единственный FAT32 раздел на всю флешку длиной, и в этом разделе проставлен флаг BOOT. Средствами GPARTED можно такое в графическом интерфейсе провернуть в несколько этапов. Средствами терминала это делается в несколько команд (допустим, наша флешка называется /dev/sd
d -
перепроверьте это десять раз, перед тем, как вводить команды у себя в системе чтобы ни в коем случае не выполнить эти манипуляциии над другими дисками, не флешкой - ПОТЕРЯЕТЕ ДАННЫЕ, будьте бдительны и внимательны):
#становимся суперпользователем
sudo -i
#Отмонтирование раздела флешки /dev/sdd1
umount /dev/sdd1
#Пересоздаем файловую систему, - нам нужен mbr
parted /dev/sdd mklabel msdos --script
#создаем единственный раздел fat32 на всю флешку:
parted /dev/sdd mkpart primary fat32 0% 100% --script
umount /dev/sdd1
#пересоздаем саму файловую систему, даем ей метку (в примере - "WinSetup"):
mkfs.vfat -n "WinSetup" /dev/sdd1
#устанавливаем на раздел загрузочный флаг:
parted /dev/sdd set 1 boot on --script
#перестаем быть суперпользователем
exit
Теперь определимся: надо ли нам чтобы флешка грузилась и в UEFI и в Legacy. Если надо, то читаем под спойлером, если не надо - просто идем дальше.
Сперва ставим в систему, в которой работаем, необходимые пакеты. Для этого подключаем интернет, и вводим в терминале:sudo apt install syslinux mtools
Даем пакетному менеджеру освоить поставленную задачу. Как появится строка приветствия терминала - приступаем к установке загрузчика на флешку и конфигурированию его там:
#Создадим себе буферную директорию - папку mnt в домашней папке текущего пользователя:
mkdir ~/mnt
#выполняем отмонтирование флешки и монтируем ее в эту директорию
sudo umount /dev/sdd1
sudo mount /dev/sdd1 ~/mnt
#Создаем иерархию каталогов и набиваем их необходимыми файлами:
mkdir -p ~/mnt/boot/syslinux
for i in chain.c32 libutil.c32 libcom32.c32; do find /usr/lib/syslinux/modules/bios -iname $i -exec cp {} "~/mnt/boot/syslinux" \;;done
echo -e "default boot\nLABEL boot\nMENU LABEL boot\nCOM32 chain.c32\nAPPEND fs ntldr=/bootmgr" > "~/mnt/boot/syslinux/syslinux.cfg"
#отмонтируем флешку
sudo umount /dev/sdd1
#выполняем установку загрузчика syslinux в директорию /boot/syslinux на флешке (точка монтирования при этом не указывается, - так и должно быть)
sudo syslinux -i /dev/sdd1 -d /boot/syslinux
#дописываем загрузочный сектор на устройство /dev/sdd
dd conv=notrunc bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdd
Все. Руками монтируем флешку через файловый менеджер, или утилиту "Диски" из стандартной поставки.
На этом все. Почву подготовили. Теперь будем копировать файлы.
2. Копирование файлов из образа ISO. Скачиваем себе образ ISO с сайта MS (ссылка в начале сообщения), скачанный файл обзываем Windows10.iso, и кладем к себе в каталог "Загрузки" (если она в другом месте и иначе называется - то в дальнейших командах следует поправить пути). Монтируем образ в папку mnt в папке пользователя, а флешку - в папку /mnt2:
#создание папкок mnt и mnt2 (если mnt уже существует - будет ошибка, не обращаем внимания и идем дальше)
mkdir ~/mnt
mkdir ~/mnt2
#монтирование образа в папку ~/mnt:
sudo mount -o loop ~/Загрузки/Windows.iso ~/mnt
#монтирование флешки в папку ~/mnt2
sudo umount /dev/sdd1
sudo mount /dev/sdd1 ~/mnt2
#выполняем копирование загрузчиков windows:
find ~/mnt -maxdepth 1 -type d -regextype posix-egrep -regex ".*(boot|efi)$" -exec cp -r {} ~/mnt2/ \;
find ~/mnt -maxdepth 1 -type f -iname "bootmgr*" -exec cp {} ~/mnt2/ \;
#копирование файлов .wim из образа в целевую директорию флешки
mkdir ~/mnt2/sources
find ~/mnt -type f -iname "*.wim" -exec rsync -aP {} ~/mnt2/sources/ \;
#все отмонтируем:
sudo umount /dev/sdd1
sudo umount ~/mnt
Если все вышеобозначенное выполнено без ошибок, то на флешке получается такая вот структура папок и каталогов:
boot/...
efi/...
sources/...
bootmgr
bootmgr.efi
Причем в папке sources лежат boot.wim и install.wim.
Все. Флешку можно тестировать. Должна успешно грузиться и в режиме UEFI и в режиме Legacy (если делали то, что под спойлером).
Если есть проблемы: предположим, загрузиться с флешки получается, но вместо типичного вида программы установки видим какую-то ошибку, и нам предлагается поискать драйвера для дисков и тому подобное (бывает в некоторых образах windows, причем как лицензионных, так и самосборках). Решение лежит на поверхности: необходимо модифицировать файл boot.wim. Для его модификации потребуется соответствующий пакет wimtools и небольшие знания cmd в windows. Итак, устанавливаем необходимый пакет:
sudo apt install wimtools
Механизм работы загрузочного девайса с windows на борту таков, что изначально загружается один из загрузчиков (либо bootmgr.efi, либо bootmgr), далее управление передается boot.wim, который уже и подтягивает install.wim. Описанная выше по тексту ошибка означает, что install.wim из цепочки выпал, - boot.wim не может его найти. Почему - вопрос открытый. Не будем вникать. Лучше явным образом укажем загрузчику где искать install.wim. Создаем в корневом каталоге флешки текстовый файл winpeshl.ini. Его содержимое:
[LaunchApps]
cmd.exe, "/k runsetup.cmd"
Там же создаем еще один текстовый файл: runsetup.cmd. Его содержимое:
@echo off
Title TishSerg Windows Setup Bootstrapper v1.0
echo [%time%] Initializing Windows PE...
Wpeinit
echo.
Wpeutil UpdateBootInfo > nul
for /f "tokens=3" %%a in (
'reg query "HKLM\System\CurrentControlSet\Control" /v PEBootRamdiskSourceDrive'
) do set RamdiskSourceDrive=%%a
echo [%time%] Detected setup media: %RamdiskSourceDrive%
echo.
:: Run setup.exe with /installFrom prefix
%CD:~0,2%\setup.exe /installFrom:%RamdiskSourceDrive%sources\\install.wim
:: When closed Windows Setup
echo.
echo [%time%] Windows Setup has been closed. Device will reboot now...
Wpeutil Reboot
Выделенное жирным - это, собственно, и есть прямое указание пути (если ранее по тексту принятые имена каталога с образами wim на флешке и сам образ install.wim соответствуют тем, что у Вас - оставляем без изменений; в противном случае вписываем свои данные). Сохраняем оба этих файла. Теперь наша задача закинуть их внутрь boot.wim. Приступаем:
#Перемонтируем флешку для удобства:
sudo umount /dev/sdd1: sudo mount /dev/sdd1 ~/mnt
#Даем права на редактирование образа boot.wim:
chmod 777 ~/mnt/sources/boot.wim
#Получаем ИНДЕКС образа, который надо модифицировать:
numImage=`wiminfo ~/mnt/sources/boot.wim | grep "Boot Index" | awk '{print $3}'`
#Монтируем этот образ в каталог ~/mnt2:
wimmountrw ~/mnt/sources/boot.wim $numImage ~/mnt2
#находим каталог system32 (регистр символов всякий раз может плавать, поэтому сразу беру это дело в переменную):
sys32path=`find ~/mnt2 -maxdepth 2 -type d -iname "system32"`: echo $sys32path
#копируем ранее созданные файлы в system32:
cp ~/mnt/winpeshl.ini "$sys32path"
cp ~/mnt/runsetup.cmd "$sys32path"
#отмонтируем образ с сохранением изменений и пересобираем его:
wimunmount ~/mnt --commit --rebuild
#отмонтируем флешку
sudo umount /dev/sdd1
Примечания:1. Описанная методика изложена на
Хабре. Данный пост - это просто адаптация под реалии Ubuntu. Пользуясь случаем, - большое спасибо автору той замечательной статьи.
2. Можно создать и мультизагрузочную флешку. Принцип ровно тот же самый. Однако загвоздка будет в необходимости редактирования файлов bcd с целью добавления в них загрузочных записей. Ввиду того, что редактор BCD под Linux в природе на момент не существует, обойти данную проблему можно использованием виртуальной машины qemu. Пример такого решения: создавая загрузочную флешку, модифицировать boot.wim таким образом, чтобы он выполнил последовательность команд, описанную в статье по ссылке для вызова встроенного виндового bcdedit и отредактировал существующие уже прямо на флешке файлы
[точка монтирования флешки]/boot/BCD
[точка монтирования флешки]/efi/microsoft/boot/BCD
Альтернативным вариантом является, к примеру, копирование одного из бесплатных виндовых редакторов BCD (например,
BOOTICE соответствующей системе разрядности) в корень флешки, и последующий запуск ее вместо начала установки системы прямо при тестировании флешки с виртуальной машины (Shift+F10 в начале установки даст командную строку, - далее можно, если мышетыкательно, taskmgr, "Новая задача", и найти на флешке исполняемый файл bootice, как им пользоваться рассказывать не буду - в сети полно руководств).
Внимание: для того, чтобы изменения, внесенные виртуальной машиной на флешку стали доступны в системе после окончания работы виртуальной машины, флешку в системе нужно перемонтировать. Момент не очевидный, так что считаю необходимым предупредить. Наоборот принцип тот же. Внесли изменения в файлы на флешке - перемонтировали - проверяем в виртуальной машине. Иначе работать не будет.
3. Раз уж заговорил о виртуальной машине. Для проверки способности флешки "быть загрузочной" применим qemu. Вот вариант проверки флешки для эмулируемой машины x86_x64 в режиме Legacy:
sudo qemu-system-x86_64 -m 2048 -enable-kvm -vga virtio -usb -usbdevice disk:/dev/sdd -boot menu=on
и в режиме UEFI:
sudo qemu-system-x86_64 -m 2048 -enable-kvm -vga virtio -usb -usbdevice disk:/dev/sdd -bios /usr/share/ovmf/OVMF.fd -boot menu=on
Если охота прогнать установку в виртуалке "от начала до конца" то надо создать сперва "виртуальный жесткий диск":
qemu-img create ~/mywin.img 30G
А затем подсунуть его предыдущим командам в качестве аргумента:
sudo qemu-system-x86_64 -m 2048 -enable-kvm -vga virtio -usb -usbdevice disk:/dev/sdd -boot menu=on -hda ~/mywin.img
sudo qemu-system-x86_64 -m 2048 -enable-kvm -vga virtio -usb -usbdevice disk:/dev/sdd -bios /usr/share/ovmf/OVMF.fd -boot menu=on -hda ~/mywin.img
При загрузке виртуальной машины (поскольку применяется -boot menu=on, нажать ESC и выбрать с чего грузиться - выбрать флешку). Как установить qemu рассказывать
не буду - и без того уже достаточно длинным получился пост, призываю гуглить; откуда взялся OVMF.fd тоже призываю гуглить.