1. Tổng quan
Bài viết này sẽ hướng dẫn bạn cách tạo một bản phân phối Linux cho kiến trúc x86. Quá trình này có ba phần quan trọng:
- Kernel (Nhân hệ điều hành)
- User Space (Không gian người dùng, sẽ sử dụng Busy Box)
- Boot Loader (Trình khởi động, ở đây là Syslinux)
Quá trình khởi động sẽ diễn ra theo các giai đoạn:
Boot → Kernel → User Space
2. Chuẩn bị môi trường
Để thực hiện việc này, bạn cần cài đặt một số công cụ sau:
Cài đặt Docker Desktop
Đầu tiên, hãy cài đặt Docker Desktop để đảm bảo môi trường build nhất quán:
Cài đặt QEMU
Tiếp theo, cài đặt QEMU để có thể chạy thử sản phẩm trên một máy ảo x86:
3. Quy trình xây dựng bản phân phối
Mở cửa sổ CMD của Windows và khởi động Docker Desktop. Sau đó, bạn có thể bắt đầu quy trình build:
bash
$ docker run --privileged -it ubuntu
Tiến hành cập nhật và cài đặt các gói cần thiết:
bash
$ apt update
$ apt install bzip2 git vim make gcc libncurses-dev flex bison bc cpio libelf-dev libssl-dev syslinux dosfstools
Tạo Image cho Kernel
- Clone mã nguồn Linux:
bash
$ git clone --depth 1 https://github.com/torvalds/linux.git
$ cd linux/
- Cấu hình Kernel:
bash
$ make menuconfig
- Chọn
Exit
và xác nhận vớiYes
. Sau đó, biên dịch Kernel:
bash
$ make -j 8
- Lưu Image Kernel:
bash
$ mkdir /boot-files
$ cp arch/x86/boot/bzImage /boot-files
$ cd ..
Tạo initramfs
- Clone mã nguồn BusyBox:
bash
$ git clone --depth 1 https://git.busybox.net/busybox
$ cd busybox
- Cấu hình BusyBox:
bash
$ make menuconfig
- Tìm đến mục
Build static binary (no shared libs)
và chọnY
. Sau đó chọnExit
và lưu lại. Biên dịch BusyBox:
bash
$ make -j 8
- Nếu gặp lỗi build fail, hãy sửa lại mã nguồn theo patch sau patch link và chạy lại lệnh
make -j 8
. - Lưu initramfs:
bash
$ mkdir /boot-files/initramfs
$ make CONFIG_PREFIX=/boot-files/initramfs install
Tạo tệp init
- Di chuyển vào thư mục initramfs:
bash
$ cd /boot-files/initramfs/
$ vim init
- Thêm đoạn mã sau vào tệp
init
:
bash
#!/bin/sh
/bin/sh
- Lưu và thoát. Xoá tệp
linuxrc
và thay đổi quyền cho tệpinit
:
bash
$ rm linuxrc
$ chmod +x init
- Lưu lại initramfs:
bash
$ find . | cpio -o -H newc > ../init.cpio
$ cd ..
Tạo Bootloader
Cài đặt Syslinux:
bash
$ apt install syslinux
- Tạo vùng chứa bootloader, kernel, và initramfs:
bash
$ dd if=/dev/zero of=boot bs=1M count=50
- Định dạng filesystem để Syslinux hỗ trợ:
bash
$ apt install dosfstools
$ mkfs -t fat boot
$ syslinux boot
$ mkdir m
$ mount boot m
$ cp bzImage init.cpio m
$ umount m
4. Quá trình khởi động
Mở một tab CMD mới để thực hiện các bước sau:
Sao chép dữ liệu từ Docker về máy Windows
bash
$ docker ps -a
- Lấy ID của Docker mà bạn vừa sử dụng để build:
bash
$ docker cp dockerid:/boot-files/boot .
- Thử nghiệm với QEMU:
bash
$ qemu-system-x86_64 boot
Khởi động Kernel và Initramfs
Khi giả lập hiển thị, bạn sẽ thấy chương trình bootloader cho x86. Nhập lệnh sau để chọn Kernel và Initramfs:
bash
$ /bzImage -initrd=/init.cpio
- Nhấn Enter và tận hưởng thành quả của bạn!
5. Kết quả
Nếu mọi thứ diễn ra suôn sẻ, bạn sẽ thấy một hệ điều hành Linux hoạt động trên máy ảo x86 của mình. Chúc mừng bạn đã hoàn tất quá trình tạo bản phân phối Linux thành công!
source: viblo