从 appimage 内部使用 unionfs
Using unionfs from inside an appimage
我正在从 AppImage(使用 appimage-builder v0.9.2 创建)中的脚本创建覆盖文件系统(使用 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
如有任何帮助,我们将不胜感激!
解决方法是:
- 使用选项
auto_unmount
启动 unionfs
- 而不是
fusermount -u
,使用pkill -nf ${ROOT_DIR}
杀死最后一个unionfs进程
(终止其参数中包含 ${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(使用 appimage-builder v0.9.2 创建)中的脚本创建覆盖文件系统(使用 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
如有任何帮助,我们将不胜感激!
解决方法是:
- 使用选项
auto_unmount
启动 unionfs
- 而不是
fusermount -u
,使用pkill -nf ${ROOT_DIR}
杀死最后一个unionfs进程 (终止其参数中包含 ${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}