Як видалити 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
Я даю вам плюс один для передбачення та запобігання серйозної помилки нобі.
psitae

Дякую купу, я зробив усе можливе, щоб запобігти якомога більше помилок noob: зробити резервну копію, не записувати безпосередньо на блоковий пристрій, якщо countце забуто, не використовуючи безпосередньо загальне ім'я блокового пристрою, вказавши, що слід створити файл резервного копіювання. вимкнути пристрій, що змінюється, приклад того, як виглядає вдале очищення, як скасувати, якщо ви його викрутили. Я думаю, якщо ти достатньо обізнаний, щоб ти знав, що я отримую, ти можеш прорізати кроки дитини і просто зробити все це за одну команду. Але я не збираюся давати тобі цю команду, якщо ти ще вчишся. ;)
ВсемогутнійЕнтність

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?
ændrük

1
Кількість байтів пояснюється тим, що таблиця розділів лежить між 446 і 512. Звичайно, тут виникає питання, чому ви хочете видалити MBR-скриньку ... нічого не шкодить, просто сидячи там невикористаним. Якщо ви хочете інший завантажувач замість цього, просто встановіть його, і він замінить grub.
psusi

3
Нічого собі, цей тип відповіді повинен бути "ПОПЕРЕДЖЕННЯ: НАЙКРАСНО ОПАСНО", написані великими червоними літерами по всьому. Я впевнений, що ОП здатна це робити, але мені б не хотілося бачити, щоб якийсь новачок користувач копіював першу команду в термінал, навіть не знаючи, що таке "таблиця розділів"
Сергій

1
Ви НЕ робити цього . Перша команда знищить таблицю розділів (як згадувалося в ОП), але друга команда спричинить невизначене поведінку, якщо 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. По-друге, @ Пробіг, не визначена поведінка неможлива, якщо перший байт сектора 0 є 0x00. Я не знаю, чому ви так думаєте.
OmnipotentEntity

1

Мій досвід с

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

це те, що він успішно видалив grub2 з /dev/sda(де встановлена ​​моя Windows 7), тому перша частина питання "Як видалити grub з / dev / sda?" відповіли.

Однак, друга частина запитання, яка "Як відновити 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

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

На комп'ютерах, сумісних з комп'ютером IBM, програмне забезпечення для завантаження, що міститься в BIOS BI ROM, завантажується і виконує основний запис завантаження. [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, виготовлений із мандріви iso або іншого варіанту, який ви хочете встановити, є інструменти для створення завантажувальних usb-паличок із iso-файлів, що використовують Google (або ви можете нам записати інсталятор із компакт-диска)

Зараз більшість інсталяторів Linux надає вам вибір, що робити, спробувати відтворити / використовувати для оцінки чи переносну Linux або запустити налаштування для її встановлення. У цей момент ми просто чекаємо (рухаємо курсор вгору вниз, тому екран буде чекати, але не натискати клавішу введення чи натискання мишкою).

Просто нагадайте в цей момент ваш USB / або / CDRom запустився і працює. тепер прийшов час повернути жорсткий диск, який ми тимчасово видаляли, зачекайте хвилину (для деяких біосів потрібно трохи зачекати хвилину більше, ніж достатньо)

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


0

Старе питання, але як це сталося зі мною вчора, я вирішив його так: я вимкнув комп’ютер, фізично відключив інкримінований жорсткий диск, знову запустив комп’ютер, потім

~ $ sudo update-grub

Зробивши це, я вимкнув комп’ютер, підключив жорсткий диск, і мій старий розділ Windows 7, який вже не існував з 2 років тому, не з’явився - нарешті.

Я розумію, що це приземлене рішення, але воно працює. Одного разу я повністю витру цей жорсткий диск, і будь-який залишився слід від GRUB зникне.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.