GRUB

**GNU GRUB** (viết tắt của **GNU GRand Unified Bootloader** được gọi phổ biến là **GRUB**) là một boot loader được phát triển bởi dự án GNU. GRUB là một cài đặt mẫu của Multiboot Specification của Quỹ Phần mềm Tự do (FSF), cung cấp cho người dùng một lựa chọn  cho phép khởi động một trong nhiều hệ điều hành được cài trên một máy tính hoặc lựa chọn một cấu hình hạt nhân cụ thể có sẵn trên các phân vùng của một hệ điều hành cụ thể.

GNU GRUB được phát triển từ một gói phần mềm được gọi là *Grand Unified Bootloader* (dựa trên Lý thuyết thống nhất lớn). nó được sử dụng chủ yếu cho các hệ thống tương tự Unix. Hệ điều hành GNU sử dụng GNU GRUB làm trình khởi động mặc định, cũng như hầu hết các bản phân phối Linux. Hệ điều hành Solaris đã dùng GRUB làm trình khởi động trên các hệ thống x86, bắt đầu từ phiên bản Solaris 10 1/06.

## Tính năng
Người dùng có thể tự động cấu hình các hệ thống con GRUB. GRUB nạp cấu hình của nó lúc khởi động, cho phép thay đổi thời gian khởi động, chẳng hạn như việc lựa chọn hạt nhân khác nhau hoặc đĩa RAM ban đầu. Để kết thúc, GRUB cung cấp một giao diện dòng lệnh đơn giản, tương tự bash,cho phép người dùng viết các trình tự khởi động mới một cách nhanh chóng, ngoài các danh sách thực đơn bình thường.

GRUB có tính cơ động cao. Nó hỗ trợ nhiều định dạng thực thi. Nó hỗ trợ tất cả các hệ thống tập tin Unix thường được sử dụng, hệ thống tập tin FAT và NTFS của Windows, và logical block addressing (LBA, hay dịch theo tiếng Việt là phép gán mác khối dữ liệu). GRUB cho phép người dùng xem nội dung của tập tin trên bất kỳ hệ thống tập tin được hỗ trợ.

GRUB có thể tải ảnh khởi động của hệ điều hành từ mạng, do đó nó hỗ trợ các hệ thống không có ổ cứng. Nó cũng hỗ trợ giải nén tự động của các hình ảnh khởi động trước khi khởi động chúng. GRUB hỗ trợ các hệ điều hành mà không hỗ trợ đa khởi động, bằng cách sử dụng chuỗi tải. Nó sử dụng hai hoặc ba dòng của chuỗi lệnh để khởi động bất kỳ hệ thống DOS, Windows, Linux, BSD hay Solaris, làm cho nó rất dễ dàng để làm việc với nó. Chuỗi tải hỗ trợ các hệ điều hành tương tự Unix cũng đã tích hợp trong GRUB.

GRUB có thể được sử dụng với nhiều giao diện người dùng. Hầu hết các bản phân phối Linux tận dụng sự hỗ trợ của GRUB cho một giao diện đồ họa để cung cấp một trình đơn khởi động tùy chỉnh với một hình ảnh nền. Một sửa đổi giao diện văn bản của GRUB có thể sử dụng một liên kết nối tiếp để một thiết bị đầu cuối từ xa có thể truy cập vào các bộ nạp khởi động.

GRUB dùng một màn hình cuộn để lựa chọn hệ điều hành khởi động. Điều này có nghĩa là 150 hoặc nhiều sự lựa chọn khởi động hơn có thể dễ dàng kiểm soát bởi GRUB bằng cách thêm chúng vào tập tin cấu hình `grub.cfg`. Các phím mũi tên được sử dụng để chọn hệ điều hành để khởi động. Ngoài giao diện menu bình thường, GRUB cũng cung cấp một giao diện dòng lệnh tương tự bash cung cấp nhiều tập lệnh để người dùng có thể xem hoặc sửa đổi bất kỳ một phần nào của quá trình khởi động. Với công cụ này ai cũng có thể mà không cần nhiều kiến thức về những thành phần được cài trên máy tính, dùng GRUB từ một số thiết bị mở rộng như đĩa mềm, USB hay một đĩa CD-ROM để khởi động và cài đặt hệ điều hành

## Hoạt động

### <span id="MAP-FILE" contenteditable="false"></span>Khởi động
Khi một máy tính được bật, BIOS của máy tính sẽ tìm thiết bị được cấu hình khởi động chính (thường là ổ cứng) tải và thực thi chương trình bootstrap đầu tiên từ master boot record (MBR). MBR là những sector đầu tiên của ổ cứng, với số 0 là offset của nó(các sector bắt đầu đếm từ 0). Trong một thời gian dài, kích thước của sector là 512&nbsp;byte, nhưng từ năm 2009 có nhiều ổ cứng có kích thước một sector là 4096&nbsp;byte, được gọi là ổ cứng Advanced Format.  Tính đến tháng 10/2013, những ổ cứng như thế vẫn được truy cập những sector 512-byte, bằng cách sử dung mô phỏng 512e.

Boot record MBR legacy hỗ trợ tối đa 4 phân vùng primary và chiếm 64&nbsp;byte. Cùng với tùy chọn chữ ký đĩa (4 byte) và nhãn đĩa (6 byte), chuỗi dữ liệu này chiếm từ 434 đến 446&nbsp;byte mã máy của boot loader. Mặc dù một kích thước nhỏ có thể chứa đủ một boot loader đơn giản, nó không đủ lớn để chứa một boot loader hỗ trợ một hệ thống tập tin lớn và phức tạp, menu điều khiển các lựa chọn khởi động hệ thống là ví dụ. Boot loader với footprints lớn hơn do đó được chia thành nhiều phần, nơi những phần nhỏ nhất được tích hợp bên trong MBR, trong khi những phần lớn hơn chứa trong các khu vực khác (ví dụ,trong một sector trống ở giữa MBR phân vùng đầu tiên) và được gọi đến bởi mã MBR của boot loader.

Ảnh nhân hệ điều hành trong phần lớn các trường hợp các tập tin nằm trên hệ thống tập tin thích hợp, nhưng các khái niệm về một hệ thống tập tin là không biết đến BIOS. Vì vậy,trong các hệ thống dựa trên BIOS,nhiệm vụ của boot loader là để truy cập vào nội dung của các tập tin, vì vậy nó có thể đọc từ đĩa cứng, nạp vào bộ nhớ RAM và thực hiện.

Một trong những phương pháp tiếp cận có thể cho boot loader là tải trực tiếp các ảnh của hạt nhân từ các sector ổ cứng đang sử dụng bởi hình ảnh thực tế hạt nhân, mà không có sự hiểu biết cơ bản hệ thống tập tin.  Thông thường, cấp bổ sung gián tiếp là cần thiết, ở dạng bản đồ hoặc các bản đồ tập tin &ndash;&nbsp;các file phụ trợ có chứa một danh sách các&nbsp;sector vật lý đang sử dụng bởi ảnh hạt nhân, cung cấp thông tin cho boot loader về nơi có thể tìm thấy những sector cơ sở của nhân hệ thống. Các bản đồ này cần được cập nhật mỗi lần nhân hệ thống bị thay đổi, ví dụ như nâng cấp hạt nhân hệ thống giải phân mảnh hệ thống file. Cũng như vậy, trong các trường hợp bản đồ thay đổi trên ổ đĩa vật lý, vị trí của chúng cũng cần được cập nhật vào mã MBR của boot loader, vì vậy các cơ chế khu vực gián tiếp tiếp tục làm việc. Điều này không phức tạp, nhưng nó yêu cầu phải sửa đổi bằng tay trong trường hợp bị sai trong ki cập nhật hệ thống.

Một cách khác là tạo một boot loader nhận biết được hệ thống file bên dưới, Hạt nhân như vậy được cấu hình và truy cập thông qua đường dẫn thực tế. Điều này yêu cầu boot loader cần chứa một trình điều khiển hệ thống file cho mỗi hệ thống file mà nó hỗ trợ, như vậy trình khởi động sẽ có thể nhận biết và tiếp cận dữ liệu. Cách tiếp cận này cho phép loại bỏ các phần lập trình nhúng không cần thiết vào sector và cả sự cần thiết của việc phân địa chỉ tập tin, và MBR (tức Master Boot Record) sẽ không cần phải cập nhật lại mỗi khi ảnh hạt nhân hệ điều hành được thêm vào trình khởi động hoặc được gỡ ra.

GNU GRUB sử dụng phương pháp thứ hai, bằng cách tìm hiểu các hệ thống tập tin cơ bản. Boot loader tự chia thành nhiều phần, cho phép nó phù hợp với các chương trình khởi động MBR.

Có hai phiên bản của GRUB đang được sử dụng phổ biến. GRUB phiên bản 2, được gọi là *GRUB 2,* được viết lại từ đầu và có ý định thay thế phiên bản tiền nhiệm của nó GRUB 1, và hiện nay nó được sử dụng bởi đa số các bản phân phối Linux. GRUB phiên bản 1, được gọi là *GRUB legacy,*chỉ phổ biến ở các phiên bản cũ của các bản phân phối Linux, trong đó một số vẫn còn đang được sử dụng và hỗ trợ, ví dụ như trong CentOS 5.

### GRUB Phiên bản 1 (GRUB legacy)

Master boot record (MBR) thường chứa GRUB *giai stage 1,* nhưng có thể chứa bootloader khác có thể gọi đến GRUB *stage 1* từ một boot sector giống như bản ghi kích thước khởi động của phân vùng. 
Với kích thước nhỏ của một boot sector (512&nbsp;Byte), *stage 1* có thể làm ít hơn so với tải các giai đoạn tiếp theo của GRUB bằng cách tải một vài sector từ một vùng cố định  gần điểm đầu đĩa cứng (trong 1024 cylinder đầu tiên).

*Stage 1* có thể tải *stage 2* trực tiếp, nhưng nó thường được thiết lập để tải *stage 1.5.* GRUB *stage 1.5* ở khu vực 30 KiB đầu tiên của ổ cứng ngay sau MBR và trước phân vùng đầu tiên. Trong trường hợp vị trí này không có sẵn(bảng phân vùng bất thường, trình điều khiển đĩa đặc biệt, đĩa GPT hoặc LVM) các cài đặt của *stage 1.5* sẽ bị lỗi. S*tage 1.5* chứa trình điều khiển hệ thống tập tin. điều này cho phép *stage 1.5* tải trực tiếp *stage 2* từ bất kỳ vị trí nào trên hệ thống file, ví dụ từ`/boot/grub`. *Stage 2* sẽ tải file cấu hình mặc định và các module cần thiết khác.

### GRUB 2 (GRUB)

* **Stage 1**: `boot.img` được lưu trữ trên master boot record (MBR) hoặc có thể bất kỳ vị trí nào thuộc volume boot records (VBR), và chỉ tới các stage tiếp theo bằng một địa chỉ LBA48 (vì vậy tránh được giới hạn 1024-cylinder của GRUB legacy); lúc cài đặt nó được cấu hình để tải sector đầu tiên của `core.img`.
* **Stage 1.5**: `core.img` mặc định được ghi vào các sector giữa MBR và phân vùng đầu tiên, khi những sector này trống và có sẵn. Với  các phân vùng legacy, phân vùng đầu tiên của ổ cứng không bắt đầu từ sector 1 (bộ đếm bắt đầu từ 0) mà từ sector 63,để lại một khoảng trống 62 sector. không gian đó không phải là một phần của bất kỳ phân vùng hoặc tập tin hệ thống, và do đó không dễ bị bất kỳ vấn đề liên quan với nó.Mỗi khi thực thi, `core.img` sẽ tải file cấu hình của nó  và các module cần thiết khác, trình điều khiển hệ thống file riêng biệt; lúc cài đặt, nó được tạo ra từ `diskboot.img` và được cấu hình để tải *stage 2 *bằng đường dẫn của nó
* **Stage 2**: file thuộc *stage 2* đều được lưu trữ trong thư mục `/boot/grub`  một thư mục con của thư mục  `/boot` quy định bởi Filesystem Hierarchy Standard (FHS).
## Lịch sử
GRUB ban đầu được phát triển bởi Erich Boleyn như là một phần của hệ thống khởi động hệ điều hành GNU/Hurd, phát triển bởi Free Software Foundation. Năm 1999, Gordon Matzigkeit và Yoshinori K. Okuji đã đưa GRUB trở thành gói phần mềm chính thức của GNU Project và mở rộng quá trình phát triển cho công chúng. , phần lớn các bản phân phối Linux đã sử dụng GRUB 2, cũng như các hệ thống khác như PlayStation&nbsp;4 của SONY.

### Phát triển
GRUB phiên bản 1 (còn được gọi là "GRUB Legacy") không còn được phát triển và đang bị loại bỏ dần. Các nhà phát triển GNU GRUB đã chuyển trọng tâm sang GRUB&nbsp;2, một bản viết lại hoàn chỉnh với các mục tiêu bao gồm làm cho GNU GRUB sạch hơn, mạnh mẽ hơn, di động hơn và mạnh mẽ hơn. GRUB&nbsp;2 được bắt đầu với tên gọi **PUPA**. PUPA được hỗ trợ bởi Information-technology Promotion Agency (IPA) tại Nhật Bản. PUPA được tích hợp vào quá trình phát triển  GRUB&nbsp;2 khoảng năm 2002, khi GRUB phiên bản 0.9x được đổi tên thành GRUB Legacy.

Một số mục tiêu của dự án GRUB 2 bao gồm hỗ trợ cho các nền tảng không phải x86, quốc tế hóa và bản địa hóa, các ký tự không phải ASCII, mô-đun động, quản lý bộ nhớ, một ngôn ngữ script mini, Port mã nền tảng cụ thể (x86) sang các mô-đun cụ thể của nền tảng, và một khung hướng đối tượng. GNU GRUB v2.00 chính thức được phát hành vào ngày 26 tháng 6 năm 2012.

Ba trong số các bản phân phối Linux được sử dụng rộng rãi nhất sử dụng GRUB 2 làm boot loader chính của chúng. Ubuntu  đã chấp nhận nó làm boot loader mặc định từ phiên bản 9.10 tháng 10 năm 2009. Fedora tiếp nối với Fedora 16 được phát hành vào tháng 11 năm 2011. OpenSUSE đã sử dụng GRUB 2 làm boot loader mặc định từ phiên bản 12.2 phát hành tháng 9 năm 2012. Solaris cũng đã áp dụng GRUB 2 trên nền tảng x86 trong bản phát hành Solaris&nbsp;11.1.

Cuối năm 2015, việc exploit nhấn phím backspace 28 lần để vượt qua mật khẩu đăng nhập đã được tìm thấy và nhanh chóng được sửa.

### Biến thể
GNU GRUB là một phần mềm tự do nguồn mở, vì vậy một số biến thể đã được tạo ra. Một số đáng chú ý, chưa được hợp nhất vào dòng chính GRUB:
* OpenSolaris bao gồm GRUB Legacy đã được sửa đổi hỗ trợ BSD disklabels, lựa chọn hạt nhân 64-bit tự động và khởi động từ ZFS.
* Google Summer of Code 2008có một dự án hỗ trợt GRUB Legacy để khởi động từ các phân vùng có định dạng ext4.
* Dự án Syllable đã tạo một phiên bản GRUB sửa đổi để khởi động hệ thống từ AtheOS File System.
* *TrustedGRUB* mở rộng GRUB bằng cách triển khai xác minh tính toàn vẹn của hệ thống và bảo mật quy trình khởi động, sử dụng Trusted Platform Module (TPM).
* Intel BIOS Implementation Test Suite (BITS) cung cấp môi trường GRUB để kiểm tra BIOS và đặc biệt là việc khởi tạo bộ xử lý, phần cứng và công nghệ Intel. BITS hỗ trợ tập lệnh qua Python và bao gồm các API Python để truy cập các chức năng cấp thấp khác nhau của nền tảng phần cứng, bao gồm ACPI, thanh ghi CPU và chipset, PCI và PCI Express.
* GRUB4DOS là bản fork kế thừa của GRUB legacy hiện đã không còn tồn tại giúp cải thiện trải nghiệm cài đặt trên DOS và Microsoft Windows bằng cách đặt mọi thứ ngoài cấu hình GRLDR vào một tệp hình ảnh. Nó có thể được tải bởi Windows Boot Manager.

## Tiện ích

### Công cụ cấu hình GRUB

Các công cụ thiết lập được các bản phân phối khác nhau sử dụng thường bao gồm các mô-đun để thiết lập. Ví dụ, YaST2 trên các bản phân phối SUSE Linux và openSUSE và Anaconda trên trên các bản phân phối Fedora/RHEL.StartUp-Manager và GRUB Customizer là các trình soạn thảo cấu hình đồ họa cho các bản phân phối dựa trên Debian. Việc phát triển StartUp-Manager đã dừng lại vào ngày 6 tháng 5 năm 2011 sau khi nhà phát triển chính viện lý do cá nhân không tích cực phát triển chương trình. GRUB Customizer cũng có sẵn cho các bản phân phối dựa trên Arch.

Đối với GRUB 2 có KDE Control Modules.

GRLDR ICE là một công cụ nhỏ để sửa đổi cấu hình mặc định của tệp grldr cho GRUB4DOS.

### Các tiện ích sửa chữa khởi động
Boot-Repair là một công cụ đồ họa đơn giản để khôi phục các sự cố thường xuyên liên quan đến khởi động với GRUB và Microsoft Windows bootloader. Ứng dụng này có sẵn theo giấy phép GNU GPL license. Boot-Repair có thể sử lỗi GRUB trên nhiều bản phân phối Linux, bao gồm nhưng không giới hạn ở Debian, Ubuntu, Mint, Fedora, openSUSE, vàArch Linux.

### Trình cài đặt cho Windows
Grub2Win là một gói phần mềm nguồn mở trên Windows. Nó cho phép GNU GRUB khởi động từ một thư mục Windows. Chương trình thiết lập cài đặt GNU GRUB v2.04 vào một phân vùng NTFS. Một ứng dụng Windows GUI sau đó được sử dụng để tùy chỉnh menu khởi động GRUB, chủ đề, thứ tự khởi động UEFI, tập lệnh, v.v. Tất cả các tập lệnh và lệnh GNU GRUB đều được hỗ trợ cho cả UEFI và legacy. Grub2Win có thể cấu hình GRUB cho multiboot của Windows, Ubuntu, openSuse, Fedora nhiều bản phân phối Linux khác. Nó được cung cấp miễn phí theo GNU GPL License tại SourceForge.

## Trình quản lý khởi động thay thế
Điểm mạnh của GRUB là có nhiều nền tảng, hệ thống file và hệ điều hành được hỗ trợ, khiến nó trở thành lựa chọn mặc định cho các bản phân phối và hệ thống nhúng.

Tuy nhiên, có những trình quản lý khởi động được nhắm mục tiêu vào người dùng cuối mang lại trải nghiệm người dùng thân thiện hơn, bộ chọn hệ điều hành đồ họa và cấu hình đơn giản hơn:
* rEFInd – Trình quản lý khởi động đồ họa kiểu Macintosh, chỉ dành cho máy tính dựa trên UEFI (không hỗ trợ BIOS).
* CloverEFI  – Trình quản lý khởi động đồ họa kiểu Macintosh dành cho máy tính chạy BIOS và UEFI. Giả lập UEFI với DUET được sửa đổi nhiều từ dự án TianoCore. Yêu cầu phân vùng được định dạng FAT ngay cả trên hệ thống BIOS. Như một lợi ích, nó có một trình điều khiển hệ thống tệp cơ bản trong khu vực khởi động phân vùng, tránh sự hư hỏng của GRUB 2nd, 3rd và lời nhắc GRUB Rescue nổi tiếng. Giao diện người dùng trông tương tự như rEFInd: cả hai đều kế thừa từ trình quản lý khởi động bị bỏ rơi rEFIt.

Các lựa chọn thay thế không có đồ họa:
* systemd-boot – Trình quản lý khởi động nhẹ, chỉ dành cho UEFI với menu bộ chọn hệ điều hành dựa trên văn bản.

## Liên kết ngoài

### Hướng dẫn triển khai và khắc phục sự cố
Wiki của các bản phân phối có nhiều giải pháp cho các vấn đề phổ biến và thiết lập tùy chỉnh có thể giúp bạn:
* Arch Linux /GRUB
* Ubuntu /Grub2 (cũng xem Liên kết ở dưới cùng)
* 
* 
* Grub2 theme tutorial 

### Tài liệu
* GRUB manual – tài liệu chi tiết nhất, bao gồm tất cả các lệnh
* 
* GRUB wiki archived in 2010

### Bài viết giới thiệu
* Boot with GRUB, một bài báo tháng 4 năm 2001 trên Linux Journal

### Tài liệu kỹ thuật
* Booting Linux on x86 using Grub2 – bài viết chuyên sâu
* Unified Extensible Firmware Interface (UEFI firmware, common since 2012)
* GUID Partition Table (GPT) – handles hard drives bigger than 2 TiB and more than 4 partitions
* Master boot record used with BIOS firmware (motherboards roughly before 2012)
* BIOS Boot Specification Version 1.01 (ngày 11 tháng 1 năm 1996) – hard to find

### Xem thêm
* SysLinux (IsoLinux) – commonly used bootloader on CDs, DVDs
* NTLDR (BOOTMGR) – Windows bootloader
* Comparison of boot loaders
## Chú thích