ĐỒNG Ý. Trở thành một chút dài để bình luận. Điều này không liên quan trực tiếp, mà chỉ để giải thích aa55
bình luận.
Khi Hệ thống đầu vào / đầu ra cơ bản (BIOS) khởi động, nó sẽ tự kiểm tra bật nguồn (POST), kiểm tra phần cứng, v.v. Sau đó, nó sẽ tìm các thiết bị có khả năng khởi động và hoạt động theo thứ tự được đưa ra bởi CMOS (Cấu hình của bạn trong BIOS - mà lần lượt được đưa ra bởi một chất bán dẫn oxit kim loại bổ sung ). Khi tìm thấy một đĩa có 0xaa55
độ lệch 510, nó sẽ tải phần đó của đĩa, (sector 1), vào bộ nhớ và để lại quyền điều khiển cho nó trên địa chỉ 0x00000 của mã đó. 512 byte đó là Bản ghi khởi động chính (MBR).
Mã đó, trong trường hợp này là " GRUB - boot" , kiểm tra các byte khác nhau của 512 này ngoài việc hỏi BIOS để biết thông tin khác nhau. Trong quá trình này, nó định vị đĩa nào có phần còn lại của GRUB và tải phần đó của đĩa vào bộ nhớ - sau đó phần mã đó sẽ được kiểm soát. Đó là một nhân gắn kết vv và để lại quyền kiểm soát đó.
Sử dụng GPT, hình ảnh GRUB tải từ bên trong MBR nằm trong bios_grub
phân vùng - mà bạn có và đủ lớn, v.v., vì vậy không thể thấy điều đó có thể sai như thế nào.
Trên "Không tìm thấy thiết bị khởi động." thông báo từ BIOS - người ta có thể gặp trường hợp MBR của đĩa khởi động bị hỏng, nếu MBR kết thúc 0xaa55
và MBR bị hỏng, người ta thường gặp lỗi khác - hoặc hệ thống bị treo.
Nhưng dù sao đi nữa. Điều này thật kỳ lạ. Tôi nhận thấy bạn không có phân vùng được đánh dấu là "khởi động" . Sử dụng GPT là chính xác, - nhưng, mặc dù nó bị cấm, bạn có thể thử gắn cờ một ví dụ sda5
như khởi động. Trong gparted: (đã học được rằng (g) chia tay cũng thay đổi GPT mà ai không muốn) fdisk:
# Toggle bootable:
a [DISK NUMBER]
# Check (could be an asterisk marking boot partition):
p
# Save changes:
w
Có thể là BIOS của bạn đang hoạt động nhiều hơn thì nên và kiểm tra bảng phân vùng trong MBR.
EDIT - Cập nhật để bình luận:
AFAIK không quan trọng bạn chọn cái nào vì nó không thực sự được sử dụng. Điểm là, đối với những người từng nói không có "thiết bị khởi động được tìm thấy" , họ sẽ hài lòng. Đây sda1
không phải là một phân vùng khởi động theo nghĩa truyền thống, mà là không gian cho các tệp khởi động GRUB.
Trong bố cục phân vùng truyền thống (không phải GPT), bạn thường có một cái gì đó như:
0x000 [Master Boot Record] <- Partition table say Partition 2 is active
|
0x200 [ GRUB module 1 ] <- core.img from GRUB |
|
0x400 [ Partition 1 Swap ] |
| | |
| | |
|__________________| |
|
0x... [ Partition 2 ext4 ] |
| * Active | <- AKA boot ----------------+
| |
|__________________|
0x... [ Partition 3 ext4 ]
| |
| |
|__________________|
Điều đó có nghĩa là 3 phân vùng. Mọi thứ trước khi bù 0x400 trên ổ cứng i byte thô - như không phải là một phần của bất kỳ phân vùng, v.v.
Ở đây phân vùng khởi động là phân vùng 2 là phân vùng hệ thống với linux.
Các tệp mô-đun GRUB 1 nằm ngay sau MBR và trước phân vùng đầu tiên. Nó có thể cư trú ở bất cứ đâu, nhưng thường trên cùng một đĩa và ở độ lệch 512 của đĩa MBR.
Ngoài ra trên hệ thống GPT - GPT sử dụng chính phần đó của đĩa, do đó người ta phải di chuyển các tệp GRUB đó sang vị trí khác. Đó là những gì
bios_grub
dành cho - để lưu trữ core.img
cho GRUB 2.
Các "bộ khởi động cờ" chỉ đơn thuần là một shot trong bóng tối, - và sẽ ngạc nhiên nếu nó hoạt động. Nhưng người ta đã bắt đầu ở đâu đó.
EDIT2:
Nếu bạn làm điều này:
Sao lưu MBR hiện tại:
dd if=/dev/sda of=/path/mbr-backup bs=512 count=1
Tạo hình ảnh từ Code TEST
bên dưới, được lưu vào tập tin test.s
bằng cách:
as -o test.o test.s
objcopy -O binary test.o test.img
Sao chép test.img
tệp vào MBR:
dd if=test.img of=/dev/sda bs=512 count=1
Khởi động
KIỂM TRA mã:
.file "test.s"
.text
.code16
.globl start, _start
start:
_start:
jmp go
nop
go:
movb $0x48, %al
call prnt_chr
movb $0x65, %al
call prnt_chr
movb $0x6c, %al
call prnt_chr
movb $0x6c, %al
call prnt_chr
movb $0x6f, %al
call prnt_chr
movb $0x21, %al
call prnt_chr
ret
prnt_chr:
movb $0x0e, %ah
int $0x10
ret
. = _start + 0x1fe
.word 0xaa55
Để khôi phục MBR, hãy làm:
dd if=/path/mbr-backup of=/dev/sda bs=512 count=1
Điều này chỉ cần in "Xin chào!" vào màn hình nếu MBR đã được tải, sau đó dừng lại. Đã kiểm tra nó bằng cách chạy dưới qemu-system-x86_64, qemu-system-i386, VirtualBox, Intel PC 32 và 64 bit cố định.
dd if=/dev/sda bs=1 skip=510 count=2 2>&- | hexdump
(hoặc xxd thay vì hexdump) bằng 55aa? Nếu không MBR là xấu.