

Kể từ Ubuntu Server 20.04, Canonical đã thay thế cơ chế cài đặt truyền thống dựa trên Debian preseed bằng phương thức autoinstall. Phương thức này sử dụng tệp cấu hình user-data theo cú pháp YAML, cho phép tự động hóa hoàn toàn quá trình cài đặt Ubuntu Server theo một cấu hình định sẵn.
Cùng với sự thay đổi đó, trình cài đặt ubiquity đã được thay thế bằng subiquity, một trình cài đặt chuyên biệt cho môi trường máy chủ, kết hợp với cloud-init và curtin để xử lý các tác vụ như phân vùng ổ đĩa, cài đặt hệ điều hành và cấu hình ban đầu.
Việc sử dụng Autoinstall ISO đặc biệt phù hợp trong các kịch bản cần cài đặt nhanh và lặp lại Ubuntu Server trên nhiều máy chủ với cùng một cấu hình, triển khai trong môi trường không có kết nối Internet hoặc không sử dụng PXE boot, cũng như các trường hợp cần chuẩn hóa hệ điều hành ngay từ bước cài đặt ban đầu. Một bộ Autoinstall ISO được xây dựng tốt có thể tái sử dụng nhiều lần, giúp dễ dàng kiểm soát cấu hình và thuận tiện cho các đợt triển khai lâu dài.
Bài viết này tập trung hướng dẫn triển khai Ubuntu Server 22.04 bằng Autoinstall ISO, với các bước thực hành rõ ràng, dễ áp dụng trong môi trường lab, test và triển khai thực tế.

Mô hình trong hình minh họa mô tả kiến trúc triển khai Ubuntu Server bằng Autoinstall ISO, trong đó toàn bộ cấu hình cài đặt được chuẩn bị sẵn và đóng gói vào một file ISO duy nhất. Quá trình triển khai được tổ chức theo luồng một chiều, tách biệt rõ ràng giữa giai đoạn chuẩn bị và giai đoạn cài đặt.
Hệ thống gồm ba thành phần chính:
Đóng vai trò chuẩn bị và build Autoinstall ISO. Máy chủ này không tham gia trực tiếp vào quá trình cài đặt mà chỉ tạo ra artifact triển khai thông qua việc đóng gói cấu hình autoinstall và dữ liệu cloud-init vào ISO.
Là sản phẩm trung tâm của mô hình, chứa bootloader, nguồn cài đặt hệ điều hành và dữ liệu cấu hình NoCloud. ISO này có thể được tái sử dụng để triển khai đồng nhất trên nhiều máy khác nhau.
Là máy đích cần cài đặt Ubuntu Server. Máy khởi động từ Autoinstall ISO, tự động đọc cấu hình cài đặt và hoàn tất quá trình triển khai mà không cần tương tác thủ công.
Trong bài viết này, quá trình xây dựng Autoinstall ISO được thực hiện trên hệ thống Ubuntu 22.04. Sau đây là một số phần mềm cần chuẩn bị trước khi bắt đầu triển khai:
sudo apt install p7zip-fullsudo apt install wgetsudo apt install xorrisoTrước tiên, cần tạo một thư mục làm việc để chứa toàn bộ dữ liệu và các file phục vụ cho quá trình build Autoinstall ISO.
mkdir /root/deploy-iso-u22
cd /root/deploy-iso-u22
mkdir source-filesSau đó tải về bản ISO Ubuntu Server 22.04.
wget
https://releases.ubuntu.com/jammy/ubuntu-22.04.5-live-server-amd64.isoCấu trúc ISO của Ubuntu Server 22.04 có sự khác biệt so với phiên bản 20.04. Trong khi Ubuntu 20.04 chỉ sử dụng một phân vùng duy nhất trên ISO, thì từ 22.04, ISO được chia thành nhiều phân vùng GPT riêng biệt, bao gồm:
Công cụ 7zip phù hợp trong trường hợp này vì cho phép giải nén toàn bộ nội dung ISO, đồng thời tự động trích xuất các ảnh phân vùng MBR và EFI.
7z -y x ubuntu-22.04.5-live-server-amd64.iso -osource-filesSau khi giải nén, trong thư mục source-files sẽ thấy toàn bộ nội dung ISO cùng với một thư mục đặc biệt có tên '[BOOT]'. Thư mục này chứa hai file:

Hai file này sẽ được sử dụng lại khi build ISO mới. Do đó, không cần giữ chúng trong thư mục source-files; có thể di chuyển ra ngoài và đổi tên để thuận tiện cho các bước tiếp theo:
mv source-files/'[BOOT]' BOOTĐây là bước quan trọng nhất trong toàn bộ quá trình tạo Autoinstall ISO, đồng thời cũng là nơi dễ phát sinh lỗi nhất. Phần lớn các lỗi autoinstall (cài đặt dừng giữa chừng, cấu hình sai, không boot được…) đều bắt nguồn từ file user-data.
Trước tiên, tạo một thư mục để lưu các file cấu hình user-data và meta-data
mkdir source-files/nocloudtouch source-files/nocloud/meta-dataLưu ý: file meta-data chỉ là một file rỗng, nhưng cloud-init yêu cầu bắt buộc phải tồn tại. Trong các môi trường cloud, file này sẽ được dùng để chứa những thông tin bổ sung cần thiết cho quá trình triển khai.
touch source-files/nocloud/user-dataFile user-data là nơi định nghĩa toàn bộ hành vi của quá trình cài đặt: người dùng, phân vùng, mạng, SSH, mirror APT, các lệnh chạy sau cài đặt…
Dưới đây là ví dụ một file user-data hoàn chỉnh:
#cloud-config
# Khối autoinstall: kích hoạt trình cài đặt tự động của Subiquity
autoinstall:
version: 1
# Thông tin hệ thống & user
identity:
hostname: default-hostname
username: vnptcloud
realname: vnptcloud
password: "$6$.F/Lfm/K3aW2kTOW$ch2aPZPtxIPNINvx6jlibNPNsT78qryJtVFbpZ/Yt/lViatNzsm2BzAIDhFITRTvEbSAbIOahpg1P27YSwJ4T."
# Mật khẩu phải ở dạng hash (SHA-512)
# Thiết lập bàn phím & locale
keyboard:
layout: us
variant: ''
locale: en_US.UTF-8
# Cấu hình SSH
ssh:
install-server: true
allow-pw: true
authorized-keys: []
# Cấu hình APT & mirror
apt:
geoip: true
mirror-selection:
primary:
- uri: http://archive.ubuntu.com/ubuntu/
arches: [amd64, i386]
- uri: http://ports.ubuntu.com/ubuntu-ports
arches: [s390x, arm64, armhf, powerpc, ppc64el, riscv64]
security:
- uri: http://security.ubuntu.com/ubuntu/
arches: [amd64, i386]
- uri: http://ports.ubuntu.com/ubuntu-ports
arches: [s390x, arm64, armhf, powerpc, ppc64el, riscv64]
preserve_sources_list: false
updates: security
# Nguồn cài đặt OS
source:
id: ubuntu-server
search_drivers: false
# Kernel sử dụng sau cài đặt
kernel:
package: linux-generic
# Cấu hình storage
storage:
layout:
name: direct
# Lệnh chạy trong quá trình cài đặt (curtin)
late-commands:
- curtin in-target -- sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
- curtin in-target -- systemctl restart ssh
- curtin in-target -- mkdir -p /mnt/cdrom
- cp -r /cdrom/* /target/mnt/cdrom/
- curtin in-target -- chmod +x /mnt/cdrom/configure_network.sh
# user-data: chạy khi boot lần đầu
user-data:
runcmd:
- cd /mnt/cdrom
- ./configure_network.shLưu ý: Đoạn cấu hình trên có kèm comment để giải thích. Trước khi sử dụng thực tế, hãy xóa toàn bộ các dòng comment (#) để tránh lỗi trong quá trình autoinstall.
Autoinstall không cho phép sử dụng mật khẩu plaintext, vì vậy mật khẩu cần được tạo ở dạng hash:
root@vnptcloud:~# openssl passwd -6
Password:
Verifying - Password:
$6$cu9o5B/L7oabJfAe$sViUmNfgeG81GM37250OrnRw3QQFXyrt2opjyYFMTcQ47Lv7enQOE7pzMI4SY5Bi/HtpBnCYqA8vTd/4mVFQK1Trong file user-data trên, ta sử dụng một script riêng để cấu hình hostname và network sau khi hệ thống cài đặt xong. Script cấu hình sẽ được đóng gói trực tiếp trong ISO, sau đó được gọi ở lần boot đầu tiên thông qua user-data -> runcmd
Ví dụ cấu hình:
Tạo file configure_network.sh trong thư mục root/deploy-iso-u22/source-files/ với nội dung:
#!/bin/bash
hostnamectl set-hostname vnptcloud
cat <<EOF > /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses:
- 192.168.56.100/24
gateway4: 192.168.56.1
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
EOF
netplan apply || trueLưu ý: Tên interface mạng có thể khác nhau tùy môi trường (VM, lab hoặc máy vật lý). Trước khi áp dụng cấu hình, nên kiểm tra lại interface thực tế để tránh lỗi network sau khi cài đặt.
File cấu hình GRUB của ISO nằm tại:
source-files/boot/grub/grub.cfgChèn đoạn cấu hình sau ở phía trên các menu entry hiện có trong file grub.cfg:
menuentry " Autoinstall Ubuntu Server" {
set gfxpayload=keep
linux /casper/vmlinuz quiet fsck.mode=skip autoinstall ds=nocloud\;s=/cdrom/nocloud/ ---
initrd /casper/initrd
}Tham số autoinstall buộc Subiquity chuyển sang chế độ cài đặt tự động, trong khi ds=nocloud chỉ định cloud-init sử dụng datasource NoCloud - phù hợp khi nhúng sẵn user-data và meta-data trực tiếp trong ISO. Tham số s=/cdrom/nocloud/ xác định chính xác vị trí chứa các file cấu hình, với /cdrom là điểm mount của ISO trong quá trình cài đặt.
Lưu ý: dấu ; bắt buộc phải được escape (\;), nếu không GRUB sẽ coi phần còn lại là comment và toàn bộ cấu hình cloud-init sẽ bị bỏ qua, khiến autoinstall không hoạt động dù menu boot vẫn hiển thị bình thường.
Sau khi chỉnh sửa, khi boot từ ISO, menu khởi động sẽ xuất hiện thêm lựa chọn “Autoinstall Ubuntu Server”.
Sau khi đã hoàn tất các file cấu hình autoinstall và chỉnh sửa GRUB, bước cuối cùng là đóng gói lại toàn bộ nội dung thành một file ISO mới có khả năng boot và cài đặt tự động.
Trước khi build ISO tùy biến, nên kiểm tra cách ISO gốc của Ubuntu Server được tạo. Điều này giúp đảm bảo ISO mới giữ nguyên khả năng boot cho cả BIOS Legacy và UEFI. Lệnh sau sẽ hiển thị đầy đủ thông tin El Torito và layout boot của ISO gốc:
xorriso -indev ubuntu-22.04.5-live-server-amd64.iso -report_el_torito as_mkisofs
Từ kết quả này, ta có thể tái sử dụng chính xác các tham số boot khi build ISO mới.
Tiếp theo, di chuyển vào thư mục source-files, nơi chứa toàn bộ nội dung ISO đã được chỉnh sửa (user-data, meta-data, GRUB, script, …):
cd source-files
Sau đó, dùng xorriso để build ISO autoinstall mới:
xorriso -as mkisofs -r \
-V 'Custom Ubuntu Server 22.04' \
-o ../ubuntu-server-22.04.5-auto.iso \
--grub2-mbr ../BOOT/1-Boot-NoEmul.img \
-partition_offset 16 \
--mbr-force-bootable \
-append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b ../BOOT/2-Boot-NoEmul.img \
-appended_part_as_gpt \
-iso_mbr_part_type a2a0ebe5b9334487c068b6b72699c7 \
-c '/boot.catalog' \
-b '/boot/grub/i386-pc/eltorito.img' \
-no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot \
-e '--interval:appended_partition_2:::' \
-no-emul-boot \
.Trong đó, dấu . chỉ định toàn bộ thư mục hiện tại (source-files) sẽ được dùng làm source để build ISO. Nói cách khác, mọi chỉnh sửa đã thực hiện trước đó đều được đóng gói vào file ISO mới.
Sau khi build xong Autoinstall ISO, cần kiểm thử lại toàn bộ quy trình cài đặt trước khi sử dụng trong môi trường thực tế. Trong bài viết này, việc kiểm thử được thực hiện trên VMware Workstation, giúp dễ quan sát quá trình boot, theo dõi log và lặp lại nhiều lần khi cần chỉnh sửa cấu hình.
Tạo một máy ảo mới và gắn file ISO Autoinstall vừa build làm thiết bị boot.
Khi khởi động, menu GRUB xuất hiện với tùy chọn “Autoinstall Ubuntu Server”, cho thấy cấu hình GRUB đã được áp dụng thành công. Lựa chọn mục này sẽ kích hoạt quá trình cài đặt tự động hoàn toàn bằng Subiquity, không yêu cầu bất kỳ thao tác thủ công nào.

Trong quá trình cài đặt, Subiquity lần lượt áp dụng các cấu hình được định nghĩa trong file user-data, bao gồm network, storage, user, SSH và các lệnh hậu cài đặt.

Quá trình cài đặt hoàn tất

Sau khi hoàn tất và reboot, hệ thống khởi động vào Ubuntu Server với IP tĩnh và hostname đã được cấu hình chính xác theo kịch bản ban đầu.

Lưu ý:
File user-data là thành phần quan trọng nhất của Autoinstall và cũng là nơi dễ phát sinh lỗi nhất. Chỉ một sai sót nhỏ về cú pháp YAML, thụt lề không chính xác hoặc cấu hình không phù hợp với môi trường thực tế cũng có thể khiến quá trình autoinstall thất bại hoặc dừng giữa chừng. Do đó, khi xây dựng file user-data, nên tham khảo các ví dụ thực tế đã được kiểm chứng và điều chỉnh lại cho phù hợp với nhu cầu triển khai cụ thể. Một ví dụ cấu hình chi tiết và hữu ích có thể tham khảo tại đây.
