Môi trường Cloud cá nhân với LXD
Phần mềm nguồn mở cho điện toán đám mây đã trở nên đơn giản và phổ biến đến mức người dùng bình thường cũng có thể sở hữu cả một hệ thống cloud cá nhân tại nhà. Trong ảnh dưới đây là hệ thống “điện toán đám mây” chạy trong phòng ngủ nhà mình. Bài viết này giới thiệu cách mình cài đặt hệ thống cloud trên phần cứng lỗi thời sử dụng công nghệ quản lý container và máy ảo LXD trên Ubuntu Linux.

Phần cứng
Mình có một số máy tính mini mình mua qua nhiều năm phục vụ công việc. Mỗi máy tính có tuổi thọ phần cứng và tuổi thọ công nghệ khoảng 5 năm nên mình thường hay mua mới sau 5 năm. Tuy vậy máy tính mini dùng nhẹ nhàng gần như rất khó hỏng, thành ra sau 5 năm mình có một số máy tính vẫn chạy. Sau khi thanh lọc và vứt bớt các máy đã hỏng hay lỗi thời, mình còn danh sách máy như sau.
- Intel NUC 8: 512G SSD, 32G DDR4, Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz. Máy tính này mình mua 2020, đã chạy bền bỉ được hơn 6 năm.
- Geekom A6. 1T SSD, 32G DDR5, AMD Ryzen 7 6800H with Radeon Graphics. Máy này mình mua từ chợ đồ cũ, năm 2025.
- GMKTek K10 Mini. 1T SSD, 64G DDR5, 13th Gen Intel(R) Core(TM) i9-13900HK. Máy này mình mua Christmas 2025 do lo sợ giá Memory tăng cao.
- MikroTik hEX Router. Router này mình mua tháng 4 năm 2019 để học Network mà chưa bao giờ có thời gian để học.
Một điểm khá thú vị của các máy tính trên là máy nào cũng có 2 card mạng (NIC): một NIC Wi-Fi và một NIC Ethernet. Vì vậy, mình có thể dành NIC Wi-Fi cho mục đích quản lý, còn NIC Ethernet cho mạng của máy ảo và LXD.
Với hệ thống máy tính mini trên, mình đã cài hệ thống cloud cá nhân dùng LXD.
Cài đặt LXD Cloud Cluster
Thật sự việc cài đặt LXD cluster là việc rất đơn giản. Mình thấy tài liệu cài cluster LXD khá là đơn giản và dễ hiểu. Mình làm theo tài liệu và có ngay một cluster chạy LXD.
Kết quả sau khi cài LXD cloud.
$ lxc cluster list
+-------+-----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| NAME | URL | ROLES | ARCHITECTURE | FAILURE DOMAIN | DESCRIPTION | STATE | MESSAGE |
+-------+-----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| A6 | https://10.145.223.98:8443 | database | x86_64 | default | | ONLINE | Fully operational |
+-------+-----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| K10 | https://10.145.223.100:8443 | database-leader | x86_64 | default | | ONLINE | Fully operational |
| | | database | | | | | |
+-------+-----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| nuke8 | https://10.145.223.99:8443 | database | x86_64 | default | | ONLINE | Fully operational |
+-------+-----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
Tuy vậy, mình thấy phần cài đặt mạng ảo để các VM có thể nói chuyện với nhau thông qua network vật lý khá phức tạp. Bản thân tài liệu OVN trên LXD cũng khá sơ sài, đòi hỏi người dùng phải hiểu OVN và cách LXD dùng OVN trước khi có thể cài đặt và sử dụng được. Mình sẽ tập trung phần sau của blog này giải thích chi tiết hơn về cách cài đặt công nghệ mạng ảo OVN này.
Cài đặt OVN Network
Cài đặt MicroOVN
OVN đã trở thành công nghệ mạng ảo mặc định trong nhiều phần mềm cloud nguồn mở, nên mình dùng OVN để cài đặt mạng ảo cho LXD cloud của mình. OVN bao gồm controller quản lý logic mạng và Open vSwitch, phần mềm quản lý switch ảo trên Linux. OVN controller và vSwitch cần được cài đặt trên tất cả các máy trong cluster. May mắn là Canonical cung cấp MicroOVN, một gói snap giúp đơn giản hóa việc cài đặt và quản lý OVN cluster.
Việc cài đặt OVN cluster trở nên đơn giản với các bước như sau.
# Bootstrap ở máy K10 và thêm máy A6 và nuke8 vào cluster.
# Câu lệnh "add" sẽ đưa ra 1 token cho phép microovn ở máy A6/Nuke8 tham gia cluster.
sudo snap install microovn
sudo microovn cluster bootstrap
sudo microovn add A6
sudo microovn add nuke8
sudo microovn cluster list
# chạy câu lệnh join ở máy A6
sudo microovn cluster join <a6_token>
# chạy câu lệnh join ở máy nuke8
sudo microovn cluster join <nuke8_token>
sudo microovn cluster list
+-------+---------------------+-------+------------------------------------------------------------------+--------+
| NAME | ADDRESS | ROLE | FINGERPRINT | STATUS |
+-------+---------------------+-------+------------------------------------------------------------------+--------+
| A6 | 10.145.223.98:6686 | voter | 7be8bcd0052880c079fc252791001201cc0b18a54893741174272c3e3573ea66 | ONLINE |
+-------+---------------------+-------+------------------------------------------------------------------+--------+
| K10 | 10.145.223.100:6686 | voter | 8d98dfc874ff2a92d9706c6d009d2bde0667a819b709a7fb505db56e198d2d6f | ONLINE |
+-------+---------------------+-------+------------------------------------------------------------------+--------+
| nuke8 | 10.145.223.99:6686 | voter | 12ad418daa4cfef9975b3f6b0404f8ad2f1341711246da751401ed9593347f28 | ONLINE |
+-------+---------------------+-------+------------------------------------------------------------------+--------+
Sau khi cài đặt và thiết lập MicroOVN, MicroOVN sẽ chạy các chương trình sau: ovn-chassis quản lý mạng vật lý ở từng máy, ovn-northd quản lý logic của mạng, ovn-ovsdb (nb / sb) là cơ sở dữ liệu lưu trữ cấu trúc mạng logic và mạng vật lý ở tầng Open vSwitch, và cuối cùng là ovs-vswitchd quản lý switch ảo.
sudo snap services microovn
Service Startup Current Notes
microovn.chassis enabled active -
microovn.daemon enabled active -
microovn.ovn-northd enabled active -
microovn.ovn-ovsdb-server-nb enabled active -
microovn.ovn-ovsdb-server-sb enabled active -
microovn.refresh-expiring-certs enabled inactive timer-activated
microovn.switch enabled active -
Cấu hình LXD sử dụng MicroOVN

Cho đến bước này, ta đã có LXD cluster giúp quản lý VM hay container và MicroOVN cluster giúp quản lý mạng ảo. Bước quan trọng tiếp theo là cấu hình LXD để LXD sử dụng MicroOVN để quản lý mạng ảo. Đến đây mình nghĩ mình cần dành thời gian để giải thích cấu trúc mạng ảo này một chút. Nhớ rằng mỗi máy có 2 NIC: 1 NIC Wi-Fi và 1 NIC Ethernet. NIC Wi-Fi dùng để quản lý máy vật lý (A6, K10, nuke8), chẳng hạn cập nhật phần mềm. NIC Ethernet còn lại được dùng với 2 mục đích:
- Để các phần mềm ở tầng quản lý (LXD Cluster, MicroOVN cluster) nói chuyện với nhau.
- Để các máy ảo chạy ở các máy khác nhau nói chuyện khác nhau.
Do chỉ có 1 NIC cho 2 mục đích, mình dùng VLAN để chia NIC này ra. Mạng với VLAN ID 0, hay không có VLAN tag, sẽ được dùng cho phần mềm quản lý. Mạng với VLAN ID 30 sẽ được dùng bởi mạng ảo OVN. Mình cấu hình mạng vật lý sử dụng netplan như sau. eno1 là NIC Ethernet sẽ có IP static ở mạng 10.145.223.0/24. Mạng cho máy ảo sẽ được tag với VLAN ID 30 sử dụng cùng NIC eno1.
network:
version: 2
ethernets:
eno1:
dhcp4: false
addresses: [ 10.145.223.98/24 ]
vlans:
vlan30:
accept-ra: no
id: 30
link: eno1
Với cài đặt như này, Linux sẽ giả lập thêm 1 NIC nữa, như thể hệ thống có 2 NIC: một NIC tên là eno1 và một NIC tên là vlan30.
ip l | grep eno1
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
4: vlan30@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP mode DEFAULT group default qlen 1000
Sau khi đã có 1 NIC chuyên cho mạng ảo, việc cài đặt LXD dùng mạng ảo này đơn giản là việc tạo một mạng ảo chung mới ở tất cả các máy vật lý sử dụng NIC ảo này. Mình dùng câu lệnh dưới đây để tạo một mạng vật lý tên là UPLINK dựa trên NIC vlan30 ở tất cả các máy và chỉ định dải IP của mạng này.
lxc network create UPLINK --type=physical parent=vlan30 --target=K10
lxc network create UPLINK --type=physical parent=vlan30 --target=A6
lxc network create UPLINK --type=physical parent=vlan30 --target=nuke8
lxc network create UPLINK --type=physical ipv4.ovn.ranges=10.2.230.10-10.2.230.100 ipv4.gateway=10.2.230.1/24 dns.nameservers=10.2.230.1
lxc config set network.ovn.northbound_connection ssl:10.145.223.98:6641,ssl:10.145.223.99:6641,ssl:10.145.223.100:6641
Câu lệnh trên nghĩa là: mạng UPLINK sẽ dùng vlan30. Mạng này có dải IP 10.2.230.0/24.
Với cấu hình này, các máy ảo trên LXD cloud sẽ có IP trong dải 10.2.230.0/24 và sẽ được vSwitch đưa ra mạng vật lý qua NIC vlan30. Gói tin đi qua vlan30 sẽ được tag với ID=30 trước khi đưa lên router MikroTik hEX xử lý.
Cài đặt routing ở MikroTik hEX
Cho đến bước này, gói tin từ một máy ảo sẽ đi theo con đường như sau (giả định VM1 là máy ảo chạy trên A6 và muốn gửi đến VM2 trên nuke8).
VM1 --> A6 Open vSwitch --> A6 route qua vlan30 (vật lý). Linux sẽ tag gói tin với VID=30 --> MikroTik hEX -->
nuke8 vlan30 (Linux bóc VID=30 khỏi gói tin) --> nuke8 Open vSwitch --> VM2
Do vậy bước cuối cùng là tag các port của MikroTik hEX với VLAN30 để router này biết các port có thể nhận cả gói tin của VLAN30 lẫn VLAN0. VLAN0 là mặc định, nên thật sự bước cuối cùng là tag VLAN30 vào tất cả các port. Điều này có thể dễ dàng thực hiện với câu lệnh sau:
Tagged VLAN-ID 30 for ethernet ports 2, 3, 4
# Tagged all ports
/interface/bridge/vlan/add bridge=bridge vlan-ids=30 tagged=ether2,ether3,ether4 comment="VLAN 30 for OVN"
/interface/vlan/add name=vlan30 vlan-id=30 interface=bridge comment="Router VLAN"
/ip/address/add address=10.2.230.1/24 network=10.2.230.0 interface=vlan30 comment="VLAN addresses for OVN UPLINK"
# Open the VLAN network to upstream access
# This rule needs to have a higher order than the drop rule:
# 6 ;;; defconf: drop all not coming from LAN
# chain=input action=drop in-interface-list=!LAN
/ip/firewall/filter/add chain=forward action=accept src-address=192.168.0.0/24 dst-address=10.2.230.0/24 log=no log-prefix=""
Cấu hình LXD UI và sử dụng Cloud
Đến bước này gần như bạn đã có một hệ thống cloud hoàn chỉnh. Các bước còn lại đơn giản chỉ là bật UI của LXD và tạo mạng ảo OVN cho VM.
Bật UI cho LXD đơn giản là việc chạy câu lệnh sau ở tất cả các máy vật lý.
# Run in both K10, A6, nuke8
lxc config set core.https_address :8443
sudo systemctl start keepalived
ip l show wlo1 # 192.168.0.160 as the VIP
Ở đây mình chọn IP 192.168.0.160 làm VIP cho UI của cloud nội bộ này. IP này không gì hơn là 1 địa chỉ IP trong mạng Wi-Fi nhà mình. Máy vật lý (A6, nuke8, K10), ngoài địa chỉ IP trên dải Wi-Fi 192.168.0.0/24, sẽ có thể có thêm VIP này, chỉ để mình truy cập UI của LXD dễ hơn. Tài liệu LXD viết rất rõ ràng và dễ hiểu về bước này.
Sau bước này, bạn có thể truy cập cloud này qua địa chỉ: https://192.168.0.160:8443/ui/project/default

Sử dụng UPLINK cho mạng ảo OVN cũng đơn giản: tạo một mạng OVN và chỉ định uplink như trong tài liệu.
lxc network create ovntest --type=ovn network=UPLINK
lxc init ubuntu:24.04 c1
lxc config device override c1 eth0 network=ovntest
lxc start c1
lxc init ubuntu:24.04 c2
lxc config device override c2 eth0 network=ovntest
lxc start c2
Mạng ovntest sẽ có một dải IP ngẫu nhiên. Các máy trong dải IP này sẽ nói chuyện với nhau thông qua OVN tunnel. Máy ảo cũng có thể truy cập internet bằng cách NAT thông qua network 10.2.230.0/24.
Tổng kết
Việc cài đặt có thể hơi “phức tạp” nhưng thực chất là cấu trúc khá cơ bản trong cloud nội bộ ở doanh nghiệp vừa và nhỏ. Nếu như hơn 10 năm trước cloud computing là công nghệ gần như chỉ dành cho Big Tech hay các doanh nghiệp lớn, thì bây giờ cloud nguồn mở đã thật sự đủ trưởng thành và ổn định để người dùng phổ thông với phần cứng cũ cũng có thể có cloud computing ở trong nhà. Mình thấy đầu tư một máy tính mini và sử dụng phần mềm cloud nguồn mở là giải pháp tiết kiệm chi phí hơn rất nhiều so với subscription cloud.