Jump to content

Bottles (software)

From DawoumWiki, the free Mathematics self-learning
Bottles
Developer(s)Bottles Developers
Stable release
51.18 / January 15, 2025; 12 months ago (2025-01-15)
Repositorygithub.com/bottlesdevs/Bottles
Written inPython
Operating systemLinux
LicenseGPL Version 3
Websiteusebottles.com

리눅스 사용자들의 가장 큰 고민꺼리 중 하나는 윈도우 응용 프로그램을 설치하려는 이유가 생길 때입니다. 보통 대안 프로그램이 있긴 하지만, 대안이 없는 경우에는 윈도우 프로그램을 어떤 형태로든지 직접 설치해야 합니다.

이때, 시스템 하드웨어의 여유가 있을 때에는 QEMU/KVM 등의 가상 기계를 이용할 수 있지만, 그런 여유가 없을 때에는 Wine을 이용할 수 있습니다. 와인도 개발이 진행되면서 윈도우 프로그램 설치가 점점 나아지긴 했지만, 다른 이유, 예를 들어, 성능 향상을 이유로 다른 방법을 선택하기도 합니다.

어쨌든, 과거에 PlayOnLinux, Lutris를 이용해서 윈도우 프로그램을 설치했고, 여기서는 Bottles라는 프로그램을 사용해서 윈도우 프로그램을 설치해 보려고 합니다.

먼저 Bottles부터 설치해야 합니다.

Installation

이 프로그램의 개발자들은 컨테이너 방식인 Flatpak을 이용하는 패키지를 제공하고 있습니다.

여기서는 시스템에 직접 설치할 예정이므로, github에서 소스를 받아서 deb 패키지를 만들 것입니다.

또는 최신 버전인 51.13을 직접 받아도 좋겠습니다.

이제 Building Debian Packages with Meson를 읽고 내용대로 처리해 줍니다

  • cd Bottles-51.13
  • dh_make --createorig -p bottles_51.13
  • dh_auto_configure --buildsystem=meson

여기서, 보통, debian/changelog, control 파일 등을 수정할 필요가 있습니다. 굳이 안해도 bottles 자체를 사용하는 데에는 이상은 없습니다:

  • dpkg-buildpackage -i -us -uc -b

패키지가 정상적으로 컴파일이 되지 않을 때에는 필요한 라이브러리를 먼저 설치해야 할 수도 있습니다.

패키지가 만들어지면 설치합니다:

  • cd ..
  • sudo dpkg -i bottles_51.13-1_amd64.deb

첫 번째 실행은 가능한 터미널에서 하는 것이 좋은데, 왜냐하면 의존성 프로그램의 부재로 오류를 발생할 수 있고 내용을 쉽게 확인할 수 있기 때문입니다.

다음 패키지를 설치해야 합니다:

  • sudo apt install python3-pathvalidate
  • sudo apt install python3-icoextract
  • sudo rm /usr/lib/python3.12/EXTERNALLY-MANAGED
  • sudo pip install patool
  • sudo pip install fvs
  • sudo pip install vkbasalt-cli

이제 오류 없이 실행될 것으로 기대되지만, 오류를 확인하셔서 대처하십시오.

Configurations

첫 실행에서 몇 가지 프로그램을 다운로드합니다. 아마도 기본값으로 진행해도 당장은 문제없을 전망입니다.

Installing window program

Kakaotalk

윈도우용 카카오톡을 받아야 하는데, 여기서는 Windows10 이상에서 사용하기를 받았습니다.

  • Bottles에서 New bottle

설치 환경이 마무리 되면, Run Executable...를 눌러서 다운받은 설치 프로그램을 선택합니다.

설치 중에 한글 표현이 이상없이 되고, 기본값으로 설치합니다.

한글 입력은 Korean IME (kime)을 이용함으로써 문제를 회피할 수 있습니다.

님프 입력기에서는 한글 입력기 가능하지만, 마지막에 점이나 쉼표를 찍으면, 앞쪽에 표시되는 문제가 있습니다.

이 부분을 개선하기 위해, 아래와 같이 바꿀 수 있지만, 입력하고 있는 위치에 글씨를 보여주지 않기 때문에, 이것도 문제입니다.

  • 아래쪽에 있는 Tools->Registry Editor를 실행합니다.
  • HKEY_CURRENT_USER->Software->Wine
  • X11 Driver를 생성
  • String에 inputStyle를 입력하고 data에 root를 입력하십시오.

Diablo 2 Resurrected

내 컴퓨터에서 실행기를 통해 오프라인으로 캠페인을 실행할 수 있습니다. 이와 같은 환경을 마련해 둔 파일을 설치할 필요가 있고, FitGirl이 제작한 Jul. 29th '22에 배포된 30.3GB 파일을 이용할 수 있습니다. 더구나 한글을 지원하기 때문에 음성이나 텍스트를 한글로 볼 수 있습니다.

Bottom (software)에서 Gaming 프로파일을 이용해서 설치했고, 다이렉트 X 등의 프로그램은 설치할 필요가 없고 설치는 몇 십분 정도 걸립니다.

Diablo 2

기존에 PlayOnLinux에 설치된 것을 그래도 옮겨왔습니다. 예를 들어, PlayOnLinux에서 Diable2라는 이름으로 virtual drive를 만들고, 같은 이름으로 bottle을 만들었을 때, 아래와 같이 옮길 수 있습니다

  • mv ~/.PlayOnLinux/wineprefix/Diable2/drive_c/Program\ Files/Diable II ~/.local/share/bottles/bottles/Diablo2/drive_c/Program\ Files

그리고, Hero Editor는 다른 곳에 라이브러리를 남기는지 옮겨서는 실행되지 않고, 같은 bottle에 설치를 다시했습니다.

게다가, PlayOnLinux/Diablo2 fullscreen mode를 읽고 다시 설정을 진행해야 할 수 있습니다.

StarCraft2

기존에 PlayOnLinux에 설치된 것을 그대로 옮겨왔고, Runme First를 실행해서 다시 offline 모드를 만들었습니다.

64비트 모드에서 실행되지 않으니, 32비트 모드에서 실행해야 하며, 즉, wine32 버전까지 설치해야 합니다.

시드 버전에 있는 wine32가 nvidia와 겹합되어 있기 때문에, 설치 중에 확인해서 그렇게 설치하지 않도록 주의가 필요합니다.

HOffice 2014

문제 없이 설치됩니다.

한글 입력은 사용할 수 없어서, 추가적인 조치가 필요합니다.

  • 아래쪽에 있는 Tools->Registry Editor를 실행합니다.
  • HKEY_CURRENT_USER->Software->Wine
  • X11 Driver를 생성
  • String에 UseXIM를 입력하고 data에 N를 입력하십시오.

⇧ Shift+Space로 입력기 전환이 됩니다. Hnc update가 진행되지 않습니다.

Troubleshootings

Gamemode

Gamemode가 없어도 설치는 되지만, 물론 의존성으로 설치하도록 강제할 수도 있을지라도, 아래의 패치들을 사용하면, 특정 버튼이 동작하지 않을 수 있습니다.

바로 아래의 패치에서 bottle_preferences.py 파일에서 남겨둔 것을 제거해야 합니다:

--- Bottles-51.21.orig/bottles/frontend/views/bottle_preferences.py	2025-03-17 12:14:40.000000000 +0900
+++ Bottles-51.21/bottles/frontend/views/bottle_preferences.py	2025-03-27 18:01:40.072110234 +0900
@@ -139,7 +139,5 @@
         self.queue = details.queue
         self.details = details
 
-        if not gamemode_available or not Xdp.Portal.running_under_sandbox():
-             return

51.21 패치 파일

바로 아래 글은 master 가지의 패치 파일이고, 여기서 제공하는 것은 타르볼로 제공하는 파일의 패치 파일입니다.

diff '--color=auto' --color -urN Bottles-51.21.orig/bottles/frontend/views/bottle_details.py Bottles-51.21/bottles/frontend/views/bottle_details.py
--- Bottles-51.21.orig/bottles/frontend/views/bottle_details.py	2025-03-17 12:14:40.000000000 +0900
+++ Bottles-51.21/bottles/frontend/views/bottle_details.py	2025-03-27 18:00:43.322435905 +0900
@@ -451,6 +451,9 @@
             else:
                 show_chooser()
 
+        if not Xdp.Portal.running_under_sandbox():
+           show_chooser()
+
     def __backup(self, widget, backup_type):
         """
         This function pop up the file chooser where the user
diff '--color=auto' --color -urN Bottles-51.21.orig/bottles/frontend/views/bottle_preferences.py Bottles-51.21/bottles/frontend/views/bottle_preferences.py
--- Bottles-51.21.orig/bottles/frontend/views/bottle_preferences.py	2025-03-17 12:14:40.000000000 +0900
+++ Bottles-51.21/bottles/frontend/views/bottle_preferences.py	2025-03-27 18:01:40.072110234 +0900
@@ -139,7 +139,7 @@
         self.queue = details.queue
         self.details = details
 
-        if not gamemode_available or not Xdp.Portal.running_under_sandbox():
+        if not gamemode_available:
             return
 
         _not_available = _("This feature is unavailable on your system.")
diff '--color=auto' --color -urN Bottles-51.21.orig/bottles/frontend/views/list.py Bottles-51.21/bottles/frontend/views/list.py
--- Bottles-51.21.orig/bottles/frontend/views/list.py	2025-03-17 12:14:40.000000000 +0900
+++ Bottles-51.21/bottles/frontend/views/list.py	2025-03-27 17:58:05.783943863 +0900
@@ -82,8 +82,8 @@
 
     def run_executable(self, *_args):
         """Display file dialog for executable"""
-        if not Xdp.Portal.running_under_sandbox():
-            return
+#        if not Xdp.Portal.running_under_sandbox():
+#            return
 
         def set_path(_dialog, response):
             if response != Gtk.ResponseType.ACCEPT:
diff '--color=auto' --color -urN Bottles-51.21.orig/bottles/frontend/views/new_bottle_dialog.py Bottles-51.21/bottles/frontend/views/new_bottle_dialog.py
--- Bottles-51.21.orig/bottles/frontend/views/new_bottle_dialog.py	2025-03-17 12:14:40.000000000 +0900
+++ Bottles-51.21/bottles/frontend/views/new_bottle_dialog.py	2025-03-27 17:56:12.770662000 +0900
@@ -80,7 +80,7 @@
         super().__init__(**kwargs)
         # common variables and references
         self.window = GtkUtils.get_parent_window()
-        if not self.window or not Xdp.Portal.running_under_sandbox():
+        if not self.window:
             return
 
         self.app = self.window.get_application()

Bottles preferences error

51.18 이래로, bottle 생성이 되지 않고, 기존 bottle도 세부 속성을 볼 수 없을 것입니다. 이는 flatpak에서는 발생하지 않는 것으로 추정되고, 불필요한 코드를 제거하면서 삽입된 코드 중에서, 샌드박스 검사를 통과하지 못하는 경우에 처리로 인해 발생하는 것으로 보입니다:

아래와 같이 통과하지 못하는 경우의 코드를 제거함으로써 일부 해결이 되는 것처럼 보입니다:

diff --color -urN Bottles.dist/bottles/frontend/bottle_details_page.py Bottles/bottles/frontend/bottle_details_page.py
--- Bottles.dist/bottles/frontend/bottle_details_page.py	2025-02-21 02:39:29.298999928 +0900
+++ Bottles/bottles/frontend/bottle_details_page.py	2025-03-03 07:21:09.040255099 +0900
@@ -442,6 +442,9 @@
             else:
                 show_chooser()
 
+        if not Xdp.Portal.running_under_sandbox():
+            show_chooser()
+
     def __backup(self, widget, backup_type):
         """
         This function pop up the file chooser where the user
diff --color -urN Bottles.dist/bottles/frontend/bottles_list_view.py Bottles/bottles/frontend/bottles_list_view.py
--- Bottles.dist/bottles/frontend/bottles_list_view.py	2025-02-21 02:39:29.298999928 +0900
+++ Bottles/bottles/frontend/bottles_list_view.py	2025-03-03 07:19:41.657552128 +0900
@@ -82,8 +82,8 @@
 
     def run_executable(self, *_args):
         """Display file dialog for executable"""
-        if not Xdp.Portal.running_under_sandbox():
-            return
+#        if not Xdp.Portal.running_under_sandbox():
+#            return
 
         def set_path(_dialog, response):
             if response != Gtk.ResponseType.ACCEPT:
diff --color -urN Bottles.dist/bottles/frontend/details_preferences_page.py Bottles/bottles/frontend/details_preferences_page.py
--- Bottles.dist/bottles/frontend/details_preferences_page.py	2025-02-23 02:09:01.486621108 +0900
+++ Bottles/bottles/frontend/details_preferences_page.py	2025-03-03 07:19:41.658224602 +0900
@@ -139,9 +139,12 @@
         self.queue = details.queue
         self.details = details
 
-        if not gamemode_available or not Xdp.Portal.running_under_sandbox():
+#        if not gamemode_available or not Xdp.Portal.running_under_sandbox():
+#            return
+        if not gamemode_available: 
             return
 
+
         _not_available = _("This feature is unavailable on your system.")
         _flatpak_not_available = _(
             "{} To add this feature, please run flatpak install"
diff --color -urN Bottles.dist/bottles/frontend/new_bottle_dialog.py Bottles/bottles/frontend/new_bottle_dialog.py
--- Bottles.dist/bottles/frontend/new_bottle_dialog.py	2025-02-21 02:39:29.300018341 +0900
+++ Bottles/bottles/frontend/new_bottle_dialog.py	2025-03-03 07:19:41.658422417 +0900
@@ -80,7 +80,9 @@
         super().__init__(**kwargs)
         # common variables and references
         self.window = GtkUtils.get_parent_window()
-        if not self.window or not Xdp.Portal.running_under_sandbox():
+#        if not self.window or not Xdp.Portal.running_under_sandbox():
+#            return
+        if not self.window:
             return
 
         self.app = self.window.get_application()

51.18 compile

아래의 두 개의 파일로 바꾸었습니다:

  • bottles/frontend/meson.build
  • bottles/frontend/windows/window.py 또는 bottles/frontend/window.py

추가적으로 libadwaita >= 1.7로 의존성 버전이 바뀌었습니다.

51.17 compile

아래 두 개의 파일에 대한 패치는 아치 리눅스 패키지 정보에서 얻을 수 있습니다.

아래 2 파일을 수정해야 할 수도 있습니다. 첫 번째 파일은 컴파일을 위해 수정될 필요가 있고, 두 번째 파일은 실행 시 환경을 제공하기 위해 수정될 필요가 있습니다. 실행 환경이 샌드박스 (Flatpak 또는 AppImage)가 아닐 경우에 메시지를 출력하면서 실행이 되지 않습니다.

  • frontend/meson.build
  • frontend/windows/main_window.py

드라이브 만들기

보통 bottle을 만들면, 자신의 디렉토리 문자 (C)와 리눅스 루트 디렉토리를 (Z)로 만들어 줍니다. 특정 디렉토리로 바로 가기 드라이브를 만들기 위해, 아래와 마찬가지로 Legacy Wine Tools->Configuration->Drives에서 등록할 수 있습니다.

화면 dpi 조절

와인 관련 창이 너무 작아서 내용을 확인할 수 없습니다. 이때에는 해당 bottles에서 오른쪽 화살표를 눌러서 Legacy Wine Tools 아래에 Configuration을 실행합니다. 그런-다음 Graphics에서 dpi를 조절할 수 있습니다.