Cloud kietna

Bài 3: Virtualization

Bài 3: Virtualization

Bài 3: Virtualization

Kiến thức nền tảng để học Cloud

Part 3 of 5

1. Tìm hiểu về công nghệ ảo hóa QEMU/KVM

1.1. QEMU

1.1.1. Giới thiệu QEMU

  • QEMU (Quick Emulator) là một trình giả lập miễn phí và mã nguồn mở.
  • QEMU giả lập bộ vi xử lí máy tính thông qua một trình biên dịch nhị phân động và cung cấp một bộ những mẫu phần cứng khác nhau cho phép nó có thể chạy đa dạng các hệ điều hành
  • Có thể kết hợp với KVM để chạy các máy ảo ở tốc độ gần tương đương với tốc độ trực tiếp
  • QEMU còn có thể giả lập ở mức tiến trình người dùng, cho phép ứng dụng có thể chạy trên một kiến trúc khác với kiến trúc nó được biên dịch.
  • QEMU hỗ trợ giả lập nhiều kiến trúc như x86, ARM, PowerPC và RISC-V

1.1.2. Các chế độ giả lập

  • Chế độ User-mode
    • Ở chế độ này QEMU chạy một chương trình Linux hoặc macOS được biên dịch cho một tập lệnh chỉ dẫn khác.
    • Mục tiêu chính của chế độ này là phục vụ biên dịch và gỡ lỗi chéo
  • Chế độ System Emulation
    • Ở chế độ này QEMU giả lập một hệ điều hành đầy đủ, bao gồm cả thiết bị ngoại vi
    • Cho phép tạo ra một vài máy ảo trên một máy thật
    • QEMU hỗ trợ nhiều hệ điều hành như Linux, Solaris, Windows, DOS, BSD
    • Hỗ trợ một vài tập lệnh như x86, MIPS, 32-bit ARMv7, ARMv8, PowerPC, RISC-V, SPARC, ETRAX CRIS và MicroBlaze
  • Hypervisor Support
    • Trong chế độ này QEMU vừa đóng vai trò là trình quản lí máy ảo cũng như back-end để giả lập thiết bị cho các máy ảo chạy dưới một Hypervisor
    • Hypervisor phổ biến nhất là KVM nhưng cũng hỗ trợ một vài hypervisor khác như Xen, Apple’s HVF, Windows’s WHPX và NetBSD’s nvmm

1.2. KVM

  • KVM (Kernel Virtualization Machine) là một công nghệ ảo hóa phần cứng, hệ điều hành chính (Host OS) có nhiệm vụ mô phỏng phần cứng để cho phép các hệ điều hành khác (Guest OS) chạy trên nền tảng ảo hóa này
  • Cho phép vận hành nhiều máy chủ ảo trên cùng một máy chủ vật lí, và các máy ảo sẽ dùng chung các tài nguyên của máy chủ vật lí
  • Mỗi máy ảo có phần cứng ảo riêng của nó

1.2.1. Chức năng của ảo hóa

  • Phân chia: Chạy nhiều máy ảo trên một máy thật với nhiều hệ điều hành khác nhau
  • Cô lập: Mỗi dịch vụ được triển khai trên một máy ảo khác nhau thì khi một dịch gặp sự cố, các dịch vụ khác sẽ không bị ảnh hưởng
  • Đóng gói: Máy ảo được đóng gói thành các file riêng biệt, dễ dàng backup hay chuyển sang hệ thống khác để chạy

1.2.2. Lợi ích của ảo hóa

  • Tiết kiệm chi phí, tăng tính hiệu quả, hiệu năng, linh động
  • Giảm số lượng máy chủ vậ lí, tiết kiệm chi phí bảo trì phần cứng
  • Dễ dàng mở rộng khi có nhu cầu
  • Khai thác triệt để các tài nguyên của phần cứng vật lí
  • Cho phép di chuyển máy chủ đơn giản và nhanh chóng

1.2.3. Đặc điểm của KVM

  • KVM không có tài nguyên dùng chung, tài nguyên được phân cho từng máy ảo có thể được sử dụng 100% bởi máy ảo đó mà không bị chia sẻ
  • Giúp các VM hoạt động ổn định hơn và không bị ảnh hưởng bởi các VM khác trong hệ thống

1.2.4. Kiến trúc của KVM

  • KVM Kernel Module
    • Là một phần trong mainstream của Linux Kernel
    • Cung cấp một interface chung cho Intel VMX hay AMD SVM (Thành phần hỗ trợ ảo hóa phần cứng)
    • Chứa các phần mô phỏng cho các instruction hay CPU modes không được hỗ trợ bởi Intel VMX và AMD SVM
  • QEMU-kvm: Chương trình dòng lệnh để tạo ra các máy ảo. Có các chức năng chính
    • Thiết lập VM và các thiết bị I/O
    • Thực thi guest code thông qua KVM kernel module
    • Mô phỏng thiết bị I/O và di chuyển các máy ảo từ Host này sang Host khác
  • Libvirt management stack
    • Cung cấp API để các công cụ như virsh có thể giao tiếp và quản lí các VM
    • Cung cấp chế độ quản lí từ xa an toàn
  • File cấu hình XML: Xác định các thông tin và thiết bị trong một VM cụ thể. File cấu hình này bao gồm
    • Metadata: Tên của VM, Timezone, các thông tin khác về VM
    • Thông tin của các thiết bị trong VM, bao gồm CPU ảo, thiết bị lưu trữ, thiết bị vào ra, card mạng và các thiết bị phần cứng khác (Kể cả thực và ảo)
    • Các thiết đặt của VM như bộ nhớ tối đa, thiết đặt khởi động lại
  • Tương tác giữa các thành phần
    • Khi VM được khởi động, hypervisor sử dụng cấu hình XML để tạo ra một instance của VM như một tiến trình user-space của host.
    • Hypervisor đồng thời cho phép VM có thể truy cập bởi các host-based interface như virsh, virt-install hay guestfish, cũng như web console GUI
    • Với các công cụ ảo hóa được sử dụng
      • libvirt dịch các thông tin đầu vào nó nhận được cho thành những chỉ dẫn cho QEMU
      • QEMU truyền các chỉ dẫn tới KVM, nơi đảm bảo phần nhân có thể gán các tài nguyên phù hợp đủ để thực hiện các chỉ dẫn.
      • Kết quả, QEMU có thể thực thi các yêu cầu thay đổi tương ứng, như tạo hoặc chỉnh sửa thông tin của một VM, hay các thao tác trên hệ điều hành của VM

Untitled

1.2.5. Cơ chế hoạt động

  • KVM sử dụng Linux Bridge và OpenVSwitch để ảo hóa network, giúp các máy ảo giao tiếp được với nhau
  • Linux Bridge sẽ tạo ra một con switch ảo để các VM kết nối vào và có thể giao tiếp với nhau, cũng như để kết nối ra bên ngoài

Untitled

  • Trong sơ đồ trên
    • Bridge: Tương đương với Switch Layer 2 (Data Link)
    • Port: Tương đương với Port Switch thật
    • Tap: Network Interface để các VM kết nối với Bridge do Linux Bridge tạo ra
    • FD (Forward Data): Vận chuyển dữ liệu
  • Các tính năng chính
    • STP - Spanning Tree Protocol: Giao thức chống lặp gói tin trong mạng
    • VLAN: Chia switch thành các mạng LAN ảo, cô lập traffic giữa các VM
    • FDB: Chuyển tiếp các gói tin theo DB để nâng cao hiệu năng Switch

1.2.6. Nhược điểm của KVM

  • Yêu cầu phần cứng của máy chủ vật lí lớn, do là công nghệ ảo hóa hoàn toàn phần cứng
  • KVM chỉ có sẵn trong các hệ thống Linux

1.3. Mối quan hệ giữa QEMU và KVM

  • QEMU là một công cụ ảo hóa userland loại 2 (Tức là phải chạy trên một hệ điều hành host), thực hiện ảo hóa phần cứng như đĩa, mạng, VGA, PCI, USB,…
    • QEMU rất linh hoạt vì có thể cho phép code được viết cho một kiểu kiến trúc vi xử lí này có thể chạy trên các kiến trúc vi xử lí khác (Như ARM trên x86)
    • QEMU có thể chạy độc lập và giả lập được tất cả các tài nguyên của máy ảo, tuy nhiên tốc độ rất chậm
  • KVM là một module nhân Linux. Là công cụ ảo hóa loại 1 cung cấp ảo hóa đầy đủ cho Linux trên phần cứng x86 hỗ trợ ảo hóa (Intel VT hoặc AMD-V)
    • Ảo hóa đầy đủ:
      • Khi một CPU được ảo hóa bởi công cụ ảo hóa (vCPU), công cụ ảo hóa sẽ biên dịch các chỉ dẫn của vCPU tới CPU vật lí. Điểu này gây ra các vấn đề lớn tới hiệu suất
      • Các chip sử lí hiện đại cung cấp các phần ảo hóa mở rộng, cho phép chia nhỏ CPU vật lí và nối trực tiếp tới các vCPU, cho phép các chỉ dẫn trên vCPU được thực thi trực tiếp trên các mảnh nhỏ của CPU vật lí
  • QEMU có thể chạy độc lập, nhưng vì hiệu năng thấp nên QEMU cho phép sử dụng KVM như một cách để tăng tốc hiệu năng
  • KVM cũng có thể chạy độc lập mà không cần QEMU. Tuy nhiên nó chỉ cung cấp một môi trường đã được ảo hóa để hệ điều hành guest có thể chạy trên nó.
    • Nếu không có QEMU, nó không thể giả lập những cấu hình phần cứng khác nhau hoặc cho phép gỡ lỗi ở mức phần cứng

Untitled

1.4. Giao thức VNC/noVNC

1.4.1. Giới thiệu

  • VNC (Virutal Network Computing) là một hệ thống được sử dụng để chia sẻ màn hình máy tính cho người dùng từ xa.
  • Hoạt động dựa trên giao thức TCP và thường dùng cổng 5900

1.4.2. Cách thức hoạt động

  • Khi được kích hoạt, VNC Server ghi nhận nội dung của framebuffer (Bộ nhớ hình ảnh) và chia sẻ nội dung này với VNC Client (Người dùng từ xa). Thông qua một kết nối mạng, VNC Client có thể hiển thị và điều khiển máy tính từ xa

1.4.3. Ưu điểm của VNC

  • Truy cập và điều khiển từ xa thuận tiện
  • Dễ dàng cài đặt và sử dụng
  • Đa năng và linh hoạt

1.4.4. Nhược điểm của VNC

  • Tốc độ truyền dữ liệu chậm
  • Thiếu tính năng bảo mật cao
  • Hỗ trợ thiết bị hạn chế

1.4.5. noVNC

  • noVNC là một VNC Client dạng HTML và một thư viện JavaScript
  • noVNC hỗ trợ các trình duyệt web thông dụng và kể cả các trình duyệt web trên điện thoại (iOS và Android)
  • Các tính năng chính
    • Hỗ trợ các trình duyệt web thông dụng kể cả trên điện thoại
    • Hỗ trợ các phương pháp xác thực: Classical VNC, RealVNC’s RSA-AES, Tight, VeNCrypt Plain, XVP, Apple’s Diffie-Hellman, UltraVNC’s MSLogonII
    • Hỗ trợ các hình thức mã hóa của VNC: raw, copyrect, rre, hextile, tight, tightPNG, ZRLE, JPEG
    • Hỗ trợ thay đổi kích cỡ, thu phóng màn hình
    • Hiển thị con trỏ cục bộ
    • Hỗ trợ copy/paste từ Clipboard, hỗ trợ đầy đủ Unicode
    • Hỗ trợ các cử chỉ chạm để mô phỏng các hành động phổ biến của chuột
  • NoVNC Lab
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get install -y xfce4 xfce4-goodies
sudo apt-get install -y tightvncserver
  • Chạy VNC Server
vncserver

Untitled

cd .vnc
cp xstartup xstartup.bak
vi xstartup

#!/bin/bash
xrdb $HOME/Xresources
startxfce4 &
  • Install NoVNC
cd ~/
git clone https://github.com/novnc/noVNC.git
cd noVNC
openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem

Untitled

  • Run noVNC
    • Note: Google Chrome sẽ bị lỗi Failed connect to Server, còn Firefox và Edge không bị
~/noVNC/utils/novnc_proxy --vnc localhost:5901

Untitled

1.5. Lab cài đặt KVM và QEMU trên AlmaLinux

  • Host:
    • Máy AlmaLinux 9
    • 2 CPU, 16GB RAM
    • Disk: 512GB
yum update
# Kiem tra Server co ho tro ao hoa khong
egrep -c '(vmx|svm)' /proc/cpuinfo
# Cap nhat Server
sudo dnf update
# Cai dat KVM
sudo dnf install qemu-kvm libvirt libvirt-client virt-top virt-install virt-manager virt-viewer libguestfs-tools
# Khoi dong libvirtd demon
sudo systemctl start libvirtd
sudo systemctl enable libvirtd 
sudo systemctl status libvirtd
# Khoi chay virt-manager de tao may ao
sudo virt-manager
  • Tạo một máy ảo sử dụng virt-install
sudo virt-install --name lubuntu --ram=4096 --vcpus=2 --cpu host --hvm --
disk path=/var/lib/libvirt/../../assets/images/cloud-basic/virtualization/images/lubuntu,size=50 --cdrom /home/kietna/Downloads/lubuntu-24.04-cdrom.iso --graphics vnc --osinfo ubuntu-lts-latest
  • Tên máy ảo: lubuntu
    • RAM 4GB
    • VCpus: 2
    • Disk: 50GB, Path: /var/lib/libvirt/../../assets/images/cloud-basic/virtualization/images/lubuntu
    • ISO file: /home/kietna/Downloads/lubuntu-24.04-cdrom.iso
    • HVM: Máy ảo được ảo hóa toàn bộ
    • OSInfo: ubuntu
    • Kích hoạt giao diện đồ họa VNC
  • Hoặc dùng công cụ Virt-manager

Untitled

  • Tạo máy ảo mới, nguồn từ file ISO

Untitled

  • Lựa chọn file ISO, hệ điều hành

Untitled

  • Thiết lập RAM, CPUs

Untitled

  • Tạo Disk Image

Untitled

  • Hoàn thiện image

Untitled

  • Tiến hành cài hệ điều hành lên máy ảo

Untitled

2. Tìm hiểu về libvirt, virt-manager, webvirt

2.1. libvirt

2.1.1. Giới thiệu

  • Libvirt là công cụ để quản lí các nền tảng ảo hóa
  • Có thể truy cập từ C, Python, Perl, Go,…
  • Hỗ trợ KVM, Hypervisor Framework, QEMU
  • Hỗ trợ Linux, FreeBSD, Windows và MacOS

2.1.2. Tính năng

  • Thực thi tất cả các thao tác quản trị và tương tác với QEMU bằng việc cung cấp các API
  • Các máy ảo được định nghĩa trong Libvirt thông qua một file XML, tham chiếu tới khái niệm “domain”
  • Libvirt chuyển XML thành các tùy chọn của các dòng lệnh nhằm mục đích gọi QEMU
  • Tương thích khi sử dụng với virsh (Công cụ quản lí tài nguyên ảo hóa theo giao diện dòng lệnh

2.1.3. Các ứng dụng sử dụng libvirt

  • Các ứng dụng dòng lệnh
    • guestfish: Công cụ để kiểm tra và chỉnh sửa hệ thống file của các máy ảo
    • virsh: Công cụ để thực hiện các thao tác quản lí tại các miền, mạng, bộ lưu trữ được quản lí bởi libvirt
    • virt-clone: Cho phép nhân bản đĩa, máy ảo và cập nhận UUID, MAC nếu cần
    • virt-df: Kiểm tra hiệu năng của các hệ thống file máy ảo từ máy host, tương thích với những hệ thống file phổ biến và các phân vùng LVM
    • virt-image: Cung cấp giải pháp để triển khai các máy ảo, xác định một file XML chứa các thông tin cần thiết để triển khai một máy ảo
    • virt-install: Cung cấp giải pháp để cài đặt hệ điều hành từ một trung tâm phân phối chẳng hạn như đĩa CD, hoặc thông qua mạng như NFS, HTTP, FTP
    • virt-top: Theo dõi các thông số CPU, Memory, Network, Disk của các máy chủ đang chạy trên host
    • stap: Thu thập thông tin về hệ thống bằng cách sử dụng các đoạn mã
    • vagrant-libvirt: Plugin Vagrant để dùng libvirt để quản lí các máy ảo
    • virt-lightning: Sử dụng libvirt, cloud-init và libguestfs để cho phép mọi người triển khai nhanh một máy ảo

2.1.4. Mối quan hệ giữa libvirt, QEMU và KVM

  • libvirt là một thư viện ảo hóa bao bọc QEMU và KVM để cung cấp API cho các công cụ khác như Virt-manager hoặc Vargant
    • Vagrant sử dụng libvirt, libvirt sử dụng QEMU và KVM

2.2. virt-manager

  • virt-manager là một công cụ dòng lệnh để quản lí các máy ảo sử dụng libvirt
  • Thường được dùng để quản lí các máy ảo tạo bởi KVMs
  • Cung cấp các thông tin về miền đang chạy, hiệu năng và thống kê tài nguyên sử dụng theo thời gian thực.
  • Cung cấp các wizards cho việc tạo một domain mới, cấu hình và điều chỉnh việc phân bố tài nguyên cũng như ảo hóa phần cứng
  • Đi kèm một VNC và SPICE client để truy cập vào các máy ảo ở giao diện đồ họa
  • Các công cụ và virt-manager hỗ trợ
    • virt-install: Hỗ trợ triển khai hệ điều hành lên máy ảo
    • virt-viewer: Một giao diện đồ họa nhẹ để tương tác với giao diện đồ họa của máy ảo (Hỗ trợ VNC hoặc SPICE)
    • virt-clone: Đã nêu ở trên
    • virt-xml: Công cụ cho phép dễ dàng chỉnh sửa các file XML liên quan tới miền bằng cách dùng công cụ virt-install
    • virt-bootstrap: Công cụ cho phép thiết lập root file system cho libvirt-based containters một cách dễ dàng
  • Lab virt-manager: Đã sử dụng ở trên

2.3. webvirt

  • WebVirtMgr là một công cụ nền Web dựa trên libvirt để quản lí các máy ảo
  • Cho phép tạo và cấu hình các miền, và điều chỉnh phân bổ tài nguyên cho các miền
  • Công cụ VNC viewer được tích hợp
  • Chỉ hỗ trợ với hypervisor KVM
  • Được viết bởi Python & Django. Libvirt sử dụng Python để tương tác với hypervisor

3. Tìm hiểu về veth, namespace network

3.1. Namespace network

  • Namespaces là tính năng của Linux kernel để cô lập và ảo hóa tài nguyên hệ thống
  • Mỗi một process được liên kết với 1 namespace và chỉ có thể nhìn thấy hoặc sử dụng tài nguyên liên quan đến namespaces, và namespaces con của namespace đó nếu có
  • Mỗi process có thể có một cái nhìn độc lập về tài nguyên
  • Network namespaces ảo hóa mạng, trên mỗi network namespaces chứa duy nhất một loopback interface
  • Mỗi network interface, có duy nhất 1 namespaces và có thể di chuyển giữa các namespaces
  • Mỗi namespaces có một bộ địa chỉ IP, bảng Routing, danh sách Socket, Firewall và các nguồn tài nguyên mạng riêng
  • Khi network namespaces bị hủy, nó sẽ hủy tất cả các virtual interfaces nào bên trong nó và di chuyển bất kỳ physical interfaces nào trở lại network namespaces root

3.2. veth

  • Virtual Ethernet Interfaces (veth) là một kiến trúc theo cặp, được sử dụng để kết nối như một đường ống, các lưu lượng tới từ một đầu veth và được đưa ra, peer tới giao diện veth còn lại.
  • Có thể dùng veth để kết nối mạng trong namespace từ trong ra ngoài root namespace trên các interface vật lí của root namespace

Untitled

4. Tìm hiểu về openvswitch

4.1. Giới thiệu

  • Openvswitch (OVS) là một dự án về chuyển mạch ảo đa lớp (Multilayer)
  • Mục đích: Cung cấp lớp chuyển mạch cho môi trường ảo hóa phần cứng, trong khi hỗ trợ nhiều giao thức và tiêu chuẩn được sử dụng trong hệ thống chuyển mạch thông thường

Untitled

4.2 Hỗ trợ các tính năng

  • VLAN tagging, trunking
  • Standard Spanning Tree Protocol
  • LACP
  • Port Mirroring
  • Tunneling Protocols
  • QoS

4.3. Thành phần chính của OpenvSwitch

  • ovs-vswitchd: Thực hiện chuyển đổi các luồng chuyển mạch
  • ovsdb-server: Lightweight Database Server, cho phép ovs-vswitchd thực hiện các truy vấn đến cấu hình
  • ovs-dpctl: Công cụ để cấu hình các switch kernel module
  • ovs-vsctl: Tiện ích để truy vấn và cập nhật cấu hình ovs-vswitchd
  • ovs-appctl: Tiện ích gửi command để chạy OpenvSwitch
  • ovs-ofctl: Công cụ truy vấn và điều khiển chuyển mạch Open Flow và Controller
  • ovs-pki: Công cụ cho phép tạo và quản lí các public-key cho các Open Flow switch
  • ovs-testcontroller: Một OpenFlow controller đơn giản có thể quản lí một số switch ảo thông qua giao thức OpenFlow, khiến chúng hoạt động như các switch lớp 2 hoặc như hub. Phù hợp để kiểm tra các mạng OpenFlow ban đầu

Untitled

Untitled

5. Tìm hiểu về linux bridge

5.1. Giới thiệu

  • Linux Bridge là một soft switch, giải quyết vẫn đề ảo hóa network bên trong máy vật lí
  • Linux Bridge tạo ra các Switch Layer 2 kết nối các máy ảo (VM) để các VM đó giao tiếp được với nhau và có thể kết nối được ra mạng ngoài. Linux bridge thường sử dụng kết hợp với KVM - QEMU
  • Linux Bridge thật ra là một switch ảo và được sử dụng với ảo hóa KVM/QEMU, là một module trong kernel, sử dụng câu lệnh brctl để quản lí

5.2. Cấu trúc hệ thống

Untitled

  • Virtual Computing Device: Máy ảo VM chạy trong host server
  • Virtual NIC: Máy ảo VM có vNIC mà đóng vai trò là NIC cho máy ảo
  • Physical Switch Port: Port sử dụng cho Ethernet switch, cổng vật lí xác định bởi các port RJ45. Một port RJ45 kết nối tới port trên NIC của máy Host
  • Virtual Switch Port: Port ảo tồn tại trên Virtual Switch, cả vNIC và virtual port đều là phần mềm, nó liên kết với virtual cable kết nối vNIC

5.3. Cấu trúc và các thành phần của Linux Bridge-

Untitled

  • Các thành phần
    • Bridge: Tương đương với Switch Layer 2
    • Tap: Giao diện mạng để các VM kết nối với Bridge do Linux Bridge tạo ra (nằm trong nhân kernal, hoạt động là L2 của mô hình OSI)
    • fd (Forward Data): Chuyển tiếp dữ liệu từ máy ảo tới Bridge
  • Các tính năng
    • STP: Spanning Tree Protocol: Giao thức chống Loop gói tin trong mạng
    • VLAN: Chia switch thành các mạng LAN ảo để cô lập traffic
    • FDB: Chuyển tiếp các gói tin theo Database để nâng cao hiệu năng Switch

6. Tìm hiểu về SDN

6.1. Khái niệm

  • SDN (Software Defined Networking): Phần mềm hỗ trợ điều khiển mạng giúp tối ưu tốc độ hiệu quả.
  • Giúp doanh nghiệp có thể kiểm soát mạng và đáp ứng nhu cầu quản lí linh hoạt hơn.
  • SDN hỗ trợ quản lí lưu lượng truy cập dễ dàng
  • Các doanh nghiệp ứng dụng SDN để triển khai các ứng dụng với tốc độ nhanh chóng hơn, đồng thời giảm chi phí xây dựng và vận hành ứng dụng. IT có thể quản lí và cung cấp dịch vụ mạng tại một nơi duy nhất

6.2. Ưu điểm của SDN

  • Đơn giản hóa việc quản lí
  • Quản lý mạng tập trung
  • Tăng không gian lưu trữ và tối ưu chi phí hiệu quả
  • Hỗ trợ tạo ra mạng ảo để dùng

6.3. Nhược điểm SDN

  • Bảo mật: Do SDN tập trung dữ liệu tại một nơi nên sẽ phát sinh rủi ro bảo mật
  • Không có định nghĩa cụ thể, mô hình rất đa dạng
  • Có thể gây nhầm lẫn về SDN

6.4. Phân loại SDN

  • Open SDN: Sử dụng OpenFlow switch đơn giản. Bộ điều khiển kết nối với các thiết bị Router bằng southbound API dưới sự hỗ trợ của OpenFlow
  • SDN qua APIs: Các chức năng từ xa như switch được gọi bằng phương pháp như CLI hoặc SNMP, các thiết bị cung cấp những điểm điều khiển, cho phép bộ điều khiển kết nối và làm việc từ xa qua API
  • SDI qua Hypervisor: Trong SDN này, cấu hình của các thiết bị mạng vật lý sẽ không thay đổi. Nhưng các mạng tạo trên Hypervisor sẽ được tạo qua các mạng vật lý
  • Mạng Hyper: Sự kết hợp của mạng truyền thống với SDN thành một mạng, để tích hợp nhiều tính năng khác nhau

6.5. Kiến trúc của SDN

  • Lớp ứng dụng: Chứa các ứng dụng như tự động phát hiện sự xâm nhận trái phép, cân bằng tải và tường lửa
  • Lớp điều khiển: Chứa bộ điều khiển của SDN, đây như bộ não của mạng, cho phép trừu tượng hóa phần cứng với các ứng dụng được phát triển trên đó
  • Lớp cơ sở hạ thầng: Chứa các thiết bị Physical Switches mà tại đó, các gói dữ liệu được di chuyển
  • Các lớp này trong SDN giao tiếp với nhau thông qua
    • Northbound APIs (Giữa lớp ứng dụng & lớp điều khiển)
    • Southbound APIs (Giữa lớp điều khiển & lớp cơ sở hạ tầng)

6.6. Ứng dụng của SDN

  • DevOps: SDN giúp tự động hóa các bản cập nhật ứng dụng, mang lại sự thuận tiện cho các nền tảng và ứng dụng cho DevOps triển khai
  • Mạng của nhà cung cấp dịch vụ: Giúp các dịch vụ được đơn giản và tự động hóa, hỗ trợ việc quản lí dịch vụ
  • Campus Network: SDN cung cấp khả năng quản lí tập trung tại một nơi duy nhất và tự động hóa, giúp cải thiện chất lượng dịch vụ của ứng dụng
  • Bảo mật trung tâm dữ liệu: Giúp đơn giản hóa việc quản trị tường lửa, tăng cường bảo mật cho trung tâm dữ liệu

7. CPU giữa máy thật và máy ảo

7.1. Cách CPU tương tác với phần cứng

7.1.1. Trên máy vật lí

  • CPU tương tác với các phần cứng khác thông qua các giao diện (interfaces) và bus.
  • Sử dụng một system bus để truyền dữ liệu giữa CPU và các phần cứng khác
  • CPU cũng giao tiếp với memory qua các memory bus, lấy và lưu trữ thông tin.
  • CPU còn giao tiếp với các card đồ họa, card âm thanh hay card mạng thông qua các interfaces được chuyên môn hóa như PCIe hay USB, cho phép tương tác liền mạch

Untitled

  • Kiến trúc Bus: Con đường truyền thông tin
    • Thông tin giữa CPU và các thành phần khác được thiết lập thông qua kiến trúc bus
    • Một bus là một đường đi cho phép truyền dữ liệu, kiểm soát tín hiệu, và địa chỉ giữa các thành phần phần cứng khác nhau.
    • Có 3 loại bus chính
      • Data bus:
        • Chịu trách nhiệm để truyền dữ liệu giữa CPU và memory cũng như các thiết bị ngoại vi
        • Mang theo thông tin cần được xử lí hay lưu trữ
        • Độ rộng của Data bus xác định lượng dữ liệu có thể truyền đi trong một thời gian
      • Address bus
        • Được sử dụng bởi CPU để xác định vị trí của memory hay các thiết bị ngoại vi nơi mà dữ liệu cần được lấy hoặc lưu trữ.
        • Nó mang theo đại chỉ bộ nhớ hoặc địa chỉ thiết bị
        • Độ rộng của bus xác định vùng nhớ tối đa có thể đánh địa chỉ
      • Control bus
        • Mang theo các tín hiệu điều khiển liên quan tới hoạt động của nhiều thành phần khác nhau
        • Bao gồm các tín hiệu như: read, write, interrupt, clock và reset
        • Cho phép đồng bộ các hành động cũng như đảm bảo việc hoạt động chính xác giữa CPU và các thành phần khác
  • Giao diện Memory: Truy cập dữ liệu
    • Một trong những công việc quan trọng của CPU là truy cập và truyền dữ liệu từ memory
    • Memory Interface cho phép CPU đọc và ghi dữ liệu với memory, điều quan trọng trong việc thực thi các tập lệnh cũng như lưu trữ các dữ liệu tạm thời hoặc vĩnh viễn.
    • Giao diện Memory chứa các thành phần đa dạng như memory controller, cache, memory modules.
      • Memory Controller hoạt đọng như một cầu nối giữa CPU và Memory, quản lí việc truyền dữ liệu & địa chỉ
      • Cache: Bộ nhớ nhỏ nhưng tốc độ nhanh, chứa các dữ liệu thường xuyên được truy cập
      • Memory Module: RAM và ROM: Cung cấp bộ nhớ dành cho dữ liệu và các tệp hướng dẫn
    • Khi CPU cần truy cập dữ liệu từ memory,
      • Nó gửi địa chỉ memory thông qua address bus
      • Memory Controller giải mã địa chỉ và truy cập data dựa vào vị trí cụ thể của bộ nhớ
      • Memory Interface đóng vai trò quan trọng trong tốc độ và hiệu suất tổng thể của hệ thống
  • Thao tác vào/ra: Tương tác với các thiết bị ngoại vi
    • CPU giao tiếp với các thiết bị ngoại vi thông qua các hoạt động vào ra
      • Các thiết bị ngoại vi bao gồm bàn phím, chuột, màn hình, máy in và thiết bị lưu trữ.
      • Các thiết bị là cơ bản cho việc tương tác với người dùng và lưu trữ thông tin
    • Để thực hiện thao tác vào/ra. CPU sử dụng tập lệnh I/O và các cổng I/O đặc biệt
      • Tập lệnh được dùng để gửi các tín hiệu điều khiển và truyền dữ liệu giữa CPU và thiết bị
      • Các cổng I/O hoạt động như một giao diện giữa CPU và thiết bị ngoại vi, cho phép trao đổi thông tin
    • CPU có thể giao tiếp với các thiết bị ngoại vi bằng
      • Chế độ I/O được lập trình:
        • CPU xử lí việc truyền data bằng việc đọc và ghi thường xuyên vào các cổng I/O
      • Chế độ truy cập bộ nhớ trực tiếp (DMA)
        • CPU giao việc vận chuyển cho một bộ xử lí DMA, nơi có thể truy cập memory trực tiếp và truyền giữa liệu giữa CPU và thiết bị ngoại vi mà không cần sự can thiệp từ CPU
        • Thích hợp cho việc truyền dữ liệu tốc độ cao
  • Thanh ngắt: Xử lí các sự kiện không đồng bộ
    • Thanh ngắt đóng vai trò quan trọng trong giao tiếp giữa CPU với các thành phần khác bằng cách xử lí các sự kiện không đồng bộ.
    • Một thanh ngắt là một tín hiệu ngưng việc thực thi bình thường của CPU và chuyển hướng chúng tới một sự kiện hoặc điều kiện cụ thể
    • Có nhiều loại ngắt:
      • Hardware interrupts: Được khởi tạo bởi một thiết bị gắn ngoài để yêu cầu sự chú ý của CPU
        • Ví dụ: Khi một phím trên bàn phím được bấm, nó tạo ra một Hardware interrupts
      • Software interrupts: Được khởi tạo bởi phần mềm để thực thi một tính năng cụ thể
      • Exception interrupts: Được khởi tạo để xử lí ngoại lệ như vi phạm truy cập bộ nhớ hoặc chia cho 0
    • Khi một sự kiện ngắt xảy ra
      • CPU tạm ngưng và lưu lại trạng thái hiện tại
      • Xử lí việc ngắt bằng cách kích hoạt một ISR - Interrupt service routine.
      • ISR là một routine đặc biệt được thiết kế để xử lí việc ngắt và thực thi các hành động cần thiết
      • Khi ISR hoàn thành, CPU khởi chạy lại trình tự thực hiện bình thường nơi mà nó vừa dừng lại
    • Ngắt là yếu tố quan trọng để xử lí các sự kiện liên quan tới thời gian, thực hiện các hoạt động vào/ra, và đảm bảo hệ thống hoạt đồng bình thường
    • Ngắt cho phép CPU có thể xử lí đa tác vụ và phản hồi lại nhanh

7.1.2. Trên máy ảo (Virtual Machine)

  • CPU trong hệ thống ảo hóa được gọi là vCPU
  • Hypervisor sẽ sử dụng một phần của CPU vật lí và chia cho một vCPU được gán vào một máy ảo cụ thể
  • Nhà quản trị có thể thông qua Hypervisor để phân phối các tài nguyên cho các máy ảo được cấu hình với các số lượng vCPU khác nhau
  • Công thức tính số vCPU
    • (Threads x Cores) x Physical CPU = Number vCPU
  • Mỗi vCPU được thể hiện qua một processor thread trên CPU vật lí
    • Ví dụ: 1 VM được gán 4 vCPUs, tức là nó có thể chạy 4 threads một lúc
  • Hệ thống ảo hóa hiện đại không gán vĩnh viễn một vCPU vào một CPU vật lí, hệ thống tiếp nhận các threads tới từ VM và chia sẻ chúng vào các cores của CPU vật lí trên cơ chế chia sẻ thời gian, điều này cho phép sử dụng tối ưu hơn
  • Đa phần CPU của Server hiện đại có thể chạy được 2 threads trên mỗi CPU core nếu hỗ trợ multithreading hoặc hyperthreading.
    • Mỗi vCPU sẽ thể hiện một nửa khả năng tính toán của 1 core vật lí

7.2. CPU Numa

  • Truy cập bộ nhớ không đồng nhất (Non-uniform Memory Access - NUMA)
  • Một cách thiết kế bộ nhớ máy tính trong lĩnh vực đa xử lí, trong đó thời gian truy cập bộ nhớ phụ thuộc vào vị trí tương đối của bộ nhớ so với bộ vi xử lí (CPU)
  • Với Numa, một bộ vi xử lí có thể truy cập bộ nhớ cục bộ của mình nhanh hơn các bộ nhớ khác (Bộ nhớ của các vi xử lí khác, bộ nhớ chung chia sẻ giữa các bộ vi xử lí)
  • Numa cung cấp một giải pháp cho vấn đề này bằng cách cung cấp bộ nhớ riêng cho mỗi vi xử lí, tránh việc giảm hiệu suất khi nhiều bộ vi xử lí cùng truy cập một địa chỉ nhớ
  • NUMA là một dạng gắn kết chặt chẽ hơn của cụm máy tính
    • Chỉ cần hỗ trợ thêm “bộ nhớ ảo” trong một kiến trúc cụm máy tính là ta có thể hoàn toàn cài đặt giao thức giống như NUMA chỉ bằng phần mềm
    • Nếu chỉ hỗ trợ bằng phần mềm thì tốc độ trao đổi sẽ chậm hơn rất nhiều so với việc hỗ trợ NUMA thông qua phần cứng

7.3. CPU Pining

7.3.1. Giới thiệu

  • CPU Pinning cho phép gán CPU ảo của máy ảo vào một hay nhiều nhân của CPU vật lí được chỉ định
  • Cho phép kiểm soát tài nguyên và hiệu năng tốt hơn

7.3.2. Tác dụng

  • CPU pinning đảm bảo việc thực thi của VM bị giới hạn trong các lõi, và luồng CPU được chỉ định
  • Ngăn chặn việc phân phối tài nguyên động trên các core vật lí khác nhau.
  • Hữu ích với những công việc cần độ trễ thấp hoặc các ứng dụng cần tài nguyên CPU chuyên dụng

7.3.3. Lab

  • Cấu hình máy vật lí

Untitled

Untitled

  • Xác định kiến trúc CPU và NUMA
    • Cho biết có bao nhiêu sockets, cores và hyperthreads đang được đính vào host
virsh nodeinfo
  • Có 4 CPUs
  • 4 Sockets
  • 1 Core/Socket

Untitled

  • Xác định kiến trúc chi tiết hơn
    • Cho thấy hệ thống có 1 NUMA nodes, 4 CPU
    • Ta thấy cell id = 0, có các CPU 0, 1, 2, 3
virsh capabilities

Screenshot 2024-05-06 at 13.24.12.png

  • Xác định Numa Cell nào còn trống để mapping guest vào
    • Ở đây chỉ có 1 NUMA Cell với tổng dung lượng 16GB
    • Trong trường hợp có nhiều NUMA Cell thì cần lựa chọn Cell nào có dung lượng > RAM của máy ảo
virsh freecell

Untitled

  • Tắt máy ảo, mở file cấu hình
virsh edit + <domain name>

Untitled

  • Tại đây chúng ta có thể thấy dòng
<vcpu placement='static'>2</vcpu>

Máy ảo đang được cấp 2 vcpus

  • Tiến hành Pinning CPU ID 2,3 vào bằng tham số cpuset
<vcpu placement='static' cpuset='2,3'>2</vcpu>

Untitled

  • Khởi chạy máy ảo, cài công cụ Stress

Untitled

  • Khởi chạy công cụ Stress CPU
stress -c 100

Untitled

  • Kết quả thu được
    • Do đã Pin CPU 3,4 (ID = 2,3) vào máy ảo, nên khi máy ảo Stress Test (CPU = 100%). Thì trên máy vật lí chỉ CPU3 & CPU4 đạt ngưỡng 100%

8. Spice

8.1. Giới thiệu

  • Spice là một giải pháp để điều khiển máy tính từ xa, cho phép client có thể truy cập và điều hiển từ xa các thiết bị (Bàn phím, chuột, âm thanh).
  • Mục đích chính là kết nối vào các máy ảo
  • Cấu trúc cơ bản của Spice là
    • Spice Server
    • Spice Client
    • Spice Protocol

8.2. Thành phần cơ bản của Spice

8.2.1. Spice Server

  • Spice server được triển khai ở libspice, một thư viện VDI
  • QEMU sử dụng spice-server để cung cấp giải pháp điều khiển từ xa máy ảo qua giao thức Spice
  • Giao diện thiết bị ảo (Virtual Device Interface - VDI) xác định một tập hợp các giao diện có thể định nghĩa một tiêu chuẩn để đưa các thiết bị ảo (Màn hình, chuột, bàn phím) và kích hoạt các thành phần Spice khác nhau để tương tác với các thiết bị đó.
  • Server giao tiếp với client qua giao thức Spice và đồng thời cũng tương tác với VDI host (Như QEMU)

8.2.2. Spice Client

  • Spice Client là chương trình được sử dụng bởi người dùng cuối để truy cập vào hệ thống từ xa qua Spice
  • Client phổ biến nhất là remote-viewer (Đi kèm với virt-viewer)
  • GNOME Box cũng có thể dùng như một Spice client

8.2.3. QXL Device và Drivers

  • Spice server hỗ trợ QXL VDI interface
  • Khi libspice được sử dụng với QEMU, một thiết bị video PCI có thể được sử dụng để cải thiện hiệu năng hiển thị và tăng cường khả năng đồ họa của hệ điều hành khách
  • Thiết bị video này được gọi là QXL và cần phải có drivers QXL trên máy khách để có thể hoạt động đầy đủ chức năng.
  • Nếu không có driver thì chỉ hỗ trợ ở mức VGA bình thường

8.2.4. Spice Agent

  • Spice Agent là một thành phần tùy chọn để tăng cường trải nghiệm người dùng và cung cấp giải pháp quản lí công việc hướng máy khách
  • Ví dụ, cho phép di chuyển con trỏ chuột tự do từ máy ảo và máy thật, hay cho phép Copy và Paste giữa hai máy

8.2.5. VDI Port Device

  • Hỗ trợ một kênh giao tiếp giữa client và agent ở phía server
  • Khi dùng QEMU, Spice Agent được cài đặt ở máy guest
  • VDI Port là một thiết bị QEMU PCI được dùng để giao tiếp với Agent

8.2.6. Giao thức Spice

  • Giao thức Spice định nghĩa các thông điệp và quy tắc để giao tiếp giữa các thành phần của Spice

8.3. Các tính năng

  • Đa kênh
    • Server và Client giao tiếp qua các kênh
    • Mỗi kênh được thiết kế cho một loại dữ liệu cụ thể
  • Nén ảnh: Sử dụng thuật toán SFALIC hoặc Lempel-Ziv
  • Nén video: M-JPEG
  • Chế độ chuột
    • Server Mouse
      • User click chuột vào cử sổ Spice, con trỏ chuột sẽ được chụp lại và cài đặt vô hình
      • Ở chế độ này server điều khiển chuột trên màn hình
      • Có thể có vấn đề nếu con trỏ chuột có thể có độ trễ
    • Client Mouse
      • VDI host application phải đăng kí một thiết bị trỏ chính xác
      • Thích hợp với những môi trường có độ trễ
      • Tuy nhiên con trỏ có thể bị mất tính đồng bộ trong một thời gian
  • Các tính năng khác
    • Hỗ trợ đa màn hình
    • Độ phân giải bất kì
    • Chuyển hướng USB, Smart Card
    • Âm thanh 2 chiều
    • Lip-sync
    • Migration
    • Pixmap and Palette caching

9. lstopo

  • Ubuntu VM on VMWare Fusion

Untitled

  • Tổng quan hệ thống
    • Có một NUMA Mode với tổng bộ nhớ là 5881 MB
    • Trong node có 2 package đại diện cho các bộ xử lý (CPU) trên hệ thống là L#0 và L#1
      • Mỗi package có một hệ thống Cache riêng, bao gồm L3 (12MB), L2 (256KB), L1d (32KB), và L1i (32KB).
      • Mỗi package đều có 1 core: Core L#0 and Core L#1.
        • Core L#0 chứa đơn vị xử lí L#0 P#0.
        • Core L#1 chứa đơn vị xử lí L#1 P#1.
  • Thiết bị PCI
    • PCI 00:07.1 được link tới Block fd0 (0 MB)
    • PCI 00:0f.0 không được kết nối tới Block hay thiết bị mạng nào
    • PCI 00:10.0 được kết nối tới Block sda (128GB)
    • PCI 02:01.0 được kết nối tới card mạng ens33
    • PCI 02:04.0 được kết nối tới 2 blocks
      • Block sr0 (151 MB dung lượng)
      • block sr1 (4784 MB dung lượng)

Share this article

Related Posts