Allow using fuse-overlayfs instead of mount
This commit is contained in:
parent
64065ed12e
commit
76d9feb07a
@ -1,6 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from lmm.config import LMMConfig
|
||||||
from lmm.const import LMM_GAMES_PATH
|
from lmm.const import LMM_GAMES_PATH
|
||||||
from lmm.games.config import load_game_configs
|
from lmm.games.config import load_game_configs
|
||||||
from lmm.games.game import Game
|
from lmm.games.game import Game
|
||||||
@ -148,6 +149,7 @@ def list():
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
LMMConfig.init()
|
||||||
cli()
|
cli()
|
||||||
|
|
||||||
|
|
||||||
|
24
lmm/config.py
Normal file
24
lmm/config.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
from lmm.const import LMM_PATH
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
|
class LMMConfig:
|
||||||
|
use_fuse: bool
|
||||||
|
overlayfs_command: str
|
||||||
|
fusermount_command: str
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def init(cls):
|
||||||
|
# Load the config file
|
||||||
|
config = LMM_PATH / "config.yaml"
|
||||||
|
if config.exists():
|
||||||
|
with open(config, "r") as f:
|
||||||
|
data = yaml.load(f, Loader=yaml.CLoader)
|
||||||
|
else:
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
fuse = data.get("fuse", {})
|
||||||
|
cls.use_fuse = fuse.get("enable", False)
|
||||||
|
cls.overlayfs_command = fuse.get("overlayfs", "fuse-overlayfs")
|
||||||
|
cls.fusermount_command = fuse.get("fusermount", "fusermount")
|
@ -115,11 +115,21 @@ class ProtonGame(Game, abc.ABC):
|
|||||||
with open(proc_path, "r") as f:
|
with open(proc_path, "r") as f:
|
||||||
cmdline = f.read()
|
cmdline = f.read()
|
||||||
|
|
||||||
|
# Workaround for Baldur's Gate 3, which launches "../bin/bg3_dx11.exe", when launched from
|
||||||
|
# the Larion Launcher.
|
||||||
|
if cmdline.startswith(".."):
|
||||||
|
cmdline = os.path.join(
|
||||||
|
os.readlink(proc / dir / "cwd"), cmdline
|
||||||
|
).replace("\\", "/")
|
||||||
|
|
||||||
# Workaround for games like Baldur's Gate 3 that have a relative path in the cmdline.
|
# Workaround for games like Baldur's Gate 3 that have a relative path in the cmdline.
|
||||||
# Note that the cmdline contains null bytes that we have to remove.
|
# Note that the cmdline contains null bytes that we have to remove.
|
||||||
abs_cmdline = os.path.abspath(cmdline).replace("\x00", "")
|
abs_cmdline = os.path.abspath(cmdline).replace("\x00", "")
|
||||||
if cmdline.startswith(wine_exe_path) or abs_cmdline == str(
|
|
||||||
self.game_executable
|
if (
|
||||||
|
cmdline.startswith(wine_exe_path)
|
||||||
|
or abs_cmdline == str(self.game_executable)
|
||||||
|
or abs_cmdline.startswith(str(self.game_executable))
|
||||||
):
|
):
|
||||||
self._pid = dir
|
self._pid = dir
|
||||||
break
|
break
|
||||||
|
@ -2,7 +2,8 @@ from pathlib import Path
|
|||||||
import tempfile
|
import tempfile
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from lmm.cmd import run_sudo_cmd
|
from lmm.config import LMMConfig
|
||||||
|
from lmm.cmd import run_sudo_cmd, run_cmd
|
||||||
|
|
||||||
|
|
||||||
def compute_workdirs_location(mount: Path) -> Path:
|
def compute_workdirs_location(mount: Path) -> Path:
|
||||||
@ -71,18 +72,29 @@ class OverlayFSMount:
|
|||||||
workdir = self.create_workdir()
|
workdir = self.create_workdir()
|
||||||
options += f",upperdir={self.upper},workdir={workdir}"
|
options += f",upperdir={self.upper},workdir={workdir}"
|
||||||
|
|
||||||
result = run_sudo_cmd(
|
if LMMConfig.use_fuse:
|
||||||
[
|
result = run_cmd(
|
||||||
"mount",
|
[
|
||||||
"-t",
|
LMMConfig.overlayfs_command,
|
||||||
"overlay",
|
"-o",
|
||||||
"overlay",
|
options,
|
||||||
"-o",
|
str(self.mount_path),
|
||||||
options,
|
],
|
||||||
str(self.mount_path),
|
cd=self.cd,
|
||||||
],
|
)
|
||||||
cd=self.cd,
|
else:
|
||||||
)
|
result = run_sudo_cmd(
|
||||||
|
[
|
||||||
|
"mount",
|
||||||
|
"-t",
|
||||||
|
"overlay",
|
||||||
|
"overlay",
|
||||||
|
"-o",
|
||||||
|
options,
|
||||||
|
str(self.mount_path),
|
||||||
|
],
|
||||||
|
cd=self.cd,
|
||||||
|
)
|
||||||
print("Mount result:", result)
|
print("Mount result:", result)
|
||||||
if not result == 0:
|
if not result == 0:
|
||||||
return None
|
return None
|
||||||
@ -95,12 +107,21 @@ class OverlayFSMount:
|
|||||||
print("Unmounting...")
|
print("Unmounting...")
|
||||||
|
|
||||||
# Remove the mount
|
# Remove the mount
|
||||||
run_sudo_cmd(
|
if LMMConfig.use_fuse:
|
||||||
[
|
run_cmd(
|
||||||
"umount",
|
[
|
||||||
str(self.mount_path),
|
LMMConfig.fusermount_command,
|
||||||
]
|
"-u",
|
||||||
)
|
str(self.mount_path),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
run_sudo_cmd(
|
||||||
|
[
|
||||||
|
"umount",
|
||||||
|
str(self.mount_path),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
# Remove the temporary workdir
|
# Remove the temporary workdir
|
||||||
if self.workdir is not None:
|
if self.workdir is not None:
|
||||||
|
Loading…
Reference in New Issue
Block a user