Hướng dẫn khởi động Linux không ổ cứng (Diskless) với ZFS, iSCSI và PXE
Bài viết chia sẻ quy trình chi tiết thiết lập hệ thống "diskless" booting cho Debian 13 sử dụng ZFS, iSCSI và PXE. Giải pháp này cho phép chạy hệ điều hành qua mạng từ NAS, lý tưởng cho việc thử nghiệm AI hoặc phát triển mà không ảnh hưởng đến cấu hình Windows trên máy chủ.

Hướng dẫn khởi động Linux không ổ cứng (Diskless) với ZFS, iSCSI và PXE
Hình ảnh minh họa iSCSI Netboot
Động cơ của tôi là muốn thử nghiệm các mô hình Unsloth mới cho Qwen3.6 và Gemma4 trên PC chơi game của mình. Việc biên dịch llama.cpp trên Windows khá tẻ nhạt, và tôi đã lạm dụng quá nhiều bộ công cụ (toolchains) khác nhau trên cài đặt Windows của mình. Windows vẫn không mang lại cảm giác thân thiện với lập trình viên đối với tôi, và tôi chấp nhận dùng nó chỉ làm giao diện cho chế độ Big Picture của Steam.
Tôi không muốn làm phiền cấu hình Windows dùng để chơi game của mình. Windows có thói quen xấu là làm hỏng GRUB khi cập nhật. UEFI khắc phục điều đó phần nào, nhưng việc duy trì thủ công các mục UEFI và thay đổi chúng mỗi khi kernel cập nhật thật sự phiền phức. Một trong những lợi ích tốt nhất của phương pháp được mô tả ở đây là GRUB cũng nằm trên ổ đĩa từ xa.
Tôi có một vài ổ NVME trong PC, cả hai đều chứa một số trò chơi tôi chơi thường xuyên. Tôi không muốn rơi vào cảnh phải phân vùng lại mọi thứ để bộ tải khởi động hoạt động với cả Linux và Windows. Chắc chắn tôi có thể dùng ổ USB, và trong quá khứ tôi đã làm vậy, nhưng tôi có xu hướng để lạc USB ở khắp mọi nơi. Khi cần gấp, tôi thường lấy chiếc USB có sẵn (để in FedEx hoặc làm ổ sao lưu ảnh khi đi nghỉ) và kết quả là tôi thường xóa sạch các USB cài Linux. Tôi đã có một NAS, tại sao không dùng khởi động từ xa (remote boot)?
Tôi luôn muốn biết PXE hoạt động như thế nào qua iSCSI.
Thiết lập của tôi
Giới hạn
Việc cài đặt Debian trên ổ đĩa mạng chắc chắn sẽ chậm hơn đáng kể so với cài đặt gốc. Vì tôi sẽ sử dụng một phần ổ NVME cục bộ để lưu và tải các mô hình AI, tôi không thực sự quan tâm đến hiệu suất của hệ điều hành vì tôi có đủ RAM để chạy mọi thứ mượt mà sau khi OS khởi động xong. Tôi sẽ không dùng cấu hình này để duyệt web bằng Firefox.
Giả định
Một máy chủ duy nhất chạy Debian 13 được sử dụng cho Netboot.xyz, tftpd, iSCSI Target và ZFS ZVol. Bản cài đặt Proxmox của tôi hoạt động hoàn hảo cho việc này. Tôi sử dụng router Asus với firmware Merlin cho DNSMasq.
Bài viết này được chia thành các phần sau:
- Cài đặt và cấu hình Netboot.xyz
- Cấu hình TFTP
- Cấu hình DNSMasq trên Router
- Tạo ZFS ZVol
- Cấu hình iSCSI
- Cài đặt Debian
Cài đặt và cấu hình Netboot.xyz
Tôi sử dụng máy chủ Proxmox của mình để xuất các mục tiêu iSCSI. Cài đặt các gói cần thiết.
apt install apache2 git ansible tftpd-hpa targetcli-fb
Clone và biên dịch netboot. Bạn có thể sử dụng netboot trực tiếp mà không cần biên dịch, nhưng khi đó nó sẽ tải xuống tất cả tài sản (assets) tại thời điểm chạy, tuy tiện lợi nhưng không phải là điều tôi khuyến nghị.
cd /opt
git clone https://github.com/netbootxyz/netboot.xyz.git
cd netboot.xyz
Chúng ta chỉnh sửa một vài tệp cấu hình để điều chỉnh việc cài đặt netboot.
Chỉnh sửa /opt/netboot.xyz/user_overrides.yml với nội dung sau:
generate_menus: true
generate_disks: true
generate_checksums: true
generate_local_vars: false
make_num_jobs: 1
site_name: 192.168.50.167
boot_domain: 192.168.50.167
Đảm bảo site_name và boot_domain trỏ đến máy chủ netboot. Trong trường hợp của tôi, đó chính là máy chủ Proxmox.
Bây giờ chúng ta sửa một số mẫu netboot để có thể khởi động bộ cài đặt và iSCSI của mình.
Chỉnh sửa /opt/netboot.xyz/roles/netbootxyz/templates/menu/boot.cfg.j2 — tìm phần :end và thay đổi thành:
:end
chain local-vars.ipxe ||
exit
Chỉnh sửa /opt/netboot.xyz/roles/netbootxyz/templates/local-vars.ipxe.j2 và thay đổi thành:
#!ipxe
set custom_url http://192.168.50.167
Sử dụng ansible để cài đặt netbootxyz vào /var/www/html. Quá trình này có thể mất một lúc...
ansible-playbook -i inventory site.yml
Bây giờ chúng ta cần thêm một menu tùy chỉnh để khởi động từ các đĩa. Nếu đĩa không có hệ điều hành, nó sẽ khởi động bộ cài đặt Debian. Nếu bạn muốn cài đặt hệ điều hành trên nhiều máy, hãy thoải mái tạo các tệp ipxe khác nhau cho bộ cài đặt và các đĩa khởi động.
Tạo /var/www/html/debian13-iscsi.ipxe và thay đổi như dưới đây. Đảm bảo địa chỉ IP và IQN là chính xác.
#!ipxe
set iscsi-server 192.168.50.167
set iscsi-target iqn.2026-05.xyz.716697.pve-vt:tank-debian-disk-12700k
set initiator-iqn iqn.2026-05.xyz.716697.pve-vt:12700k
set username myuser
set password mypassword
set reverse-username targetuser
set reverse-password targetpassword
sanboot iscsi:${iscsi-server}::::${iscsi-target} || goto installer
:installer
imgfree
kernel http://${iscsi-server}/assets/debian13/linux
initrd http://${iscsi-server}/assets/debian13/initrd.gz
imgargs linux root=/dev/ram0 initrd=initrd.gz vga=normal
boot
Tạo mục nhập netboot.xyz tùy chỉnh. Tạo tệp mới /var/www/html/custom.ipxe
#!ipxe
menu Local Custom Menu
item --gap Local iSCSI Installs:
item debian13-iscsi Debian 13 iSCSI Boot (192.168.50.167)
item --gap --
item back Back to main menu
choose menu || goto back
goto ${menu}
:debian13-iscsi
chain http://192.168.50.167/debian13-iscsi.ipxe ||
goto back
:back
chain http://192.168.50.167/menu.ipxe
Tải xuống bộ cài đặt initrd của Debian.
mkdir -p /var/www/html/assets/debian13
cd /var/www/html/assets/debian13
wget http://ftp.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
wget http://ftp.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
Menu Netboot
Cấu hình TFTP
Cấu hình trong /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
Sao chép các tệp nhị phân netboot.xyz mà chúng ta đã biên dịch vào tftp/ipxe.
mkdir -p /srv/tftp/ipxe
cp /var/www/html/ipxe/netboot.xyz-undionly.kpxe /srv/tftp/ipxe/
cp /var/www/html/ipxe/netboot.xyz-snp.efi /srv/tftp/ipxe/
cp /var/www/html/ipxe/netboot.xyz.efi /srv/tftp/ipxe/
chown -R tftp:tftp /srv/tftp/ipxe
service tftpd-hpa restart
Cấu hình DNSMasq trên máy chủ DHCP
Cấu hình DNSMasq trên router mặc định / máy chủ DHCP của bạn để chuyển hướng đến Máy chủ TFTP. Tôi có router Asus với firmware Merlin sử dụng dnsmasq. Cấu hình tùy chỉnh nằm trong: /jffs/configs/dnsmasq.conf.add. Đảm bảo IP giống với máy chủ TFTPD.
Các phần khác nhau dưới đây là cần thiết để hỗ trợ cả PXE và iPXE. Tôi nhận ra mình cần chúng vì VM của tôi hỗ trợ iPXE nhưng máy 12700k của tôi thì không.
# BIOS Clients
dhcp-boot=tag:!ipxe,ipxe/netboot.xyz-undionly.kpxe,,192.168.50.167
# UEFI x86-64 clients
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-boot=tag:efi-x86_64,ipxe/netboot.xyz-snp.efi,,192.168.50.167
# Tag iPXE clients (option 175 present)
dhcp-match=set:ipxe,175
# All other iPXE clients get the netboot.xyz menu
dhcp-boot=tag:ipxe,http://192.168.50.167/menu.ipxe
Khởi động lại dnsmasq:
service restart_dnsmasq
Tạo ZFS ZVol
Tôi sẽ rất ngắn gọn về ZFS. Tôi sẽ không đi vào chi tiết cụ thể, ngoài việc ZFS rất tuyệt vời. Có rất nhiều tài liệu ở nơi khác về cách bạn có thể tạo ZFS Pools và ZVols. Thay cho ZFS, iSCSI hoàn toàn có thể sử dụng bất kỳ đĩa nào khác được kết nối.
zpool create tank /dev/disk/by-id/${DISK_ID}
zfs create -V 32G tank/debian-disk-12700k
Cấu hình iSCSI
Đây là phần khó nhất nhất. Chúng ta xuất ZVOL (hoặc bất kỳ đĩa nào khác) dưới dạng iSCSI target. Khối lệnh dưới đây thực hiện các việc sau:
- Tạo iSCSI Backstore với ZVol làm thiết bị khối. Sử dụng bất kỳ đĩa nào khác nếu bạn muốn bỏ qua ZFS.
- Tạo iSCSI Target cho Đĩa khởi động Debian.
- Đặt
demo_mode_write_protect=1. Điều này bật bảo vệ ghi cho các máy khách không được xác thực. - Đặt
generate_node_acls=0. - Tạo initiator (máy khách) và xác thực lẫn nhau tương ứng.
- Tạo ánh xạ LUN giữa iSCSI target và ZVOL backstore.
- Xác minh Portal (máy chủ iSCSI) tồn tại.
- Cuối cùng, liệt kê cấu hình iSCSI cho target.
Sử dụng lệnh targetcli để thực hiện các bước cấu hình chi tiết, bao gồm tạo backstore, target, thiết lập ACLs với tên người dùng/mật khẩu (CHAP authentication), và ánh xạ LUN. Đây là bước quan trọng để đảm bảo tính bảo mật và kết nối đúng giữa máy khách (initiator) và máy chủ (target).
Cài đặt Debian
Cài đặt Debian
Khởi động VM và chúng ta sẽ thấy menu netboot cùng với mục menu tùy chỉnh của mình. Chọn Custom URL Menu, sau đó chọn mục Debian13 mà chúng ta đã tạo trước đó trong debian13-iscsi.ipxe.
Nhật ký cho thấy netboot đã cố gắng khởi động qua đĩa, nhưng thất bại vì chúng ta chưa cài đặt hệ điều hành. Nó tiếp tục khởi động bộ cài đặt initrd và kernel của Debian 13.
Bộ cài đặt khởi động và chúng ta có thể tiếp tục như bất kỳ cài đặt Debian nào khác. Chọn ngôn ngữ, vị trí, bố cục bàn phím, tên máy chủ và gương phần mềm Debian của bạn.
Đây là nơi phần thú vị bắt đầu. Bộ cài đặt giờ cố gắng phát hiện đĩa, nhưng không tìm thấy bất kỳ đĩa nào. Nó nhắc bạn kiểm tra xem bạn có bất kỳ trình điều khiển thiết bị nào cho các đĩa mà nó có thể không phát hiện ra không. Chúng ta không muốn điều này ngay bây giờ. Chọn Continue with no disk drive.
Màn hình tiếp theo sẽ liệt kê các ổ đĩa được phát hiện. Chọn Configure iSCSI volumes.
Màn hình tiếp theo hỏi nếu bạn muốn đăng nhập vào bất kỳ máy chủ iSCSI nào mà bạn có thể có. Đây là nơi chúng ta nhấn Super+F2 để chuyển sang TTY 2 và thêm chi tiết xác thực.
Nhấn Enter và chỉnh sửa /etc/iscsi/initiatorname.iscsi với InitiatorName mà chúng ta đã cấu hình cho các iSCSI ACLs bằng targetcli. Ví dụ của tôi là InitiatorName=iqn.2026-05.xyz.716697.pve-vt:12700k.
Để bộ cài đặt sử dụng initiator mới, hãy giết các tiến trình iscsid. Khởi động lại iscsid, nó sẽ được khởi chạy như một tiến trình daemon nền theo mặc định. Xác nhận bằng ps | grep iscsi để xem các tiến trình iscsid đang chạy.
ps | grep iscsi
kill -9 ISCSI_PIDs
iscsid
Nhấn Super+F1 để quay lại tty của bộ cài đặt.
Chọn tùy chọn để đăng nhập vào các mục tiêu iSCSI.
Nhập máy chủ iSCSI tức là địa chỉ portal iSCSI & cổng.
Nhập chi tiết xác thực iSCSI mà chúng ta đã cấu hình bằng targetcli. Nhập tên người dùng Initiator, mật khẩu, tên người dùng Target và mật khẩu Target.
Nếu bộ cài đặt có thể kết nối với portal iSCSI, nó sẽ hiển thị danh sách các mục tiêu. Chọn mục tiêu của chúng ta. Nếu bạn không thấy gì, hãy thử kiểm tra lại cấu hình iSCSI trên máy chủ bằng targetcli.
Sau khi chọn mục tiêu, màn hình tiếp theo là phân vùng. Rất quan trọng phải chú ý đến phần này. Bất kỳ cấu hình sai ở đây có thể làm hỏng bất kỳ hệ điều hành hoặc dữ liệu hiện có nào bạn có thể có trên các đĩa khác. Tôi sẽ chọn "Guided - Use entire disk" vì tôi muốn Debian sử dụng toàn bộ ZVOL mà chúng ta đã tạo.
Chọn các đĩa. Trong trường hợp bạn có nhiều đĩa hệ thống, hãy rất chắc chắn chọn đúng đĩa. Đĩa iSCSI sẽ hiển thị là LIO-ORG.
Phân vùng đĩa theo ý bạn. Tôi thích tùy chọn đầu tiên để mọi thứ đơn giản. Xác nhận bố cục phân vùng và đợi quá trình cài đặt hoàn tất.
Sau khi cài đặt xong, hãy khởi động lại. Trong lần khởi động tiếp theo, chọn Custom URL Menu của chúng ta trong Netboot.xyz và chọn Debian 13. Nhật ký giờ sẽ cho thấy Debian đang được khởi động từ thiết bị SAN.
Cuối cùng là Grub. Chọn Debian và nhấn Enter. Đăng nhập vào Debian và quá trình khởi động hoàn tất.
Bài viết liên quan
Phần mềm
Lo ngại về Bun: Liệu sự suy giảm của Claude Code có phải là điềm báo cho tương lai của runtime này?
04 tháng 5, 2026

Phần mềm
Bun công bố hướng dẫn chuyển đổi sang Rust, nhưng gọi dự án viết lại là "chưa chín muồi"
05 tháng 5, 2026

Công nghệ
Nhà xuất bản cáo buộc Mark Zuckerberg cá nhân chỉ đạo vi phạm bản quyền để đào tạo AI Llama
05 tháng 5, 2026
