henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2025-05-11 07:33 pm

Безвідповідальна модифікація інсталяції

Майкрософт вперше додали механізма autounattend.xml за часів захоплюючих краєвидів Вісти. Користувач завантажував те що зараз називається ADK віндюковий, який містив графічну ютіліту WSIM, яка випльовувала xml-файла. Останній клавсь до кореня usb-драйву і віндюка (ув ідеалі) інсталювався без втручання хомо сапієнса.

Нічого революційно нового ув тому не було--лайнакси схожі механізми мали багато років, наприклад kickstart ув Федорі.

Прублема ADK є ув тому, що він потребує інстальованої ОС, а способу генерації autounattend.xml з-під ОС конкурентів Майкрософт не надає, окрім цінних порад писати його ув текстовому редакторі вручну (дуже дякую).

Не слідкуючи за їх цирком на дроті, деякий час назад я почув, що з винахідливим змістом того .xml можна отримати інсталяцію віндюка без сучасних та корисних аплікації типу коупайлота або ноутпеда (модерн) чи аутлука (н'ю), та без необхідності ув танцюванні гопака для створювання 'офлайнового' користувацького акавнту.

Різноманітні онлайнові генератóри autounattend.xml змінюються як пори року. Поточним, працюючим, популярним (ППП) залишається дойчландський unbeaufsichtigter (вимовляйте це самі) generator.

На цьому пригоди лише починаються:

  1. Якщо потрібен .iso з доданим autounattend.xml для створення мошини віртуальної, то як модифікувати оригінальний .iso? Всередені там є хфайлова система udf, яку змаунтувати можна тільки read-only.

  2. Якщо треба інсталювати віндюка на справжнього комп'ютера (ви не повірите, але такі випадки трапляються непоодиноко), то як створити з оригінального .iso завантажувальний usb?

Нагадаю: ми ув лайнаксі, де жодні rufus'и працюють не тут. Різноманітні ютіліти різної ступені занедбаності або підтримують лише .iso лайнаксних дістро, або написані ув найкращому випадку школярами, ув найгіршому--вініпухами чи руснею (маґа-патріот-джон с тексастской області лєнінґрадскоґо района). Ув 2х останніх різновидах є гарний шанс отримати гарного .iso с безоплатним подарунком всередині.

З найсмішніших варіянтів що я бачив, кількість залежностей є така, що аплікацію, разом з залежностями, завертають ув appimage як ковбасу.

.iso → usb

Rufus'и та друзі для режиму UEFI роблять нічого складного: на usb-дівайсі створюється дві GPT партішони:

  1. невелика fat32;
  2. 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
kondybas: (Default)

[personal profile] kondybas 2025-05-11 05:23 pm (UTC)(link)
Дякую за корисну інфу. В сімейства всього разом більше десятка компів-ноутів, які мені доводиться сапортити. Всі ці езотеричні практики сильно зекономлять мені геморой.
kondybas: (Default)

[personal profile] kondybas 2025-05-11 05:29 pm (UTC)(link)
"..кількість CVE починаючи з 2022 наводить на конспірологічні думки які я тут писати не буду.."

Так то не конспірологія, а достеменно встановлений факт. Як і з вінраром.
kondybas: (Default)

[personal profile] kondybas 2025-05-11 06:53 pm (UTC)(link)
З вінраром було одразу два факапи, і кожен достатньо красномовний.

Перший - коли вилізло, що при створенні запароленого архіву в нього додається сегмент, де лежить той пароль, закриптований по RSA. І той, в кого є приватний ключ, може відкрити будь-який запаролений вінрар-архів. Другий - коли виявилося, що при створенні архіву, що "саморозпаковується" (ехешник, якому не потрібен архіватор для розпаковки себе), в нього додається якийсь бінарі-блоб, який стартується після власне розпакування архіву. На всі питання автор відповідав приблизно "йдіть нахуй, ось чому!"

Вінрар був доволі популярний за кордоном, але після цих факапів він там практично вимер.
kondybas: (Default)

[personal profile] kondybas 2025-05-11 07:16 pm (UTC)(link)
Навєрно, подумав, що не для того покинув родінку, шоб знову сідать на пляшку.