Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
anbox
提交
8d2e3853
A
anbox
项目概览
openeuler
/
anbox
通知
24
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
anbox
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8d2e3853
编写于
1月 05, 2017
作者:
S
Simon Fels
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
scripts: respect new unprivileged container model
上级
bd48e95d
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
191 addition
and
56 deletion
+191
-56
external/nsexec/uidmapshift.c
external/nsexec/uidmapshift.c
+160
-0
scripts/container-manager.sh
scripts/container-manager.sh
+9
-23
scripts/create-package.sh
scripts/create-package.sh
+22
-33
未找到文件。
external/nsexec/uidmapshift.c
0 → 100644
浏览文件 @
8d2e3853
/*
* Copyright © 2012-2016 Canonical, Inc
*
* Author: Serge Hallyn <serge.hallyn@ubuntu.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, version 2 of the
* License.
*
*/
#define _XOPEN_SOURCE 500
#include <errno.h>
#include <ftw.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define min(a,b) (a) < (b) ? (a) : (b)
#define max(a,b) (a) > (b) ? (a) : (b)
static
int
verbose
=
0
;
static
int
convert_uids
=
0
;
static
int
convert_gids
=
0
;
static
uid_t
srcid
;
static
uid_t
dstid
;
static
uid_t
range
;
static
uid_t
range_uid_max
=
0
;
static
uid_t
range_uid_min
=
~
0
;
static
gid_t
range_gid_max
=
0
;
static
gid_t
range_gid_min
=
~
0
;
void
usage
(
void
)
{
extern
const
char
*
__progname
;
printf
(
"Usage: %s [OPTIONS] directory [src dst range]
\n\n
"
,
__progname
);
printf
(
" -u, --uid convert uids in directory
\n
"
);
printf
(
" -g, --gid convert gids in directory
\n
"
);
printf
(
" -b, --both convert uids and gids in directory
\n
"
);
printf
(
" -r, --range find min,max uid/gid used in directory
\n
"
);
printf
(
" -v, --verbose increate verbosity
\n\n
"
);
printf
(
"Note this program always recursively walks all of directory.
\n
"
);
printf
(
"If -u,-g, or -b is given, then [src dst range] are required to convert the
\n
"
);
printf
(
"ids within the range [src..src+range] to [dst..dst+range].
\n\n
"
);
printf
(
"Examples:
\n
"
);
printf
(
" %s -r /path/to/directory # show min/max uid/gid
\n
"
,
__progname
);
printf
(
" %s -b /path/to/directory 0 100000 500 # map uids and gids up
\n
"
,
__progname
);
printf
(
" %s -u /path/to/directory 100000 0 500 # map the uids back down
\n
"
,
__progname
);
}
int
ftw_callback
(
const
char
*
fpath
,
const
struct
stat
*
st
,
int
typeflag
,
struct
FTW
*
ftw
)
{
uid_t
new_uid
=
-
1
;
uid_t
new_gid
=
-
1
;
int
ret
;
range_uid_max
=
max
(
range_uid_max
,
st
->
st_uid
);
range_uid_min
=
min
(
range_uid_min
,
st
->
st_uid
);
range_gid_max
=
max
(
range_gid_max
,
st
->
st_gid
);
range_gid_min
=
min
(
range_gid_min
,
st
->
st_gid
);
if
(
convert_uids
&&
st
->
st_uid
>=
srcid
&&
st
->
st_uid
<
srcid
+
range
)
new_uid
=
(
st
->
st_uid
-
srcid
)
+
dstid
;
if
(
convert_gids
&&
st
->
st_gid
>=
srcid
&&
st
->
st_gid
<
srcid
+
range
)
new_gid
=
(
st
->
st_gid
-
srcid
)
+
dstid
;
if
(
new_uid
!=
-
1
||
new_gid
!=
-
1
)
{
ret
=
lchown
(
&
fpath
[
ftw
->
base
],
new_uid
,
new_gid
);
if
(
ret
)
{
fprintf
(
stderr
,
"failed to chown %d:%d %s
\n
"
,
new_uid
,
new_gid
,
fpath
);
/* well, let's keep going */
}
else
{
if
(
!
S_ISLNK
(
st
->
st_mode
))
{
if
(
verbose
>
1
)
fprintf
(
stderr
,
"resetting mode to %o on %s
\n
"
,
st
->
st_mode
,
fpath
);
ret
=
chmod
(
&
fpath
[
ftw
->
base
],
st
->
st_mode
);
if
(
ret
)
{
fprintf
(
stderr
,
"failed to reset mode %o on %s
\n
"
,
st
->
st_mode
,
fpath
);
/* well, let's keep going */
}
}
if
(
verbose
)
printf
(
"u:%07d=%07d g:%07d=%07d m:%#07o %s %s
\n
"
,
st
->
st_uid
,
new_uid
,
st
->
st_gid
,
new_gid
,
st
->
st_mode
,
fpath
,
&
fpath
[
ftw
->
base
]);
}
}
return
0
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
const
char
*
base
;
int
show_range
=
0
;
int
opt
,
ret
;
static
const
struct
option
long_opts
[]
=
{
{
"help"
,
no_argument
,
NULL
,
'h'
},
{
"uids"
,
no_argument
,
NULL
,
'u'
},
{
"gids"
,
no_argument
,
NULL
,
'g'
},
{
"both"
,
no_argument
,
NULL
,
'b'
},
{
"range"
,
no_argument
,
NULL
,
'r'
},
{
"verbose"
,
no_argument
,
NULL
,
'v'
},
{
NULL
,
0
,
NULL
,
0
}
};
while
((
opt
=
getopt_long
(
argc
,
argv
,
"hugbrv"
,
long_opts
,
NULL
))
>=
0
)
{
switch
(
opt
)
{
case
'h'
:
usage
();
exit
(
EXIT_SUCCESS
);
case
'u'
:
convert_uids
=
1
;
break
;
case
'g'
:
convert_gids
=
1
;
break
;
case
'b'
:
convert_uids
=
convert_gids
=
1
;
break
;
case
'r'
:
show_range
=
1
;
break
;
case
'v'
:
verbose
++
;
break
;
}
}
argc
-=
optind
;
argv
+=
optind
;
if
(
argc
<
1
)
{
usage
();
exit
(
EXIT_FAILURE
);
}
base
=
argv
[
0
];
if
(
convert_uids
||
convert_gids
)
{
if
(
argc
<
4
)
{
usage
();
exit
(
EXIT_FAILURE
);
}
srcid
=
atoi
(
argv
[
1
]);
dstid
=
atoi
(
argv
[
2
]);
range
=
atoi
(
argv
[
3
]);
}
ret
=
nftw
(
base
,
ftw_callback
,
1000
,
FTW_PHYS
|
FTW_CHDIR
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"Failed to walk path %s %s
\n
"
,
base
,
strerror
(
errno
));
usage
();
return
EXIT_FAILURE
;
}
if
(
show_range
)
{
printf
(
"UIDs %d - %d
\n
"
"GIDs %d - %d
\n
"
,
range_uid_min
,
range_uid_max
,
range_gid_min
,
range_gid_max
);
}
return
EXIT_SUCCESS
;
}
scripts/container-manager.sh
浏览文件 @
8d2e3853
...
@@ -8,17 +8,11 @@ set -x
...
@@ -8,17 +8,11 @@ set -x
DATA_PATH
=
$SNAP_COMMON
/var/lib/anbox
DATA_PATH
=
$SNAP_COMMON
/var/lib/anbox
ROOTFS_PATH
=
$DATA_PATH
/rootfs
ROOTFS_PATH
=
$DATA_PATH
/rootfs
RAMDISK_PATH
=
$DATA_PATH
/ramdisk
ANDROID_IMG
=
$SNAP
/android.img
INITRD
=
$SNAP
/ramdisk.img
CONTAINER_BASE_UID
=
100000
SYSTEM_IMG
=
$SNAP
/system.img
if
[
!
-e
$INITRD
]
;
then
if
[
!
-e
$ANDROID_IMG
]
;
then
echo
"ERROR: boot ramdisk does not exist"
echo
"ERROR: android image does not exist"
exit
1
fi
if
[
!
-e
$SYSTEM_IMG
]
;
then
echo
"ERROR: system image does not exist"
exit
1
exit
1
fi
fi
...
@@ -67,24 +61,14 @@ load_kernel_modules() {
...
@@ -67,24 +61,14 @@ load_kernel_modules() {
}
}
start
()
{
start
()
{
# Extract ramdisk content instead of trying to bind mount the
# cpio image file to allow modifications.
rm
-Rf
$RAMDISK_PATH
mkdir
-p
$RAMDISK_PATH
cd
$RAMDISK_PATH
cat
$INITRD
|
gzip
-d
| cpio
-i
# FIXME those things should be fixed in the build process
chmod
+x
$RAMDISK_PATH
/anbox-init.sh
# Setup the read-only rootfs
# Setup the read-only rootfs
mkdir
-p
$ROOTFS_PATH
mkdir
-p
$ROOTFS_PATH
mount
-o
bind
,ro
$RAMDISK_PATH
$ROOTFS_PATH
mount
-o
loop,ro
$ANDROID_IMG
$ROOTFS_PATH
mount
-o
loop,ro
$SYSTEM_IMG
$ROOTFS_PATH
/system
# but certain top-level directories need to be in a writable space
# but certain top-level directories need to be in a writable space
for
dir
in
cache data
;
do
for
dir
in
cache data
;
do
mkdir
-p
$DATA_PATH
/android-
$dir
mkdir
-p
$DATA_PATH
/android-
$dir
chown
$CONTAINER_BASE_UID
:
$CONTAINER_BASE_UID
$DATA_PATH
/android-
$dir
mount
-o
bind
$DATA_PATH
/android-
$dir
$ROOTFS_PATH
/
$dir
mount
-o
bind
$DATA_PATH
/android-
$dir
$ROOTFS_PATH
/
$dir
done
done
...
@@ -104,6 +88,9 @@ start() {
...
@@ -104,6 +88,9 @@ start() {
load_kernel_modules
load_kernel_modules
# Ensure FUSE support for user namespaces is enabled
echo
Y
>
/sys/module/fuse/parameters/userns_mounts
exec
$SNAP
/usr/sbin/aa-exec
-p
unconfined
--
$SNAP
/bin/anbox-wrapper.sh container-manager
exec
$SNAP
/usr/sbin/aa-exec
-p
unconfined
--
$SNAP
/bin/anbox-wrapper.sh container-manager
}
}
...
@@ -111,7 +98,6 @@ stop() {
...
@@ -111,7 +98,6 @@ stop() {
for
dir
in
cache data
;
do
for
dir
in
cache data
;
do
umount
$ROOTFS_PATH
/
$dir
umount
$ROOTFS_PATH
/
$dir
done
done
umount
$ROOTFS_PATH
/system
umount
$ROOTFS_PATH
umount
$ROOTFS_PATH
$SNAP
/bin/anbox-bridge.sh stop
$SNAP
/bin/anbox-bridge.sh stop
...
...
scripts/create-package.sh
浏览文件 @
8d2e3853
#!/bin/bash
#!/bin/bash
TOPDIR
=
`
echo
$ANDROID_BUILD_TOP
`
set
-ex
OUTDIR
=
`
echo
$ANDROID_PRODUCT_OUT
`
CURDIR
=
`
pwd
`
TARGET
=
rootfs
if
[
-d
$TARGET
]
;
then
ramdisk
=
$1
rm
-rf
$TARGET
system
=
$2
if
[
-z
"
$ramdisk
"
]
||
[
-z
"
$system
"
]
;
then
echo
"Usage:
$0
<ramdisk> <system image>"
exit
1
fi
fi
mkdir
$TARGET
workdir
=
`
mktemp
-d
`
cp
-r
$OUTDIR
/root/
*
$TARGET
/
rootfs
=
$workdir
/rootfs
cp
-r
$OUTDIR
/system/
*
$TARGET
/system/
mkdir
$TARGET
/cache
mkdir
-p
$rootfs
find out
-name
filesystem_config.txt
-exec
cp
{}
$TARGET
\;
# Extract ramdisk and preserve ownership of files
if
[
!
-e
$TARGET
/filesystem_config.txt
]
;
then
(
cd
$rootfs
;
cat
$ramdisk
|
gzip
-d
|
sudo
cpio
-i
)
echo
"ERROR: Filesystem config is not available. You have to run"
echo
"ERROR:
$
make target-files-package"
echo
"ERROR: to generate it as part of the Android build."
rm
-rf
$TARGET
exit
1
fi
if
[
-z
"
$TOPDIR
"
]
||
[
"
$CURDIR
"
!=
"
$TOPDIR
"
]
;
then
mkdir
$workdir
/system
echo
"ERROR: You have to execute this script from the ANDROID_BUILD_TOP"
sudo
mount
-o
loop,ro
$system
$workdir
/system
echo
"ERROR: directory."
sudo cp
-ar
$workdir
/system/
*
$rootfs
/system
exit
1
sudo
umount
$workdir
/system
fi
cp
anbox/scripts/anbox-init.sh
$TARGET
/
gcc
-o
$workdir
/uidmapshift external/nsexec/uidmapshift.c
chmod
+x
$TARGET
/anbox-init.sh
sudo
$workdir
/uidmapshift
-b
$rootfs
0 100000 65536
chmod
755
$TARGET
/init.
*
# FIXME
chmod
755
$TARGET
/default.prop
sudo chmod
+x
$rootfs
/anbox-init.sh
chmod
755
$TARGET
/system/build.prop
chmod
+x
$TARGET
/anbox-init.sh
TARBALL_NAME
=
anbox-rootfs-
`
date
+%Y%m%d%H%M
`
.tar
sudo
mksquashfs
$rootfs
android.img
-comp
xz
-no-xattrs
tar
cf
$TARBALL_NAME
$TARGET
rm
-rf
$TARGET
echo
"Created
$TARBALL_NAME
"
sudo rm
-rf
$workdir
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录