Một trong những rủi ro thường trực đối với các hệ thống máy chủ cá nhân (home lab) là làm thế nào để tắt máy an toàn khi xảy ra sự cố mất điện đột ngột. Mặc dù việc trang bị Bộ lưu điện (UPS) là giải pháp hiệu quả để đảm bảo dữ liệu không bị mất mát khi nguồn điện chính bị ngắt, hầu hết các mẫu UPS chỉ có một cổng kết nối USB để gửi tín hiệu tắt máy. Điều này gây khó khăn lớn khi bạn có nhiều thiết bị được cấp nguồn bởi cùng một UPS trong home lab.
Đặc biệt, nếu bạn đang sử dụng Proxmox VE hoặc các nền tảng ảo hóa khác, bạn có thể cần tắt đồng thời nhiều máy ảo (VM) cùng lúc để tránh hỏng hóc dữ liệu. Đây là vấn đề mà gần như mọi người dùng home lab đều phải đối mặt, và may mắn thay, nó đã được giải quyết từ lâu bằng cách sử dụng một công cụ giám sát tín hiệu tắt máy từ UPS và phát đi tín hiệu đó đến các máy khách được cấp nguồn. Một trong những công cụ mạnh mẽ và đáng tin cậy nhất cho mục đích này là NUT, viết tắt của Network UPS Tools. Đối với hệ thống home lab dựa trên Proxmox của tôi, NUT chính là “vị cứu tinh”.
NUT là gì và tại sao bạn nên sử dụng nó?
Đảm bảo các thiết bị của bạn được tắt an toàn
Môi trường home lab không có được nguồn điện phụ trợ và dự phòng như các trung tâm dữ liệu chuyên nghiệp. Do đó, việc sở hữu một UPS chạy bằng pin là điều cần thiết để tránh mất dữ liệu khi nguồn điện gia đình gặp sự cố. Nếu bạn chỉ có một máy chủ hoặc một máy chủ ảo hóa, một cổng USB duy nhất mà hầu hết các mẫu UPS sử dụng để báo hiệu là đủ. Tuy nhiên, nếu bạn có 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 pháp để gửi tín hiệu tắt máy đến tất cả các máy chủ đó.
Đó chính là lúc Network UPS Tools (NUT) phát huy tác dụng. NUT hoạt động theo mô hình máy chủ-máy khách (server-client). Máy chủ NUT được cài đặt trên máy tính kết nối trực tiếp với UPS qua cổng USB. Trong khi đó, các máy khách được cài đặt trên tất cả các thiết bị khác được cấp nguồn bởi UPS (bao gồm cả máy chủ đang chạy NUT). Điều này có nghĩa là khi điện áp giảm và UPS bắt đầu hoạt động, đến khi pin của UPS gần cạn, nó sẽ gửi lệnh tắt máy qua USB. Máy chủ NUT sẽ nhận lệnh đó và truyền tín hiệu đến các máy khách, đảm bảo tất cả các thiết bị đều được tắt an toàn trước khi UPS hết pin, từ đó bảo vệ dữ liệu của bạn.
Mặc dù việc thiết lập NUT có thể không phải là điều dễ dàng nhất, nhưng quá trình này sẽ giúp bạn làm quen với việc chỉnh sửa các tệp cấu hình, và kết quả cuối cùng chắc chắn sẽ làm bạn hài lòng. Ngoài ra, NUT còn có tiện ích bổ trợ cho Home Assistant để giám sát, đây là một điểm cộng lớn cho bất kỳ công cụ nào trong môi trường nhà thông minh.
Bắt đầu thiết lập NUT trên máy chủ Proxmox của bạn
Các sự cố mất điện sẽ không còn khiến tôi lo lắng về dữ liệu
Do quyết định cài đặt máy chủ NUT trên Proxmox Host, trước tiên chúng ta cần xác định cổng USB mà UPS đang kết nối. Để làm điều này, chúng ta sẽ truy cập vào nút PVE (Proxmox Virtual Environment) và chuyển đến tab Shell, nơi chúng ta có thể sử dụng giao diện dòng lệnh (CLI) để chạy lệnh lsusb
. Sau khi xác định được chi tiết [bus]:[device]
của UPS (ví dụ: đối với tôi là 3:2
), chúng ta sẽ chạy lệnh lsusb -v -s 3:2
để tìm hiểu thông tin chi tiết về UPS.
Bây giờ, tiến hành cài đặt NUT bằng lệnh sau:
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 để lấy các thông tin cần thiết cho các tệp cấu hình sắp tới:
nut-scanner -U
Thời gian để cấu hình các tệp tin
Chúng ta sẽ cần chỉnh sửa bảy tệp để mọi thứ hoạt động trơn tru, cùng với một vài lệnh cuối cùng để thay đổi phần trăm pin kích hoạt quá trình tắt máy.
-
/etc/nut/nut.conf
:
Đầu tiên, hãy tạo một bản sao dự phòng:cp /etc/nut/nut.conf /etc/nut/nut.example.conf
Sau đó, mở tệp bằng bất kỳ trình soạn thảo văn bản nào bạn thích:
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. -
/etc/nut/ups.conf
:
Tương tự, tạo một bản sao lưu phòng trường hợp có lỗi:cp /etc/nut/ups.conf /etc/nut/ups.example.conf
Mở tệp để chỉnh sửa:
nano /etc/nut/ups.conf
Xóa mọi thứ trong tệp và thêm nội dung sau:
pollinterval = 15 maxretry = 3 offdelay = 120 ondelay = 240
Và thêm kết quả từ lệnh
nut-scanner
của bạn (ví dụ dưới đây là của UPS APC):[apc] # APC Back-UPS BGM1500 driver = usbhid-ups port = auto desc = "APC Back-UPS BGM1500" vendorid = 051D productid = 0002 serial = xxxxxxxxxxxx
Lưu tệp, sau đó kiểm tra để đảm bảo không có lỗi và nó hiển thị một subdriver:
upsdrvctl start
-
/etc/nut/upsd.conf
:
Hãy sao lưu tệp trước khi chỉnh sửa:cp /etc/nut/upsd.conf /etc/nut/upsd.example.conf
Sau đó, 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
Điều này sẽ khiến máy chủ NUT lắng nghe trên tất cả các mạng.
-
/etc/nut/upsd.users
:
Sao lưu tệp 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] # Người dùng quản trị password = ******** # Cho phép thay đổi giá trị của một số biến trong UPS. actions = SET # Cho phép đặt cờ "Tắt máy cưỡng bức" trong UPS. actions = FSD # Cho phép tất cả các lệnh tức thì instcmds = ALL upsmon master [upsuser] # Người dùng thông thường password = ******** upsmon slave
-
/etc/nut/upsmon.conf
:
Sao lưu tệp: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 battery 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 gần hoàn tất. Tạo một bản sao lưu củaupssched.conf
:cp /etc/nut/upssched.conf /etc/nut/upssched.example.conf
Mở tệp 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
:
Tệp 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 ngay lập tức:nano /etc/nut/upssched-cmd
Và viết một tệp mới với nội dung sau:
#!/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 tệp, sau đó cấp quyền thực thi:
chmod +x /etc/nut/upssched-cmd
Đó là kết thúc các giai đoạn cấu hình. Bây giờ, chúng ta có thể khởi động lại Proxmox Host hoặc sử dụng CLI để khởi động lại các dịch vụ sau khi chúng có các tệp cấu hình chính xác:
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
Một điều cuối cù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 độ thoải mái của tôi. Vì vậy, chúng ta sẽ điều chỉnh để các lệnh tắt máy xảy ra sớm hơn nhiều. Sử dụng hai lệnh tiếp theo trong Proxmox VE Shell, và sử dụng upsadmin
cùng với password
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
Thời gian để giám sát NUT của chúng ta
Giao diện Home Assistant hiển thị tích hợp và giám sát bộ lưu điện APC qua máy chủ NUT
Home Assistant có một tích hợp NUT mà bạn có thể thêm 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ùng với tên người dùng và mật khẩu người dùng thông thường mà bạn đã thiết lập trước đó. Điều 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 của bạn đang làm.
Tóm lại: Việc triển khai NUT đã giúp tôi an tâm hơn về dữ liệu Home Lab
Với việc NUT đã giám sát các máy chủ Proxmox của tôi, tôi có thể giảm bớt lo lắng về việc mất dữ liệu khi có sự 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 máy an toàn, tôi có thể thêm chúng như các thiết bị máy khách để chúng cũng theo dõi tín hiệu tắt máy và tắt trước khi pin UPS cạn kiệt. Và vâng, 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 máy đến nhiều máy khách, nhưng phương pháp này không tốn kém một chút nào và mang lại hiệu quả vượt trội.
Hãy chia sẻ ý kiến của bạn về giải pháp NUT cho home lab hoặc bất kỳ phương pháp bảo vệ dữ liệu nào khác mà bạn đang sử dụng!
Tài liệu tham khảo
- You don’t need TrueNAS or Proxmox to make a home server: Ubuntu
- Best UPS for your home lab, gaming PC, and more
- I’m addicted to installing Proxmox on old devices, and you should be too
- Home Assistant NUT integration documentation
- NUT Client Configuration Example