GRUBをアンインストールするにはどうすればよいですか?


19

データストレージにのみ使用するハードドライブには、過去のUbuntuインストールからのGRUBがまだあります。

ドライブの残りのデータを損なわずにGRUBを削除するにはどうすればよいですか?

バックグラウンド

時々、さまざまな起動順序構成のコンピューター間でデータドライブを移動するため、各コンピューターのBIOS設定にデータドライブを収容する必要を回避するために、起動できないようにしたいと思います。

データドライブのみが接続されている状態でコンピューターの電源を入れると、次のように表示されます。

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

古いバックアップから/etc/fstab、これが最近再フォーマットしたルートパーティションのUUIDであり、もう存在しないことを確認できます。データドライブのパーティションテーブルとraw マスターブートレコードは次のとおりです。

私は主な質問に答えない回避策には興味がないことに注意してください。この問題を回避するためのいくつかの方法を考えることができますが、それを直接解決する方法がわからないことは原則として私を悩ませます。すべてのインストール手順には、対応するアンインストール手順が必要です。


好奇心が強い-/ boot / grubのファイルを削除した場合(これを削除したと仮定します)、mbrコードは本当に重要ですか?私はそれが他のものに使われるとは思わないでしょうか?私は間違っている可能性がありますが、それが使用されるとは思わないでしょうし、データを気にするなら、私はそのような低レベルの何かに手を出したくないのです。
マーティフライド

生のMBRデータをダンプして、ここに投稿できますか?のようなことができるはずsfdisk -d /dev/sdb > sdb.outです。
ブレークスルー

回答:


25

ディスクの最初の数バイトを0x00にするだけで、デバイスを起動不可能にすることができます。

通常(これはgrub、grub2、ntldr iircの両方に当てはまります)、ドライブの最初のバイトはx86 jmp命令になります。これは、ディスクラベルよりも前に発生します。デバイスに実行を渡してブートストラップすると、デバイス情報をコードとして取り込むようにCPUを設定するだけです。無効なコードがある場合、割り込みをトリガーし、BIOSが例外を処理し、次の起動可能なデバイスに進みます。

たとえば、私のディスクの始まりは次で始まります:

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

最初の部分はeb 63、現在のIPからのオフセット0x63へのジャンプ(つまり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パーティションテーブルとしてフォーマットされている場合、存在する必要があるのは、オフセットにあるパーティションテーブルと、offset にあるセクターの最後にある0x1beMBRシグネチャ55aaだけ0x1feです。 0x1be10進数の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

さて、hexdumpedの出力に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エラーを予測して防止するために、プラス1を提供します。
psitae

ない、バックアップを作成する場合のブロックデバイスに直接書き込む:おかげでたくさん、私はできるだけ多くのnoobのエラーとして防ぐために、自分のベストを尽くしたcount直接共通ブロックデバイス名を使用していない、忘れてしまった、バックアップファイルが作成されるべきであることを指定します変更されているデバイスから、クリアの成功がどのように見えるかの例、失敗した場合に元に戻す方法。あなたが私が何を得ているかを知るのに十分な知識があれば、赤ちゃんのステップを切り抜けて、単一のコマンドでこれをすべて行うことができます。ただし、まだ学習している場合は、そのコマンドを提供するつもりはありません。;)
OmnipotentEntity

2

警告:非常に危険

Linux自体からddコマンドを使用できます(パーティションテーブルを削除します)。

 # 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/hdafdisk -lコマンドを使用してデバイス名を見つけます:

# fdisk -l

ソース

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

これらのバイトカウントは不快なほどarbitrary意的です。GRUB2で同じかどうか知っていますか?
エンドリューク

1
バイトカウントは、パーティションテーブルが446から512の間にあるためです。もちろん、これはgrub MBRを削除する理由の疑問を招きます...そこに座っているだけで何も傷つけていません。代わりに別のブートローダーが必要な場合は、インストールするだけでgrubが置き換えられます。
-psusi

3
うわー、このタイプの回答には、「警告:非常に危険です」と書かれた大きな赤い文字が必要です。私は確かにOPがこれを行うことが可能ですが、私も「パーティションテーブル」は何であるかを知らなくても、いくつかの初心者ユーザー・コピー・貼り付け端子に最初のコマンドを参照してくださいことを憎むよ
セルゲイ

1
これをしないでください。最初のコマンドは(前述のOPのように)パーティションテーブルを消去しますが、MBRが適切に構成されていない場合、2番目のコマンドは未定義の動作を引き起こします。
ブレークスルー

1
ええと。タキオンが貼り付けたコマンドは何もしません。あなたはでテストすることができtouch testfiledd if=/dev/urandom of=testfile bs=512 count=1sudo losetup /dev/loop7 testfilesudo dd if=/dev/null of=/dev/loop7 bs=446 count=1sudo hexdump -Cv /dev/loop7。ご覧のとおり/dev/null、ソースは0ではありませんが、EOFソースです。 使用する必要があるddものはコピーできません。2番目の@Breakthrough、セクター0の最初のバイトがの場合、未定義の動作はありません。どうしてそう思うのか分かりません。/dev/null/dev/zero0x00
OmnipotentEntity

1

私の経験

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

つまり/dev/sda、Windows 7がインストールされている場所からgrub2を正常にアンインストールしたため、「/ dev / sdaからgrubを削除するにはどうすればよいですか?」という質問の最初の部分です。回答済みです。

ただし、質問の2番目の部分、「/ dev / sdaのMBRを復元するにはどうすればよいですか?」install-mbrコマンドがMBRの復元に失敗したため、回答がありません。その結果、Windowsは起動しなくなり、Windowsブートマネージャーは破損したMBRに関するエラーを報告し、Windows修復CDから修復するようにユーザーに要求します。


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
    

クレジット:HOW TO:Ubuntu LIVE CDを使用してWindows MBRを回復する

ウィキペディアの記事を読んで、MBRを識別する唯一のものは、セクターの最後にある署名(バイト510および511)であるという印象があります。MBRの最初の446バイトには、マシン命令が含まれているはずです。BIOSは、MBR署名が存在する場合、最初の446バイトの実際の内容に関係なく、ブートローダーに制御を転送することになっています。

IBM PC互換コンピューターでは、ROM BIOSに含まれるブートストラップファームウェアがマスターブートレコードをロードして実行します。[14] ...したがって、MBRの先頭にはリアルモードのマシン言語命令が含まれます。[14] BIOSは、ストレージデバイスから物理メモリにMBRを読み取り、マイクロプロセッサにブートコードの開始を指示します。

MBRのコードセクションのサイズが制限されているため、通常、追加のコード(ブートローダーなど)をストレージデバイスからメモリにコピーする小さなプログラムのみが含まれます。次に、制御がこのコードに渡され、実際のオペレーティングシステムの読み込みを行います。

...

BIOSのブートストラップシーケンスは、検出した最初の有効なMBRをアドレス0x7C00のコンピューターの物理メモリに読み込みます。BIOSコードで実行される最後の命令は、そのアドレスへの「ジャンプ」となり、MBRコピーの先頭に実行を向けます。BIOS実装者は、報告されたディスク容量を超えるセクターを参照するエントリのない有効なパーティションテーブルがMBRに含まれていることを確認するなど、BIOS実装者が他のチェックを含めることを選択できますが、ほとんどのBIOSの主な検証は最後の0xAA55署名です。

したがって、私の理解では、MBRには常にブートローダーが含まれているはずであり、最初の446バイトをゼロにしてもBIOSがディスクから起動しようとすることは停止しませんが、無効なコードを実行しようとするとコンピューターがハングする可能性があります。

更新:また、この記事では、ディスクをBIOSで「起動できない」ようにするには、セクターで(ディスクエディターを使用して)MBR署名を実際に編集することをお勧めします。ただし、OSがディスク上のパーティションテーブルを見ることに影響するかどうかはわかりませんが、少なくともこれらのバイトをいつでも元に戻すことができます...


0

別のより単純なソリューション。

私の場合、Debian linuxがありましたが、Mandrivaを使用したかったので、他の人でも動作します

PCの電源を切り、起動したくない(grubがある)起動するディスクを取り外します。

mandriva isoまたはインストールしたい他の亜種から作られた起動可能なusbに入れるだけです。isoファイルから起動可能なusbスティックを作成するためのツールがあります。

現在、ほとんどのLinuxインストーラーは、何をすべきか、評価版またはポータブルLinuxで試してみて/使用するか、セットアップを実行してインストールするかを選択できます。この時点で待機します(画面を待機するためにカーソルを上に移動しますが、Enterキーを押したり、マウスでクリックしたりしないでください)。

この時点で、USB /または/ CDRomが起動して実行中であることを思い出してください。今、一時的に削除したハードディスクをプラグインする時間です。1分間待機します(一部のBIOSでは、1分間の待機が少し必要です)

ほとんどのインストーラーには、必要な操作を実行できるパーティションツールが含まれているため、セットアッププロセスを続行します。簡単な解決策ですが、単に初心者として古いlinuxのセットアップを取り除きました


0

古い質問ですが、昨日私に起こったように、私はそれを次のように解決しました:私はコンピューターの電源を切り、問題のハードドライブを物理的に切断し、コンピューターを再起動し、

~ $ sudo update-grub

これを行って、コンピューターの電源を切り、ハードドライブと2年前に存在しなくなった古いWindows 7パーティションを再接続しましたが、最終的には表示されませんでした。

私はこれが現実的なソリューションであることを理解していますが、うまくいきます。ある日、そのハードドライブを完全に消去すると、GRUBの残りの痕跡は消えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.