Как мне удалить GRUB?


19

Жесткий диск, который я использую только для хранения данных, все еще имеет GRUB из прошлых установок Ubuntu.

Как я могу удалить GRUB из него, не нанося вред остальным данным диска?

Фон

Я иногда перемещаю диск данных между компьютерами с различными конфигурациями порядка загрузки, поэтому я хотел бы, чтобы он не загружался , чтобы не включать его в настройки BIOS каждого компьютера.

Когда я включаю компьютер, когда подключен только диск с данными, появляется следующее:

error: no such device: fdf38dd4-9e9d-479d-b830-2a6989958503.
grub rescue> 

Из старых резервных копий я могу подтвердить, /etc/fstabчто это был UUID корневого раздела, который я недавно переформатировал и которого больше не существует . Вот таблица разделов диска с данными и основная загрузочная запись .

Обратите внимание, что меня не интересуют обходные пути, которые не отвечают на мой основной вопрос. Я могу придумать несколько способов обойти эту проблему, но меня беспокоит принцип, что я не знаю, как решить эту проблему напрямую. Каждая процедура установки должна иметь процедуру удаления аналога.


Просто любопытно - если вы удалите файлы в / boot / grub (что я и предполагал), действительно ли имеет значение код mbr? Я не думаю, что это будет использоваться чем-то еще, не так ли? Я могу ошибаться, но я не думаю, что это будет использоваться, и я не хотел бы что-то делать на таком низком уровне, если бы я заботился о данных.
Марти Фрид

Можете ли вы сбросить необработанные данные MBR и опубликовать их здесь? Вы должны быть в состоянии сделать что-то вроде sfdisk -d /dev/sdb > sdb.out.
Прорыв

Ответы:


25

Вы можете сделать устройство не загружаемым, просто сделав первые несколько байтов диска 0x00.

Как правило (и это верно как для grub, grub2, так и для ntldr iirc), самый первый байт вашего диска будет инструкцией x86 jmp. Это происходит даже до метки диска, поскольку при передаче выполнения устройству для его начальной загрузки оно просто устанавливает ЦП на всасывание информации об устройстве в виде кода. Если он имеет неверный код, он вызывает прерывание, и BIOS обрабатывает исключение и переходит к следующему загрузочному устройству.

Например, начало моего диска начинается с:

00000000  eb 63 90 d0 bc 00 7c fb  50 07 50 1f fc be 1b 7c  |.c....|.P.P....||

Первая часть - eb 63это переход со смещением 0x63 от текущего IP (то есть до 0x65).

00000060  00 00 00 00 ff fa 90 90  f6 c2 80 74 05 f6 c2 70  |...........t...p|
00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|

Казнь продолжается отсюда.

Конец сектора выглядит так:

000001b0  cd 10 ac 3c 00 75 f4 c3  ed db 96 d6 00 00 80 01  |...<.u..........|
000001c0  01 00 83 fe ff ff 3f 00  00 00 c1 07 a6 0e 00 fe  |......?.........|
000001d0  ff ff 83 fe ff ff 00 60  00 11 00 00 38 29 00 fe  |.......`....8)..|
000001e0  ff ff 82 fe ff ff 00 08  a6 0e 00 58 5a 02 00 00  |...........XZ...|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|

Если ваш диск отформатирован как таблица разделов MBR, то для этого нужны только две вещи: таблица разделов со смещением 0x1beи подпись MBR, 55aaкоторая находится в самом конце сектора со смещением 0x1fe. 0x1beдесятичное число 446.

Следующее (конечно) сделает устройство не загружаемым. Но это то, что вы хотите. Если вы не хотите, чтобы ваше устройство не загружалось, не делайте этого, ммм-кей? Я предполагаю, что ваше устройство есть /dev/sdz, просто потому что не так много людей имеют /dev/sdz, и это снижает риск того, что некоторые идиоты-новички слепо копируют команды вставки.

Сначала скопируйте MBR в файл для резервного копирования.

sudo dd if=/dev/sdz of=/some/where/safe/preferably/not/on/dev/sdz/backup.mbr bs=512 count=1

Затем сделайте копию этого файла:

cp backup.mbr backup.mbr.test

Затем мы должны создать устройство с обратной связью (чтобы содержимое не усекалось) и применить изменения к нашему фиктивному сектору 0 в качестве теста:

sudo losetup /dev/loop7 backup.mbr.test
sudo dd if=/dev/zero of=/dev/loop7 bs=446 count=1
sudo losetup -d /dev/loop7

hexdump файл и убедитесь, что вся таблица разделов не повреждена:

sudo hexdump -C backup.mbr.test

Вы должны увидеть что-то вроде:

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 01  |................|
000001c0  01 00 83 fe ff ff 3f 00  00 00 c1 07 a6 0e 00 fe  |......?.........|
000001d0  ff ff 83 fe ff ff 00 60  00 11 00 00 38 29 00 fe  |.......`....8)..|
000001e0  ff ff 82 fe ff ff 00 08  a6 0e 00 58 5a 02 00 00  |...........XZ...|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200

Теперь, 0x1beгде вы видите 80на шестнадцатеричном выводе, это также может быть 00и остается действительным. (Это флаг «загрузочный» в таблице разделов, вы можете оставить его в покое, потому что он полностью игнорируется большинством современных BIOS ...) Байт, 0x1bfхотя и почти никогда не будет 0x00(чаще всего, 0x01но он может принимать другие значения) можете сравнить это с вашим, backup.mbrчтобы убедиться, что ничего прошлого 0x1beне изменилось.

Как только вы убедитесь, что применили изменения правильно, вы можете напрямую скопировать файл на первую часть диска. Причина, по которой вы хотите сделать файл, а не /dev/zeroснова, заключается в безопасности от опечаток. Если вы случайно пропустите count=1это, у вас будет плохое время, копирование файла с другой стороны никогда не будет проходить мимо EOF. Так что безопаснее.

sudo dd if=backup.mbr.test of=/dev/sdz

Затем hexdumpваш диск, чтобы убедиться, что изменения приняли, как ожидалось.

hexdump -C /dev/sdz | head

Сравните с 0x200против, backup.mbr.testчтобы убедиться, что это то, что вы хотите.

Наконец, если что-то облажается по какой-либо причине, вы можете просто скопировать резервную копию MBR обратно на диск через:

sudo dd if=backup.mbr of=/dev/sdz

Надеюсь это поможет.


1
Я даю вам один плюс за предвидение и предотвращение серьезной ошибки нуба.
Псита

Спасибо большое, я сделал все возможное, чтобы предотвратить как можно больше ошибок noob: создание резервной копии, а не запись непосредственно на блочное устройство в случае, если countон забыт, а не прямое использование общего имени блочного устройства, указав, что файл резервной копии должен быть создан Выключенное устройство, пример того, как выглядит успешная очистка, как отменить, если вы облажались. Я полагаю, что если вы достаточно осведомлены, чтобы понять, что я получаю, вы сможете пройти через шаги ребенка и просто сделать все это в одной команде. Но я не собираюсь давать вам эту команду, если вы все еще учитесь. ;)
OmnipotentEntity

2

ВНИМАНИЕ: ЧРЕЗВЫЧАЙНО ОПАСНО

Вы можете использовать команду dd из самого Linux (она удаляет таблицу разделов):

 # dd if=/dev/null of=/dev/sdX bs=512 count=1

Просто удалите MBR без таблицы разделов (см. Комментарий ниже):

# dd if=/dev/null of=/dev/sdX bs=446 count=1

Замените /dev/hdXна ваше фактическое имя устройства, например /dev/hda. Используйте fdisk -lкоманду, чтобы узнать имя устройства:

# fdisk -l

Источник

  1. http://www.cyberciti.biz/faq/linux-how-to-uninstall-grub/

Эти байты выглядят неудобно произвольно. Вы знаете, одинаковы ли они для GRUB2?
rndrük

1
Число байтов объясняется тем, что таблица разделов находится между 446 и 512. Конечно, возникает вопрос, почему вы хотите удалить MBR grub ... это не повредит ничему, просто оставаясь там неиспользованным. Если вам нужен другой загрузчик, просто установите его, и он заменит grub.
psusi

3
Ничего себе, этот тип ответа должен иметь надпись «ПРЕДУПРЕЖДЕНИЕ: ЧРЕЗВЫЧАЙНО ОПАСНЫЙ», написанную большими красными буквами по всему тексту. Я уверен, что OP способен сделать это, но я бы не хотел, чтобы какой-то новичок вставил первую команду в терминал, даже не зная, что такое «таблица разделов»
Сергей

1
Вы не делать этого . Первая команда уничтожит таблицу разделов (как упомянуто OP), но вторая команда вызовет неопределенное поведение, если MBR не настроен должным образом.
Прорыв

1
Хмм .. Я не знаю, почему вы, ребята, сходите с ума, команды, которые вставили тахионы, вообще ничего не делают. Вы можете проверить с touch testfile, dd if=/dev/urandom of=testfile bs=512 count=1, sudo losetup /dev/loop7 testfile, sudo dd if=/dev/null of=/dev/loop7 bs=446 count=1, sudo hexdump -Cv /dev/loop7. Как видите, /dev/nullэто не источник 0, а источник EOF. ddне может и не будет копировать что-либо от /dev/nullвас нужно использовать /dev/zero. Второе @Breakthrough, неопределенное поведение невозможно, если первый байт сектора 00x00 . Я не знаю, почему ты так думаешь.
OmnipotentEntity

1

Мой опыт работы с

sudo install-mbr -i n -p D -t 0 /dev/sda

является то, что он успешно деинсталлировал grub2 из /dev/sda(где установлена ​​моя Windows 7), поэтому первая часть вопроса "Как мне удалить grub из / dev / sda?" был дан ответ.

Тем не менее, 2-я часть вопроса: «Как восстановить MBR / dev / sda?» не было получено ответа, так как install-mbrкоманда не смогла восстановить MBR. В результате Windows больше не загружается, и диспетчер загрузки Windows сообщает об ошибке о поврежденной MBR и просит пользователя восстановить с компакт-диска восстановления Windows.


1

Прочитав статью на эту тему в Википедии, я хотел бы предложить несколько дополнительных решений:

  1. Изменить порядок загрузки в BIOS :)

  2. Лучший и самый безопасный: используйте fdiskдля удаления флага «загрузочный» из любых разделов на этом диске. Большинство MBR ищут «загрузочный» раздел для загрузки по цепочке, поэтому я ожидаю, что GRUB просто ничего не сделает, если таких разделов нет. Хотя не проверял.

    Если вышесказанное не помогает, попробуйте установить бесплатный клон стандартного кода MBR:

  3. Установите mbrпакет и используйте install-mbrкоманду следующим образом:

    sudo apt-get install mbr
    sudo install-mbr -i n -p D -t 0 /dev/sda
    

Кредиты: КАК: Восстановить Windows MBR, используя Ubuntu LIVE CD

После прочтения статьи в Википедии у меня сложилось впечатление, что единственная вещь, которая идентифицирует MBR, - это ее подпись, которая находится в самом конце сектора (байты 510 и 511). Первые 446 байтов MBR должны содержать машинные инструкции. Предполагается, что BIOS передает управление загрузчику независимо от фактического содержимого первых 446 байтов, при условии наличия подписи MBR:

На IBM PC-совместимых компьютерах загрузочная микропрограмма, содержащаяся в ПЗУ BIOS, загружает и выполняет основную загрузочную запись. [14] ... Таким образом, ожидается, что начало MBR будет содержать инструкции машинного языка реального режима. [14] BIOS считывает MBR из запоминающего устройства в физическую память, а затем направляет микропроцессор в начало загрузочного кода.

Из-за ограниченного размера раздела кода MBR, он обычно содержит только небольшую программу, которая копирует дополнительный код (например, загрузчик) с устройства хранения в память. Затем управление передается этому коду, который отвечает за загрузку реальной операционной системы.

...

Последовательность начальной загрузки в BIOS загрузит первую действительную MBR, найденную в физической памяти компьютера по адресу 0x7C00. Последняя инструкция, выполненная в коде BIOS, будет «переходом» по этому адресу, чтобы направить выполнение в начало копии MBR. Основной проверкой для большинства BIOS является подпись 0xAA55 на конце, хотя разработчик BIOS может решить включить другие проверки, такие как проверка того, что MBR содержит допустимую таблицу разделов без записей, относящихся к секторам, превышающим заявленную емкость диска.

Поэтому я понимаю, что MBR всегда должен содержать загрузчик, и обнуление первых 446 его байтов не помешает BIOS попытаться загрузиться с диска - но это может привести к зависанию компьютера при попытке выполнить недопустимый код.

ОБНОВЛЕНИЕ: Кроме того, в этой статье предлагается, чтобы диск выглядел «не загружаемым» для BIOS, вы должны отредактировать сигнатуру MBR в и в секторе (используя любой редактор дисков). Я не уверен, повлияет ли это на то, что ОС увидит таблицу разделов на диске ... но, по крайней мере, вы всегда можете изменить эти байты обратно ...


0

Еще одно более простое решение.

В моем случае у меня был Debian Linux, но я хотел использовать Mandriva, будет работать и для других

Выключите компьютер, затем удалите диск, который загружается, который вы не хотите загружать (который имеет grub)

Просто вставьте загрузочный USB-диск из Mandriva ISO или другой вариант, который вы хотите установить. Существуют инструменты для создания загрузочных USB-флешек из ISO-файлов с помощью Google (или вы можете использовать сгоревший установщик с CD-ROM).

Теперь большинство установщиков linux предоставляют вам выбор, что делать, пробовать и играть / использовать для ознакомления или переносить linux или запустить установку для его установки. На данный момент мы просто ждем (переместите курсор вниз, чтобы экран ожидал, но не нажимайте ввод или щелчок мышью).

Напомним, что в этот момент ваш USB / или / CDRom запущен и работает. теперь пришло время подключить обратно жесткий диск, который мы временно удалили, подождите минуту (некоторые биографии требуют небольшого ожидания, подождите более чем достаточно)

Продолжайте процесс установки, так как большинство инсталляторов содержат инструменты для создания разделов, которые вы можете делать как угодно ну это простое решение, я избавился от старой установки Linux просто как новичок


0

Старый вопрос, но, как это случилось со мной вчера, я решил это так: я выключил компьютер, физически отключил инкриминированный жесткий диск, снова запустил компьютер, затем

~ $ sudo update-grub

Сделав это, я выключил компьютер, снова подключил жесткий диск, и мой старый раздел Windows 7, который больше не существует 2 года назад, не появился - наконец.

Я понимаю, что это практичное решение, но оно работает. Однажды я полностью уничтожу этот жесткий диск, и все оставшиеся следы GRUB исчезнут.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.