Làm cách nào để gỡ cài đặt GRUB?


19

Một ổ cứng mà tôi chỉ sử dụng để lưu trữ dữ liệu vẫn có GRUB từ các cài đặt Ubuntu trước đây.

Làm cách nào tôi có thể xóa GRUB khỏi nó mà không làm hại phần còn lại của dữ liệu ổ đĩa?

Lý lịch

Thỉnh thoảng tôi di chuyển ổ dữ liệu giữa các máy tính với các cấu hình thứ tự khởi động khác nhau, vì vậy tôi muốn nó không thể khởi động để tránh phải đặt nó trong các cài đặt BIOS của mỗi máy tính.

Khi tôi bật nguồn máy tính trong khi chỉ gắn ổ dữ liệu, thông báo sau sẽ xuất hiện:

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

Tôi có thể xác nhận từ các bản sao lưu cũ /etc/fstabrằng đây là UUID của phân vùng gốc mà tôi đã định dạng lại gần đây và không còn tồn tại . Đây là bảng phân vùng của ổ dữ liệu và bản ghi khởi động chính thô .

Xin lưu ý rằng tôi không quan tâm đến cách giải quyết không trả lời câu hỏi chính của tôi. Tôi có thể nghĩ ra một số cách để giải quyết vấn đề này, nhưng nó làm phiền tôi theo nguyên tắc rằng tôi không biết cách giải quyết trực tiếp. Mỗi thủ tục cài đặt nên có một quy trình gỡ cài đặt đối tác.


Chỉ tò mò - nếu bạn xóa các tệp trong / boot / grub (mà tôi giả sử bạn đã làm), mã mbr có thực sự quan trọng không? Tôi không nghĩ rằng nó sẽ được sử dụng bởi bất cứ điều gì khác, phải không? Tôi có thể sai, nhưng tôi sẽ không nghĩ rằng nó sẽ được sử dụng và tôi ghét phải xoay quanh với thứ gì đó ở mức độ thấp như vậy nếu tôi quan tâm đến dữ liệu.
Marty Fried

Bạn có thể đổ dữ liệu MBR thô và đăng nó ở đây không? Bạn sẽ có thể làm một cái gì đó như sfdisk -d /dev/sdb > sdb.out.
Đột phá

Câu trả lời:


25

Bạn có thể khiến thiết bị không khởi động được đơn giản bằng cách tạo một vài byte đầu tiên của đĩa 0x00.

Thông thường (và điều này đúng cho cả grub, grub2 và ntldr iirc) byte đầu tiên của ổ đĩa của bạn sẽ là một lệnh jmp x86. Điều này xảy ra trước cả đĩa, bởi vì khi truyền thực thi cho thiết bị để khởi động nó, nó chỉ đơn giản đặt CPU để lấy thông tin của thiết bị dưới dạng mã. Nếu nó có mã không hợp lệ, nó sẽ kích hoạt ngắt và BIOS xử lý ngoại lệ và chuyển đến thiết bị có thể khởi động tiếp theo.

Chẳng hạn, phần đầu đĩa của tôi bắt đầu bằng:

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

Phần đầu tiên eb 63là Jump để bù 0x63 từ IP hiện tại (vì vậy đến 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......|

Thi hành tiếp tục từ đây.

Sự kết thúc của ngành trông như thế này:

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.|

Nếu đĩa của bạn được định dạng dưới dạng bảng phân vùng MBR thì nó chỉ cần có hai thứ, bảng phân vùng được bù 0x1bevà chữ ký MBR, 55aaxuất hiện ở cuối của phần bù 0x1fe. 0x1belà số thập phân 446.

Điều sau đây (tất nhiên) sẽ làm cho thiết bị không thể khởi động. Nhưng đây là những gì bạn muốn. Nếu bạn không muốn làm cho thiết bị của mình không thể khởi động được thì đừng làm điều này, mmm-kay? Tôi cho rằng thiết bị của bạn là /dev/sdz, đơn giản vì không có nhiều người có /dev/sdz, và điều này làm giảm nguy cơ một số người mới ngốc nghếch sao chép một cách mù quáng các lệnh dán.

Đầu tiên, sao chép MBR vào một tệp để sao lưu.

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

Tiếp theo, tạo một bản sao của tập tin đó:

cp backup.mbr backup.mbr.test

Tiếp theo, chúng tôi phải tạo một thiết bị loopback (để nội dung không bị cắt ngắn.) Và áp dụng các thay đổi trên khu vực giả mạo 0 của chúng tôi dưới dạng thử nghiệm:

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 tệp và đảm bảo rằng toàn bộ bảng phân vùng còn nguyên vẹn:

sudo hexdump -C backup.mbr.test

Bạn sẽ thấy một cái gì đó như:

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

Bây giờ, 0x1belà nơi bạn nhìn thấy 80trên đầu ra hexdumped, điều này cũng có thể 00và vẫn còn hiệu lực. (Đó là "khởi động" cờ trong bảng phân vùng, bạn có thể để nó một mình, bởi vì nó hoàn toàn bị bỏ qua bởi hầu hết các BIOS hiện đại ...) Byte tại 0x1bfmặc dù hầu như sẽ không bao giờ được 0x00(đó là phổ biến nhất 0x01nhưng nó có thể có giá trị khác), bạn có thể so sánh điều này với bạn backup.mbrđể đảm bảo rằng không có gì quá khứ 0x1bebị thay đổi.

Khi bạn hài lòng rằng bạn đã áp dụng thay đổi một cách chính xác thì bạn có thể sao chép trực tiếp tệp qua phần đầu tiên của đĩa. Lý do tại sao bạn muốn làm tệp chứ không phải /dev/zeromột lần nữa là vì sự an toàn chống lại lỗi chính tả. Nếu bạn vô tình bỏ qua count=1bạn sẽ có một thời gian tồi tệ, sao chép một tập tin mặt khác sẽ không bao giờ chạy qua EOF, bao giờ. Vì vậy, nó an toàn hơn.

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

Tiếp theo hexdumpđĩa của bạn để đảm bảo rằng các thay đổi đã diễn ra như mong đợi.

hexdump -C /dev/sdz | head

So sánh 0x200với backup.mbr.testđể đảm bảo đó là những gì bạn muốn.

Cuối cùng, nếu bất cứ điều gì làm hỏng mọi lý do, bạn chỉ cần sao lưu bản sao lưu của MBR vào ổ đĩa thông qua:

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

Hi vọng điêu nay co ich.


1
Tôi sẽ cho bạn một điểm cộng để dự đoán và ngăn ngừa lỗi nghiêm trọng.
psitae

Cảm ơn rất nhiều, tôi đã cố gắng hết sức để ngăn chặn càng nhiều lỗi noob càng tốt: tạo bản sao lưu, không ghi trực tiếp vào thiết bị khối trong trường hợp countbị quên, không sử dụng trực tiếp tên thiết bị khối chung, chỉ định rằng tệp sao lưu phải được tạo tắt thiết bị đang được thay đổi, một ví dụ về việc xóa thành công trông như thế nào, làm thế nào để hoàn tác nếu bạn làm hỏng. Tôi nghĩ rằng nếu bạn đủ hiểu biết để biết những gì tôi nhận được ở bạn có thể cắt qua các bước bé và chỉ cần làm tất cả những điều này trong một lệnh duy nhất. Nhưng tôi sẽ không cung cấp cho bạn lệnh đó nếu bạn vẫn đang học. ;)
Toàn

2

CẢNH BÁO: TUYỆT VỜI NGUY HIỂM

Bạn có thể sử dụng lệnh dd từ chính Linux (nó loại bỏ bảng phân vùng):

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

Chỉ cần loại bỏ MBR, không có bảng phân vùng (xem bình luận bên dưới):

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

Thay thế /dev/hdXbằng tên thiết bị thực tế của bạn như /dev/hda. Sử dụng fdisk -llệnh để tìm ra tên thiết bị:

# fdisk -l

Nguồn

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

Những byte đó trông khó chịu tùy ý. Bạn có biết nếu chúng giống nhau cho GRUB2 không?
ændrük

1
Số lượng byte là bởi vì bảng phân vùng nằm trong khoảng từ 446 đến 512. Tất nhiên, điều này đặt ra câu hỏi tại sao bạn muốn loại bỏ MBR grub ... nó không làm tổn thương bất cứ thứ gì chỉ ngồi không sử dụng. Nếu bạn muốn một bộ tải khởi động khác thay thế, chỉ cần cài đặt nó và nó sẽ thay thế grub.
psusi

3
Ồ, loại câu trả lời này phải có "CẢNH BÁO: TUYỆT VỜI NGUY HIỂM" được viết bằng chữ lớn màu đỏ trên đó. Tôi chắc chắn OP có khả năng làm điều này nhưng tôi ghét phải thấy một số người dùng mới sao chép lệnh đầu tiên vào thiết bị đầu cuối mà không biết "bảng phân vùng" là gì
Serge

1
Đừng không làm điều này . Lệnh đầu tiên sẽ xóa sạch bảng phân vùng (như OP đã đề cập), nhưng lệnh thứ hai sẽ gây ra hành vi không xác định nếu MBR không được cấu hình đúng.
Đột phá

1
Umm .. Tôi không biết tại sao các bạn lại bối rối, những mệnh lệnh mà tachyons dán không làm gì cả. Bạn có thể thử nghiệm với 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. Như bạn có thể thấy /dev/nullkhông phải là nguồn 0, đó là nguồn EOF. ddkhông thể và sẽ không sao chép bất cứ thứ gì /dev/nullbạn cần sử dụng /dev/zero. @BreakENC thứ hai, không có hành vi không xác định nào có thể xảy ra nếu byte đầu tiên của sector 0 là 0x00. Tôi không biết tại sao bạn nghĩ vậy.
Toàn năngEntity

1

Kinh nghiệm của tôi với

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

là, nó đã được cài đặt thành công grub2 từ /dev/sda(nơi Windows 7 của tôi được cài đặt), vì vậy phần đầu tiên của câu hỏi "Làm cách nào để xóa grub khỏi / dev / sda?" đã được trả lời.

Tuy nhiên, phần thứ 2 của câu hỏi, đó là "Làm cách nào để khôi phục MBR của / dev / sda?" đã không được trả lời vì install-mbrlệnh không thể khôi phục MBR. Do đó, Windows không khởi động được nữa và trình quản lý khởi động Windows báo cáo lỗi về MBR bị hỏng và yêu cầu người dùng sửa chữa từ đĩa CD sửa chữa windows.


1

Sau khi đọc bài viết Wikipedia về chủ đề tôi muốn đề xuất một vài giải pháp bổ sung:

  1. Thay đổi thứ tự khởi động trong BIOS :)

  2. Cách tốt nhất và an toàn nhất: sử dụng fdiskđể xóa cờ "có thể khởi động" khỏi mọi phân vùng trên ổ đĩa đó. Hầu hết các MBR tìm kiếm một phân vùng "có khả năng khởi động" để tải chuỗi từ đó, vì vậy tôi mong GRUB sẽ không làm gì nếu không có các phân vùng như vậy. Mặc dù chưa được thử nghiệm.

    Nếu cách trên không có ích, hãy thử cài đặt bản sao miễn phí của mã MBR tiêu chuẩn:

  3. Cài đặt mbrgói và sử dụng install-mbrlệnh như thế này:

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

Tín dụng: CÁCH: Khôi phục Windows MBR bằng Ubuntu LIVE CD

Từ việc đọc bài viết trên Wikipedia, tôi có ấn tượng rằng điều duy nhất xác định MBR là chữ ký của nó nằm ở cuối của khu vực (byte 510 và 511). 446 byte MBR đầu tiên được cho là chứa hướng dẫn máy. BIOS có nhiệm vụ chuyển điều khiển sang bộ tải khởi động bất kể nội dung thực tế của 446 byte đầu tiên, miễn là có chữ ký MBR:

Trên các máy tính tương thích với PC của IBM, phần sụn khởi động có trong ROM ROM tải và thực thi bản ghi khởi động chính. [14] ... Do đó, phần đầu của MBR dự kiến ​​sẽ chứa các hướng dẫn ngôn ngữ máy chế độ thực. [14] BIOS đọc MBR từ thiết bị lưu trữ vào bộ nhớ vật lý, sau đó hướng bộ vi xử lý đến đầu mã khởi động.

Do kích thước hạn chế của phần mã của MBR, nó thường chỉ chứa một chương trình nhỏ sao chép mã bổ sung (như bộ tải khởi động) từ thiết bị lưu trữ vào bộ nhớ. Kiểm soát sau đó được chuyển đến mã này, chịu trách nhiệm tải hệ điều hành thực tế.

...

Chuỗi bootstrap trong BIOS sẽ tải MBR hợp lệ đầu tiên mà nó tìm thấy vào bộ nhớ vật lý của máy tính tại địa chỉ 0x7C00. Lệnh cuối cùng được thực thi trong mã BIOS sẽ là "nhảy" đến địa chỉ đó, để thực hiện trực tiếp đến phần đầu của bản sao MBR. Xác thực chính cho hầu hết các BIOS là chữ ký 0xAA55 ở cuối, mặc dù người triển khai BIOS có thể chọn bao gồm các kiểm tra khác, như vậy xác minh rằng MBR chứa bảng phân vùng hợp lệ mà không có các mục tham chiếu đến các lĩnh vực vượt quá khả năng được báo cáo của đĩa.

Vì vậy, sự hiểu biết của tôi là MBR luôn được cho là có chứa bộ tải khởi động và việc không sử dụng 446 byte đầu tiên sẽ không ngăn BIOS cố gắng khởi động từ đĩa - nhưng có khả năng khiến máy tính bị treo trong khi cố thực thi mã không hợp lệ.

CẬP NHẬT: Ngoài ra, bài viết này đề xuất rằng để làm cho đĩa trông "không thể khởi động" cho BIOS, bạn thực sự nên chỉnh sửa chữ ký MBR tại và của khu vực (sử dụng bất kỳ trình chỉnh sửa đĩa nào). Tôi không chắc liệu nó có ảnh hưởng đến HĐH hay không khi nhìn thấy bảng phân vùng trên đĩa ... nhưng ít nhất bạn luôn có thể sửa đổi các byte đó trở lại ...


0

Một giải pháp đơn giản hơn.

Trong trường hợp của tôi, tôi đã có Debian linux nhưng muốn sử dụng Mandriva, cũng sẽ hoạt động cho người khác

Tắt máy tính của bạn, sau đó loại bỏ đĩa khởi động mà bạn không muốn khởi động (có grub)

Đơn giản chỉ cần đặt một usb có thể khởi động được tạo từ mandriva iso hoặc biến thể khác mà bạn muốn cài đặt, có các công cụ để tạo các thanh usb có thể khởi động từ các tệp iso sử dụng google (hoặc bạn có thể cho chúng tôi cài đặt ghi đĩa từ cd rom)

Bây giờ hầu hết các trình cài đặt linux cung cấp cho bạn lựa chọn những việc cần làm, thử và chơi / sử dụng để đánh giá hoặc linux di động hoặc chạy thiết lập để cài đặt nó. Tại thời điểm này, chúng tôi chỉ chờ (di chuyển con trỏ xuống để màn hình sẽ chờ nhưng không nhấn enter hoặc nhấp bằng chuột).

Chỉ cần nhắc nhở tại thời điểm này USB / hoặc / CDRom của bạn đã bắt đầu và đang chạy. bây giờ đã đến lúc cắm lại ổ cứng mà chúng tôi tạm thời gỡ bỏ chờ một phút (một số bios yêu cầu một chút chờ đợi một phút là quá đủ)

Tiếp tục quá trình thiết lập vì hầu hết các trình cài đặt chứa các công cụ phân vùng, bạn có thể làm bất cứ điều gì bạn muốn. Đây là một giải pháp đơn giản, tôi đã thoát khỏi một thiết lập linux cũ chỉ đơn giản là người mới bắt đầu


0

Câu hỏi cũ, nhưng như đã xảy ra với tôi ngày hôm qua, tôi đã giải quyết nó như thế này: Tôi tắt máy tính, ngắt kết nối vật lý ổ cứng bị hỏng, khởi động lại máy tính, sau đó

~ $ sudo update-grub

Xong việc này, tôi tắt máy tính, kết nối lại ổ cứng và phân vùng Windows 7 cũ của tôi, không còn tồn tại từ 2 năm trước, cuối cùng cũng không xuất hiện.

Tôi hiểu đây là một giải pháp thực tế, nhưng nó hoạt động. Một ngày nào đó tôi sẽ xóa sạch ổ cứng đó và mọi dấu vết GRUB còn lại sẽ biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.