Trong môi trường home lab, một trong những rủi ro thường trực là làm thế nào để tắt các server một cách an toàn và nhẹ nhàng khi xảy ra sự cố mất điện đột ngột. Việc trang bị một bộ lưu điện (UPS) là giải pháp thiết yếu giúp bạn tránh mất dữ liệu khi nguồn điện bị cắt. Tuy nhiên, hầu hết các mẫu UPS phổ biến chỉ cung cấp một cổng kết nối USB để gửi tín hiệu tắt nguồn, trong khi hệ thống home lab của bạn có thể bao gồm nhiều thiết bị cần được bảo vệ đồng thời.
Đặc biệt, nếu bạn đang vận hành các hypervisor như Proxmox, việc tắt nhiều máy ảo (VMs) cùng lúc càng trở nên phức tạp. Đây là vấn đề mà hầu hết những người đam mê home lab đều phải đối mặt. May mắn thay, một công cụ đã ra đời để giải quyết triệt để thách thức này: Network UPS Tools (NUT). NUT hoạt động như một “vị cứu tinh” cho hệ thống home lab dựa trên Proxmox của tôi, cho phép giám sát tín hiệu tắt nguồn từ UPS và phát đi lệnh tắt nguồn tới tất cả các thiết bị được kết nối.
Network UPS Tools (NUT) Là Gì Và Tại Sao Bạn Nên Sử Dụng?
Đảm Bảo Thiết Bị Tắt Nguồn An Toàn, Tránh Mất Dữ Liệu
Home lab không có khả năng tiếp cận các nguồn điện dự phòng và hệ thống dự phòng phức tạp như các trung tâm dữ liệu chuyên nghiệp. Do đó, việc sở hữu một bộ lưu điện (UPS) dùng pin là vô cùng cần thiết để ngăn ngừa mất dữ liệu khi nguồn điện tại nhà gặp sự cố. Nếu bạn chỉ có một server hoặc một máy chủ ảo hóa, cổng USB tín hiệu đơn lẻ trên hầu hết các mẫu UPS sẽ hoạt động tốt. Tuy nhiên, nếu bạn sở hữu nhiều máy chủ ảo hóa hoặc các thiết bị khác, bạn cần một phương thức để gửi tín hiệu tắt nguồn tới tất cả các thiết bị này.
Đây chính là lúc Network UPS Tools (NUT) phát huy tác dụng. NUT hoạt động theo mô hình server-client (máy chủ-máy khách), trong đó máy chủ NUT chạy trên thiết bị được kết nối qua USB với UPS, và các client NUT được cài đặt trên tất cả các thiết bị khác trong hệ thống của bạn (bao gồm cả thiết bị đang chạy server NUT). Điều này có nghĩa là khi nguồn điện bị ngắt và UPS bắt đầu hoạt động, đến khi pin UPS gần cạn, nó sẽ gửi lệnh tắt nguồn qua USB. Server NUT sẽ nhận lệnh này và truyền tải nó tới tất cả các client, đảm bảo mọi thứ được tắt đúng cách trước khi bạn mất dữ liệu.
Mặc dù việc thiết lập NUT có thể không phải là đơn giản nhất và đòi hỏi bạn phải làm quen với việc chỉnh sửa các file cấu hình, nhưng kết quả cuối cùng hoàn toàn xứng đáng với công sức bỏ ra. Ngoài ra, NUT còn có một add-on tích hợp cho Home Assistant, giúp bạn dễ dàng giám sát trạng thái của UPS, một tính năng được cộng đồng công nghệ rất ưa chuộng.
Hướng Dẫn Cài Đặt và Cấu Hình NUT Trên Server Proxmox
Vì tôi chọn cài đặt NUT server trực tiếp trên máy chủ Proxmox, chúng ta cần xác định cổng USB mà UPS đang kết nối.
Xác Định Cổng USB Của UPS Trên Proxmox
Đầu tiên, hãy truy cập vào node PVE và chuyển sang tab Shell để sử dụng giao diện dòng lệnh (CLI). Sử dụng lệnh lsusb
để liệt kê tất cả các thiết bị USB được kết nối. Sau khi xác định được chi tiết [bus] : [device]
của UPS (ví dụ của tôi là 3:2
), chúng ta sẽ dùng lệnh lsusb -v -s 3:2
để xem thông tin chi tiết về UPS.
Màn hình Proxmox hiển thị kết quả lệnh lsusb, giúp xác định cổng USB của UPS
Cài Đặt NUT
Tiếp theo, tiến hành cài đặt NUT bằng lệnh:
apt install nut -y
Sau khi quá trình cài đặt hoàn tất, chúng ta cần chạy trình quét NUT để thu thập thông tin cần thiết cho các file cấu hình sắp tới:
nut-scanner -U
Chi Tiết Cấu Hình Các File Quan Trọng Của NUT
Chúng ta sẽ cần chỉnh sửa bảy file để hệ thống hoạt động, cùng với một vài lệnh cuối cùng để thay đổi ngưỡng phần trăm pin kích hoạt tắt nguồn.
-
/etc/nut/nut.conf
- Đầu tiên, tạo một bản sao lưu:
cp /etc/nut/nut.conf /etc/nut/nut.example.conf
- Mở file bằng bất kỳ trình soạn thảo văn bản nào:
nano /etc/nut/nut.conf
- Bạn sẽ thấy dòng
MODE=none
là dòng duy nhất không bị chú thích. Hãy thay đổi thànhMODE=netserver
, sau đó lưu và thoát.
- Đầu tiên, tạo một bản sao lưu:
-
/etc/nut/ups.conf
- Tạo bản sao lưu dự phòng:
cp /etc/nut/ups.conf /etc/nut/ups.example.conf
- Mở file để chỉnh sửa:
nano /etc/nut/ups.conf
- Xóa tất cả nội dung hiện có và thêm vào:
pollinterval = 15 maxretry = 3 offdelay = 120 ondelay = 240
- Và thêm các kết quả từ
nut-scanner
của bạn (ví dụ cho APC):[apc] # APC Back-UPS BGM1500 driver = usbhid-ups port = auto desc = "APC Back-UPS BGM1500" vendorid = 051D productid = 0002 serial = xxxxxxxxxxxx
- Lưu file, sau đó kiểm tra để đảm bảo không có lỗi và hiển thị một subdriver:
upsdrvctl start
- Tạo bản sao lưu dự phòng:
-
/etc/nut/upsd.conf
- Sao lưu file cấu hình:
cp /etc/nut/upsd.conf /etc/nut/upsd.example.conf
- Tiến hành chỉnh sửa:
nano /etc/nut/upsd.conf
- Xóa nội dung và thay thế bằng:
LISTEN 0.0.0.0 3493 LISTEN :: 3493
- Để server sẽ lắng nghe tất cả các mạng.
- Sao lưu file cấu hình:
-
/etc/nut/upsd.users
-
Sao lưu file cấu hình như trước:
cp /etc/nut/upsd.users /etc/nut/upsd.example.users
-
Mở bằng trình soạn thảo yêu thích của bạn:
nano /etc/nut/upsd.users
-
Chỉnh sửa và đặt mật khẩu riêng của bạn:
[upsadmin] # Administrative user password = ******** # Allow changing values of certain variables in the UPS. actions = SET # Allow setting the "Forced Shutdown" flag in the UPS. actions = FSD # Allow all instant commands instcmds = ALL upsmon master [upsuser] # Normal user password = ******** upsmon slave
-
-
/etc/nut/upsmon.conf
-
Sao lưu file:
cp /etc/nut/upsmon.conf /etc/nut/upsmon.example.conf
-
Sau đó chỉnh sửa bằng bất kỳ trình soạn thảo nào và thay thế nội dung (bao gồm mật khẩu quản trị của bạn):
RUN_AS_USER root MONITOR apc@localhost 1 upsadmin ******* master MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h" NOTIFYCMD /usr/sbin/upssched POLLFREQ 4 POLLFREQALERT 2 HOSTSYNC 15 DEADTIME 24 MAXAGE 24 POWERDOWNFLAG /etc/killpower NOTIFYMSG ONLINE "UPS %s on line power" NOTIFYMSG ONBATT "UPS %s on battery" NOTIFYMSG LOWBATT "UPS %s battary is low" NOTIFYMSG FSD "UPS %s: forced shutdown in progress" NOTIFYMSG COMMOK "Communications with UPS %s established" NOTIFYMSG COMMBAD "Communications with UPS %s lost" NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding" NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced" NOTIFYMSG NOCOMM "UPS %s is unavailable" NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible" NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC NOTIFYFLAG FSD SYSLOG+WALL+EXEC NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC NOTIFYFLAG REPLBATT SYSLOG+WALL NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC NOTIFYFLAG NOPARENT SYSLOG+WALL RBWARNTIME 43200 NOCOMMWARNTIME 600 FINALDELAY 5
-
-
/etc/nut/upssched.conf
-
Chúng ta đang đến gần đích rồi. Tạo một bản sao lưu của
upssched.conf
:cp /etc/nut/upssched.conf /etc/nut/upssched.example.conf
-
Mở file và thay thế nội dung bằng:
CMDSCRIPT /etc/nut/upssched-cmd PIPEFN /etc/nut/upssched.pipe LOCKFN /etc/nut/upssched.lock AT ONBATT * START-TIMER onbatt 30 AT ONLINE * CANCEL-TIMER onbatt online AT LOWBATT * EXECUTE onbatt AT COMMBAD * START-TIMER commbad 30 AT COMMOK * CANCEL-TIMER commbad commok AT NOCOMM * EXECUTE commbad AT SHUTDOWN * EXECUTE powerdown AT SHUTDOWN * EXECUTE powerdown
-
-
/etc/nut/upssched-cmd
- File này không phải lúc nào cũng tồn tại, vì vậy bạn có thể tạo mới bằng lệnh
nano /etc/nut/upssched-cmd
- Và viết một file mới với nội dung:
#!/bin/sh case $1 in onbatt) logger -t upssched-cmd "UPS running on battery" ;; shutdowncritical) logger -t upssched-cmd "UPS on battery critical, forced shutdown" /usr/sbin/upsmon -c fsd ;; upsgone) logger -t upssched-cmd "UPS has been gone too long, can't reach" ;; *) logger -t upssched-cmd "Unrecognized command: $1" ;; esac
- Lưu file, sau đó cấp quyền thực thi:
chmod +x /etc/nut/upssched-cmd
- File này không phải lúc nào cũng tồn tại, vì vậy bạn có thể tạo mới bằng lệnh
Khởi Động Lại Dịch Vụ NUT và Kiểm Tra
Đó là kết thúc các giai đoạn cấu hình. Chúng ta có thể khởi động lại máy chủ Proxmox hoặc sử dụng CLI để khởi động lại các dịch vụ sau khi các file cấu hình đã đúng:
service nut-server restart
service nut-client restart
systemctl restart nut-monitor
upsdrvctl stop
upsdrvctl start
Bạn có thể kiểm tra mọi thứ bằng lệnh sau. Lệnh này sẽ hiển thị danh sách các mục đang được giám sát nếu mọi thứ đã được thiết lập đúng cách:
upsc apc@localhost
Tùy Chỉnh Ngưỡng Pin Kích Hoạt Tắt Nguồn (Quan Trọng)
Các cài đặt mặc định cho các mẫu UPS của APC thường quá thấp so với mức độ an toàn của tôi, vì vậy chúng ta sẽ đặt lệnh tắt nguồn diễn ra sớm hơn nhiều. Sử dụng hai lệnh tiếp theo trong Proxmox VE Shell và dùng tài khoản upsadmin
cùng mật khẩu mà chúng ta đã chỉ định trước đó trong /etc/nut/upsd.users
:
upsrw -s battery.runtime.low=600 apc@localhost
upsrw -s battery.charge.low=50 apc@localhost
Giám Sát NUT Với Home Assistant
Tích Hợp NUT Vào Home Assistant để Kiểm Soát Trực Quan
Home Assistant có một tích hợp NUT riêng, bạn có thể thêm nó từ Settings > Devices & Services > Add Integration. Để kết nối để giám sát, bạn sẽ cần thêm địa chỉ IP của máy chủ NUT của mình, cùng với tên người dùng (upsuser
) và mật khẩu người dùng thông thường mà bạn đã thiết lập trước đó. Thao tác này sẽ tự động kéo dữ liệu về bảng điều khiển chính của bạn, hiển thị chính xác những gì máy chủ UPS NUT của bạn đang làm.
Dashboard Home Assistant hiển thị trạng thái UPS APC được tích hợp qua máy chủ NUT để giám sát
Dropping a NUT on my home lab servers made me worry about power outages less
Giờ đây, khi NUT đã giám sát các máy chủ Proxmox của tôi, tôi có thể ít lo lắng hơn về việc mất điện. Nếu tôi thêm nhiều máy chủ hơn hoặc cần các thiết bị khác để giám sát máy chủ NUT để tắt nguồn an toàn, tôi có thể thêm chúng làm thiết bị client để chúng theo dõi tín hiệu tắt nguồn và sẽ tắt trước khi pin UPS hết. Mặc dù tôi biết rằng các mẫu UPS đắt tiền hơn có thể gửi tín hiệu tắt nguồn đến nhiều client, nhưng cách này không tốn kém gì cả và mang lại hiệu quả tương tự, thậm chí còn linh hoạt hơn cho một hệ thống home lab đa dạng. NUT thực sự là một giải pháp bảo vệ dữ liệu tối ưu, mang lại sự an tâm tuyệt đối cho bất kỳ ai vận hành một home lab chuyên nghiệp.
Bạn đã từng sử dụng NUT hoặc có kinh nghiệm nào khác trong việc bảo vệ home lab khỏi sự cố mất điện không? Hãy chia sẻ ý kiến và câu hỏi của bạn trong phần bình luận bên dưới nhé!