Майкрософт вперше додали механізма autounattend.xml
за часів
захоплюючих краєвидів Вісти. Користувач завантажував те що зараз
називається ADK віндюковий, який містив графічну ютіліту WSIM, яка
випльовувала xml-файла. Останній клавсь до кореня usb-драйву і віндюка
(ув ідеалі) інсталювався без втручання хомо сапієнса.
Нічого революційно нового ув тому не було--лайнакси схожі механізми
мали багато років, наприклад kickstart ув Федорі.
Прублема ADK є ув тому, що він потребує інстальованої ОС, а способу
генерації autounattend.xml
з-під ОС конкурентів Майкрософт не надає,
окрім цінних порад писати його ув текстовому редакторі вручну (дуже
дякую).
Не слідкуючи за їх цирком на дроті, деякий час назад я почув, що з
винахідливим змістом того .xml можна отримати інсталяцію віндюка без
сучасних та корисних аплікації типу коупайлота або ноутпеда (модерн)
чи аутлука (н'ю), та без необхідності ув танцюванні гопака для
створювання 'офлайнового' користувацького акавнту.
Різноманітні онлайнові генератóри autounattend.xml
змінюються як
пори року. Поточним, працюючим, популярним (ППП) залишається
дойчландський unbeaufsichtigter (вимовляйте це самі)
generator.
На цьому пригоди лише починаються:
Якщо потрібен .iso з доданим autounattend.xml
для створення
мошини віртуальної, то як модифікувати оригінальний .iso? Всередені
там є хфайлова система udf, яку змаунтувати можна тільки read-only.
Якщо треба інсталювати віндюка на справжнього комп'ютера (ви не
повірите, але такі випадки трапляються непоодиноко), то як створити
з оригінального .iso завантажувальний usb?
Нагадаю: ми ув лайнаксі, де жодні rufus'и працюють не тут.
Різноманітні ютіліти різної ступені занедбаності або підтримують лише
.iso лайнаксних дістро, або написані ув найкращому випадку школярами,
ув найгіршому--вініпухами чи руснею (маґа-патріот-джон с тексастской
області лєнінґрадскоґо района). Ув 2х останніх різновидах є гарний
шанс отримати гарного .iso с безоплатним подарунком всередині.
З найсмішніших варіянтів що я бачив, кількість залежностей є така, що
аплікацію, разом з залежностями, завертають ув appimage як ковбасу.
.iso → usb
Rufus'и та друзі для режиму UEFI роблять нічого складного: на
usb-дівайсі створюється дві GPT партішони:
- невелика fat32;
- ntfs (рідше--exfat), яка займає решту дівайса.
До 1ї переписують бутлоадера (зазвичай 'універсального', який може
вантажити декілька різних ОС). До ntfs копіюють вміст .iso.
Ув нашому варіянті майкрософтський .iso має свого бутлоадера, тому
скопіювати можна його. Головний трюка є ув правільному створені
партішонів: (1) fat32 не повинен бути з позначками esp та boot,
інакше віндюковий інсталятора вирішить що саме на usb-драйві буде EFI
розділ для ОС, хоча останню він ставить до геть іншого драйва; (2) без
позначки msftdata на ntfs партішоні віндюка кидає "Install driver to
show hardware" даялога, а її diskpart малює його як "Unknown". Вкрай
неввічливо.
$ parted test.img print | grep -v ^Disk
WARNING: You are not superuser. Watch out for permissions.
Model: (file)
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 1049kB 1074MB 1073MB fat32 BOOT msftdata
2 1074MB 7516MB 6442MB ntfs INSTALL msftdata
Наївний
скрипта,
який це втомлююче робить, на жаль, вимагає рута через створення loop
devices, але не чіпає хадварних драйвів:
$ sudo ./winiso2img Win11_24H2_English_x64.iso test.img
test.img
потім можна перенести на usb-драйв будь-яким улюбленим
способом, наприклад:
$ sudo dd if=test.img of=/dev/XXX status=progress bs=1M oflag=direct,sync
Ув принципі, щоб згенерувати хфайла з потрібною таблицею партішонів
можна обійтися без losetup+parted, а взяти sfdisk та udisksctl, але
mkfs.ntfs -fF file.img
у мене не бажало форматувати хфайла так, щоб
його визнавала інсталяція.
Модифікація .iso
Майкрософтські .iso зроблені з хфайлової системи udf, а крихітний шар
iso9660 там містить лише хфайла README.TXT з повідомленям про skill
issue читача.
Лайнакс знає про udf, але маунтить оті .iso лише ув read-only.
Спочатку я хотів взяти 7-zip. Розаркування великого аркайву (> 5GB)
займає час навіть на сучасних мошинах, тому бажано повідомляти
користувачу що коїться. 7-zip друкує лінію стану розаркування, але
робить це ув найворожіший спосіб. По-1ше, автор 7-zip'у вважає що \r
(carriage return) то є буржуазноє ізлішєство. Ось фрагмент
збереженого аутпуту:
00000000: 2020 304d 2053 6361 6e20 2f68 6f6d 652f 0M Scan /home/
00000010: 616c 6578 2f44 6f77 6e6c 6f61 6473 2f77 alex/Downloads/w
00000020: 696e 2f69 736f 2f77 3131 2f08 0808 0808 in/iso/w11/.....
00000030: 0808 0808 0808 0808 0808 0808 0808 0808 ................
00000040: 0808 0808 0808 0808 0808 0808 0808 0808 ................
00000050: 0808 0808 0808 2020 2020 2020 2020 2020 ......
00000060: 2020 2020 2020 2020 2020 2020 2020 2020
00000070: 2020 2020 2020 2020 2020 2020 2020 2020
00000080: 2008 0808 0808 0808 0808 0808 0808 0808 ...............
00000090: 0808 0808 0808 0808 0808 0808 0808 0808 ................
000000a0: 0808 0808 0808 0808 0808 0808 2020 3025 ............ 0%
000000b0: 2031 3030 204f 7065 6e08 0808 0808 0808 100 Open.......
000000c0: 0808 0808 0808 2020 ......
Воно видаляє рядок за допомогою циклу з \b
(backspace), потім друкує
пробіли щоб видалити їх знову.
По-2ге, воно відмовляється малювати лінію стану коли stdout не є
терміналом. Зі script(1) це можна побороти і, з деяким зусиллям, я
змусив аутпут від 7z бути зумісним з dialog(1) gauge, але після
проглядання 7-zip src, огида до нього у мене переросла бажання його
торкатися. Це 1 з найгірших src, які я бачив. То є диво що воно
працює взагалі, а кількість CVE починаючи з 2022 наводить на
конспірологічні думки які я тут писати не буду.
Якщо ігнорувати 7-zip, як тоді модифікувати змонтований read-only
.iso? Можна скопіювати все ув іншу директорію, але існує більш
шляхетний спосіб: overlayfs.
З ним гагібайти хфайлів не копіються, але метод вимагає рута. FreeBSD
ніби мала раніше щось схоже (unionfs), але коли я користувався fbsd,
воно часто працювало з помилками.
Після отримання директорії з autounattend.xml
хфайлом, її завертають
ув .iso знову.
Скрипта,
який це робить, є на 24 рядки більший за попередній winiso2img
:
$ wc -l *
67 mkwiniso
91 winiso2img
158 total
$ sudo ./mkwiniso add lol.xml Win11_24H2_English_x64.iso test.iso
Якщо просто треба з розаркованого Майкрософтського .iso створити
новий, рута є непотрібний:
$ ./mkwiniso generate dir 1.iso