docker 컨테이너에서 WineHQ 실행

8994 단어 linuxdockergaming
(내가 당신의 어떤 시간을 낭비하기 전에, 이 글은 내 시스템의 잉웨이다 gpu로 완성되었다는 것을 경고합니다. 불행히도, 나는 AMD, 심지어 Intel gpu로 이 점을 정확하게 테스트할 방법이 없습니다.)

좋아요.
지금 이것은 결코 완전히 사실이 아니다...
이 해결 방안도 가장 좋은 것은 아니다.
그러나 내가 개인 자료에서 말한 바와 같이 나는 단지 궁금할 뿐이다.
루터스, 심지어 스팀의proton 같은 도구는 더 간단하고 빠른 방식으로 네이티브 linux 포트가 없는 게임을 하고 있다.
나는 두 가지를 모두 시험해 보았지만, 모두 쓸모가 있다.사실이야.나는 힘들이지 않고 내가 원하는 게임을 할 수 있다.
  • Lutris이 생겼습니다. 저는 사이트에 가서 제가 원하는 게임을 위해 미리 설정한 설치 프로그램을 끌고 일을 하게 하면 됩니다. 신기합니다.
  • SteamProton가 있습니다. 저는 게임을 다운로드하고 놀기만 하면 됩니다.
  • Wine 자체는 제 발행 패키지 관리자가 설치하거나 원본 코드에서 컴파일합니다.
  • 내가 전에 말한 바와 같이, 이 모든 것들은 모두 역할을 잘 발휘했다.그러나 호기심은 여전히 나를 괴롭혔다. "나는 이 모든 것을 담은 용기만 설치할 수 있고, 이 모든 의존항이 내 시스템에 걸리지 않도록 할 수 있습니까?"
    사실 내가 내 시스템에 얼마나 많은 물건이 설치되어 있는지, 그리고 내가 매일 진정으로 얼마나 많은 물건을 필요로 하는지 생각할 때, 이 문제는 항상 내 머릿속에 떠오른다.더 나아가, 내가 발행판을 변경하거나 다시 설치해야 할 때, 나는 무엇을 놓칠 수 있다.
    이 점을 감안하여 나는 용기를 시험해 보기 시작했다.설령 단지 많든 적든 깨끗한 방식으로 새로운 wine 버전을 테스트한다 하더라도, 나는 이미 새로운 버전으로 업그레이드되었기 때문에, 불행하게도, 이 버전은 파괴되어서, 어쩔 수 없이 이전의 작업 버전 패키지를 다시 설치해야 한다.
    그래서 저는 Ubuntu 초점 용기에서 몇 가지 물건을 구축하고 두 개의 용기로 나누기로 했습니다.
  • 저는 Ubuntu의 기본 용기를 바탕으로 잉웨이다 드라이버만 설치했습니다
  • 나의 실제 포도주 용기는 게임의 모든 의존항을 포함한다.
  • 내가 이런 방법을 선택한 것은 gpu 드라이버가 자주 나타나지 않기 때문이다. (불행히도) 그리고 나도 기본 이미지를 사용할 수 있기 때문이다.
    더 많은 세부 사항을 깊이 있게 토론하기 전에, Dockerfiles에 심상치 않은 점이 있음을 알아차린다면, 이 구축 시스템이 이미 준비가 되어 있기 때문이다.그러나 그것들도 전통적인 docker buildcmd로 정상적으로 구축할 수 있다.--build arg 플래그를 사용하여 기본값을 덮어쓸 수 있습니다.
    또한 호스트에 설치된 드라이버 버전이 컨테이너에 설치된 드라이버 버전과 동일한지 확인하십시오.

    기본 용기


    ARG UBUNTU_VERSION=focal
    ARG NVIDIA_DRIVER_VERSION=450
    FROM ubuntu:$UBUNTU_VERSION
    
    ARG UBUNTU_VERSION
    ARG NVIDIA_DRIVER_VERSION
    
    ENV DEBIAN_FRONTEND=noninteractive
    ENV UBUNTU_VERSION=$UBUNTU_VERSION
    ENV NVIDIA_DRIVER_VERSION=$NVIDIA_DRIVER_VERSION
    
    ENV PKGNV="nvidia-driver-${NVIDIA_DRIVER_VERSION} libnvidia-gl-${NVIDIA_DRIVER_VERSION}:i386"
    ENV PKGVK="libvulkan1 libvulkan1:i386 vulkan-tools vulkan-utils"
    
    
    RUN     dpkg --add-architecture i386 && \
        apt update && \
        apt install -y gnupg2 apt-transport-https curl 
    
    RUN apt install -y $PKGNV $PKGVK
    
    
    따라서 이것은 첫 번째 용기입니다. ubuntufocal 버전과 nvidiadrivers450(기본적으로), vulkan, 그리고 잠시 후에 사용할 기본 도구를 기반으로 합니다.다음 단계에서 나는 그것을 ubuntu-nvidia-vlk:focal 라고 부른다.

    포도주 용기


    FROM ubuntu-nvidia-vlk:focal
    
    ARG WVERSION="5.17"
    ARG WTVERSION="20200412"
    
    ENV WINE_VERSION="${WVERSION}"
    ENV PKG_WINE_VERSION="${WVERSION}~${UBUNTU_VERSION}"
    ENV WINE_TRICKS_VERSION="${WTVERSION}"
    
    RUN curl -s https://dl.winehq.org/wine-builds/winehq.key | apt-key add - && \
        echo "deb https://dl.winehq.org/wine-builds/ubuntu/ ${UBUNTU_VERSION} main" | tee /etc/apt/sources.list.d/wine.list && \
        apt update && \
        apt install -y winbind cabextract wget fonts-wine ttf-mscorefonts-installer\
            winehq-staging=$PKG_WINE_VERSION \
            wine-staging=$PKG_WINE_VERSION \
            wine-staging-i386=$PKG_WINE_VERSION \
            wine-staging-amd64=$PKG_WINE_VERSION
    
    ADD https://github.com/Winetricks/winetricks/archive/${WINE_TRICKS_VERSION}.zip /tmp/wt.zip 
    RUN unzip /tmp/wt.zip -d /tmp/ && \
        cp /tmp/winetricks-${WINE_TRICKS_VERSION}/src/winetricks /usr/local/bin && \
        rm -Rf /tmp/*
    
    
    우리는 우리의 winehq:5.17 용기라고 할 수 있다.
    우리는 기본 용기와 포도주 용기가 하나 있다.
    대부분의 게임이 winbindcabextract가 필요하기 때문에 나는 그것들을 포도주와 함께 두기로 결정했다.이니시에이터/로드기에 많이 사용되기 때문에 글꼴 패키지도 있습니다.
    나는 내가 필요로 하는 소프트웨어 패키지를 위해 다른 무대를 세울 수 있다고 생각하지만, 나는 아직 그것들을 놓을 가장 좋은 무대를 찾을 시간이 없다.
    그래서 이제 우리는 커다란 명령줄을 기억하지 않기 위해 발자국을 만들 필요가 있다.
    이 때, 우리는 이 줄을 dockerfile에 추가해서 dxvk 용기에 추가할 수 있습니다
    ARG DXVKVERSION="1.7.1"
    ENV DXVK_VERSION="${DXVK_VERSION}"
    ADD https://github.com/doitsujin/dxvk/releases/download/v${DXVK_VERSION}/dxvk-${DXVK_VERSION}.tar.gz /tmp/dxvk.tar.gz 
    
    ... 하지만 DXVK는 winetricks를 통해 설치할 수도 있습니다.그래서 저는 지금 winetricks 방법을 사용합니다.
    우리는 언제든지 용기를 시작할 수 있도록 이 스크립트를 경로 디렉터리에 추가할 수 있습니다.
    또한 모든 버전을 환경 변수로 용기에 넣는 것은 개인적인 선호일 뿐이기 때문에 필요할 때 신속하게 검사할 수 있습니다.
    $HOME/tmp 경로에 임시 폴더를 만들고 용기 내의 $HOME으로 사용합니다.또한 현재 경로 (또는 WINEPREFIX) 는 $HOME/game의 컨테이너에 배치됩니다.
    나는 어쩔 수 없이 이렇게 해야 한다. 왜냐하면.Xauthority 파일은 homedir에 마운트됩니다. 볼륨이기 때문에 두 가지 일이 발생할 수 있습니다.
    1 - WINEPREFIX를 마스터 디렉토리로 설정한 경우.Xauthority 파일은 호스트의 위치로 복사됩니다.
    2 - 홈 디렉터리가 존재하지 않으면 사용자 root (용기 기본 사용자) 가 만들 것입니다. 이로 인해 일부 프로그램은 홈 디렉터리를 기본 위치로 사용하여 자신의 파일 (예를 들어 winetricks) 을 작성할 수 있습니다.
    #!/bin/bash
    
    curdir="$(pwd)"
    vhome="${HOME}/tmp/.winestorage"
    
    if [ ! -d "$vhome" ]; then
        echo "creating $vhome"
        mkdir -p $vhome
    fi
    
    docker run --rm \
        --name wine \
        -u $(id -u):$(id -g) \
        -e DISPLAY \
        -e WINEPREFIX=/wine/game \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        -e PULSE_SERVER=unix:/pulse \
        -e HOME=/wine \
        -v $HOME/.Xauthority:/wine/.Xauthority \
        -v /run/user/$(id -u)/pulse/native:/pulse \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools \
        --device /dev/nvidia-modeset:/dev/nvidia-modeset \
        -v ${vhome}:/wine \
        -v ${curdir}:/wine/game \
        -ti \
        winehq:5.17 \
        bash
    
    이 스크립트는 다음과 같은 몇 가지 고려 사항이 있습니다.
  • 종료 후 제거--rm
  • 컨테이너에 사용자 및 그룹 매핑 -u $(id -u):$(id -g)
  • WINEPREFIX env를/wine/game-e WINEPREFIX=/wine/game, my HOME을/wine-e HOME=/wine
  • 로 설정
  • X11 소켓이 포함된 디렉토리를 컨테이너-v /tmp/.X11-unix:/tmp/.X11-unix에 마운트합니다.
  • pulesaudio를 사용하기 때문에 플러그인 경로-e PULSE_SERVER=unix:/pulse를 정의하고 실제 플러그인을 용기에 넣습니다-v /run/user/$(id -u)/pulse/native:/pulse
  • 그것은 나의 것을 설치할 것이다.사용자 홈 디렉토리의 X 권한 파일-v $HOME/.Xauthority:/wine/.Xauthority
  • 엔비디아 gpu
  • 에 해당하는 모든 장치 추가
  • , 마지막으로 주 경로와 게임 경로를 용기에 넣기
  • 우리는 이 스크립트를 확장하여 추가 wine 변수를 용기에 전달할 수 있습니다.
    현재 용기에서 우리는 직접 /wine/game 로 이동하여 우리가 실행하고자 하는 내용을 설치하거나 재생할 수 있다.
    추가 패키지를 설치해야 할 물건을 설치하려고 시도할 때, 루트로 용기를 입력하고 docker exec -u root -ti wine bash 실행하기만 하면 우리가 필요로 하는 물건을 설치할 수 있는 새로운 셸을 열 수도 있습니다.
    포도주를 사용하는 것은 이 글의 진정한 목표가 아니지만, 인터넷에는 이 점을 도울 충분한 정보가 있다.winetricks를 설치하면 접두사를 설정하는 데 도움을 줄 수 있습니다.
    내 동기 중 하나는 이 디렉터리 구조 ($vhome 경로) 를 사용하여 winetricks에 캐시를 다운로드하고 유지하려고 하는 것이다.
    나는 이런 방법을 써서 전투를 일으킨 적이 있다.net는 효과가 매우 좋은 몇 가지 게임을 시도했다.
    나는 에픽 게임 스토어도 운영할 수 있지만, 불행하게도 나는 그곳에서 몇 가지 게임을 했지만 운이 없었다.나는 나의 접두사에 약간의 물건이 없어졌다고 생각한다.
    마지막으로 전쟁 게임을 할 수 있는 게임 센터를 설치하고 탱크 세계를 몇 바퀴 돌 수 있다.
    이 점에서 대부분의 필요한 작업은 접두사에 어떤 의존항을 사용해야 하는지, 그리고 어떤 포도주 창고를 덮어야 하는지 찾아내는 것이다.Lutris 설치 스크립트는 주어진 게임에 대한 더 많은 정보를 찾기에 적합하다.
    여전히 오류가 발생하지만, wine 디버깅 메시지는 일부 문제를 추적하고, 우리가 설치해야 할 잃어버릴 수 있는 소프트웨어 패키지를 찾을 수 있도록 도와줍니다.

    보안 문제


    나는 이런 방법의 안전 결함을 깊이 연구하지 않을 것이다.
    아리 칼포스는 그의 자리에서 이미 잘했다.GUI 프로그램을 실행하는 것을 고려하지 않아도 읽을 만하다.
    그러면 다음 몇 가지 효과적인 문제를 해결하기 위해 시작 스크립트를 조정해 보겠습니다.
    #!/bin/bash
    
    curdir="$(pwd)"
    vhome="${HOME}/tmp/.winestorage"
    
    if [ ! -d "$vhome" ]; then
        echo "creating $vhome"
        mkdir -p $vhome
    fi
    
    docker run --rm \
        --cap-drop=all \
        --name wine \
        -u $(id -u):$(id -g) \
        -e DISPLAY \
        -e WINEPREFIX=/wine/game \
        -v /tmp/.X11-unix:/tmp/.X11-unix:ro \
        -e PULSE_SERVER=unix:/pulse \
        -e HOME=/wine \
        -v $HOME/.Xauthority:/wine/.Xauthority:ro \
        -v /run/user/$(id -u)/pulse/native:/pulse \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools \
        --device /dev/nvidia-modeset:/dev/nvidia-modeset \
        -v ${vhome}:/wine \
        -v ${curdir}:/wine/game \
        -ti \
        winehq:5.17 \
        bash
    
    우리가 --cap-drop=all 를 추가할 때, 작업을 멈추는 일 중 하나는 용기를 root 로 입력하고 용기 시스템의 모든 내용을 변경할 수 있다는 것을 기억하십시오.
    물론, linux에서 게임을 하는 것은 더욱 간단한 방법이 있지만, 이것은 나에게 있어서 좋은 일이다. 이렇게 하면 나는 호스트 시스템에 설치되어 있지 않은 많은 소프트웨어 패키지에서 벗어날 수 있다.
    AMD나 Intel 그래픽에서 실행할 수 있도록 이 글을 개선할 수 있지만, 지금은 할 수 없습니다.

    좋은 웹페이지 즐겨찾기