diff -ruN a/src/constant/kernel.ts b/src/constant/kernel.ts
--- a/src/constant/kernel.ts
+++ b/src/constant/kernel.ts
@@ -300,9 +300,9 @@
       'run',
       '--disable-color',
       '-c',
-      '$APP_BASE_PATH/$CORE_BASE_PATH/config.json',
+      '$CORE_BASE_PATH/config.json',
       '-D',
-      '$APP_BASE_PATH/$CORE_BASE_PATH',
+      '$CORE_BASE_PATH',
     ],
   }
 }
diff -ruN a/src/stores/env.ts b/src/stores/env.ts
--- a/src/stores/env.ts
+++ b/src/stores/env.ts
@@ -15,6 +15,7 @@
     appName: '',
     appVersion: '',
     basePath: '',
+    configPath: '',
     appPath: '',
     os: '' as OS,
     arch: '',
diff -ruN a/src/stores/kernelApi.ts b/src/stores/kernelApi.ts
--- a/src/stores/kernelApi.ts
+++ b/src/stores/kernelApi.ts
@@ -271,19 +271,24 @@
   const runCoreProcess = async (isAlpha: boolean) => {
     let stopped = false
+    const coreWorkingDirectory =
+      envStore.env.os === 'linux' && envStore.env.configPath
+        ? `${envStore.env.configPath}/${CoreWorkingDirectory}`
+        : CoreWorkingDirectory
     const pid = await ExecBackground(
-      CoreWorkingDirectory + '/' + getKernelFileName(isAlpha),
+      coreWorkingDirectory + '/' + getKernelFileName(isAlpha),
       getKernelRuntimeArgs(isAlpha),
       undefined,
       async (end) => {
         stopped = true
         const logs = await ReadFile(CoreLogFilePath, { Range: '-4096' }).catch((err) => String(err))
         logs.split('\n').forEach((line) => line && logsStore.recordKernelLog(line))
         end && logsStore.recordKernelLog(end)
         onCoreStopped()
       },
       {
-        PidFile: CorePidFilePath,
         LogFile: CoreLogFilePath,
+        PidFile: coreWorkingDirectory + '/pid.txt',
+        WorkingDirectory: envStore.env.configPath || envStore.env.basePath,
         Env: getKernelRuntimeEnv(isAlpha),
       },
     )
diff -ruN a/src/types/app.d.ts b/src/types/app.d.ts
--- a/src/types/app.d.ts
+++ b/src/types/app.d.ts
@@ -17,6 +17,7 @@
     appName: string
     appVersion: string
     basePath: string
+    configPath: string
     appPath: string
     os: OS
     arch: string
diff -ruN a/src/views/PluginsView/index.vue b/src/views/PluginsView/index.vue
--- a/src/views/PluginsView/index.vue
+++ b/src/views/PluginsView/index.vue
@@ -37,7 +37,7 @@
     label: 'common.openFile',
     handler: async (id: string) => {
       const plugin = pluginsStore.getPluginById(id)
-      await OpenURI(envStore.env.basePath + '/' + plugin!.path)
+      await OpenURI(`${envStore.env.configPath || envStore.env.basePath}/${plugin!.path}`)
     },
   },
 ]
diff -ruN a/src/views/RulesetsView/index.vue b/src/views/RulesetsView/index.vue
--- a/src/views/RulesetsView/index.vue
+++ b/src/views/RulesetsView/index.vue
@@ -27,7 +27,7 @@
     label: 'common.openFile',
     handler: async (id: string) => {
       const ruleset = rulesetsStore.getRulesetById(id)
-      await OpenURI(envStore.env.basePath + '/' + ruleset!.path)
+      await OpenURI(`${envStore.env.configPath || envStore.env.basePath}/${ruleset!.path}`)
     },
   },
   {
diff -ruN a/src/utils/helper.ts b/src/utils/helper.ts
--- a/src/utils/helper.ts
+++ b/src/utils/helper.ts
@@ -822,9 +822,21 @@
 export const processMagicVariables = (str: string) => {
   const { env } = useEnvStore()
   let result = str
+  const coreBasePath =
+    env.os === 'linux' && env.configPath
+      ? `${env.configPath}/${CoreWorkingDirectory}`
+      : CoreWorkingDirectory
+
+  if (env.os === 'linux') {
+    result = result.replaceAll('$APP_BASE_PATH/$CORE_BASE_PATH', coreBasePath)
+    result = result.replaceAll(
+      `${env.basePath}/${CoreWorkingDirectory}`,
+      coreBasePath,
+    )
+  }
   Object.entries({
     $APP_BASE_PATH: env.basePath,
-    $CORE_BASE_PATH: CoreWorkingDirectory,
+    $CORE_BASE_PATH: coreBasePath,
   }).forEach(([source, target]) => {
     result = result.replaceAll(source, target)
   })
