Làm việc từ xa bằng máy tính ở nhà

Mình là người hay làm việc bên ngoài văn phòng, cụ thể là quán cafe hay trên đường đi du lịch. Thế nhưng laptop thì không mạnh bằng máy bàn nên mình vẫn thực sự dùng máy tính bàn ở nhà cho công việc, dù đang dùng màn hình và bàn phím của laptop. Vậy mình làm thế nào?

Dù làm về lập trình và có thâm niên nhưng mình vẫn chỉ sử dụng máy móc bình dân. Cụ thể laptop của mình chỉ là Dell Vostro 5568 với CPU Core i5 (2 nhân 4 luồng).

Laptop

Trong thời gian bị phong tỏa vì CoVid, mình cứ băn khoăn lỡ laptop này bị hư thì làm sao đi sửa để tiếp tục làm việc được, nên sau khi được mở cửa lại, mình cũng mua luôn một máy bàn để dự phòng, lỡ bị phong tỏa nữa. Máy bàn mà mình mua, mặc dù rẻ hơn laptop nhưng mạnh hơn nhiều, là con ASRock DeskMini X300, với CPU Ryzen 5 5600G (6 nhân 12 luồng). Máy chạy nhanh, mát, ít tốn điện nên mình cho nó bật 24/24 và làm công cụ kiếm cơm chính luôn. Dù đi đâu thì mình vẫn truy cập từ xa vào nó. Đặc biệt, công việc của mình cũng thường phải chạy biên dịch code Rust, build ảnh Docker, là những tác vụ ngốn CPU, nên việc tận dụng sức mạnh của máy bàn sẽ giúp tiết kiệm thời gian hơn, làm việc năng suất hơn.

Dưới đây là hình ảnh ví dụ khi mình thực hiện một công việc khá nặng: build ảnh Docker mà trong đó có các bước biên dịch gói Rust, toàn bộ 12 luồng của CPU đều bị vắt hết sức:

Heavy task

(Hình ảnh theo dõi bằng công cụ btop)

Để làm cho máy tính ở nhà truy cập được từ bên ngoài, mình thiết lập một mạng VPN riêng, với giao thức WireGuard. Trong trường hợp máy bàn đã bị tắt nguồn mà cần bật từ xa, mình cho cả router mạng của nhà gia nhập vào mạng VPN này, để có thể truy cập vào router, dùng lệnh etherwake để bật máy. Muốn router có thể cài đặt WireGuard và sử dụng được lệnh trên thì router cần được cài đặt firmware OpenWrt. Mình đang dùng router Newifi 2.

Về mặt phần mềm, sử dụng hệ điều hành Linux là thuận lợi nhất cho kiểu làm việc này, vì:

  • Giao thức VPN WireGuard được hỗ trợ sẵn trong nhân Linux. Chạy từ nhân sẽ đảm bảo tốc độ tốt hơn. Đã vậy, các phần mềm quản lý mạng của desktop cũng hỗ trợ sẵn, không phải cài thêm phần mềm nào. Trên Windows và MacOS cũng có thể dùng WireGuard nhưng phải cài thêm phần mềm và nó chạy ở userland nên tốc độ không tốt bằng khi chạy trong nhân như bên Linux.

  • Hỗ trợ sẵn giao thức SSH để sử dụng máy từ xa. Công việc của mình không cần nhìn thấy giao diện của máy đích, tức là không cần truyền hình ảnh, nên dùng SSH sẽ nhanh hơn. Vì SSH là một trong những phần mềm cốt lõi của Linux nên tự nhiên các phần mềm khác cũng hỗ trợ tốt giao thức này. Ví dụ khi mình muốn duyệt file trên máy từ xa bằng phần mềm quản lý file, mình chỉ cần gõ sftp://tên-máy vào thanh địa chỉ:

    Files on SSH

    Khi nhấp đôi chuột vào file, ví dụ file PDF, file ODT v.v... ta có thể mở file bằng phần mềm chuyên dụng tương ứng, mặc dù phần mềm là của máy hiện tại, còn file là của máy ở xa.

    LibreOffice with SSH

  • Linux hỗ trợ SSH tốt đến nỗi, ta không cần phải gõ password (nhờ xác minh qua public key), không cần phải gõ đầy đủ username@ip_address (nhờ các phần mềm đều đọc hiểu file ssh_config).

  • Để viết code trên những file nằm trên máy ở xa, chạy thử code thì mình tận dụng tính năng "Remote Development" của VS Code. VS Code có lẽ là phần mềm có giao diện đồ họa hỗ trợ tốt nhất cách làm việc này.

    VS Code remote

  • Tất nhiên, khi viết code bằng những phần mềm có giao diện text như Helix, Vim/NeoVim thì không cần tính năng "remote development" nào cả.

  • Khi làm việc từ xa (qua SSH) với các phần mềm chạy trong Terminal thì có một lưu ý, những phần mềm hiện đại, mặc dù thiên về bàn phím, chúng vẫn đáp ứng với chuột, chẳng hạn nếu bạn dùng chuột để bôi đen một đoạn text, chúng sẽ sao chép đoạn text đó vào clipboard. Vấn đề là chúng đang chạy trên máy ở xa, nên clipboard được chép vào là clipboard của máy đó, chứ không phải máy ngay trước mặt bạn. Nếu bạn muốn tận dụng tính năng này, hãy sử dụng một terminal tiên tiến, chúng sẽ giúp đoạn text đó được sao chép vào clipboard của máy trước mặt bạn luôn. Bộ ba phần mềm tôi dùng để khai thác tính năng này là:

    • Helix (trình soạn thảo code)
    • Zellij: Giúp bạn mở nhiều tab trên máy từ xa (để mở nhiều thư mục khác nhau, mở nhiều chương trình khác nhau) nhưng chỉ thông qua một kết nối SSH chung.
    • Kitty: Terminal trên máy trước mặt. Phần mềm này cung cấp nhiều tính năng tiên tiến. Bạn cũng có thể chọn WezTerm. Tôi chọn Kitty vì để tiết kiệm không gian trên màn hình nhỏ.

    Khi dùng bộ ba này, nếu trong Helix, bạn chọn một đoạn text (bằng w chẳng hạn), rồi bấm Space y, đoạn text đó sẽ được sao chép vào clipboard của máy trước mặt bạn.

Cách setup này có một hạn chế là khi cần chạy máy ảo VirtualBox trên máy tính từ xa, mình vẫn chưa tìm ra cách nào để chạy và điều khiển VirtualBox trong chế độ headless (không mở giao diện đồ họa) cả.

Trên đây là cách setup để làm việc với máy tính từ xa của mình. Mặc dù, cách này không phù hợp với mọi người nhưng nếu công việc bạn gần giống vậy, hãy thử xem sao, vì có thể năng suất sẽ tăng lên.