hoatranlab.io.vn Zalo: 0917516878 Hotline: 0917516878 [email protected]
HoaTranLab Logo HoaTranLab
Linux Bible 11th Edition • Chapter 29

Deploying Linux to the Cloud

Sử dụng cloud-init để cấu hình cloud instances, làm việc với cloud images (qcow2), inject SSH keys và triển khai Linux lên AWS, Azure và OpenStack.

Mục tiêu học tập

cloud-init Framework

Hiểu cơ chế cloud-init hoạt động để cấu hình Linux cloud instances tự động khi khởi động lần đầu tiên.

user-data và meta-data

Tạo và cấu hình hai file cloud-init: meta-data (thông tin instance) và user-data (cấu hình OS bên trong).

Cloud Images (qcow2)

Tải và sử dụng cloud images từ Fedora, Ubuntu, RHEL; tạo snapshots với qemu-img; copy images vào libvirt.

SSH Key Injection

Inject SSH public keys vào cloud instances qua cloud-init để cho phép passwordless login vào VMs.

Cloning Cloud Instances

Clone cloud instances dùng virt-manager hoặc virt-clone để nhanh chóng tạo nhiều VMs từ template.

Public Cloud Deployment

Hiểu cách deploy Linux instances trên AWS EC2, Azure VM và OpenStack với cloud-init.

Lý thuyết: Deploying Linux to the Cloud

1. cloud-init là gì?

cloud-init là công cụ tiêu chuẩn để cấu hình Linux cloud instances. Thay vì cài đặt thủ công, cloud-init tự động thiết lập OS khi VM boot lần đầu: set hostname, tạo users, inject SSH keys, cài đặt packages, chạy scripts.

cloud-init process flow:

1. Boot

VM starts

2. Detect

Find data source

3. Read

meta-data + user-data

4. Configure

Apply settings

5. Ready

Instance usable

2. File meta-data

File meta-data chứa thông tin nhận dạng instance từ bên ngoài: instance ID, hostname.

meta-data

instance-id

: FedoraWS01

local-hostname

: fedora01.example.com

availability-zone

: us-east-1a

3. File user-data

File user-data cấu hình bên trong OS. Phải bắt đầu bằng #cloud-config. Hỗ trợ nhiều directives: password, ssh keys, packages, runcmd.

user-data (comprehensive)

#cloud-config

password

: cloudpass

chpasswd

: {expire: False}

ssh_pwauth

: True

ssh_authorized_keys

:

- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@laptop

packages

:

- nginx

- git

- vim

package_update

: true

runcmd

:

- systemctl enable --now nginx

- firewall-cmd --add-service=http --permanent

- firewall-cmd --reload

users

:

- name: devops

sudo: ['ALL=(ALL) NOPASSWD:ALL']

groups: wheel

shell: /bin/bash

ssh_authorized_keys:

- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... devops@workstation

4. Tạo ISO data image và Snapshot

Terminal - Tạo cloud-init data ISO

# Cài đặt công cụ cần thiết

$ sudo dnf install genisoimage cloud-init qemu-img virt-install -y

# Tạo ISO chứa meta-data và user-data

$ genisoimage -output fedora42-data.iso \

-volid cidata \

-joliet -rock \

user-data meta-data

Total translation table size: 0

Total rock ridge attributes bytes: 0

Total directory bytes: 0

Writing: Initial Padblock Start Block 0

# Tạo snapshot của cloud image (để giữ nguyên bản gốc)

$ qemu-img create -f qcow2 \

-o backing_file=Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2 \

-F qcow2 Fedora-Cloud-Base-01.qcow2

Formatting 'Fedora-Cloud-Base-01.qcow2', fmt=qcow2

# Xem thông tin image

$ qemu-img info Fedora-Cloud-Base-01.qcow2

image: Fedora-Cloud-Base-01.qcow2

file format: qcow2

virtual size: 10 GiB (10737418240 bytes)

disk size: 392 KiB

backing file: Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2

5. Khởi động Cloud Instance

Terminal - Start cloud instance với virt-install

# Copy images vào libvirt images directory

$ sudo cp Fedora-Cloud-Base-01.qcow2 \

fedora42-data.iso \

/var/lib/libvirt/images/

# Khởi động cloud instance

$ cd /var/lib/libvirt/images

$ sudo virt-install --import \

--name fedora42-01 \

--ram 4096 --vcpus 2 \

--disk path=Fedora-Cloud-Base-01.qcow2,format=qcow2,bus=virtio \

--disk path=fedora42-data.iso,device=cdrom \

--os-variant fedora42 \

--network network=default &

Starting install...

Domain 'fedora42-01' is running.

# Mở console VM

$ virt-viewer fedora42-01

# Đăng nhập: user=fedora, password=cloudpass

6. Kiểm tra Cloud Instance

Terminal - Kiểm tra bên trong cloud instance

# Kiểm tra user-data đã được áp dụng

[fedora@fedora01 ~]$ sudo cat /var/lib/cloud/instances/nocloud/user-data.txt

#cloud-config

password: cloudpass

chpasswd: {expire: False}

# Xem cloud-init config

[fedora@fedora01 ~]$ sudo cat /etc/cloud/cloud.cfg | head -20

users:

- default

disable_root: true

system_info:

default_user:

name: fedora

sudo: ["ALL=(ALL) NOPASSWD:ALL"]

shell: /bin/bash

# Xem cloud-init logs

[fedora@fedora01 ~]$ sudo journalctl -u cloud-init --no-pager | tail -20

cloud-init[1234]: Cloud-init v. 24.3 finished at Tue, 01 Apr 2025

7. Triển khai lên Public Cloud (AWS/Azure)

AWS EC2 với cloud-init

  • • Chọn AMI (Amazon Machine Image) Linux
  • • Chọn instance type (t2.micro, t3.small...)
  • • Chọn key pair cho SSH access
  • • Trong "Advanced Details" > User data: paste nội dung user-data
  • • cloud-init chạy tự động khi instance boot

Azure VM với cloud-init

  • • Chọn Ubuntu/RHEL/Fedora image từ Marketplace
  • • Trong "Advanced" tab, chọn "Enable cloud-init"
  • • Upload hoặc paste user-data content
  • • Azure hỗ trợ cloud-init natively
  • • SSH key tự động inject qua Azure portal

Lab Thực Hành

Tạo và deploy một Fedora cloud instance với cloud-init, cài đặt Nginx tự động và inject SSH key để đăng nhập không cần password.

1

Tạo SSH key pair

Terminal

$ ssh-keygen -t ed25519 -C "cloud-lab" -f ~/.ssh/cloud-lab

Generating public/private ed25519 key pair.

Your identification has been saved in /home/user/.ssh/cloud-lab

$ cat ~/.ssh/cloud-lab.pub

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... cloud-lab

2

Tạo file meta-data

meta-data

instance-id

: lab-webserver-01

local-hostname

: webserver01
3

Tạo file user-data với SSH key và Nginx

user-data

#cloud-config

ssh_authorized_keys

:

- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... cloud-lab

packages

:

- nginx

runcmd

:

- systemctl enable --now nginx

- echo "<h1>Cloud Instance Ready!</h1>" > /usr/share/nginx/html/index.html

4

Tạo ISO và Snapshot

Terminal

$ genisoimage -output webserver-data.iso -volid cidata -joliet -rock user-data meta-data

$ qemu-img create -f qcow2 \

-o backing_file=Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2 \

-F qcow2 webserver-01.qcow2

5

Khởi động Cloud Instance

Terminal

$ sudo cp webserver-01.qcow2 webserver-data.iso /var/lib/libvirt/images/

$ sudo virt-install --import --name webserver-01 \

--ram 2048 --vcpus 2 \

--disk path=/var/lib/libvirt/images/webserver-01.qcow2,format=qcow2,bus=virtio \

--disk path=/var/lib/libvirt/images/webserver-data.iso,device=cdrom \

--os-variant fedora42 --network network=default &

6

SSH vào Instance và Kiểm tra Nginx

Terminal

$ virsh domifaddr webserver-01

Name MAC address Protocol Address

vnet0 52:54:00:12:34:56 ipv4 192.168.122.77/24

$ ssh -i ~/.ssh/cloud-lab [email protected]

[fedora@webserver01 ~]$ systemctl status nginx

● nginx.service - The nginx HTTP and reverse proxy server

Active: active (running)

[fedora@webserver01 ~]$ curl http://localhost

<h1>Cloud Instance Ready!</h1>

7

Clone Cloud Instance

Terminal

$ virsh shutdown webserver-01

$ virt-clone --original webserver-01 \

--name webserver-02 \

--auto-clone

Cloning 'webserver-01'... 100% [===================] 3.1 GB 55 MB/s in 58s

$ virsh start webserver-02

Câu hỏi ôn tập

1

cloud-init là gì và tại sao nó quan trọng với cloud images?

cloud-init là công cụ chuẩn để cấu hình Linux cloud instances tự động khi boot lần đầu. Quan trọng vì cloud images là generic (không có user cụ thể, SSH keys) — cloud-init inject các cấu hình này (hostname, users, SSH keys, packages, scripts) mà không cần cài đặt thủ công mỗi lần.
2

Sự khác biệt giữa file meta-data và user-data trong cloud-init?

meta-data: thông tin về instance từ bên ngoài (instance-id, hostname). Cung cấp bởi infrastructure. user-data: cấu hình bên trong OS, bắt đầu bằng #cloud-config. Cho phép set passwords, SSH keys, install packages, run commands. User data do người dùng định nghĩa.
3

Tại sao cần tạo snapshot của cloud image trước khi dùng?

Cloud image gốc (qcow2) nên được giữ nguyên như template. Tạo snapshot (qemu-img create -f qcow2 -o backing_file=...) tạo ra một file nhỏ chỉ lưu changes. Điều này cho phép: (1) revert về trạng thái ban đầu dễ dàng; (2) tạo nhiều VMs từ cùng base image; (3) tiết kiệm disk space.
4

Lệnh genisoimage dùng để làm gì trong workflow cloud-init?

genisoimage tạo một ISO image chứa files meta-data và user-data. ISO này được gắn như CD-ROM vào VM (--disk path=...iso,device=cdrom). cloud-init tìm data source "NoCloud" từ CD-ROM có volume label "cidata" và đọc cấu hình từ đó khi boot.
5

Làm thế nào để inject SSH key vào cloud instance qua cloud-init?

Trong file user-data, thêm directive ssh_authorized_keys:
ssh_authorized_keys:
  - ssh-ed25519 AAAAC3... user@host

cloud-init sẽ copy public key này vào file ~/.ssh/authorized_keys của default user, cho phép SSH passwordless vào instance.
6

Directive runcmd trong user-data dùng để làm gì?

runcmd chạy các lệnh shell tùy ý khi instance boot lần đầu. Chạy một lần sau khi tất cả modules khác đã xử lý. Ví dụ: enable services (systemctl enable --now nginx), cấu hình firewall, chạy scripts. Khác với packages (chỉ install packages từ repos).
7

Tại sao cloud images thường disable root login?

Bảo mật: disable_root: true trong cloud.cfg ngăn đăng nhập trực tiếp với root. Thay vào đó, một non-root user mặc định (fedora, ubuntu, ec2-user) được tạo với sudo privileges và SSH key access. Điều này giảm attack surface và buộc dùng sudo cho privileged operations — best practice cho cloud security.
8

Lệnh qemu-img info cho biết thông tin gì về cloud image?

qemu-img info <image> hiển thị: file format (qcow2/raw), virtual size (tổng dung lượng), disk size (dung lượng thực đang dùng), backing file (nếu là snapshot), số snapshots, cluster size. Đặc biệt hữu ích để xác nhận backing file trong snapshot chain.