Wine và Proton có quan hệ gì

Trang thủ công của Wine mở đầu bằng wine - run Windows programs on Unix: nó có thể tải và chạy các tệp thực thi của DOS, Windows 3.x, Win32, và trên hệ thống 64 bit cũng chạy được tệp thực thi Win64.

Proton là công cụ tương thích do Valve làm, dành cho trình khách Steam, giúp các game chỉ có bản Windows chạy trên Linux. Tài liệu dự án của Valve ghi rõ nó sử dụng Wine để làm điều đó. Có thể hiểu như sau: Wine là tầng nền, Proton là bản tích hợp chuyên dụng cho game Steam.

Cài đặt trên Ubuntu 26.04

Kho phần mềm của Ubuntu 26.04.1 đã có sẵn Wine, phiên bản 10.0~repack-12ubuntu1. Cài cùng winetricks:

sudo apt install wine winetricks

Tôi đã thử trong một container amd64 tối thiểu: apt install -s wine mô phỏng cho thấy cần cài 331 gói, sau khi cài xong:

wine --version

xuất wine-10.0 (Ubuntu 10.0~repack-12ubuntu1).

Hai chi tiết: kho phần mềm không có gói wine32, wine phụ thuộc vào wine64 | wine32, và gói thực tế được cài là wine64; trước và sau khi cài, xuất của dpkg --print-foreign-architectures đều rỗng, cho thấy phiên bản này trên amd64 không yêu cầu bật kiến trúc i386. winehq-stable không có trong kho phần mềm sẵn có của hệ thống.

Kho riêng của WineHQ tồn tại cho cả Ubuntu 26.04 (resolute) và 24.04 (noble). Nếu muốn dùng Wine mới hơn phiên bản do bản phân phối cung cấp, hãy tra hướng dẫn cài đặt hiện hành trên trang chính thức của WineHQ, bài này không viết lại các bước đó.

WINEPREFIX: chìa khóa để dùng tốt Wine

Wine đặt registry, tệp cấu hình và ổ C ảo vào một thư mục, thư mục này do biến môi trường WINEPREFIX chỉ định, mặc định là $HOME/.wine.

Trang thủ công có một câu đáng đọc hai lần: mọi tiến trình wine của cùng một người dùng dùng chung một wineserver, chia sẻ registry, bộ nhớ dùng chung và tệp cấu hình. Nói cách khác, mặc định mọi chương trình Windows bạn cài đều chen chúc trong cùng một prefix, thư viện runtime mà một chương trình cài hoặc khóa registry mà nó sửa sẽ ảnh hưởng đến các chương trình khác.

Cách giải quyết là cho mỗi chương trình một prefix độc lập. Đặt WINEPREFIX khác nhau cho các tiến trình wine khác nhau, chúng sẽ thực sự độc lập với nhau, đây là cách dùng được trang thủ công nêu rõ:

WINEPREFIX=~/.wine-myapp wine setup.exe

Khởi tạo một prefix mới bằng wineboot -u:

WINEPREFIX=/tmp/p WINEDEBUG=-all wineboot -u

Trong một container không có desktop, lệnh này thoát với mã 0, và trong /tmp/p xuất hiện dosdevices, drive_c và wineserver. Prefix mới này chiếm khoảng 680 MB, vì vậy mỗi prefix thêm vào lại cần thêm vài trăm MB dung lượng đĩa.

Chạy chương trình

Dạng cơ bản là wine ten-chuong-trinh [tham-so] với các tham số đi sau. Tên chương trình có thể viết theo định dạng DOS (C:\\WINDOWS\\SOL.EXE), hoặc theo định dạng Unix (/msdos/windows/sol.exe). Tham số viết ở cuối dòng lệnh:

wine notepad C:\\TEMP\\README.TXT

Trong shell, khoảng trống và ký tự đặc biệt trong đường dẫn phải được escape bằng dấu gạch chéo ngược:

wine C:\\Program\ Files\\MyPrg\\test.exe

Một số chương trình kèm theo Wine không cần viết đường dẫn đầy đủ, ví dụ wine notepad, wine explorer.

Chương trình console của Windows phải chạy bằng wineconsole. Trang man nói rằng nếu không dùng wineconsole, hỗ trợ console rất hạn chế và chương trình có thể không hoạt động bình thường.

Khi chương trình không chạy được, dùng WINEDEBUG bật log, cú pháp là [class][+|-]channel[,...], class gồm err, warn, fixme, trace, chuỗi không được chứa khoảng trống. Điểm khởi đầu được trang thủ công khuyến nghị là:

WINEDEBUG=warn+all wine ten-chuong-trinh.exe

Ví dụ về kết hợp:

WINEDEBUG=fixme-all,warn+cursor,+relay wine ten-chuong-trinh.exe

Lệnh này tắt mọi thông điệp FIXME, bật các cảnh báo liên quan đến con trỏ và theo dõi mọi lời gọi API.

Cách kiểm chứng trong môi trường không có desktop

Trên server hoặc trong container, trước tiên có thể xác nhận Wine tự nó hoạt động được. Sau khi khởi tạo prefix, dùng cmd thực hiện một lệnh:

WINEPREFIX=/tmp/p wine cmd /c echo hello-from-wine

Xuất tôi nhận được trong container là hello-from-wine. Điều này chỉ chứng tỏ Wine khởi tạo được prefix và chạy được lệnh console của Windows; tôi không kiểm thử chương trình có giao diện đồ họa, âm thanh và trình điều khiển card đồ họa, trải nghiệm thực tế trên desktop bạn phải tự thử.

Proton: Wine trong Steam

Khuyến nghị của Valve: đa số người dùng dùng Proton đi kèm trình khách Steam, không cần tự biên dịch. Proton tự biên dịch được chọn trong phần Steam Play của cửa sổ cài đặt Steam; tùy chọn cho một game cụ thể nằm trong thuộc tính của game đó, ở mục "Thiết lập tùy chọn khởi động".

Về phần kết xuất, Proton mặc định dùng DXVK để xử lý Direct3D 9, 10, 11; DXVK là bộ kết xuất dựa trên Vulkan. Đặt biến môi trường PROTON_USE_WINED3D=1 sẽ chuyển sang wined3d dựa trên OpenGL. Dự án còn có một mô-đun con VKD3D-Proton, tài liệu chính thức không giải thích vai trò của nó, ở đây chỉ nêu rằng nó tồn tại.

Để thêm biến này cho một game trong Steam, viết vào tùy chọn khởi động của game đó, theo dạng:

PROTON_USE_WINED3D=1 %command%

Về việc game có chơi được hay không, tài liệu Proton của Valve không đưa ra bất kỳ đảm bảo nào, cũng không cung cấp danh sách tương thích, mà chỉ trỏ đến nhật ký cập nhật trên wiki. Cộng đồng có các trang web ghi lại báo cáo trải nghiệm từng game, ProtonDB là một trang thường được nhắc đến; nó không phải tài nguyên chính thức của Valve, và các báo cáo không thay thế được việc bạn tự kiểm thử.

Tương thích phải tự xác nhận

Cả Wine và Proton đều không đảm bảo một chương trình Windows nhất định sẽ chạy được. Một cách làm chắc chắn: chương trình thông thường trước tiên cài vào một WINEPREFIX độc lập, thử các chức năng chính, khi có vấn đề thì xem log bằng WINEDEBUG=warn+all; game thì dùng Proton đi kèm Steam trước, nếu không được thì thử PROTON_USE_WINED3D=1.

Khi dọn dẹp, xóa một thư mục prefix chỉ ảnh hưởng đến prefix đó, các prefix khác không bị ảnh hưởng. Nhưng dữ liệu chương trình lưu trong prefix (dữ liệu đã lưu, cài đặt) cũng bị xóa theo, hãy sao lưu những gì cần giữ lại trước, rồi xác nhận đường dẫn không viết sai.