Thứ Năm, 16/01/2025, 17:00 (GMT+0)

Triển khai Ubuntu Server 22.04 bằng Autoinstall ISO

Quay lại Trang chủ Blog
Trên trang này

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 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 hệ thống triển khai Autoinstall

trien-khai-ubuntu-server.jpg

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:

  • Auto-install Server

Đó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.

  • Autoinstall ISO (Artifact)

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.

  • Client / Target Machine

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.

Triển khai Ubuntu Server 22.04 bằng Autoinstall ISO

Bước 1: Chuẩn bị

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:

  • 7z dùng để giải nén ISO gốc:
sudo apt install p7zip-full
  • wget dùng để tải về bản ISO Ubuntu Server 22.04:
sudo apt install wget
  • xorriso dùng để build lại ISO sau khi đã chỉnh sửa nội dung:
sudo apt install xorriso

Bước 2: Chuẩn bị môi trường build ISO

Trướ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-files

Sau đó tải về bản ISO Ubuntu Server 22.04.

wget 
https://releases.ubuntu.com/jammy/ubuntu-22.04.5-live-server-amd64.iso

Bước 3: Giải nén ISO và các phân vùng boot

Cấ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:

  • Phân vùng MBR (BIOS boot),
  • Phân vùng EFI (UEFI boot),
  • Phân vùng chứa hệ thống cài đặt.

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-files

Sau 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:

  • Boot-NoEmul.img – ảnh phân vùng MBR
  • Boot-NoEmul.img – ảnh phân vùng EFI (UEFI)
ubuntu-server.png

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

Bước 4: Tạo file cấu hình Autoinstall

Đâ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.

4.1. Tạo thư mục chứa cấu hình autoinstall

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/nocloud

4.2. Tạo file meta-data

touch source-files/nocloud/meta-data

Lư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.

4.3. Tạo file user-data

touch source-files/nocloud/user-data

File 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.sh

Lư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.

4.4. Tạo mật khẩu dạng hash (SHA-512)

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/4mVFQK1

4.5. Tạo script cấu hình network và hostname

Trong 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:

  • Interface mạng: ens33 
  • Địa chỉ IP: 192.168.56.100/24
  • Gateway: 192.168.56.1

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 || true

Lư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.

Bước 5: Chỉnh sửa cấu hình GRUB để thêm chế độ Autoinstall

File cấu hình GRUB của ISO nằm tại:

source-files/boot/grub/grub.cfg

Chè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”.

Bước 6: Build Autoinstall ISO Ubuntu Server 22.04

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
ubuntu-server-2.png

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.

Bước 7: Kiểm thử Autoinstall ISO

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.

ubuntu-server-3.png

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.

ubuntu-server-4.png

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

ubuntu-server-5.png

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.

ubuntu-server-6.png

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.

#CloudWave Radar
#CloudWave Radar
Chúng tôi có 4 môi trường staging, 2 môi trường production, hàng chục microservice và rất nhiều phiên bản thử nghiệm. Lúc đầu dùng VPS tưởng là đủ, nhưng rồi mỗi lần cập nhật code là một lần lo… không biết lần này ‘tháo’ có làm hỏng cái gì không?
Tại sao doanh nghiệp hiện đại cần Kubernetes?
Tiếp tục đọc