bootfail to init

Signed-off-by: mgceshuang <mashuang13@huawei.com>
This commit is contained in:
pengjingtong 2023-06-05 10:52:08 +08:00
parent d7d82247b8
commit 59f54eaace
9 changed files with 64 additions and 6 deletions

View File

@ -46,4 +46,5 @@ declare_args() {
# begetutil extension module
startup_begetutil_extra_modules = ""
startup_init_extra_static_modules = ""
}

View File

@ -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"

View File

@ -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);

View File

@ -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
*/

View File

@ -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);

View File

@ -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",

View File

@ -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.

View File

@ -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)

View File

@ -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
}
}