Ненавидят винду многие, но редко кто может сказать за что.
У меня для этого повод есть, и не один. В силу того, что некоторые упоротые чуть больше, чем полностью личности до сих пор делают софт и аппаратуру с заточкой на эту ОС, то мне ее приходиться включать, и иногда даже работать. Впрочем последнее не страшно, так как емакс и на винде себя неплохо чувствует… Но сказка не об этом, а о том, как я битый вечер пытался перебросить винду с одного жесткого на другой без переустановки. Если в линуксах, да и в *BSD это плевая операция на 7 минут, то здесь меня ждал секс в плохом смысле этого слова.
Итак, мой сетап:
Старый жесткий диск, ныне воткнутый в коробку, разбитый уж и не припомню почему, примерно так:
/dev/sdс1 — / установленной системы (Agilia)
/dev/sdc2 — swap
/dev/sdc3 — полигон для moblin’а|android x86 и т.п.
/dev/sdc4 — Винда ХП.
На новом жестком диске, так как винда была нафиг не нужна, как и полигон для разных недоос, расклад был такой.
/dev/sda1 — Свободное место для венды
/dev/sda2 — / Arch Linux’а
/dev/sda3 — swap
Обычно, зная то, как хорошо гениальные инженеры мелкого и мягкого реализовали (даже в свисте и семерочке) работу с разделами HDD, я стараюсь держать win систему ТОЛЬКО на первом разделе первого жесткого диска. Но вот так исторически сложилось. А еще исторически сложилось, что переустановка (из-за софта внезапно очень нужного, который врос корнями в реестр и которого не найдешь в дистрибутивах нигде, ибо писался на коленке очередным MS-ориентированным спецом) не канает. Нужна именно та самая система.
В общем квест выдался веселый.
Скопировав винду при помощи ntfsclone на предназначенное для нее место, и прописав для нее пункт в grub’е, меня встретил мигающий курсор и тишина. После долгих экспериментов с ms-sys, dd, хексдампами, я понял, что проблема не в MBR, а в PBR (ака VBR), то есть Volume Boot Record. Его грузят по цепочке груб или MBR.
Запуск установки винды этот кривой VBR не лечит. Та видит свой VBR, считает что все чики-пуки и после первой перезагрузки мы видим кукишь.
Итогом стало форматирование раздела, запуск установки винды до первой перезагрузки и последующий бэкап при помощи dd первых блоков диска с работающим VBR.
dd if=/dev/sda1 of=workingpbr bs=512 count=5000 |
Зачем так много? Да потому что раскурив структуру NTFS я понял, что в загрузке там участвуют аж первые 16 блоков. B в каком из них засело насекомое — сказать было невозможно. До этого, сверяя шестнадцатиричные дампы я грешил на размер блоков/параметры фс, но они у рабочего и не рабочего раздела были одинаковые и делал я это уже отчаявшись. На самом деле достаточно было 512 байт, как выяснилось позже, после изрядного красноглазия.
После бэкапа я повторил ntfsclone
ntfsclone --overwrite /dev/sda1 /dev/sdc3 |
После, поверх него накатил, сначала для проверки, первые 512 байт забэкапленного.
dd if=workingpbr of=/dev/sda1 bs=512 count=1 |
И, О ЧУДО, меня встретило сообщение о ненайденном hal.dll. То есть бут отработал как надо, и разбирать дальше структуру NTFS и последовательность загрузки винды не надо.
Дальше шла рутинная правка boot.ini из линукса vim’ом.
multi(0)disk(0)rdisk(0)partition(3)
Надо было заменить на
multi(0)disk(0)rdisk(0)partition(1)
Попутно я сходил в WINDOWS/system32/config и из хайва system почистил при помощи chntpw ветку MountedDevices. Ключики там отвечают за привязку букв к ID дисков и с ними нас ждет BSOD.
И вот тут-то и начилась свистопляска…
Винда запустилась, но меня ждал замерший экран приветствия, с которого невозможно было сдвинуться. Безопасный режим вел себя аналогичным образом. WTF?
После выскребания из головы воспоминаний о работе этой наикривейшей OS, опять из линукса я поперся в WINDOWS/system32/config в хайв software, где в ключике Microsoft\Windows NT\CurrentVersion\Winlogon вытер UIhost, отрубив тем самым графическое приветствие.
Винда меня встретила унылым окошком логина в стиле начала нулевых, после ввода имени пользователя сразу же завесилась на «сохранение сеанса».
Чешем голову, читаем MSDN до просветления. Оно наступило. Эта самая Винда при установке в незапамятные времена умудрилась обозначить диск, на который была установлена, как F:\
А так как поделки MS имеют привычку захардкоживать полные пути к утилитам везде, и в ярлыках .lnk, и в сотнях ключах реестра, и еще в десятке мест о которых я могу только подозревать… И это бедствие не решается запуском sed’а с заклинанием-регэкспом на /etc. Как я и подозревал, правка Userinit’а не привела к положительным результатам, на этот раз оно залогинилось, и так и осталось с синим экраном.
Выхода было два:
- Поправить ключики в MountedDevices, но из-за их названия chntpw, доселе служивший верой и правдой делал ‘Aborted’.
- Вхачиться в таблицу разделов, чтобы диски были не в физическом порядке указаны, а в том, в каком их ожидает увидеть винда.
По счастью исполнить второе я не успел. Вовремя вспомнил, что у винды есть безопасный режим, который, в отличие от обычного завелся с горем пополам после правки пути к Userinit, и уже виндовым регэдитом (так как mmc консоль, как и половина системных утилит не хотели запускаться или падали с воплями) поправил, MountedDevices, переименовав
\DosDevices\C:
в
\DosDevices\F:
и попутно вернув Userinit в прежнее значение.
После этих ритуальных плясок с бубном, винда заработала как ни в чем не бывало. И после этого они говорят, что Линукс сложный…
линукс на самом деле жутко сложный. Там думать надо 🙂 А еще читать. И писать страшные шаманские заклинания. А в форточке достаточно включить заложеную далекими предками функцию «обезьяна без гранаты» и ломать к такой то матери