From a7713f0445267435671c9418ca04f4c3adbbc32b Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sun, 23 Nov 2025 23:16:29 +0800 Subject: [PATCH] manager: Updated the susfs binary file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - made the umount manager publicly available - and removed the “try umount” functionality --- manager/app/src/main/assets/ksu_susfs_2.0.0 | Bin 21048 -> 20088 bytes .../ultra/ui/screen/settings/ToolsScreen.kt | 45 ++++---- .../com/sukisu/ultra/ui/susfs/SuSFSConfig.kt | 100 +++--------------- .../ui/susfs/component/SuSFSConfigDialogs.kt | 63 ----------- .../ui/susfs/content/BasicSettingsContent.kt | 19 ++++ .../ui/susfs/content/TryUmountContent.kt | 99 ----------------- .../ultra/ui/susfs/util/SuSFSManager.kt | 53 ---------- .../ultra/ui/susfs/util/SuSFSModuleScripts.kt | 15 --- .../main/jniLibs/arm64-v8a/libksu_susfs.so | Bin 21048 -> 20088 bytes .../src/main/res/values-zh-rCN/strings.xml | 15 --- manager/app/src/main/res/values/strings.xml | 15 --- 11 files changed, 52 insertions(+), 372 deletions(-) delete mode 100644 manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/TryUmountContent.kt diff --git a/manager/app/src/main/assets/ksu_susfs_2.0.0 b/manager/app/src/main/assets/ksu_susfs_2.0.0 index 854b3a19f3f2e0611092100494234fd4e074ab0f..b020e7a6ad16ca2d3810fabb259c230e4f323099 100644 GIT binary patch delta 6305 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 NM83NzmaHw&{RfWC{U!ha delta 7102 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 G=6?Ztw?k()) } var susLoopPaths by remember { mutableStateOf(emptySet()) } var susMaps by remember { mutableStateOf(emptySet()) } - var tryUmounts by remember { mutableStateOf(emptySet()) } var androidDataPath by remember { mutableStateOf("") } var sdcardPath by remember { mutableStateOf("") } @@ -134,7 +131,6 @@ fun SuSFSConfigScreen( var showAddLoopPathDialog by remember { mutableStateOf(false) } var showAddSusMapDialog by remember { mutableStateOf(false) } var showAddAppPathDialog by remember { mutableStateOf(false) } - var showAddUmountDialog by remember { mutableStateOf(false) } var showAddKstatStaticallyDialog by remember { mutableStateOf(false) } var showAddKstatDialog by remember { mutableStateOf(false) } @@ -142,7 +138,6 @@ fun SuSFSConfigScreen( var editingPath by remember { mutableStateOf(null) } var editingLoopPath by remember { mutableStateOf(null) } var editingSusMap by remember { mutableStateOf(null) } - var editingUmount by remember { mutableStateOf(null) } var editingKstatConfig by remember { mutableStateOf(null) } var editingKstatPath by remember { mutableStateOf(null) } @@ -150,7 +145,6 @@ fun SuSFSConfigScreen( var showResetPathsDialog by remember { mutableStateOf(false) } var showResetLoopPathsDialog by remember { mutableStateOf(false) } var showResetSusMapsDialog by remember { mutableStateOf(false) } - var showResetUmountsDialog by remember { mutableStateOf(false) } var showResetKstatDialog by remember { mutableStateOf(false) } @@ -204,7 +198,6 @@ fun SuSFSConfigScreen( susPaths = SuSFSManager.getSusPaths(context) susLoopPaths = SuSFSManager.getSusLoopPaths(context) susMaps = SuSFSManager.getSusMaps(context) - tryUmounts = SuSFSManager.getTryUmounts(context) androidDataPath = SuSFSManager.getAndroidDataPath(context) sdcardPath = SuSFSManager.getSdcardPath(context) kstatConfigs = SuSFSManager.getKstatConfigs(context) @@ -366,33 +359,6 @@ fun SuSFSConfigScreen( existingSusPaths = susPaths ) - AddTryUmountDialog( - showDialog = showAddUmountDialog, - onDismiss = { - showAddUmountDialog = false - editingUmount = null - }, - onConfirm = { path, mode -> - val oldUmount = editingUmount - coroutineScope.launch { - isLoading = true - val success = if (oldUmount != null) { - SuSFSManager.editTryUmount(context, oldUmount, path, mode) - } else { - SuSFSManager.addTryUmount(context, path, mode) - } - if (success) { - tryUmounts = SuSFSManager.getTryUmounts(context) - } - isLoading = false - showAddUmountDialog = false - editingUmount = null - } - }, - isLoading = isLoading, - initialPath = editingUmount?.split("|")?.get(0) ?: "", - initialMode = editingUmount?.split("|")?.get(1)?.toIntOrNull() ?: 0 - ) AddKstatStaticallyDialog( showDialog = showAddKstatStaticallyDialog, @@ -551,25 +517,6 @@ fun SuSFSConfigScreen( isLoading = isLoading ) - ConfirmDialog( - showDialog = showResetUmountsDialog, - onDismiss = { showResetUmountsDialog = false }, - onConfirm = { - coroutineScope.launch { - isLoading = true - SuSFSManager.saveTryUmounts(context, emptySet()) - tryUmounts = emptySet() - if (SuSFSManager.isAutoStartEnabled(context)) { - SuSFSManager.configureAutoStart(context, true) - } - isLoading = false - showResetUmountsDialog = false - } - }, - titleRes = R.string.susfs_reset_umounts_title, - messageRes = R.string.susfs_reset_umounts_message, - isLoading = isLoading - ) ConfirmDialog( showDialog = showResetKstatDialog, @@ -749,6 +696,18 @@ fun SuSFSConfigScreen( isLoading = false } }, + umountForZygoteIsoService = umountForZygoteIsoService, + onUmountForZygoteIsoServiceChange = { enabled -> + coroutineScope.launch { + isLoading = true + val success = + SuSFSManager.setUmountForZygoteIsoService(context, enabled) + if (success) { + umountForZygoteIsoService = enabled + } + isLoading = false + } + }, onReset = { showConfirmReset = true }, onApply = { coroutineScope.launch { @@ -780,7 +739,6 @@ fun SuSFSConfigScreen( susPaths = SuSFSManager.getSusPaths(context) susLoopPaths = SuSFSManager.getSusLoopPaths(context) susMaps = SuSFSManager.getSusMaps(context) - tryUmounts = SuSFSManager.getTryUmounts(context) androidDataPath = SuSFSManager.getAndroidDataPath(context) sdcardPath = SuSFSManager.getSdcardPath(context) kstatConfigs = SuSFSManager.getKstatConfigs(context) @@ -863,40 +821,6 @@ fun SuSFSConfigScreen( onReset = { showResetSusMapsDialog = true } ) } - SuSFSTab.TRY_UMOUNT -> { - TryUmountContent( - tryUmounts = tryUmounts, - umountForZygoteIsoService = umountForZygoteIsoService, - isLoading = isLoading, - onAddUmount = { showAddUmountDialog = true }, - onRemoveUmount = { umountEntry -> - coroutineScope.launch { - isLoading = true - if (SuSFSManager.removeTryUmount(context, umountEntry)) { - tryUmounts = SuSFSManager.getTryUmounts(context) - } - isLoading = false - } - }, - onEditUmount = { umountEntry -> - editingUmount = umountEntry - showAddUmountDialog = true - }, - onToggleUmountForZygoteIsoService = { enabled -> - coroutineScope.launch { - isLoading = true - val success = - SuSFSManager.setUmountForZygoteIsoService(context, enabled) - if (success) { - umountForZygoteIsoService = enabled - } - isLoading = false - } - }, - onReset = { showResetUmountsDialog = true } - ) - } - SuSFSTab.KSTAT_CONFIG -> { KstatConfigContent( kstatConfigs = kstatConfigs, diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt index 77230aca..47d6816d 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt @@ -659,69 +659,6 @@ fun AddAppPathDialog( } } -@Composable -fun AddTryUmountDialog( - showDialog: Boolean, - onDismiss: () -> Unit, - onConfirm: (String, Int) -> Unit, - isLoading: Boolean, - initialPath: String = "", - initialMode: Int = 0 -) { - var newUmountPath by remember { mutableStateOf("") } - var newUmountMode by remember { mutableIntStateOf(0) } - - // 当对话框显示时,设置初始值 - LaunchedEffect(showDialog, initialPath, initialMode) { - if (showDialog) { - newUmountPath = initialPath - newUmountMode = initialMode - } - } - - val umountModeItems = listOf( - stringResource(R.string.susfs_umount_mode_normal), - stringResource(R.string.susfs_umount_mode_detach) - ) - - UniversalDialog( - showDialog = showDialog, - onDismiss = onDismiss, - onConfirm = { - if (newUmountPath.isNotBlank()) { - onConfirm(newUmountPath.trim(), newUmountMode) - true - } else { - false - } - }, - titleRes = if (initialPath.isNotEmpty()) R.string.susfs_edit_try_umount else R.string.susfs_add_try_umount, - isLoading = isLoading, - fields = listOf( - DialogField.TextField( - value = newUmountPath, - onValueChange = { newUmountPath = it }, - labelRes = R.string.susfs_path_label, - enabled = !isLoading - ), - DialogField.Dropdown( - titleRes = R.string.susfs_umount_mode_label, - summary = umountModeItems[newUmountMode], - items = umountModeItems, - selectedIndex = newUmountMode, - onSelectedIndexChange = { newUmountMode = it }, - enabled = !isLoading - ) - ), - confirmTextRes = if (initialPath.isNotEmpty()) R.string.susfs_save else R.string.add, - isConfirmEnabled = newUmountPath.isNotBlank() && !isLoading, - onReset = { - newUmountPath = "" - newUmountMode = 0 - } - ) -} - /** * 添加Kstat静态配置对话框 */ diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt index cb1f87d3..b851d64b 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt @@ -46,6 +46,8 @@ fun BasicSettingsContent( onEnableAvcLogSpoofingChange: (Boolean) -> Unit, hideSusMountsForAllProcs: Boolean, onHideSusMountsForAllProcsChange: (Boolean) -> Unit, + umountForZygoteIsoService: Boolean, + onUmountForZygoteIsoServiceChange: (Boolean) -> Unit, onReset: (() -> Unit)? = null, onApply: (() -> Unit)? = null, onConfigReload: () -> Unit @@ -266,6 +268,23 @@ fun BasicSettingsContent( onCheckedChange = onHideSusMountsForAllProcsChange, enabled = !isLoading ) + + // 卸载 Zygote 隔离服务开关 + SuperSwitch( + title = stringResource(R.string.umount_zygote_iso_service), + summary = stringResource(R.string.umount_zygote_iso_service_description), + leftAction = { + Icon( + Icons.Default.Security, + modifier = Modifier.padding(end = 16.dp), + contentDescription = stringResource(R.string.umount_zygote_iso_service), + tint = colorScheme.onBackground + ) + }, + checked = umountForZygoteIsoService, + onCheckedChange = onUmountForZygoteIsoServiceChange, + enabled = !isLoading + ) } // 槽位信息按钮 diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/TryUmountContent.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/TryUmountContent.kt deleted file mode 100644 index 10d2c8c0..00000000 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/TryUmountContent.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.sukisu.ultra.ui.susfs.content - -import androidx.compose.foundation.layout.* -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.* -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import com.sukisu.ultra.R -import com.sukisu.ultra.ui.susfs.component.BottomActionButtons -import com.sukisu.ultra.ui.susfs.component.EmptyStateCard -import com.sukisu.ultra.ui.susfs.component.PathItemCard -import com.sukisu.ultra.ui.susfs.component.ResetButton -import top.yukonga.miuix.kmp.basic.* -import top.yukonga.miuix.kmp.extra.SuperSwitch -import top.yukonga.miuix.kmp.theme.MiuixTheme.colorScheme - -@Composable -fun TryUmountContent( - tryUmounts: Set, - umountForZygoteIsoService: Boolean, - isLoading: Boolean, - onAddUmount: () -> Unit, - onRemoveUmount: (String) -> Unit, - onEditUmount: ((String) -> Unit)? = null, - onToggleUmountForZygoteIsoService: (Boolean) -> Unit, - onReset: (() -> Unit)? = null -) { - Column( - modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - Card( - modifier = Modifier.fillMaxWidth(), - ) { - SuperSwitch( - title = stringResource(R.string.umount_zygote_iso_service), - summary = stringResource(R.string.umount_zygote_iso_service_description), - leftAction = { - Icon( - Icons.Default.Security, - modifier = Modifier.padding(end = 16.dp), - contentDescription = stringResource(R.string.umount_zygote_iso_service), - tint = colorScheme.onBackground - ) - }, - checked = umountForZygoteIsoService, - onCheckedChange = onToggleUmountForZygoteIsoService, - enabled = !isLoading - ) - } - - if (tryUmounts.isEmpty()) { - EmptyStateCard( - message = stringResource(R.string.susfs_no_umounts_configured) - ) - } else { - tryUmounts.toList().forEach { umountEntry -> - val parts = umountEntry.split("|") - val path = if (parts.isNotEmpty()) parts[0] else umountEntry - val mode = if (parts.size > 1) parts[1] else "0" - val modeText = if (mode == "0") - stringResource(R.string.susfs_umount_mode_normal_short) - else - stringResource(R.string.susfs_umount_mode_detach_short) - - PathItemCard( - path = path, - icon = Icons.Default.Storage, - additionalInfo = stringResource( - R.string.susfs_umount_mode_display, - modeText, - mode - ), - onDelete = { onRemoveUmount(umountEntry) }, - onEdit = if (onEditUmount != null) { - { onEditUmount(umountEntry) } - } else null, - isLoading = isLoading - ) - } - } - } - - BottomActionButtons( - primaryButtonText = stringResource(R.string.add), - onPrimaryClick = onAddUmount, - isLoading = isLoading - ) - - if (onReset != null && tryUmounts.isNotEmpty()) { - ResetButton( - title = stringResource(R.string.susfs_reset_umounts_title), - onClick = onReset - ) - } -} - diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt index a511a725..e1528eb5 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt @@ -40,7 +40,6 @@ object SuSFSManager { private const val KEY_SUS_LOOP_PATHS = "sus_loop_paths" private const val KEY_SUS_MAPS = "sus_maps" - private const val KEY_TRY_UMOUNTS = "try_umounts" private const val KEY_ANDROID_DATA_PATH = "android_data_path" private const val KEY_SDCARD_PATH = "sdcard_path" private const val KEY_ENABLE_LOG = "enable_log" @@ -147,7 +146,6 @@ object SuSFSManager { val susPaths: Set, val susLoopPaths: Set, val susMaps: Set, - val tryUmounts: Set, val androidDataPath: String, val sdcardPath: String, val enableLog: Boolean, @@ -168,7 +166,6 @@ object SuSFSManager { susPaths.isNotEmpty() || susLoopPaths.isNotEmpty() || susMaps.isNotEmpty() || - tryUmounts.isNotEmpty() || kstatConfigs.isNotEmpty() || addKstatPaths.isNotEmpty() } @@ -267,7 +264,6 @@ object SuSFSManager { susPaths = getSusPaths(context), susLoopPaths = getSusLoopPaths(context), susMaps = getSusMaps(context), - tryUmounts = getTryUmounts(context), androidDataPath = getAndroidDataPath(context), sdcardPath = getSdcardPath(context), enableLog = getEnableLogState(context), @@ -369,12 +365,6 @@ object SuSFSManager { fun getSusMaps(context: Context): Set = getPrefs(context).getStringSet(KEY_SUS_MAPS, emptySet()) ?: emptySet() - fun saveTryUmounts(context: Context, umounts: Set) = - getPrefs(context).edit { putStringSet(KEY_TRY_UMOUNTS, umounts) } - - fun getTryUmounts(context: Context): Set = - getPrefs(context).getStringSet(KEY_TRY_UMOUNTS, emptySet()) ?: emptySet() - fun saveKstatConfigs(context: Context, configs: Set) = getPrefs(context).edit { putStringSet(KEY_KSTAT_CONFIGS, configs) } @@ -552,7 +542,6 @@ object SuSFSManager { KEY_SUS_PATHS to getSusPaths(context), KEY_SUS_LOOP_PATHS to getSusLoopPaths(context), KEY_SUS_MAPS to getSusMaps(context), - KEY_TRY_UMOUNTS to getTryUmounts(context), KEY_ANDROID_DATA_PATH to getAndroidDataPath(context), KEY_SDCARD_PATH to getSdcardPath(context), KEY_ENABLE_LOG to getEnableLogState(context), @@ -1066,48 +1055,6 @@ object SuSFSManager { } } - // 添加尝试卸载 - private suspend fun addTryUmountInternal(context: Context, path: String, mode: Int): Boolean { - executeSusfsCommand(context, "add_try_umount '$path' $mode") - saveTryUmounts(context, getTryUmounts(context) + "$path|$mode") - if (isAutoStartEnabled(context)) updateMagiskModule(context) - return true - } - - suspend fun addTryUmount(context: Context, path: String, mode: Int): Boolean { - return addTryUmountInternal(context, path, mode) - } - - suspend fun removeTryUmount(context: Context, umountEntry: String): Boolean { - saveTryUmounts(context, getTryUmounts(context) - umountEntry) - if (isAutoStartEnabled(context)) updateMagiskModule(context) - return true - } - - // 编辑尝试卸载 - suspend fun editTryUmount(context: Context, oldEntry: String, newPath: String, newMode: Int): Boolean { - return try { - val currentUmounts = getTryUmounts(context).toMutableSet() - if (!currentUmounts.remove(oldEntry)) { - return false - } - - saveTryUmounts(context, currentUmounts) - - val success = addTryUmountInternal(context, newPath, newMode) - - if (!success) { - // 如果添加新条目失败,恢复旧条目 - currentUmounts.add(oldEntry) - saveTryUmounts(context, currentUmounts) - if (isAutoStartEnabled(context)) updateMagiskModule(context) - } - return success - } catch (_: Exception) { - false - } - } - // Zygote隔离服务卸载控制 suspend fun setUmountForZygoteIsoService(context: Context, enabled: Boolean): Boolean { val result = executeSusfsCommandWithOutput(context, "umount_for_zygote_iso_service ${if (enabled) 1 else 0}") diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt index 79cf298f..c15c2dc1 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt @@ -427,21 +427,6 @@ object ScriptGenerator { appendLine(generateBinaryCheck(config.targetPath)) appendLine() - // 添加尝试卸载 - if (config.tryUmounts.isNotEmpty()) { - appendLine("# 添加尝试卸载") - config.tryUmounts.forEach { umount -> - val parts = umount.split("|") - if (parts.size == 2) { - val path = parts[0] - val mode = parts[1] - appendLine($$"\"$SUSFS_BIN\" add_try_umount '$$path' $$mode") - appendLine($$"echo \"$(get_current_time): 添加尝试卸载: $$path (模式: $$mode)\" >> \"$LOG_FILE\"") - } - } - appendLine() - } - appendLine($$"echo \"$(get_current_time): Post-Mount脚本执行完成\" >> \"$LOG_FILE\"") } } diff --git a/manager/app/src/main/jniLibs/arm64-v8a/libksu_susfs.so b/manager/app/src/main/jniLibs/arm64-v8a/libksu_susfs.so index 854b3a19f3f2e0611092100494234fd4e074ab0f..b020e7a6ad16ca2d3810fabb259c230e4f323099 100644 GIT binary patch delta 6305 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 NM83NzmaHw&{RfWC{U!ha delta 7102 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 G=6?Ztw?k 无法找到 ksu_susfs 文件 SuSFS 命令执行失败 - 开机自启动 重启时自动应用所有非默认配置 @@ -369,28 +368,15 @@ 基本设置 SuS 路径 - 尝试卸载 路径设置 启用功能状态 添加 SuS 路径 - 添加尝试卸载 路径 暂无 SuS 路径配置 - 暂无尝试卸载配置 - - 卸载模式 - 普通卸载(0) - 分离卸载(1) - 普通 - 分离 - 模式: %1$s (%2$s) - 重置 SuS 路径 这将清除所有 SuS 路径配置,确定要继续吗? - 重置尝试卸载 - 这将清除所有尝试卸载配置,确定要继续吗? 重置路径设置 Android Data 路径 @@ -475,7 +461,6 @@ 清理工具残留 清理各种模块以及工具的残留文件和目录(可能会误删导致丢失以及无法启动,谨慎使用) 编辑 SuS 路径 - 编辑尝试卸载 编辑 Kstat 静态配置 编辑 Kstat 路径 保存 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 52f5d47a..a721f6e0 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -369,7 +369,6 @@ Cannot find ksu_susfs file SuSFS command execution failed - Auto Start Automatically apply all non-default configurations on reboot @@ -377,27 +376,15 @@ Basic Settings SUS Paths - Try Umount Path Settings Enabled Features Status Add SUS Path - Add Try Umount Path No SUS paths configured - No try umount configured - - Umount Mode - Normal Umount (0) - Detach Umount (1) - Normal - Detach - Mode: %1$s (%2$s) Reset SUS Paths This will clear all SUS path configurations. Are you sure you want to continue? - Reset Try Umount - This will clear all try umount configurations. Are you sure you want to continue? Reset Path Settings Android Data Path @@ -435,7 +422,6 @@ Use Uname Use Build Time Unable to retrieve slot information - Kstat Configuration Add Kstat Static Configuration @@ -482,7 +468,6 @@ Cleanup Residue Clean up the residual files and directories of various modules and tools (May be deleted by mistake, resulting in loss and failure to start, use with caution) Edit SUS Path - Edit Try Umount Edit Kstat Static Configuration Edit Kstat Path Save