在 appimage 中使用 unionfs

Posted

技术标签:

【中文标题】在 appimage 中使用 unionfs【英文标题】:Using unionfs from inside an appimage 【发布时间】:2021-12-09 15:58:17 【问题描述】:

我正在从 AppImage(使用 appimage-builder v0.9.2 创建)中的脚本创建覆盖 FS(使用 unionfs-fuse)。 覆盖已成功挂载,但在脚本结束时,无法正确卸载,并使用“Operation not permitted”。 但在 AppImage 结束后,fusermount -u 工作正常。

这里是脚本script.sh

#!/bin/sh

ROOT_DIR=$(mktemp -d -t test-XXXXXX)
myUID=$(id -u)
myGID=$(id -g)
USER_DIR=/tmp/a
mkdir -p $USER_DIR

echo "Hello world!" > $USER_DIR/hello.txt

# create an overlay of $USER_DIR (rw) over $APPDIR (ro) into $ROOT_DIR
UNIONFS="unionfs -o cow,uid=$myUID,gid=$myGID $USER_DIR=RW:$APPDIR $ROOT_DIR"
if ! $( $UNIONFS ); then
    echo "mount failed!"
    exit 1
fi
echo "overlay created in $ROOT_DIR"

# files in $USER_DIR may be read/written from the overlay
cat $ROOT_DIR/hello.txt

# unmount overlay before closing the AppImage
fusermount -zu $ROOT_DIR
rmdir $ROOT_DIR

这是 AppImage 配方AppImageBuilder.yml

version: 1

AppDir:
  path: /home/user/bugreport

  app_info:
    id: org.appimage.test
    name: AppimageTest
    icon: terminal
    version: 0.0.1
    exec: bin/dash
    exec_args: "script.sh"

  apt:
    arch: amd64
    sources:
      - sourceline: 'deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse'
        key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32'
      - sourceline: 'deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse'
      - sourceline: 'deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse'

    include: [unionfs-fuse, dash, coreutils]
    exclude: []

AppImage:
  arch: x86_64
  update-information: None
  sign-key: None

terminal.png 中还需要一个随机图标文件来构建 AppImage)。

AppImage 是使用以下工具构建的:

$ appimage-builder --recipe ./AppImageBuilder.yml

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

解决方法是:

使用选项auto_unmount 启动unionfs 用pkill -nf $ROOT_DIR杀死最后一个unionfs进程而不是fusermount -u (杀死参数中包含 $ROOT_DIR 的最新进程)

生成的脚本:

#!/bin/sh

ROOT_DIR=$(mktemp -d -t test-XXXXXX)
myUID=$(id -u)
myGID=$(id -g)
USER_DIR=/tmp/a
mkdir -p $USER_DIR

echo "Hello world!" > $USER_DIR/hello.txt

# create an overlay of $USER_DIR (rw) over $APPDIR (ro) into $ROOT_DIR
UNIONFS="unionfs -o cow,auto_unmount,uid=$myUID,gid=$myGID $USER_DIR=RW:$APPDIR $ROOT_DIR"
if ! $( $UNIONFS ); then
    echo "mount failed!"
    exit 1
fi
echo "overlay created in $ROOT_DIR"

# files in $USER_DIR may be read/written from the overlay
cat $ROOT_DIR/hello.txt

# killing unionfs will unmount the overlay
pkill -nf $ROOT_DIR
sleep 0.1
rmdir $ROOT_DIR

【讨论】:

以上是关于在 appimage 中使用 unionfs的主要内容,如果未能解决你的问题,请参考以下文章

使用 Electron Builder 构建 appImage 时出现“不允许符号链接操作”错误

如何使用appimage部署qt5应用

2020-07-02Ubuntu 经验 :软件安装 :安装.AppImage文件

appimage怎么安装

Appimage版wine乱码解决

安装.AppImage