# Gỡ lỗi hệ thống: Chuyên sâu
Phần này sẽ đi sâu hơn một chút vào "hang thỏ" gỡ lỗi, cụ thể là tập trung vào việc gỡ lỗi ở cấp độ thấp hơn (low level debugging) cùng với đầu ra dữ liệu gỡ lỗi đầy đủ nhất và có tùy chọn cho bạn thiết lập cổng nối tiếp (serial setup).
Lưu ý: 99% người mới chơi bộ môn này không cần gỡ lỗi chuyên sâu như vầy, cái hướng dẫn này chỉ dành cho những dân chơi "hạng nặng" (hardcore) hoặc những trường hợp lỗi cực kỳ hy hữu mà gỡ lỗi thông thường không tìm ra được nguyên nhân.
Bạn sẽ hay gặp những cái tình huống "củ chuối" như thế này nếu Hackintosh trên những mainboard "no name" hay đến từ thương hiệu "anh hàng xóm" vì firmware của tụi nó quá khác biệt hoặc vô hiệu hóa/rút gọn rất nhiều tính năng trong UEFI dù đối với Windows không quá cần thiết để chạy; tuy nhiên đối với Mac yêu cầu bắt buộc để chạy, do đó bạn phải gỡ lỗi cấp thấp để tìm ra chi tiết nguyên nhân gây lỗi và có thể phải chỉnh sửa rất nhiều để có thể chạy được macOS trên những hệ thống này.
# Thiết lập EFI
Phần lớn thì những cài đặt yêu cầu bạn cần chỉnh ở đây toàn là những cài đặt tối thiểu phải có đã được hướng dẫn cơ bản ở những mục trước. Cái quan trọng nhất mà mình khuyến nghị bạn là sử dụng phiên bản OpenCore và tất cả kext của bạn phiên bản DEBUG (Cho phép hiển thị thông tin gỡ lỗi). Cái này giúp bạn có được mọi thông tin lỗi cần thiết, xem thêm chi tiết về gỡ lỗi OpenCore tại đây: Gỡ lỗi OpenCore
Bên cạnh việc dùng các biến thể DEBUG của OpenCore và kext cũng vậy, những công cụ sau đây cũng sẽ giúp ích trong việc gỡ lỗi cực kỳ lớn:
DebugEnhancer.kext (opens new window)
- Giúp ích rất nhiều trong việc gỡ lỗi nhân hệ thống (kernel debugging), đồng thời vá lỗi kern.msgbuf to 10485760 (opens new window) cho phép lưu nhật ký nhân hệ thống (kernel-log) dung lượng lớn hơn nhiều để có thêm nhiều thông tin hơn.
- Lưu ý: Kext này không thể chạy cùng lúc trong khi khởi tạo nhân hệ thống (kernel initialization), vì vậy nhũng nhật ký lỗi đầu tiên (early logs) sẽ không xuất hiện cho đến khi kext được nạp ngay trước Giai đoạn cấu hình PCI (PCI Configuration Stage).
-
- Kích hoạt các dòng thông báo gỡ lỗi từ bảng ACPI của bạn, giúp ích cho việc gỡ lỗi sự kiện ACPI ngay trong hệ điều hành (in-OS ACPI event debugging). Vì bảng ACPI của Mac và Windows không hoàn toàn giống nhau và Apple thì thích cái trò đặt tên cho những phần cứng quan trọng bằng những cái hàm tên lạ mà chỉ có macOS mới hiểu, khi khởi động trên máy Hackintosh nó không hiểu bảng ACPI của máy nên ta cần cái này để tìm hiểu nguyên nhân ở đâu.
- Lưu ý (Note): Bạn sẽ cần tự biên dịch SSDT này (opens new window)
# Thiết lập Config.plist
Đối với thiết lập cổng nối tiếp (serial setup), OpenCore được thiết kế thực tế giúp cho việc này trở nên khá đơn giản và chi tiết.
# Phần linh tinh trước
# Phần Serial (thiết lập cổng nối tiếp)
- Init: YES
- Khởi tạo cổng nối tiếp (serial port) từ OpenCore
- Cần thiết để gửi nhật ký của OpenCore (OpenCore logging) tới cổng nối tiếp (Serial)
# Phần Debug (gỡ lỗi)
- Target:
67- Kích hoạt đầu ra gỡ lỗi (debug output) trên OpenCore.
- Cài đặt giá trị
Target=75sẽ bổ sung thêm tùy chọn xuất log qua cổng nối tiếp (Serial) (0x08) nếu bạn muốn sử dụng serial - Bạn có thể tự tính toán giá trị của riêng mình để nhập vào tại đây: Gỡ lỗi OpenCore
# NVRAM
# Tham số khởi động (boot-args)
Tại đây chúng ta sẽ thiết lập một số biến cài đặt giúp ích cho đầu ra gỡ lỗi (giúp khai thác được nhiều thông tin lỗi nhất có thể), ta sẽ sử dụng các tham số khởi động (boot-args) sau:
-v keepsyms=1 debug=0x12a msgbuf=1048576
Bây giờ hãy cùng xem từng tham số có tác dụng gì nhé:
- -v
- Kích hoạt màn hình khởi động chi tiết (đây là cái kích hoạt cái đống chữ chạy như hack khi bạn boot máy thay thế màn hình Táo lúc khởi động để bạn dễ dàng biết được nó đang bị treo tại đâu)
- keepsyms=1
- Bảo đảm nhãn tên của hàm (symbols) được giữ lại khi nhân hệ thống gặp lỗi nghiêm trọng (kernel panics), cái này cực kỳ hữu ích cho việc gỡ lỗi. Nếu bạn không sử dụng cái này thì khi sập hệ thống; màn hình chỉ hiện một đống mã HEX (số 0, 1, A, B...) vô hồn mà hông ai hiểu gì hết. Có keepsyms=1, nó sẽ hiện ra tên của cái hàm hay cái driver nào đang gây lỗi (ví dụ như: com.apple.iokit.IOUSBHostFamily) để mình còn biết đường mà sửa.
- debug=0x12a
- Là giá trị kết hợp của
DB_PRT(0x2),DB_KPRT(0x8),DB_SLOG(0x20) vàDB_LOG_PI_SCRN(0x100) - Bạn có thể tìm thấy danh sách đầy đủ các giá trị của phiên bản XNU mới nhất tại đây: debug.h (opens new window)
- Trong lập trình, đây còn được kêu là "Bitmask" (mặt nạ bit) – tức là mình cộng các giá trị lại để mở nhiều tính năng cùng lúc. Các tham số trên cho phép hệ thống xuất nhật ký (log) gỡ lỗi ra nhiều nơi khác nhau như màn hình hoặc cổng nối tiếp (serial). Thay vì phải nhập 4 dòng lệnh riêng lẻ, bạn chỉ cần nhập cái mã "tổng" này là macOS tự hiểu phải mở hết mấy cái lệnh gỡ lỗi đó lên. Đặc biệt cái 0x100 (DB_LOG_PI_SCRN) là cái quan trọng nhất vì nó giúp in mấy dòng chữ trắng trên nền đen lúc máy bị Panic ngay trên màn hình cho mình đọc mã lỗi.
- Là giá trị kết hợp của
- msgbuf=1048576
- Thiết lập kích thước vùng đệm thông báo (message buffer) của nhân hệ thống, giúp nhận được báo cáo chuẩn chỉnh trong quá trình khởi động. Đại loại nếu bạn đặt con số này ít quá thì file log chưa được ghi tới chỗ thông báo lỗi bạn cần thì nó đã hết dung lượng tối đa file đó có thể chứa rồi.
- 1048576 tương đương 1MB (/1024^2), bạn có thể đặt lớn hơn nếu cần.
- Lưu ý rằng không bắt buộc sử dụng nếu bạn đang xài DebugEnhancer.kext, tuy nhiên đối với các nhật ký nhân hệ thống giai đoạn sớm (early kernel logs) thì vẫn cần thiết. Tức là những dòng chữ đầu tiên khi khởi động á. Đôi khi bạn sẽ cần phân tích đoạn log đầu tiên vì có thể những lỗi chính gây ra tình trạng không khởi động được nằm ở đó thay vì những đoạn chữ cuối cùng được in trên màn hình.
Các tham số khởi động hữu ích khác (Other helpful boot-args):
Tùy thuộc vào việc bạn đang gỡ lỗi thành phần gì, bạn có thể thấy các tham số này cực kỳ "lợi hại":
- -liludbgall
- Kích hoạt gỡ lỗi trên Lilu và bất kỳ plugin nào khác, lưu ý rằng tham số này yêu cầu các kext (Bao gồm Lilu và các Plugin) phải là phiên bản DEBUG.
- io=0xff
- Kích hoạt chế độ gỡ lỗi cho IOKit (khung quản lý các trình điều khiển thiết bị - driver) để xuất ra nhiều thông tin chi tiết hơn về quá trình nạp phần cứng. Lưu ý: Vì nó sẽ ghi lại nhật ký (log) của gần như mọi linh kiện trong máy, nên lượng dữ liệu sinh ra sẽ cực kỳ khổng lồ. Mở cái này sẽ khiến máy tính của bạn chạy chậm thấy rõ, đặc biệt là trong lúc đang khởi động. Chỉ nên mở khi bạn cần soi kỹ xem cái driver nào đang bị "kẹt" hông chạy được.
- igdebug=0xff
- Kích hoạt gỡ lỗi liên quan đến iGPU, hữu ích khi bạn đang gỡ lỗi với các hệ thống sử dụng iGPU.
- serial=5
- Chuyển hướng log khởi động tới cổng nối tiếp nếu bạn có kế hoạch sử dụng cổng serial
- Khuyến nghị sử dụng nếu bạn muốn thấy những nhật ký lỗi đầu tiên trong khi nhân hệ thống đang được khởi tạo, giai đoạn trước khi Cấu hình PCI (PCI Configuration).
- acpi_layer=0x8
- Kích hoạt gỡ lỗi các bảng ACPI
ACPI_TABLES, đọc acoutput.h (opens new window) để biết thêm thông tin. - Ngoài ra,
0xFFFFFFFFsẽ kích hoạt tất cả các lớp (all layers).
- Kích hoạt gỡ lỗi các bảng ACPI
- acpi_level=0x2
- Thiết lập gỡ lỗi đối tượng ACPI
ACPI_LV_DEBUG_OBJECT, đọc thêm acoutput.h (opens new window) để biết thêm thông tin. - Ngoài ra,
0xFFFF5Fsẽ bao hàm tất cả các thành phần (ACPI_ALL_COMPONENTS)
- Thiết lập gỡ lỗi đối tượng ACPI
# Thiết lập cổng nối tiếp (Serial - Tùy chọn)
Mặc dù là tùy chọn không bắt buộc, cổng nối tiếp sẽ cực kỳ hữu ích trong việc "chụp" lấy tất cả những thông tin quan trọng đang tràn ngập trong máy tính của bạn. Đôi khi vì một lý do gì đó mà kernel sẽ không đẩy thông tin lỗi trên màn hình mà đứng lại ở cái dòng log nào đó thì trên cổng serial sẽ hiển thị hết cho bạn thấy. Đây cũng là cách duy nhất để ghi nhật ký chuẩn xác cho các lỗi sập hệ thống (kernel panics) mà xuất hiện siêu sớm (chẳng hạn như ngay sau dòng [EB|#LOG:EXITBS:START])
Để thiết lập cái này, bạn sẽ cần một vài món:
- Một chân cắm/cổng nối tiếp (serial header/port) trên máy tính cần test
- Một sợi cáp serial-sang-serial hoặc serial-sang-USB
- Một cái máy tính thứ hai để nhận nhật ký nối tiếp (nhận qua cổng Serial hoặc USB)
- Phần mềm để giám sát đầu ra nối tiếp
- Trong hướng dẫn này, chúng ta sẽ sử dụng CoolTerm (opens new window) vì nó hỗ trợ macOS, Linux, Windows và cả Raspberry Pi nữa
- Các phương pháp như lệnh
screencũng được hỗ trợ
# Thiết lập phần cứng
Trong ví dụ này, chúng ta sẽ dùng bo mạch chủ Asus X299-E Strix có sẵn chân cắm nối tiếp (serial header). Để xác minh xem bo mạch của bạn có cái này không, hãy kiểm tra sách hướng dẫn sử dụng (manual) và tìm kiếm từ khóa cổng serial/COM:

Như bạn thấy, chúng ta có một cổng COM ở phía dưới bo mạch chủ và thậm chí hãng còn cung cấp sơ đồ để đấu dây thủ công nếu bạn không xài cáp chuyển đổi chân cắm (Header) Serial 9/10 chân sang DB9.
Ngoài ra, một số máy có sẵn cổng nối tiếp DB9 ngay ở cụm cổng I/O phía sau, ví dụ như chiếc Dell Optiplex 780 SFF này (lưu ý là cổng VGA và Serial trông hơi giống nhau nhưng không phải là một đâu nhé):
Với dàn máy X299 của mình, mình xài một combo đơn giản gồm Cáp chuyển đổi chân cắm (header) Serial sang cổng kết nối DB9 (opens new window), kèm thêm Bộ chuyển đổi (Adapter) DB9 sang USB (tiêu chuẩn RS-232) (opens new window) để cắm vô laptop:
| Cáp chuyển đổi chân cắm (header) Serial sang cổng kết nối DB9 | Bộ chuyển đổi (Adapter) DB9 sang USB (tiêu chuẩn RS-232) |
|---|---|
![]() | ![]() |
Tài liệu hướng dẫn của OpenCore khuyến nghị các thiết bị UART dựa trên chip CP21202:
Để lấy được nhật ký trong lúc khởi động, bạn có thể sử dụng tính năng gỡ lỗi qua cổng nối tiếp (serial port debugging). Tính năng này được bật trong mục Target, ví dụ 0xB cho việc hiển thị trên màn hình kèm theo cổng nối tiếp. OpenCore sử dụng tốc độ baud 115200, 8 bit dữ liệu, không có parity (kiểm tra chẵn lẻ), và 1 stop bit (bit dừng). Với macOS, lựa chọn tốt nhất của bạn là các thiết bị UART dựa trên chip CP2102. Kết nối chân TX trên bo mạch chủ với chân RX của bộ chuyển USB UART, và chân GND của bo mạch chủ với chân GND của bộ chuyển USB UART. Sử dụng tiện ích screen để xem đầu ra, hoặc tải phần mềm có giao diện đồ họa (GUI) như CoolTerm. Lưu ý: Trên một số bo mạch chủ (và có thể cả các dongle USB UART), việc đặt tên chân PIN có thể bị sai. Rất phổ biến trường hợp chân GND bị đổi chỗ cho chân RX, do đó bạn phải kết nối "TX" của bo mạch chủ với chân GND của USB UART, và "GND" của bo mạch chủ với chân RX của USB UART.
Nhắc nhở quan trọng: Đừng quên kích hoạt cổng nối tiếp (serial port) trong BIOS của bạn, hầu hết các bo mạch chủ sẽ vô hiệu hóa nó theo mặc định.
# Thiết lập CoolTerm
Bây giờ hãy khởi động CoolTerm (opens new window) và thiết lập một vài tùy chọn. Khi bạn mở CoolTerm, bạn sẽ thấy một cửa sổ đơn giản. Tại đây, chọn mục Options:

Ở đây có khá nhiều tùy chọn, nhưng những cái chính chúng ta cần quan tâm là:
Thiết lập thông số như sau:
- Port (Cổng): Bảo đảm cái này khớp với bộ điều khiển nối tiếp của bạn.
- Baudrate (Tốc độ baud) = 115200
- Data Bits (Bit dữ liệu) = 8
- Parity (Kiểm tra chẵn lẻ) = none
- Stop Bit (Bit dừng) = 1
Tiếp theo hãy lưu các cài đặt này và chọn mục Connect. Bạn sẽ thấy một nhật ký trực tiếp (live log) từ cổng nối tiếp:

Để thâu lại, bạn chỉ cần vào Connections -> Capture to Text/Binary File -> Start...(Cmd+R):

# Bộ công cụ gỡ lỗi nhân hệ thống (Kernel Debug Kits - Tùy chọn)
Kernel Debug Kits (KDKs) là một cách tuyệt vời để lấy thêm nhiều thông tin nhật ký từ nhân hệ thống và các kext cốt lõi. Cụ thể, KDKs là các phiên bản gỡ lỗi của nền tảng cốt lõi macOS do chính Apple cung cấp. Chúng bao gồm nhiều nhật ký hơn cũng như các lệnh ASSERT (khẳng định) cho phép bạn thấy trực tiếp các vấn đề với thiết lập của mình. Tuy nhiên, lưu ý rằng chúng ta sẽ không thảo luận về việc gỡ lỗi bắc cầu (bridged debugging) hay sử dụng lldb ở đây. Tại đây giả định bạn gỡ lỗi cho những lỗi khi đang sử dụng được trong macOS. Nếu chưa khởi động được macOS thì hướng dẫn này không có giá trị.
CẨN TRỌNG: Việc cài đặt KDK trên các máy mà bạn sử dụng để làm việc có thể dẫn đến các vấn đề với việc cập nhật hệ điều hành (OS updates) cũng như làm hỏng bản cài (bricked installs). Vui lòng gỡ lỗi trên các bản cài macOS chuyên dụng để tránh mất dữ liệu (Cài đặt macOS trên 1 phân vùng riêng chỉ sử dụng cho việc gỡ lỗi).
Để bắt đầu, trước tiên chúng ta tối thiểu cần có tài khoản dành cho lập trình viên miễn phí (opens new window) từ Apple. Sau khi bạn đã đăng ký tài khoản miễn phí, giờ đây bạn có thể truy cập KDKs từ trang More Downloads (opens new window):
- Lưu ý: Tài khoản miễn phí sẽ bị giới hạn chỉ cho tải các bản KDK chính thức (release), còn các bản KDK beta (thử nghiệm) bạn chỉ có thể tải nếu có tài khoản dành cho lập trình viên trả phí (opens new window) (Nhắc lại lần nữa: ĐMM Apple)
- Lưu ý 2: Apple lưu trữ các bản KDK từ bản mới nhất cho tới tận bản OS X 10.5 Leopard, nên đừng lo lắng về việc hệ điều hành của bạn không được hỗ trợ. Xài 10.4 thì thua 😂

Để xác định bản build KDK nào bạn cần với các bản dựng (build) thử nghiệm (beta), hãy chạy lệnh sau trong Terminal:
sw_vers | grep BuildVersion
Trong ví dụ này, mình sẽ tải Kernel Debug Kit 11.3 build 20E5186d. Sau khi tải về, hãy gắn (mount) file ảnh đĩa và bạn sẽ tìm thấy bộ cài KDK. Theo mặc định, KDK sẽ chỉ tự cài đặt cho việc "Thực hiện gỡ lỗi giữa hai máy" (Performing Two-Machine Debugging) và sẽ không mang lại lợi ích gì thêm cho máy chủ để gỡ lỗi nhân hệ thống một cách mặc định.
# Sử dụng KDK trên hệ điều hành đã được cài đặt (KDK on an Installed OS)
Để kích hoạt tính năng gỡ lỗi trên máy bạn đang Hackintosh, bạn sẽ cần làm theo các bước sau:
- Chạy gói cài đặt KDK Install pkg.
- Vô hiệu hóa SIP (Bảo vệ Toàn vẹn Hệ thống), áp dụng cho (OS X 10.11+).
- Gắn phân vùng root ở chế độ có thể ghi (macOS 10.15+).
- Cài đặt kernel và kext phiên bản gỡ lỗi (debug).
- Cập nhật các tham số khởi động (boot-args).
- Khởi động lại và kiểm tra thành quả.
# 1. Chạy gói cài đặt KDK Install pkg
Đơn giản là chạy file .pkg như bình thường:

Sau khi cài đặt xong, bạn sẽ tìm thấy các thành phần KDK như kernel có chức năng gỡ lỗi nằm tại /Library/Developer/KDKs:

# 2. Vô hiệu hóa SIP (Bảo vệ Toàn vẹn Hệ thống)
- Áp dụng cho OS X 10.11 El Capitan và mới hơn.
Để vô hiệu hóa SIP (System Integrity Protection), bạn có 2 lựa chọn:
Vô hiệu hóa qua chế độ Recovery
Thông thường, mình cực kỳ khuyến khích bạn xài cách Recovery để dễ dàng hoàn tác bằng việc Reset NVRAM, tuy nhiên một số bạn có thể cần SIP phải luôn tắt ngay cả sau khi xóa NVRAM.
Với cách đầu tiên, đơn giản là khởi động lại máy rồi vô macOS Recovery, mở Terminal và chạy lệnh sau:
csrutil disable
csrutil authenticated-root disable # Gõ thêm lệnh này nếu sử dụng Big Sur+
Khởi động lại và SIP sẽ được điều chỉnh theo cài đặt tương ứng. Bạn có thể chạy lệnh csrutil status trong terminal để kiểm tra xem đã tắt thành công chưa.
- CẢNH BÁO: Đối với những bạn đang sử dụng tính năng ApECID của OpenCore (opens new window), xin lưu ý rằng tính năng này bắt buộc phải vô hiệu hóa để sử dụng KDK.
# 3. Gắn phân vùng root ở chế độ có thể ghi
- Áp dụng cho macOS 10.15, Catalina và mới hơn
Việc gắn ổ đĩa root có quyền ghi khá dễ dàng, tuy nhiên bạn phải làm nhiều bước nên hơi lâu một chút:
# Với Big Sur+
# Đầu tiên, tạo một điểm gắn kết (mount point) cho ổ đĩa của bạn
mkdir ~/livemount
# Tiếp theo, tìm ổ đĩa chứa Hệ thống (là chứa hệ điều hành á) trong máy bạn
diskutil list
# Từ danh sách bên dưới, chúng ta có thể thấy ổ đĩa Hệ thống là disk5s5
/dev/disk5 (synthesized):
#: LOẠI Ổ ĐĨA (TYPE NAME) KÍCH THƯỚC(SIZE) MÃ ĐỊNH DANH (IDENTIFIER)
0: APFS Container Scheme - +255.7 GB disk5
Physical Store disk4s2
1: APFS Volume Big Sur HD - Data 122.5 GB disk5s1
2: APFS Volume Preboot 309.4 MB disk5s2
3: APFS Volume Recovery 887.8 MB disk5s3
4: APFS Volume VM 1.1 MB disk5s4
5: APFS Volume Big Sur HD 16.2 GB disk5s5
6: APFS Snapshot com.apple.os.update-... 16.2 GB disk5s5s
# Gắn ổ đĩa (ví dụ: disk5s5)
sudo mount -o nobrowse -t apfs /dev/disk5s5 ~/livemount
# Bây giờ bạn có thể tự do chỉnh sửa ổ đĩa Hệ thống
# Với Catalina bạn chỉ cần gõ
sudo mount -uw /
# 4. Cài đặt kernel và kext phiên bản gỡ lỗi
Bây giờ chúng ta cài đặt KDK vào hệ thống:
# Cài đặt KDK vô ổ đĩa Hệ thống (ổ đĩa chứa macOS)
# Chắc chắn là bạn đã đổi <KDK Version> thành phiên bản bạn đang tải
# Với bản 10.15 và cũ hơn, bạn nhớ chỉnh sửa cái khúc livemount với /Volumes/<Ổ đĩa mục tiêu>
sudo ditto /Library/Developer/KDKs/<KDK Version>/System ~/livemount/System
# Tạo lại bộ nhớ đệm của nhân hệ thống - kernel cache (Đối với Big Sur và các bản mới hơn)
sudo kmutil install --volume-root ~/livemount --update-all
# Tạo lại bộ nhớ đệm của nhân hệ thống - kernel cache (Đối với Catalina và các bản cũ hơn)
sudo kextcache -invalidate /Volumes/<Target Volume>
# Cuối cùng, sau khi đã chỉnh sửa xong ổ đĩa hệ thống
# Chúng ta cần tạo một bản Snapshot (bản sao lưu hệ thống) mới (Đối với Big Sur và các bản mới hơn)
sudo bless --folder ~/livemount/System/Library/CoreServices --bootefi --create-snapshot
# 5. Cập nhật các tham số khởi động (boot-args)
Sau khi đã thiết lập và cài đặt xong bộ KDK (Kernel Development Kit), giờ là lúc chúng ta phải "ra lệnh" cho file boot.efi biết nên sử dụng loại nhân (kernel) nào. Bạn có 2 lựa chọn chính:
kcsuffix=debug(Đã bị Apple gỡ bỏ từ bản Big Sur)kcsuffix=developmentkcsuffix=kasan
Trong đó, tham số development asẽ thiết lập nhân gỡ lỗi mặc định mới cho Big Sur, còn kasan là một loại nhân "siêu soi", nó ghi log cực kỳ nặng đô và chi tiết nhờ tích hợp thêm công nghệ AddressSanitizer (opens new window).
Sau khi chốt được loại nhân (kernel) nào "hợp gu" với mình, bạn thêm tham số kcsuffix vào mục boot-args trong file config.plist của bạn nhé.
# 6. Khởi động lại và kiểm tra thành quả
Nếu mọi thứ nãy giờ bạn làm đều chuẩn chỉnh, hãy khởi động lại máy và xài lệnh sau để kiểm tra coi hệ thống đã nạp đúng loại nhân mình muốn chưa:
sysctl kern.osbuildconfig
kern.osbuildconfig: kasan
Và như bạn thấy ở ví dụ trên, chúng ta đã khởi động thành công vào nhân KASAN rồi đó. Ngon lành cành đào!
# Gỡ cài đặt KDK
Việc gỡ bỏ KDK khá đơn giản, tuy nhiên có thể gây hư hỏng hệ điều hành nếu bạn không cẩn thận.
- Gắn phân vùng root ở chế độ có thể ghi (macOS 10.15+)
- Xóa kernel và kext phiên bản gỡ lỗi
- Kích hoạt lại SIP
- Xóa hết tham số khởi động (boot-args)
- Khởi động lại và kiểm tra thành quả
Các bước thực hiện:
# 1. Gắn phân vùng root ở chế độ có thể ghi (macOS 10.15+)
# Với Big Sur+
# Đầu tiên, tạo một điểm gắn kết (mount point) cho ổ đĩa của bạn
# Bỏ qua phần vẫn còn hiện diện từ lần trước, do dung lượng tăng lên
mkdir ~/livemount
# Tiếp theo, tìm ổ đĩa chứa Hệ thống (là chứa hệ điều hành á) trong máy bạn
diskutil list
# Từ danh sách bên dưới, chúng ta có thể thấy ổ đĩa Hệ thống là disk5s5
/dev/disk5 (synthesized):
#: LOẠI Ổ ĐĨA (TYPE NAME) KÍCH THƯỚC(SIZE) MÃ ĐỊNH DANH (IDENTIFIER)
0: APFS Container Scheme - +255.7 GB disk5
Physical Store disk4s2
1: APFS Volume Big Sur HD - Data 122.5 GB disk5s1
2: APFS Volume Preboot 309.4 MB disk5s2
3: APFS Volume Recovery 887.8 MB disk5s3
4: APFS Volume VM 1.1 MB disk5s4
5: APFS Volume Big Sur HD 16.2 GB disk5s5
6: APFS Snapshot com.apple.os.update-... 16.2 GB disk5s5s
# Gắn ổ đĩa (ví dụ: disk5s5)
sudo mount -o nobrowse -t apfs /dev/disk5s5 ~/livemount
# Với Catalina bạn chỉ cần gõ
sudo mount -uw /
# 2. Xóa kernel và kext phiên bản gỡ lỗi
# Khôi phục lại snapshot cũ (bản sao lưu trước đó) (Big Sur+)
sudo bless --mount ~/livemount --bootefi --last-sealed-snapshot
# Ép buộc tạo lại bộ nhớ đệm của nhân hệ thống - kernel cache (Đối với Catalina và các bản cũ hơn)
sudo rm /System/Library/Caches/com.apple.kext.caches/Startup/kernelcache.de*
sudo rm /System/Library/PrelinkedKernels/prelinkedkernel.de*
sudo kextcache -invalidate /
# 3. Kích hoạt lại SIP
- Các lệnh trong chế độ Recovery (nếu trước đó bạn đã cài đặt qua Recovery):
csrutil enable
csrutil authenticated-root enable # Big Sur+
- Thay đổi trong file config.plist (nếu trước đó đã thay đổi qua config.plist):
# 4. Xóa hết tham số khởi động (boot-args)
Đừng quên xóa bỏ đoạn kcsuffix= trong boot-args của bạn nhé.
# 5. Khởi động lại và kiểm tra thành quả
Giả sử mọi thứ đều được thực hiện chính xác, giờ bạn hãy khởi động lại và kiểm tra xem kernel đã về bản chính thức chưa:
sysctl kern.osbuildconfig
kern.osbuildconfig: release
Và như chúng ta thấy, chúng ta đã quay trở lại khởi động kernel bản chính thức thành công.

