Add support for user specified instance dir name

The default instance dir of Occlum is ".occlum". User now can specify the name
by declaring environment variable "OCCLUM_INSTANCE_DIR"
This commit is contained in:
Hui, Chunyang 2020-04-28 05:11:48 +00:00 committed by Tate, Hongliang Tian
parent 03bb09abdf
commit 6a17e6292c
6 changed files with 29 additions and 12 deletions

@ -15,7 +15,7 @@ enclave {
* *
* @retval On success, return 0; otherwise, return -1. * @retval On success, return 0; otherwise, return -1.
*/ */
public int occlum_ecall_init([in, string] const char* log_level); public int occlum_ecall_init([in, string] const char* log_level, [in, string] const char* instance_dir);
/* /*
* Create a new LibOS process to do the task specified by the given * Create a new LibOS process to do the task specified by the given

@ -33,9 +33,8 @@ lazy_static! {
.cause_err(|e| errno!(EINVAL, "invalid config JSON"))?; .cause_err(|e| errno!(EINVAL, "invalid config JSON"))?;
Ok(config) Ok(config)
} }
let config_path = unsafe { format!("{}{}", INSTANCE_DIR, "/build/Occlum.json.protected") };
let config_path = "./.occlum/build/Occlum.json.protected"; match load_config(&config_path) {
match load_config(config_path) {
Err(e) => { Err(e) => {
error!("failed to load config: {}", e.backtrace()); error!("failed to load config: {}", e.backtrace());
panic!(); panic!();

@ -11,7 +11,8 @@ use util::mem_util::from_untrusted::*;
use util::sgx::allow_debug as sgx_allow_debug; use util::sgx::allow_debug as sgx_allow_debug;
use sgx_tse::*; use sgx_tse::*;
const ENCLAVE_PATH: &'static str = ".occlum/build/lib/libocclum-libos.signed.so"; pub static mut INSTANCE_DIR: String = String::new();
static mut ENCLAVE_PATH: String = String::new();
lazy_static! { lazy_static! {
static ref INIT_ONCE: Once = Once::new(); static ref INIT_ONCE: Once = Once::new();
@ -19,11 +20,13 @@ lazy_static! {
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn occlum_ecall_init(log_level: *const c_char) -> i32 { pub extern "C" fn occlum_ecall_init(log_level: *const c_char, instance_dir: *const c_char) -> i32 {
if HAS_INIT.load(Ordering::SeqCst) == true { if HAS_INIT.load(Ordering::SeqCst) == true {
return EXIT_STATUS_INTERNAL_ERROR; return EXIT_STATUS_INTERNAL_ERROR;
} }
assert!(!instance_dir.is_null());
let log_level = { let log_level = {
let input_log_level = match parse_log_level(log_level) { let input_log_level = match parse_log_level(log_level) {
Err(e) => { Err(e) => {
@ -52,6 +55,12 @@ pub extern "C" fn occlum_ecall_init(log_level: *const c_char) -> i32 {
// Register exception handlers (support cpuid & rdtsc for now) // Register exception handlers (support cpuid & rdtsc for now)
register_exception_handlers(); register_exception_handlers();
unsafe {
let dir_str: &str = CStr::from_ptr(instance_dir).to_str().unwrap();
INSTANCE_DIR.push_str(dir_str);
ENCLAVE_PATH.push_str(&INSTANCE_DIR);
ENCLAVE_PATH.push_str("/build/lib/libocclum-libos.signed.so");
}
HAS_INIT.store(true, Ordering::SeqCst); HAS_INIT.store(true, Ordering::SeqCst);
}); });
@ -76,7 +85,8 @@ pub extern "C" fn occlum_ecall_new_process(
return EXIT_STATUS_INTERNAL_ERROR; return EXIT_STATUS_INTERNAL_ERROR;
} }
}; };
let _ = backtrace::enable_backtrace(ENCLAVE_PATH, PrintFormat::Short);
let _ = unsafe { backtrace::enable_backtrace(&ENCLAVE_PATH, PrintFormat::Short) };
panic::catch_unwind(|| { panic::catch_unwind(|| {
backtrace::__rust_begin_short_backtrace(|| { backtrace::__rust_begin_short_backtrace(|| {
match do_new_process(&path, &args, &host_stdio_fds) { match do_new_process(&path, &args, &host_stdio_fds) {
@ -97,7 +107,7 @@ pub extern "C" fn occlum_ecall_exec_thread(libos_pid: i32, host_tid: i32) -> i32
return EXIT_STATUS_INTERNAL_ERROR; return EXIT_STATUS_INTERNAL_ERROR;
} }
let _ = backtrace::enable_backtrace(ENCLAVE_PATH, PrintFormat::Short); let _ = unsafe { backtrace::enable_backtrace(&ENCLAVE_PATH, PrintFormat::Short) };
panic::catch_unwind(|| { panic::catch_unwind(|| {
backtrace::__rust_begin_short_backtrace(|| { backtrace::__rust_begin_short_backtrace(|| {
match do_exec_thread(libos_pid as pid_t, host_tid as pid_t) { match do_exec_thread(libos_pid as pid_t, host_tid as pid_t) {

@ -34,7 +34,7 @@ int occlum_pal_init(const struct occlum_pal_attr* attr) {
// automatically done by Intel SGX SDK). // automatically done by Intel SGX SDK).
eid = pal_get_enclave_id(); eid = pal_get_enclave_id();
int ret; int ret;
sgx_status_t ecall_status = occlum_ecall_init(eid, &ret, attr->log_level); sgx_status_t ecall_status = occlum_ecall_init(eid, &ret, attr->log_level, attr->instance_dir);
if (ecall_status != SGX_SUCCESS) { if (ecall_status != SGX_SUCCESS) {
const char* sgx_err = pal_get_sgx_error_msg(ecall_status); const char* sgx_err = pal_get_sgx_error_msg(ecall_status);
PAL_ERROR("Failed to do ECall: %s", sgx_err); PAL_ERROR("Failed to do ECall: %s", sgx_err);

@ -3,8 +3,11 @@
this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
occlum_dir="$( cd "$( dirname "$this_dir/../../../" )" >/dev/null 2>&1 && pwd )" occlum_dir="$( cd "$( dirname "$this_dir/../../../" )" >/dev/null 2>&1 && pwd )"
if [ -z $OCCLUM_INSTANCE_DIR ];then
OCCLUM_INSTANCE_DIR=".occlum"
fi
working_dir=`pwd` working_dir=`pwd`
context_dir="$working_dir/.occlum" context_dir="$working_dir/$OCCLUM_INSTANCE_DIR"
SGX_SDK="${SGX_SDK:-/opt/intel/sgxsdk}" SGX_SDK="${SGX_SDK:-/opt/intel/sgxsdk}"
SGX_GDB="$SGX_SDK/bin/sgx-gdb" SGX_GDB="$SGX_SDK/bin/sgx-gdb"

@ -1,4 +1,9 @@
#!/bin/bash #!/bin/bash
if [ -z $OCCLUM_INSTANCE_DIR ];then
OCCLUM_INSTANCE_DIR=".occlum"
fi
cat <<EOF cat <<EOF
{ {
"vm": { "vm": {
@ -13,7 +18,7 @@ cat <<EOF
{ {
"target": "/", "target": "/",
"type": "sefs", "type": "sefs",
"source": ".occlum/build/mount/__ROOT", "source": "$OCCLUM_INSTANCE_DIR/build/mount/__ROOT",
"options": { "options": {
"integrity_only": true, "integrity_only": true,
"MAC": "$OCCLUM_CONF_ROOT_FS_MAC" "MAC": "$OCCLUM_CONF_ROOT_FS_MAC"
@ -22,7 +27,7 @@ cat <<EOF
{ {
"target": "/root", "target": "/root",
"type": "sefs", "type": "sefs",
"source": ".occlum/run/mount/root" "source": "$OCCLUM_INSTANCE_DIR/run/mount/root"
}, },
{ {
"target": "/host", "target": "/host",