Skip to content
Цветомир Денчев

 Създаване на bootable Windows installation USB през Linux терминал

   от Цветомир Денчев


Наскоро ми се наложи да инсталирам Windows 8 на един лаптоп като преди това му пренаправя partition table-a. Понеже ползвам Linux от известно време и не съм много запознат с програмите за създаване на инсталационен medium и дали въобще дали има читави такива за него реших да проуча как стои работата със създаването му през Linux Terminal-a.

Напълно е възможно да се създаде bootable Windows USB за инсталиране с cfdisk, mount, rsync и GRUB.

Бих се радвал да споделя откритията си докато успях да го постигна през конзолата. Не нося отговорност за загуба на данни от потребители, които са решили да използват този метод, просто искам да споделя един начин за това, който ми свърши

работа.

Има и WinUSB за целта с GUI, но е пакетиран основно за Ubuntu 12.04 и 14.04.

Лично, по този начин успях да разбера “под похлупака” и на “ниско ниво” какво би трябвало да прави една такава програма.

Първо е нужно да “форматираме” флашката по определен начин. Ще създадем нов partition table, на който ще качим инсталационните файлове от Windows ISO-то. Използвах cfdisk за целта, понеже има удобен TUI.

Можем да вземем id-то на USB-то с lsblk.

lsblkhttp://cvetomir-denchev.info/wp-content/uploads/2016/05/lsblk-250x128.jpg 250w, http://cvetomir-denchev.info/wp-content/uploads/2016/05/lsblk.jpg 444w" sizes="(max-width: 300px) 100vw, 300px" />

В случая USB-то има identifier sdb в /dev/. Сега можем да го отворим със cfdisk, за да запишем нов partition table. Препоръчвам ви да копирате настоящите файлове, ако ви представляват интерес.

Изтриваме с ‘Delete’ настоящите дялове докато не се появи само надпис ‘Free Space’ на мястото на дяловете. Натискаме него и избираме да е ‘Primary partition’.  Нужно е да има bootable flag, което можем да изберем от бутона ‘Bootable’. Oт ‘Type’ e нужно да зададем типа на partition table-a да бъде HPFS/NTFS/exFAT. Това е flag на partition table-a, който означава каква файлова система ще бъде инсталирана на него, не бива да се бърка със самата файлова система.

cfdisk-1http://cvetomir-denchev.info/wp-content/uploads/2016/05/cfdisk-1-768x435... 768w, http://cvetomir-denchev.info/wp-content/uploads/2016/05/cfdisk-1-250x142... 250w, http://cvetomir-denchev.info/wp-content/uploads/2016/05/cfdisk-1.png 795w" sizes="(max-width: 300px) 100vw, 300px" />

cfdisk-2http://cvetomir-denchev.info/wp-content/uploads/2016/05/cfdisk-2-250x265... 250w, http://cvetomir-denchev.info/wp-content/uploads/2016/05/cfdisk-2.jpg 407w" sizes="(max-width: 283px) 100vw, 283px" />

Нужно е след това да инсталираме и самата нея.

sudo mkfs.ntfs -f /dev/sdb1 && sync

Моля забележете, че след sdb добавих 1, с което е означен първия partition от partition table-a на USB-то, тоест, този който направихме при създаването на partition table-a.

Инсталирам NTFS файлова система с -f опцията. Без нея по подразбиране mkfs ще направи zero write на USB устройството. Можем да пропуснем тази част с -f опцията, за да спестим време.

Добавих sync командата да се изпълни след като успешно се създаде NTFS. Добавих я с цел да се синхронизират буферите на файловите системи.

След като сме създали файловата система можем да копираме файловете от Windows USB-то. Директно можем да го ‘закачим’ на файловата система с mount:

sudo mount -o loop /media/storage/Windows-7.iso /media/winiso

По този начин ще можем да достъпим всички файлове на даден iso image от файловата система. Сега можем да закачим файловата система, която създадохме и да копираме файловете от ISO-то.

sudo mount /dev/sdb1 /media/usb/

За целта ще използваме rsync, защото е по-бърза за големи файлове и можем да имаме progress bar:

rsync -av –progress /media/winiso/* /media/usb/

След като файловете се копират остава да инсталираме boot loader на USB-то, за да можем да заредим Windows инсталацията от него. Използвах GRUB 2 за целта. След като се инсталира той, ще добавим и menu entry за инсталацията.

Можем да инсталираме GRUB2 на USB-то чрез следната команда (най-вероятно ще е нужно да получим root права, за да я използваме):

grub-install –target=i386-pc –boot-directory=/media/usb/boot /dev/sdb

където /media/usb е директорията, на която сме mount-нали USB-то и /dev/sdb e identifier-a на блоковото устройство на USB-то (/dev/sdb, a не /dev/sdb1).

След това е нужно да създадем menuentry, което може да има следното съдържание:

default=1
timeout=15
color_normal=light-cyan/dark-gray
menu_color_normal=black/light-cyan
menu_color_highlight=white/black

menuentry “Start Windows Installation” {
insmod ntfs
insmod search_label
search –no-floppy –set root –hint hd0,msdos1
ntldr /bootmgr
}

menuentry “Boot from the first hard drive” {
insmod ntfs
insmod chain
insmod part_msdos
insmod part_gpt
set root=(hd1)
chainloader +1
boot
}

Накратко, чрез тези опции задаваме кои свои модули да зареди GRUB, например този за NTFS, също и от кое блоково устройство да зареди Windows инсталатора, както и изгледа на boot менюто, също и опция да boot-нем вече инсталираната операционна система.

Нужно е да запаметим този файл като grub.cfg и да го копираме в /media/usb/boot/grub/.