Không như một chiếc bánh kem mềm ngọt nhằm dụ dỗ, lôi kéo bạn vào thế giới multibooting . Phần 2 này thực sự là một món ăn dai và khó nuốt. Vì nó chỉ toàn là lý thuyết. Nhưng hãy bình tĩnh, cứ tưởng tượng nó như là "khẩu quyết" để bạn bước vào môn phái đậm chất ngầu vậy.
1. Vì sao sở hữu một thiết bị multiboot thật sự ngầu?
Bạn là một người mới tiếp xúc đến công nghệ, sở hữu một chiếc laptop cấu hình tốt, một chiếc smart phone flagship, một chiếc USB/HDD lưu trữ dữ liệu tốc độ bàn thờ... Mọi thứ thật nên thơ và trữ tình đúng không nào. Nhưng nếu bạn là một Geek thực sự thì việc cái máy tính của bạn chỉ chạy được mỗi Windows, điện thoại chỉ chạy mỗi cái Android lèo phèo, USB/HDD chỉ để lưu trữ dữ liệu thôi liệu có làm bạn thỏa mãn chưa nhỉ?
Nếu như có một cách nào đó khiến máy tính của bạn có thể chạy được đủ chủng loại hệ điều hành, đủ loại phiên bản. Cái smartphone của bạn sẽ chạy nhiều hơn được một cái Android gốc. Cái USB/HDD của bạn ngoài lưu trữ dữ liệu còn giúp bạn chạy live các công cụ cứu hộ, hacking,... Mọi thứ hiện trên màn hình khởi động trên thiết bị của bạn như một chiếc thực đơn và bạn chỉ việc chọn món nào thích để sử dụng. Và hãy nhớ rằng không phải ai cũng có thể làm được những thứ này đâu bạn. Nếu làm được thì trong mắt những người yêu công nghệ khác bạn thật sự rất đáng ngưỡng mộ và họ sẽ rất ao ước được sở hữu một hệ thống (công cụ) như bạn. Hoặc cũng có thể... bạn sẽ là một đứa rảnh, dở hơi trong mắt những người chung quanh.
2. Tôi cần phải biết những gì?
Đến với Multibooting bạn cần làm việc với các Bootloader & Boot Manager. Cụ thể bạn sẽ cần làm việc với những cái tên như sau:
- Windows Boot Manager: trình quản lý mặc định của Windows
- Grub2 Bootloader: trình khởi động phổ biến trong thế giới Linux
- Clover Boot Manager: trình quản lý khởi động nổi tiếng của cộng đồng Hackintosh
- rEFInd Boot Manager: tiền thân của Clover nhưng hỗ trợ mạnh mẽ cho Linux
- Syslinux bootloader: một trình bootloader cũ nhưng quen thuộc cho các đĩa khởi động Linux
- Grub4dos: nhẹ, mạnh mẽ, phổ biến.
Tiếp đến hãy quan tâm đến công nghệ. Trước đây chỉ sử dụng ổ cứng dạng MBR cùng chuẩn boot Legacy BIOS. Nhưng từ 2012 định dạng GPT chuẩn boot UEFI phổ biến. Bản chất của 2 công nghệ này là khác nhau, đến thời điểm hiện tại các nhà phát triển các trình bootloader & boot manager vẫn đang miệt mài đưa ra các giải pháp để tương thích hơn với chuẩn mới. Trong đó Clover, rEFInd, Grub2 và Windows Boot Manager là hỗ trợ được cho UEFI. Còn Syslinux vẫn đang trong quá trình phát triển để tương thích với chuẩn mới này, grub4dos vẫn trung thành với nền tảng cũ Legacy.
Điều quan tâm thứ ba là bạn phải hiểu về phân vùng và định dạng của ổ cứng. Mỗi hệ điều hành sẽ quy định mỗi chuẩn riêng để phù hợp với kiến trúc của nó nhằm thuận lợi cho việc lưu trữ, sắp xếp, mã hóa dữ liệu. Windows chúng ta thường quan tâm đến hai định dạng cơ bản là FAT32 & NTFS. MacOS thì ta quan tâm đến HFS+. Linux thì quan tâm đến ext4,... Một điểm chung là định dạng FAT/FAT32 đều cả nhóm OS đều hỗ trợ tốt, có thể đọc ghi được dữ liệu. Riêng NTFS thì MacOS và Linux có thể đọc được. Còn để ghi dữ liệu thì còn tùy thuộc vào distro và sự trợ giúp của phần mềm hãng thứ 3.
Điều thứ tư, hãy biết về lập trình. Không sao, nếu bạn chưa biết gì về lập trình thì quá trình build công cụ Multiboot này bạn sẽ làm được. Bạn càng hướng tư duy của mình theo hướng tự động hóa, bạn sẽ càng hiểu về lập trình hơn.
Điều thứ tư, hãy biết về lập trình. Không sao, nếu bạn chưa biết gì về lập trình thì quá trình build công cụ Multiboot này bạn sẽ làm được. Bạn càng hướng tư duy của mình theo hướng tự động hóa, bạn sẽ càng hiểu về lập trình hơn.
3. Hướng đi của một công cụ Multiboot trong chuỗi bài viết này
Có thể nói trước khi công cụ MultibootUSB (tiền thân của Multiboot Toolkit) ra đời thì trên diễn đàn Việt Nam và cả thế giới có rất ít công cụ boot hỗ trợ cho cả UEFI & Legacy mode. Xét ở Việt Nam trước lúc Multiboot Toolkit được chia sẻ trên diễn đàn thì mới có gói BootUSB của anhdv là có hỗ trợ đến UEFI thông qua Grub2. Ở một số công cụ boot của các nước khác thì hỗ trợ UEFI khá giới hạn, đơn giản chỉ hỗ trợ boot UEFI từ Windows Boot Manager vào WinPE để có thể cứu hộ được trên chuẩn mới này.
Công cụ được giới thiệu trong chuỗi bài viết này phải làm được gì?- Phải hỗ trợ được cả hai chuẩn cũ và mới: Legacy BIOS Mode & UEFI Mode
- Ngoài hỗ trợ khởi động WinPE phải khởi động được ISO cài đặt Windows, ISO cài đặt Linux, trình cài đặt của Hackintosh/Macintosh
- Hỗ trợ khởi động các đĩa cứu hộ khác nhằm tăng cường hệ sinh thái
- Dễ dàng tùy biến và linh hoạt trong sử dụng
4. Phân vùng và cách lựa chọn phân vùng
Trước khi đọc mấy cái hại não phía dưới bạn cần mở một phần mềm phân vùng thí dụ như AOMEI Partition Assistant (bản miễn phí cũng được) để biết tớ đang nói về cái gì nhé:
Các bạn nên biết rằng khoảng trước 2012 ổ đĩa máy tính sử dụng kiến trúc phân vùng cũ là MBR và chuẩn boot là Legacy BIOS Mode. Từ 2012 trở đi kiến trúc phân vùng GPT và chuẩn boot UEFI bắt đầu được sử dụng rộng rãi trên các phần cứng mới giúp thiết bị bảo mật hơn nhưng kèm theo đó việc cứu hộ trên chuẩn mới này cũng trở nên khó khăn hơn. Vì vậy thiết bị boot phải đáp ứng được yêu cầu hỗ trợ được cả hai chuẩn này.
Vậy câu hỏi ở đây để boot được 2 chuẩn thì nên dùng phân vùng có kiến trúc MBR hay GPT? Thế này nhé: với các thiết bị boot có dung lượng nhỏ dưới 2TB thì nên sử dụng kiến trúc MBR còn lớn hơn 2TB thì phải sử dụng kiến trúc GPT mới tận dụng hết được dung lượng lưu trữ của thiết bị được. Bảng phân vùng không ảnh hưởng đến kiểu boot Legacy Mode hay UEFI Mode nhiều cho lắm mà nó ảnh hưởng đến việc cài bootloader và cách tùy chỉnh các file cấu hình cho bootloader hơn. Một ổ đĩa được định dạng là MBR hoàn toàn khởi động được trên chuẩn UEFI. Nhưng một ổ đĩa được định dạng GPT để boot được trên chế độ Legacy BIOS thì hơi vất vả xíu.
Vậy sau khi ta biết nên chọn bảng phân vùng nào rồi thì một vấn đề tiếp theo là thiết bị boot cần thiết lập bao nhiêu phân vùng? định dạng phân vùng như nào để có thể boot được cả hai chuẩn? và thứ tự phân vùng như nào mới là tối ưu?
Rắc rối rồi đúng không. Trước đây khi mới bắt đầu nghiên cứu và build công cụ Multiboot từ con số 0 mình đã thử nghiệm rất nhiều và rút ra được những điều như sau:
Định dạng FAT32 luôn ổn định nhất với các bootloader nên nền Legacy BIOS Mode. Vì định dạng này xuất hiện từ rất lâu nên các bootloader có thời gian để fix lỗi và tương thích. Muốn biết rõ nhất mức độ tương thích thế nào thì cứ kiếm máy con PC cũ thời Napoléon và boot thử là hiểu ngay. FAT32 luôn boot ngon lành. Một ưu điểm tiếp theo nữa là hỗ trợ ngon cho UEFI, vì sao ư. Vì cái chuẩn mới này chỉ khởi động từ file boot.efi đặt trên phân vùng FAT32. Chính vì thế thời kỳ đầu tạo Multiboot, các phiên bản đầu tiên mình đều sử dụng định dạng FAT32 làm định dạng mặc định cho USB.
Nghe có vẻ hay nhưng nó có một nhược điểm rất khó chịu. Định dạng FAT32 trước kia được phát minh ra theo lý thuyết để quản lý các phân vùng khoảng 32GB thôi (chỉ thích hợp cho các USB boot với dung lượng thấp). Nhưng công nghệ ngày càng phát triển, người ta đã nghiên cứu ra nhiều công nghệ giúp nâng dung lượng lưu trữ của ổ cứng lớn hơn để chứa được nhiều dữ liệu hơn. Giới hạn của FAT32 là không cho phép ta sao chép các file có dung lượng lớn hơn 4GB vào phân vùng này và khả năng chịu lỗi của nó cho ổ cứng cũng rất kém, dễ làm hư hỏng các file boot hơn. Chính vì vậy NTFS đã ra đời để khắc phục những nhược điểm đó.
Nhưng có một vấn đề ở đây, đặt các file boot.efi trên phân vùng NTFS không thể boot được UEFI. Lý do là khi chuẩn UEFI ra đời nó mặc định là file bootx64.efi hoặc bootia32.efi phải nằm ở đường dẫn EFI\BOOT. Rắc rối rồi đây, vậy tôi muốn thiết bị boot vừa hỗ trợ Legacy mode và UEFI mode đồng thời có thể lưu trữ các file lớn hơn 4GB (dễ dàng lưu trữ các ISO cài đặt Windows lẫn Linux) thì phải làm sao? 2 phân vùng, chính xác đó chính là điều tớ đã phát hiện ra (phiên bạn hiện tại của Multiboot Toolkit đã hỗ trợ 3 phân vùng lận - lý do xin được trình bày sau).
Rồi lại lòi ra một vấn đề mới. 2 phân vùng sử dụng thì phân vùng thứ nhất nên định dạng là gì? và phân vùng thử hai nên định dạng là gì? Vai trò của từng phân vùng là gì?
Thế này nhé, nếu chỉ đơn thuần hỗ trợ cho Legacy Mode thì ta chỉ cần NTFS là đủ, nhưng vì luật chơi của UEFI là các file boot của nó phải đặt trên phân vùng FAT32 nó mới chịu khởi động nên mới cần phải có phân vùng FAT32. Cơ chế boot UEFI thì sao? Khi cắm thiết bị boot và chọn khởi động, mainboard sẽ quét từng phân vùng trên thiết bị của bạn để tìm ra phân vùng FAT32 đầu tiên, sau đó nó truy cập vào đường dẫn EFI\BOOT để tìm xem có file bootx64.efi hay bootia32.efi không. Nếu không thấy nó lại tiếp tục quét các phân vùng tiếp theo cho đến khi tìm thấy các file boot của nó. Tức, nếu không thấy file boot trên phân vùng FAT32 ở đường dẫn mặc định là EFI\BOOT thì thiết bị của bạn không thể nào boot vào UEFI được.
Như vậy, việc đặt phân vùng FAT32 ở vị trí nào cũng được đúng không? Nhưng tại sao suốt từ những phiên bản đầu tiên của Multiboot Toolkit mình luôn ưu tiên thứ tự NTFS-FAT32. Bởi vì, data dành cho các bootloader mặc định mình đặt trên phân vùng NTFS phân vùng này mặc định luôn được hiện, khi chạy các lệnh cài đặt, bootloader thường ưu tiên dò phân vùng chứa data của nó. Một số bootloader sẽ không làm việc ổn định được nếu như data của nó đặt trên phân vùng ẩn. Có thể tớ sẽ cần thời gian để tìm ra các giải pháp cho vấn đề này.
Có thể trước đây đã có người nghĩ về phương pháp sử dụng 2 phân vùng này rồi nhưng chưa ai thành công trong việc biến ý tưởng này trở nên hoạt động trơn tru với một thiết bị Multiboot cả. Thời điểm bản cập nhật của Multiboot hỗ trợ hai phân vùng một blogger khác đã phát biểu rằng:
Vì sao các phân vùng dành cho Multiboot mình lại đặt chúng về cuối ổ đĩa? Trong quá trình phát triển Multiboot ngoài hỗ trợ cho USB mình còn muốn nó hỗ trợ cho ổ cứng di động nữa. Thông thường ổ cứng di động luôn có sẵn một phân vùng data riêng rồi. Lối thiết kế của mình là muốn quá trình cài đặt phải thật nhanh chóng, tránh can thiệp vào phân vùng data nhiều nhất có thể, quá trình cài đặt phải an toàn nếu bị tắt ngang và dữ liệu lưu trữ phải được toàn vẹn. Về nguyên tắc, dữ liệu sẽ được sắp xếp từ trái sang phải (hầu hết phần mềm phân vùng đều chọn cách hiện thị như vậy, nhưng thực chất đĩa cứng mình lưu dữ liệu theo các sector là những vòng tròn đồng tâm từ trong ra ngoài - chỉ là cách hiện thị thôi, đừng quá bận tâm về nó). Chính vì cách sắp xếp như vậy, nếu ta lựa chọn những phân vùng đầu tiên dành cho boot thì khi khởi tạo phân vùng mới phần mềm phân vùng sẽ phải thêm một hành động là di chuyển dữ liệu sang phải để chừa chỗ trống cho phân vùng mới. Việc này tốn thời gian và tác động đến dữ liệu không an toàn nếu người dùng giữa chừng thực hiện các thao tác dừng đột ngột.
Như vậy, việc đặt phân vùng FAT32 ở vị trí nào cũng được đúng không? Nhưng tại sao suốt từ những phiên bản đầu tiên của Multiboot Toolkit mình luôn ưu tiên thứ tự NTFS-FAT32. Bởi vì, data dành cho các bootloader mặc định mình đặt trên phân vùng NTFS phân vùng này mặc định luôn được hiện, khi chạy các lệnh cài đặt, bootloader thường ưu tiên dò phân vùng chứa data của nó. Một số bootloader sẽ không làm việc ổn định được nếu như data của nó đặt trên phân vùng ẩn. Có thể tớ sẽ cần thời gian để tìm ra các giải pháp cho vấn đề này.
Có thể trước đây đã có người nghĩ về phương pháp sử dụng 2 phân vùng này rồi nhưng chưa ai thành công trong việc biến ý tưởng này trở nên hoạt động trơn tru với một thiết bị Multiboot cả. Thời điểm bản cập nhật của Multiboot hỗ trợ hai phân vùng một blogger khác đã phát biểu rằng:
Vâng ! Đây là một điều mà trước đây mình nghĩ là sẽ không thể làm được, vì thực sự là mình đã tham khảo rất nhiều các bài hướng dẫn ở trong và ngoài nước rồi. Ngay cả với các nhà sản xuất phần cứng, phần mềm họ đều khuyến cáo như vậy, nhưng cho đến hôm nay, khi mình đã test thử và đã boot thành công chuẩn UEFI với định dạng NTFS thì mình đã tin nó là sự thật.Hi, xét về khía cạnh kỹ thuật thì lời phát biểu này không hẳn đúng vì mình sử dụng hai phân vùng lận. Do phân vùng FAT32 mình đã ẩn đi nên bạn ấy mới nghĩ rằng chiếc USB này chỉ có mỗi phân vùng NTFS thôi ^^ Không sao nhưng lời nhận xét này cũng có một phần đúng vì trước đó chưa ai thành công trong việc phát triển một công cụ boot sử dụng phân vùng ẩn boot ổn định cho cả UEFI lẫn Legacy. Tớ tin rằng, một số bản boot khác của các bạn Việt Nam lẫn nước ngoài có tham khảo đôi chút về cách thiết kế của tớ ^^
Vì sao các phân vùng dành cho Multiboot mình lại đặt chúng về cuối ổ đĩa? Trong quá trình phát triển Multiboot ngoài hỗ trợ cho USB mình còn muốn nó hỗ trợ cho ổ cứng di động nữa. Thông thường ổ cứng di động luôn có sẵn một phân vùng data riêng rồi. Lối thiết kế của mình là muốn quá trình cài đặt phải thật nhanh chóng, tránh can thiệp vào phân vùng data nhiều nhất có thể, quá trình cài đặt phải an toàn nếu bị tắt ngang và dữ liệu lưu trữ phải được toàn vẹn. Về nguyên tắc, dữ liệu sẽ được sắp xếp từ trái sang phải (hầu hết phần mềm phân vùng đều chọn cách hiện thị như vậy, nhưng thực chất đĩa cứng mình lưu dữ liệu theo các sector là những vòng tròn đồng tâm từ trong ra ngoài - chỉ là cách hiện thị thôi, đừng quá bận tâm về nó). Chính vì cách sắp xếp như vậy, nếu ta lựa chọn những phân vùng đầu tiên dành cho boot thì khi khởi tạo phân vùng mới phần mềm phân vùng sẽ phải thêm một hành động là di chuyển dữ liệu sang phải để chừa chỗ trống cho phân vùng mới. Việc này tốn thời gian và tác động đến dữ liệu không an toàn nếu người dùng giữa chừng thực hiện các thao tác dừng đột ngột.
Chưa hết đâu, còn một vấn đề nữa là phân vùng ẩn. Đối với ổ cứng di động thì chẳng phải quan tâm lắm nhưng với USB thì có một vấn đề rất khó chịu trên Windows là nó không cho một chiếc USB hiện quá 1 phân vùng, phân vùng còn lại bắt buộc phải bị ẩn đi. Phân vùng được hiện nhất định phải là phân vùng đầu tiên thì mới hoạt động ổn định được. Nếu muốn phân vùng được hiện là phân vùng thứ 2 thì chúng ta cần sự trợ giúp của công cụ BOOTICE, thực hiện việc "Set Accessible". Nếu như MacOS hay Linux thì đã từ lâu nó đều cho USB được hiện tất cả phân vùng nhưng Windows thì không. Phải đợi đến các bản cập nhật gần đây của Windows 10 thì Microsoft mới cho phép USB được hiện nhiều hơn một phân vùng. Điều này bạn cần phải nắm rõ bởi vì khi build một công cụ boot bạn sẽ sử dụng nó trên hệ điều hành nào? phiên bản nào? làm sao để tương thích được với tất cả? Đây là một vấn đề rất đau đầu và cần rất nhiều biện pháp kỹ thuật cùng như sự sáng tạo của bạn để cải tiến và khắc phục các nhược điểm còn tồn tại.
Được rồi, "lần đầu" luôn là lần khó khăn nhất nhưng cũng thú vị nhất. Hãy học cách cài các bootloader lên thiết bị bạn muốn tạo boot (USB, HDD, hay ổ cứng giả lập cũng được). Muốn biết cách cài thế nào, cấu hình config sao để có thể boot được xin mời bạn theo dõi ở phần tiếp theo...
(To be continued ...)