mirror of
https://gitee.com/openharmony/startup_init
synced 2025-02-17 10:28:00 +00:00
bootfail to init
Signed-off-by: mgceshuang <mashuang13@huawei.com>
This commit is contained in:
parent
d7d82247b8
commit
59f54eaace
@ -46,4 +46,5 @@ declare_args() {
|
||||
|
||||
# begetutil extension module
|
||||
startup_begetutil_extra_modules = ""
|
||||
startup_init_extra_static_modules = ""
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
import("//base/startup/init/begetd.gni")
|
||||
import("//build/ohos.gni")
|
||||
|
||||
# For init only
|
||||
@ -34,6 +35,7 @@ ohos_static_library("libfsmanager_static") {
|
||||
"//base/startup/init/services/log",
|
||||
"//base/startup/init/services/include",
|
||||
"//base/startup/init/services/param/include",
|
||||
"//base/startup/init/interfaces/innerkits/init_module_engine/include",
|
||||
]
|
||||
if (defined(global_parts_info.startup_hvb)) {
|
||||
sources += [
|
||||
@ -55,6 +57,12 @@ ohos_static_library("libfsmanager_static") {
|
||||
|
||||
public_deps = [ "//base/startup/hvb/libhvb:libhvb_static" ]
|
||||
}
|
||||
|
||||
deps = [ "//base/startup/init/interfaces/innerkits/init_module_engine:libinit_module_engine" ]
|
||||
if (startup_init_extra_static_modules != "") {
|
||||
deps += [ startup_init_extra_static_modules ]
|
||||
}
|
||||
|
||||
public_configs = [ ":libfsmanager_exported_configs" ]
|
||||
part_name = "init"
|
||||
subsystem_name = "startup"
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "fs_manager/fs_manager.h"
|
||||
#include "init_utils.h"
|
||||
#include "param/init_param.h"
|
||||
#include "bootstage.h"
|
||||
#include "securec.h"
|
||||
#ifdef SUPPORT_HVB
|
||||
#include "dm_verity.h"
|
||||
@ -406,6 +407,8 @@ int MountOneItem(FstabItem *item)
|
||||
}
|
||||
|
||||
int rc = Mount(item->deviceName, item->mountPoint, item->fsType, mountFlags, fsSpecificData);
|
||||
char* reason[] = {item->mountPoint, (char*)&rc};
|
||||
HookMgrExecute(GetBootStageHookMgr(), INIT_POST_MOUNT, (void*)reason, NULL);
|
||||
if (rc != 0) {
|
||||
if (FM_MANAGER_NOFAIL_ENABLED(item->fsManagerFlags)) {
|
||||
BEGET_LOGE("Mount no fail device %s to %s failed, err = %d", item->deviceName, item->mountPoint, errno);
|
||||
|
@ -27,6 +27,8 @@ extern "C" {
|
||||
|
||||
enum INIT_BOOTSTAGE {
|
||||
INIT_GLOBAL_INIT = 0,
|
||||
INIT_POST_MOUNT = 3,
|
||||
INIT_POST_DATA_UNENCRYPT = 5,
|
||||
INIT_PRE_PARAM_SERVICE = 10,
|
||||
INIT_PRE_PARAM_LOAD = 20,
|
||||
INIT_PARAM_LOAD_FILTER = 25,
|
||||
@ -41,6 +43,8 @@ enum INIT_BOOTSTAGE {
|
||||
INIT_SERVICE_FORK_BEFORE = 58,
|
||||
INIT_SERVICE_SET_PERMS = 59,
|
||||
INIT_SERVICE_FORK_AFTER = 60,
|
||||
INIT_SERVICE_BOOTEVENT = 61,
|
||||
INIT_SERVICE_REAP = 65,
|
||||
INIT_JOB_PARSE = 70,
|
||||
INIT_BOOT_COMPLETE = 100,
|
||||
};
|
||||
@ -124,6 +128,14 @@ typedef struct tagSERVICE_INFO_CTX {
|
||||
const char *reserved; /* reserved info */
|
||||
} SERVICE_INFO_CTX;
|
||||
|
||||
/**
|
||||
* @brief service info
|
||||
*/
|
||||
typedef struct tagSERVICE_BOOTEVENT_CTX {
|
||||
const char *serviceName; /* Service name */
|
||||
const char *reserved; /* reserved info */
|
||||
int state; /* bootevent state */
|
||||
} SERVICE_BOOTEVENT_CTX;
|
||||
/**
|
||||
* @brief init cmd info
|
||||
*/
|
||||
|
@ -637,6 +637,13 @@ static void CheckOndemandService(Service *service)
|
||||
}
|
||||
}
|
||||
|
||||
static void ServiceReapHookExecute(Service *service)
|
||||
{
|
||||
#ifndef OHOS_LITE
|
||||
HookMgrExecute(GetBootStageHookMgr(), INIT_SERVICE_REAP, (void*)service, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ServiceReap(Service *service)
|
||||
{
|
||||
INIT_CHECK(service != NULL, return);
|
||||
@ -675,6 +682,7 @@ void ServiceReap(Service *service)
|
||||
// the service could be restart even if it is one-shot service
|
||||
}
|
||||
|
||||
ServiceReapHookExecute(service);
|
||||
// service no need to restart if it is an ondemand service.
|
||||
if (IsOnDemandService(service)) {
|
||||
CheckOndemandService(service);
|
||||
|
@ -134,6 +134,9 @@ ohos_executable("init") {
|
||||
if (asan_detector) {
|
||||
defines += [ "ASAN_DETECTOR" ]
|
||||
}
|
||||
if (startup_init_extra_static_modules != "") {
|
||||
deps += [ startup_init_extra_static_modules ]
|
||||
}
|
||||
|
||||
version_script = get_label_info(
|
||||
"//base/startup/init/interfaces/innerkits/init_module_engine:libinit_stub_versionscript",
|
||||
|
@ -230,6 +230,7 @@ void SystemPrepare(void)
|
||||
// Make sure init log always output to /dev/kmsg.
|
||||
EnableDevKmsg();
|
||||
INIT_LOGI("Start init first stage.");
|
||||
HookMgrExecute(GetBootStageHookMgr(), INIT_PRE_PARAM_SERVICE, NULL, NULL);
|
||||
// Only ohos normal system support
|
||||
// two stages of init.
|
||||
// If we are in updater mode, only one stage of init.
|
||||
|
@ -102,11 +102,11 @@ int GetParamValue(const char *symValue, unsigned int symLen, char *paramValue, u
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void SyncExecCommand(int argc, char * const *argv)
|
||||
static int SyncExecCommand(int argc, char * const *argv)
|
||||
{
|
||||
INIT_LOGI("Sync exec: %s", argv[0]);
|
||||
pid_t pid = fork();
|
||||
INIT_ERROR_CHECK(!(pid < 0), return, "Fork new process to format failed: %d", errno);
|
||||
INIT_ERROR_CHECK(!(pid < 0), return -1, "Fork new process to format failed: %d", errno);
|
||||
if (pid == 0) {
|
||||
INIT_CHECK_ONLY_ELOG(execv(argv[0], argv) == 0, "execv %s failed! err %d.", argv[0], errno);
|
||||
exit(-1);
|
||||
@ -115,10 +115,10 @@ static void SyncExecCommand(int argc, char * const *argv)
|
||||
pid_t ret = waitpid(pid, &status, 0);
|
||||
if (ret != pid) {
|
||||
INIT_LOGE("Failed to wait pid %d, errno %d", pid, errno);
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
INIT_LOGI("Sync exec: %s result %d %d", argv[0], WEXITSTATUS(status), WIFEXITED(status));
|
||||
return;
|
||||
return WEXITSTATUS(status);
|
||||
}
|
||||
|
||||
static void DoIfup(const struct CmdArgs *ctx)
|
||||
@ -443,7 +443,12 @@ static void DoInitGlobalKey(const struct CmdArgs *ctx)
|
||||
NULL
|
||||
};
|
||||
int argc = ARRAY_LENGTH(argv);
|
||||
SyncExecCommand(argc, argv);
|
||||
int ret = SyncExecCommand(argc, argv);
|
||||
INIT_CMD_INFO cmdInfo;
|
||||
cmdInfo.cmdName = "init_global_key";
|
||||
cmdInfo.cmdContent = (const char *)&ret;
|
||||
cmdInfo.reserved = NULL;
|
||||
HookMgrExecute(GetBootStageHookMgr(), INIT_POST_DATA_UNENCRYPT, (void*)(&cmdInfo), NULL);
|
||||
}
|
||||
|
||||
static void DoInitMainUser(const struct CmdArgs *ctx)
|
||||
@ -455,7 +460,12 @@ static void DoInitMainUser(const struct CmdArgs *ctx)
|
||||
NULL
|
||||
};
|
||||
int argc = ARRAY_LENGTH(argv);
|
||||
SyncExecCommand(argc, argv);
|
||||
int ret = SyncExecCommand(argc, argv);
|
||||
INIT_CMD_INFO cmdInfo;
|
||||
cmdInfo.cmdName = "init_main_user";
|
||||
cmdInfo.cmdContent = (const char *)&ret;
|
||||
cmdInfo.reserved = NULL;
|
||||
HookMgrExecute(GetBootStageHookMgr(), INIT_POST_DATA_UNENCRYPT, (void*)(&cmdInfo), NULL);
|
||||
}
|
||||
|
||||
static void DoMkswap(const struct CmdArgs *ctx)
|
||||
|
@ -214,6 +214,15 @@ static void ReportSysEvent(void)
|
||||
return;
|
||||
}
|
||||
|
||||
static void SetServiceBooteventHookMgr(const char *name, int state)
|
||||
{
|
||||
SERVICE_BOOTEVENT_CTX context;
|
||||
context.serviceName = name;
|
||||
context.reserved = NULL;
|
||||
context.state = state;
|
||||
HookMgrExecute(GetBootStageHookMgr(), INIT_SERVICE_BOOTEVENT, (void*)(&context), NULL);
|
||||
}
|
||||
|
||||
static void BootEventParaFireByName(const char *paramName)
|
||||
{
|
||||
ListNode *found = NULL;
|
||||
@ -233,6 +242,7 @@ static void BootEventParaFireByName(const char *paramName)
|
||||
INIT_CHECK_ONLY_RETURN(clock_gettime(CLOCK_MONOTONIC,
|
||||
&(((BOOT_EVENT_PARAM_ITEM *)found)->timestamp[BOOTEVENT_READY])) == 0);
|
||||
g_bootEventNum--;
|
||||
SetServiceBooteventHookMgr(paramName, 2); // 2: bootevent service has ready
|
||||
// Check if all boot event params are fired
|
||||
if (g_bootEventNum > 0) {
|
||||
return;
|
||||
@ -277,6 +287,7 @@ static void ServiceParseBootEventHook(SERVICE_PARSE_CTX *serviceParseCtx)
|
||||
return;
|
||||
}
|
||||
g_bootEventNum++;
|
||||
SetServiceBooteventHookMgr(serviceParseCtx->serviceName, 1); // 1: bootevent service is starting
|
||||
return;
|
||||
}
|
||||
|
||||
@ -290,6 +301,7 @@ static void ServiceParseBootEventHook(SERVICE_PARSE_CTX *serviceParseCtx)
|
||||
continue;
|
||||
}
|
||||
g_bootEventNum++;
|
||||
SetServiceBooteventHookMgr(serviceParseCtx->serviceName, 1); // 1: bootevent service is starting
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user