Raspberry Pi

Đánh thức qua Internet bằng Raspberry Pi

Wake-on-LAN (WOL) không phải là một thứ lạ lẫm gì, nhưng như anh thì chả bao giờ phải dùng đến, mãi đến khi Covid-19 và “giãn cách xã hội” xuất hiện.

Mách nhỏ: Nếu bạn không có thời gian đọc về nguồn gốc vấn đề thì có thể chuyển ngay tới phần giải pháp ở dưới 🙂

Giãn cách xã hội, học trực tuyến và Real VNC

Chả là thế này. Khi hết giãn cách xã hội thì trẻ con vẫn tiếp tục ở nhà học trực tuyến gần nửa tháng rồi mới đến trường. Nhưng anh thì phải đến TIME Studio[1] để chụp ảnh. Do lịch học ngắt quãng nên anh không thể giới hạn thời gian sử dụng máy tính. Điều này dẫn đến việc trẻ con lợi dụng bố mẹ vắng nhà để chơi ghêm.

Thế là anh phải cài VNC để theo dõi. Rồi những ngày đó cũng nhanh chóng qua đi. Trẻ con quay trở lại trường và không học trên mạng nữa. Nhưng chừng đó thời gian cũng đủ để anh có thói quen thỉnh thoảng truy cập VNC để theo dõi và cơ bản là đều nhận được thông báo là máy đang không kết nối:

VNC offline

Thực ra thì máy không tắt, trừ khả năng hiếm hoi là ở nhà mất kết nối Internet, lí do chủ yếu là máy đang ở chế độ ngủ.

Nhu cầu truy cập từ xa bằng VNC

Mà khoan đã. Trẻ con không đụng đến máy tính rồi thì đánh thức máy làm gì?

Dù bây giờ đã có lưu trữ đám mây và NAS, nhưng không phải cái gì cũng để sẵn ở đấy. Ví dụ như cơ sở dữ liệu preview của Lightroom có thể lên tới hàng trăm GB và liên tục được cập nhật chẳng hạn. Hoặc chỉ trên máy đó mới có phần mềm bạn cần dùng.

Nói chung là nhỡ có lúc buộc phải dùng mà không có ai đánh thức hộ thì phiền.

Wake-on-LAN dùng làm gì?

Hãy tưởng tượng bạn ở lại làm muộn trong một văn phòng rộng 500 mét vuông. Chiếc máy bạn cần truy cập đã chuyển sang chế độ ngủ. Bạn sẽ phải đi lòng vòng qua hàng chục dãy bàn để di chuột hoặc gõ phím chiếc máy tính đấy để đánh thức nó dậy. Hoặc đơn giản là bạn không muốn đứng dậy. Những lúc như vậy bạn sẽ thấy Wake-on-LAN quả là có ích.

Cú pháp đánh thức rất đơn giản:

sudo etherwake -i eth0 aa:bb:cc:dd:ee:ff

Trong đó aa:bb:cc:dd:ee:ff là địa chỉ MAC của máy được đánh thức.

Đánh thức bằng Raspberry Pi

Giả sử bạn đến văn phòng rồi mà quên dữ liệu trên máy ở nhà, thì bạn phải tìm cách đánh thức qua Internet.

Bản thân Raspberry Pi không hỗ trợ WOL vì cơ bản là nó luôn thức nên bạn có thể dùng nó để đánh thức các thiết bị khác có WOL.

Vì địa chỉ IP ở nhà không cố định nên cách tốt nhất là dùng Dynamic DNS.

Để dùng DDNS thì trước tiên phải đặt cố định địa chỉ IP nội bộ cho Raspberry Pi. Sửa /etc/dhcpcd.conf với nội dung như này:

interface eth0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

Bước 2: Mở cổng trên router. Tuỳ mỗi loại modem/router mà có cách cấu hình khác nhau. Nhà anh dùng modem của VNPT nên sẽ vào mục Advanced Featured / NAT. Trong ví dụ này anh gán cổng 2222 cho dịch vụ ssh của máy 192.168.1.100.

NAT config
Cấu hình NAT trên modem cáp quang VNPT

Bước 3: Đăng kí dịch vụ DDNS. Anh có một tên miền đăng kí ở Google Domains nên được dùng dịch vụ DDNS miễn phí. Nếu không có Google Domains thì có thể tìm hiểu các dịch vụ DDNS miễn phí hoặc có phí khác.

Bước 4: Cài đặt và cấu hình ddclient cho Raspberry Pi. Đây là phần mềm để kết nối giữa Raspberry Pi với máy chủ DNS.

sudo apt install ddclient

Trong quá trình cài đặt, ddclient sẽ yêu cầu cung cấp thông tin như protocol, use v.v. Nhưng do giao thức googledomains không có sẵn để chọn nên bạn sẽ phải sửa tập tin cấu hình /etc/ddclient.conf như này:

protocol=googledomains
use=web
server=domains.google.com
login=tên-đăng-nhập-do-Google-Domains-tạo-ra
password='mật-khẩu-do-Google-Domains-tạo-ra'
tên.miền.raspberry.pi
daemon=100

Sau đó thì khởi động lại dịch vụ ddclient:

sudo service ddclient restart

Và đừng quên kiểm tra kết quả:

sudo ddclient -query

Nếu thấy địa chỉ đã khớp, anh có thể ssh từ Internet vào Raspberry Pi:

ssh username@tên.miền.raspberry.pi -p 2222

Rồi dùng wakeonlan để đánh thức máy tính ở nhà.

Đánh thức liên tục nhiều lần mới dậy được

Mặc dù đã chạy wakeonlan để đánh thức nhưng nhiều khi VNC vẫn báo là “VNC Server is not currently listening for Cloud connections”. Vì vậy, anh phải lặp lại lệnh này liên tục. Nhưng làm vậy thì mỏi tay quá nên anh soạn luôn một vòng lặp và lưu lại cho tiện dùng:

for i in `seq 1 10`; do echo "$i"; sudo etherwake -i eth0 aa:bb:cc:dd:ee:ff; sleep 2; done

Rõ thật là “người làm sao, của chiêm bao làm vậy” :p

__

[1] Bài này được viết từ tháng 5/2020 nhưng bị bỏ quên không xuất bản. Hồi đấy TIME Studio vẫn chưa đổi tên thành Paratime Studio như bây giờ.