Cơn ác mộng khi dùng GPU Passthrough truyền thống
Nếu đã từng setup GPU Passthrough để chạy máy ảo Windows trên Linux, chắc hẳn bạn đã nếm trải sự bất tiện của việc dùng hai màn hình. Việc phải sắm thêm một chiếc màn hình thứ hai hoặc liên tục bấm nút chuyển cổng Input Source thực sự rất phiền phức.
Cảm giác đang gõ code trên Linux mượt mà mà phải chờ 3-5 giây để màn hình nhận tín hiệu từ Windows làm đứt mạch làm việc hoàn toàn. Nếu bạn chỉ có một bộ phím chuột, việc chuyển đổi qua lại (KVM Switch) còn tốn kém và dễ làm giảm chất lượng hình ảnh.
Tại sao Remote Desktop truyền thống không đủ tốt?
Nhiều anh em thường nghĩ đến RDP, VNC hay Parsec để chữa cháy. Tuy nhiên, khi làm đồ họa nặng hoặc chơi game nhịp độ nhanh, các giải pháp này bộc lộ rõ giới hạn:
- Độ trễ (Latency): Ngay cả với mạng nội bộ 1Gbps, độ trễ vẫn ở mức 15-30ms. Với các tựa game FPS như CS2 hay Valorant, con số này là một thảm họa.
- Nén hình ảnh: Để truyền tải mượt, hình ảnh thường bị nén (compression artifacts). Điều này khiến màu sắc sai lệch, không thể dùng cho dân làm màu hay dựng phim.
- Overhead hệ thống: Việc encode video trên máy ảo và decode trên máy thật ngốn CPU đáng kể, làm giảm FPS tổng thể.
Các giải pháp hiển thị phổ biến hiện nay
Cộng đồng ảo hóa thường cân nhắc 3 phương án để xử lý hình ảnh từ máy ảo:
- Dùng 2 màn hình: Đơn giản, ổn định nhưng tốn diện tích và tiền bạc.
- Capture Card: Dùng thiết bị ngoại vi để bắt hình rồi truyền ngược lại Linux qua USB/PCIe. Cách này tốn khoảng 2-4 triệu đồng và vẫn có độ trễ nhất định.
- Looking Glass: Giải pháp phần mềm tối ưu nhất hiện nay cho người dùng Linux chuyên nghiệp.
Looking Glass: Tận dụng Shared Memory để đạt độ trễ <1ms
Sau 6 tháng chạy Homelab với card RTX 3070, mình khẳng định Looking Glass là bước ngoặt lớn. Thay vì truyền hình ảnh qua mạng, nó tạo ra một vùng nhớ dùng chung (Shared Memory) giữa Host và Guest.
Máy ảo Windows sẽ chép khung hình trực tiếp vào RAM, và Linux Host chỉ việc đọc nó ra để hiển thị. Vì dữ liệu chạy trực tiếp trên bus bộ nhớ, độ trễ gần như bằng 0. Trải nghiệm thực tế cho thấy khung hình cực kỳ mượt mà, không khác gì đang dùng máy thật.
Bước 1: Khởi tạo vùng nhớ dùng chung (IVSHMEM)
Đầu tiên, ta cần tạo một file trong /dev/shm làm nơi chứa Frame Buffer. Dung lượng file phụ thuộc vào độ phân giải. Công thức tính: Rộng x Cao x 4 x 2 (bytes). Ví dụ, màn hình 1080p cần khoảng 32MB, nhưng bạn nên cấp 64MB hoặc 128MB để dự phòng cho 4K.
# Tạo file cấu hình systemd để tự động khởi tạo khi boot
sudo nano /etc/tmpfiles.d/10-looking-glass.conf
# Thêm dòng sau (thay 'username' bằng user của bạn)
f /dev/shm/looking-glass 0660 username kvm -
Áp dụng cấu hình ngay bằng lệnh: systemd-tmpfiles --create /etc/tmpfiles.d/10-looking-glass.conf.
Bước 2: Cấu hình XML cho máy ảo KVM
Mở file cấu hình máy ảo bằng virsh edit <tên_máy_ảo>. Trong thẻ <devices>, hãy thêm đoạn mã sau vào cuối:
<shmem name='looking-glass'>
<model type='ivshmem-plain'/>
<size unit='M'>64</size>
<address type='pci' domain='0x0000' bus='0x10' slot='0x01' function='0x0'/>
</shmem>
Kiểm tra kỹ để giá trị bus và slot không bị xung đột với các thiết bị hiện có.
Bước 3: Cài đặt trên Windows Guest
Khởi động máy ảo Windows và thực hiện các bước sau:
- Tải IVSHMEM Driver từ repository VirtIO-Win.
- Mở Device Manager, cập nhật driver cho thiết bị “PCI Standard RAM Controller” bằng file vừa tải.
- Cài đặt Looking Glass Host (.exe). Chương trình này sẽ đảm nhận việc đẩy khung hình từ GPU vào vùng RAM dùng chung.
Bước 4: Cài đặt Client trên Linux Host
Trên Linux, bạn cần cài đặt Looking Glass Client để xem hình ảnh. Với Ubuntu hoặc Debian, hãy build từ source để có hiệu năng tốt nhất:
# Cài đặt các thư viện phụ thuộc
sudo apt install cmake libsdl2-dev libsdl2-ttf-dev libspice-protocol-dev libfontconfig1-dev libx11-dev
# Clone source code và build
git clone --recursive https://github.com/gnif/LookingGlass.git
cd LookingGlass/client
mkdir build && cd build
cmake ../
make -j$(nproc)
Chạy lệnh ./looking-glass-client để mở cửa sổ máy ảo. Bạn sẽ thấy màn hình Windows xuất hiện với tốc độ phản hồi đáng kinh ngạc.
Lưu ý quan trọng để tối ưu trải nghiệm
Trong quá trình sử dụng để chơi Cyberpunk 2077 và làm Adobe Premiere, mình rút ra 3 kinh nghiệm then chốt:
- Sử dụng HDMI Dummy Plug: GPU cần nhận diện có màn hình vật lý thì mới kích hoạt xuất hình. Một chiếc đầu giả lập giá 30-50k sẽ giải quyết triệt để vấn đề này.
- Phím tắt thoát: Looking Glass sẽ “bắt” chuột của bạn. Hãy nhấn phím
Scroll Lockđể thoát quyền điều khiển và quay lại Linux. - Đồng bộ âm thanh: Looking Glass chỉ truyền hình ảnh. Hãy cài thêm Scream để truyền âm thanh qua mạng ảo với độ trễ cực thấp.
Nhìn chung, Looking Glass là mảnh ghép cuối cùng để biến Linux thành cỗ máy làm việc và giải trí hoàn hảo. Chúc anh em thiết lập thành công!

