首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在appimage中使用unionfs

在appimage中使用unionfs
EN

Stack Overflow用户
提问于 2021-10-23 08:42:02
回答 1查看 64关注 0票数 0

我正在从AppImage中的脚本创建一个覆盖FS (使用unionfs-fuse) (使用appImage-Builderv0.9.2创建)。

覆盖被成功地挂载,但是在脚本的末尾,它无法正确地用'Operation not permitted‘卸载。

不过,在AppImage结束后,fusermount -u可以正常工作。

这是脚本script.sh

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
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是使用以下方法构建的:

代码语言:javascript
复制
$ appimage-builder --recipe ./AppImageBuilder.yml

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-27 12:36:44

解决办法是:

使用选项auto_unmount

  • instead of fusermount -u启动unionfs,用pkill -nf ${ROOT_DIR}终止最后一个unionfs进程。

(杀死最近在其参数中包含${ROOT_DIR}的进程)

生成的脚本:

代码语言:javascript
复制
#!/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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69686488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档