Repository: fluid-cloudnative/fluid
Pull request #3755 (2024-03-11 03:52:08)

 support configure hostpid for runtime fuse.
<!-- 
Please make sure you have read and understood the contributing guidelines;
https://github.com/fluid-cloudnative/fluid/blob/master/CONTRIBUTING.md-->

### Ⅰ. Describe what this PR does


This PR introduces an update that offers users the flexibility to manually configure the hostPID setting as per their specific needs.

### Ⅱ. Does this pull request fix one issue?
<!--If so, add "fixes #xxxx" so that the issue will be closed when this PR is merged (for example, "fixes #15" to close Issue #15). Otherwise, add "NONE" -->
fixes #XXXX

### Ⅲ. List the added test cases (unit test/integration test) if any, please explain if no tests are needed.


### Ⅳ. Describe how to verify it


### Ⅴ. Special notes for reviews

fluid-e2e-bot[bot]: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please assign ronggu for approval by writing `/assign @ronggu` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/fluid-cloudnative/fluid/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["ronggu"]} -->
sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1 New issue](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [11.3% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755)


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3755?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 64.21%. Comparing base [(`fcb496c`)](https://app.codecov.io/gh/fluid-cloudnative/fluid/commit/fcb496ca41a444f168633ebde0c14e48d62625e5?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) to head [(`6e9c8b2`)](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3755?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).


<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##           master    #3755      +/-   ##
==========================================
+ Coverage   64.19%   64.21%   +0.01%     
==========================================
  Files         474      474              
  Lines       28236    28241       +5     
==========================================
+ Hits        18127    18134       +7     
+ Misses       7945     7944       -1     
+ Partials     2164     2163       -1     
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3755?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).

sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1 New issue](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [11.3% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1 New issue](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [6.2% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.9% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755)


fluid-e2e-bot[bot]: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please assign ronggu for approval by writing `/assign @ronggu` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/fluid-cloudnative/fluid/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["ronggu"]} -->
sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1.3% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755)


sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3755&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1.4% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3755&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3755)



Patch:
diff --git a/api/v1alpha1/openapi_generated.go b/api/v1alpha1/openapi_generated.go
index 7190e540..176372bc 100644
--- a/api/v1alpha1/openapi_generated.go
+++ b/api/v1alpha1/openapi_generated.go
@@ -6713,6 +6713,22 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardSockSpec(ref common.Ref
 							Format:      "",
 						},
 					},
+					"env": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Environment variables that will be used by Vineyard Fuse. Default is not set.",
+							Type:        []string{"object"},
+							AdditionalProperties: &spec.SchemaOrBool{
+								Allows: true,
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: "",
+										Type:    []string{"string"},
+										Format:  "",
+									},
+								},
+							},
+						},
+					},
 					"cleanPolicy": {
 						SchemaProps: spec.SchemaProps{
 							Description: "CleanPolicy decides when to clean Vineyard Fuse pods. Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted OnDemand cleans fuse pod once th fuse pod on some node is not needed OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted Defaults to OnRuntimeDeleted",
diff --git a/api/v1alpha1/swagger.json b/api/v1alpha1/swagger.json
index c461dc53..92dcbb4d 100644
--- a/api/v1alpha1/swagger.json
+++ b/api/v1alpha1/swagger.json
@@ -705,7 +705,7 @@
       ],
       "properties": {
         "affinity": {
-          "description": "Affinity defines affinity for DataLoad pod",
+          "description": "Affinity defines affinity for DataMigrate pod",
           "$ref": "#/definitions/v1.Affinity"
         },
         "block": {
@@ -730,7 +730,7 @@
           "type": "string"
         },
         "nodeSelector": {
-          "description": "NodeSelector defiens node selector for DataLoad pod",
+          "description": "NodeSelector defiens node selector for DataMigrate pod",
           "type": "object",
           "additionalProperties": {
             "type": "string",
@@ -745,8 +745,21 @@
             "default": ""
           }
         },
+        "parallelOptions": {
+          "description": "ParallelOptions defines options like ssh port and ssh secret name when parallelism is greater than 1.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string",
+            "default": ""
+          }
+        },
+        "parallelism": {
+          "description": "Parallelism defines the parallelism tasks numbers for DataMigrate. If the value is greater than 1, the job acts as a launcher, and users should define the WorkerSpec.",
+          "type": "integer",
+          "format": "int32"
+        },
         "podMetadata": {
-          "description": "PodMetadata defines labels and annotations that will be propagated to DataLoad pods",
+          "description": "PodMetadata defines labels and annotations that will be propagated to DataMigrate pods",
           "default": {},
           "$ref": "#/definitions/.PodMetadata"
         },
@@ -772,7 +785,7 @@
           "type": "string"
         },
         "schedulerName": {
-          "description": "SchedulerName sets the scheduler to be used for DataLoad pod",
+          "description": "SchedulerName sets the scheduler to be used for DataMigrate pod",
           "type": "string"
         },
         "to": {
@@ -781,7 +794,7 @@
           "$ref": "#/definitions/.DataToMigrate"
         },
         "tolerations": {
-          "description": "Tolerations defines tolerations for DataLoad pod",
+          "description": "Tolerations defines tolerations for DataMigrate pod",
           "type": "array",
           "items": {
             "default": {},
@@ -1000,9 +1013,6 @@
     ".DatasetSpec": {
       "description": "DatasetSpec defines the desired state of Dataset",
       "type": "object",
-      "required": [
-        "mounts"
-      ],
       "properties": {
         "accessModes": {
           "description": "AccessModes contains all ways the volume backing the PVC can be mounted",
@@ -1017,7 +1027,7 @@
           "$ref": "#/definitions/.DataRestoreLocation"
         },
         "mounts": {
-          "description": "Mount Points to be mounted on Alluxio.",
+          "description": "Mount Points to be mounted on cache runtime. \u003cbr\u003e This field can be empty because some runtimes don't need to mount external storage (e.g. \u003ca href=\"https://v6d.io/\"\u003eVineyard\u003c/a\u003e).",
           "type": "array",
           "items": {
             "default": {},
@@ -3759,6 +3769,14 @@
           "description": "CleanPolicy decides when to clean Vineyard Fuse pods. Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted OnDemand cleans fuse pod once th fuse pod on some node is not needed OnRuntimeDeleted cleans fuse pod only when the cache runtime is deleted Defaults to OnRuntimeDeleted",
           "type": "string"
         },
+        "env": {
+          "description": "Environment variables that will be used by Vineyard Fuse. Default is not set.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string",
+            "default": ""
+          }
+        },
         "image": {
           "description": "Image for Vineyard Fuse Default is `vineyardcloudnative/vineyard-fluid-fuse`",
           "type": "string"
diff --git a/api/v1alpha1/vineyardruntime_types.go b/api/v1alpha1/vineyardruntime_types.go
index b07e955b..004a8ae5 100644
--- a/api/v1alpha1/vineyardruntime_types.go
+++ b/api/v1alpha1/vineyardruntime_types.go
@@ -157,6 +157,11 @@ type VineyardSockSpec struct {
 	// +optional
 	ImagePullPolicy string `json:"imagePullPolicy,omitempty"`
 
+	// Environment variables that will be used by Vineyard Fuse.
+	// Default is not set.
+	// +optional
+	Env map[string]string `json:"env,omitempty"`
+
 	// CleanPolicy decides when to clean Vineyard Fuse pods.
 	// Currently Fluid supports two policies: OnDemand and OnRuntimeDeleted
 	// OnDemand cleans fuse pod once th fuse pod on some node is not needed
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index 63d27502..fccd1842 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -2908,6 +2908,13 @@ func (in *VineyardRuntimeSpec) DeepCopy() *VineyardRuntimeSpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *VineyardSockSpec) DeepCopyInto(out *VineyardSockSpec) {
 	*out = *in
+	if in.Env != nil {
+		in, out := &in.Env, &out.Env
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
 	in.Resources.DeepCopyInto(&out.Resources)
 }
 
diff --git a/charts/alluxio/values.yaml b/charts/alluxio/values.yaml
index 4a8a7159..71d54c02 100644
--- a/charts/alluxio/values.yaml
+++ b/charts/alluxio/values.yaml
@@ -107,7 +107,6 @@ master:
     embedded: 19200
     rpc: 19998
     web: 19999
-  hostPID: true
   podManagementPolicy: Parallel
   hostNetwork: false
   # dnsPolicy will be ClusterFirstWithHostNet if hostNetwork: true
@@ -245,8 +244,6 @@ worker:
   ports:
     rpc: 29999
     web: 30000
-  # hostPID requires escalated privileges
-  hostPID: true
   hostNetwork: false
   # dnsPolicy will be ClusterFirstWithHostNet if hostNetwork: true
   # and ClusterFirst if hostNetwork: false
@@ -385,7 +382,7 @@ fuse:
     - "-XX:MaxDirectMemorySize=2g"
   hostNetwork: true
   # hostPID requires escalated privileges
-  hostPID: true
+  hostPID: false
   dnsPolicy: ClusterFirstWithHostNet
   user: 0
   group: 0
diff --git a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
index 3e22f9f0..f049fe62 100644
--- a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
+++ b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
@@ -100,6 +100,12 @@ spec:
                       needed OnRuntimeDeleted cleans fuse pod only when the cache
                       runtime is deleted Defaults to OnRuntimeDeleted'
                     type: string
+                  env:
+                    additionalProperties:
+                      type: string
+                    description: Environment variables that will be used by Vineyard
+                      Fuse. Default is not set.
+                    type: object
                   image:
                     description: Image for Vineyard Fuse Default is `vineyardcloudnative/vineyard-fluid-fuse`
                     type: string
diff --git a/charts/fluid/fluid/templates/csi/daemonset.yaml b/charts/fluid/fluid/templates/csi/daemonset.yaml
index a318bc7d..074707b9 100644
--- a/charts/fluid/fluid/templates/csi/daemonset.yaml
+++ b/charts/fluid/fluid/templates/csi/daemonset.yaml
@@ -28,7 +28,7 @@ spec:
       hostNetwork: true
       dnsPolicy: ClusterFirstWithHostNet
       {{- end }}
-      hostPID: true
+      hostPID: {{ .Values.csi.hostPID }}
       affinity:
         nodeAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
diff --git a/charts/fluid/fluid/values.yaml b/charts/fluid/fluid/values.yaml
index 403d944b..7e84170c 100644
--- a/charts/fluid/fluid/values.yaml
+++ b/charts/fluid/fluid/values.yaml
@@ -46,6 +46,7 @@ csi:
   # default method is "bindMount", "symlink" is also support
   # Notice: if use nodePublishMethod symlink, fuse recovery is not support
   nodePublishMethod: bindMount
+  hostPID: false
 
 runtime:
   criticalFusePod: true
diff --git a/charts/goosefs/templates/master/statefulset.yaml b/charts/goosefs/templates/master/statefulset.yaml
index 6dc03945..bf1929cd 100644
--- a/charts/goosefs/templates/master/statefulset.yaml
+++ b/charts/goosefs/templates/master/statefulset.yaml
@@ -5,7 +5,6 @@
 {{- $isUfsLocal := and (eq .Values.journal.type "UFS") (eq .Values.journal.ufsType "local") }}
 {{- $needJournalVolume := or $isEmbedded $isUfsLocal }}
 {{- $hostNetwork := .Values.master.hostNetwork }}
-{{- $hostPID := .Values.master.hostPID }}
 {{- $name := include "goosefs.name" . }}
 {{- $fullName := include "goosefs.fullname" . }}
 {{- $chart := include "goosefs.chart" . }}
@@ -47,7 +46,6 @@ spec:
     spec:
       enableServiceLinks: false
       hostNetwork: {{ $hostNetwork }}
-      hostPID: {{ .Values.master.hostPID }}
       dnsPolicy: {{ .Values.master.dnsPolicy | default ($hostNetwork | ternary "ClusterFirstWithHostNet" "ClusterFirst") }}
       nodeSelector:
       {{- if .Values.master.nodeSelector }}
diff --git a/charts/goosefs/templates/worker/statefulset.yaml b/charts/goosefs/templates/worker/statefulset.yaml
index c8b8c4c9..4d2141f8 100644
--- a/charts/goosefs/templates/worker/statefulset.yaml
+++ b/charts/goosefs/templates/worker/statefulset.yaml
@@ -1,7 +1,6 @@
 {{- $shortCircuitEnabled := .Values.shortCircuit.enabled }}
 {{- $needDomainSocketVolume := and $shortCircuitEnabled (eq .Values.shortCircuit.policy "uuid") }}
 {{- $hostNetwork := .Values.worker.hostNetwork }}
-{{- $hostPID := .Values.worker.hostPID }}
 
 apiVersion: apps/v1
 kind: StatefulSet
@@ -42,7 +41,6 @@ spec:
     spec:
       enableServiceLinks: false
       hostNetwork: {{ $hostNetwork }}
-      hostPID: {{ .Values.worker.hostPID }}
       dnsPolicy: {{ .Values.worker.dnsPolicy | default ($hostNetwork | ternary "ClusterFirstWithHostNet" "ClusterFirst") }}
       securityContext:
         fsGroup: {{ .Values.fsGroup }}
diff --git a/charts/goosefs/values.yaml b/charts/goosefs/values.yaml
index 250e7bfe..c8939c79 100644
--- a/charts/goosefs/values.yaml
+++ b/charts/goosefs/values.yaml
@@ -87,7 +87,6 @@ master:
     embedded: 19200
     rpc: 19998
     web: 19999
-  hostPID: true
   hostNetwork: false
   # dnsPolicy will be ClusterFirstWithHostNet if hostNetwork: true
   # and ClusterFirst if hostNetwork: false
@@ -208,8 +207,6 @@ worker:
   ports:
     rpc: 29999
     web: 30000
-  # hostPID requires escalated privileges
-  hostPID: true
   hostNetwork: false
   # dnsPolicy will be ClusterFirstWithHostNet if hostNetwork: true
   # and ClusterFirst if hostNetwork: false
@@ -331,7 +328,7 @@ fuse:
     - "-XX:MaxDirectMemorySize=2g"
   hostNetwork: true
   # hostPID requires escalated privileges
-  hostPID: true
+  hostPID: false
   dnsPolicy: ClusterFirstWithHostNet
   user: 0
   group: 0
diff --git a/charts/jindocache/templates/fuse/daemonset.yaml b/charts/jindocache/templates/fuse/daemonset.yaml
index 0325be25..691de29c 100755
--- a/charts/jindocache/templates/fuse/daemonset.yaml
+++ b/charts/jindocache/templates/fuse/daemonset.yaml
@@ -55,7 +55,7 @@ spec:
       priorityClassName: system-node-critical
       {{- end }}
       hostNetwork: {{ .Values.useHostNetwork }}
-      hostPID: {{ .Values.useHostPID }}
+      hostPID: {{ .Values.fuse.hostPID }}
       nodeSelector:
 {{- if .Values.fuse.nodeSelector }}
 {{ toYaml .Values.fuse.nodeSelector | trim | indent 8  }}
diff --git a/charts/jindocache/values.yaml b/charts/jindocache/values.yaml
index 18700174..ab52049d 100644
--- a/charts/jindocache/values.yaml
+++ b/charts/jindocache/values.yaml
@@ -59,6 +59,7 @@ fuse:
   labels: {}
   annotations: {}
   env: {}
+  hostPID: false
   updateStrategy:
     type: OnDelete
   properties:
diff --git a/charts/jindofs/templates/fuse/daemonset.yaml b/charts/jindofs/templates/fuse/daemonset.yaml
index 0a264c8b..94695f31 100755
--- a/charts/jindofs/templates/fuse/daemonset.yaml
+++ b/charts/jindofs/templates/fuse/daemonset.yaml
@@ -52,7 +52,7 @@ spec:
       priorityClassName: system-node-critical
       {{- end }}
       hostNetwork: {{ .Values.useHostNetwork }}
-      hostPID: {{ .Values.useHostPID }}
+      hostPID: {{ .Values.fuse.hostPID }}
       nodeSelector:
 {{- if .Values.fuse.nodeSelector }}
 {{ toYaml .Values.fuse.nodeSelector | trim | indent 8  }}
diff --git a/charts/jindofs/templates/master/statefulset.yaml b/charts/jindofs/templates/master/statefulset.yaml
index 17a87389..abc2c67f 100755
--- a/charts/jindofs/templates/master/statefulset.yaml
+++ b/charts/jindofs/templates/master/statefulset.yaml
@@ -51,7 +51,6 @@ spec:
 {{- end }}
     spec:
       hostNetwork: {{ .Values.useHostNetwork }}
-      hostPID: {{ .Values.useHostPID }}
       nodeSelector:
 {{- if .Values.master.nodeSelector }}
 {{ toYaml .Values.master.nodeSelector | trim | indent 8  }}
diff --git a/charts/jindofs/templates/worker/statefulset.yaml b/charts/jindofs/templates/worker/statefulset.yaml
index 0dd71613..67ff3869 100755
--- a/charts/jindofs/templates/worker/statefulset.yaml
+++ b/charts/jindofs/templates/worker/statefulset.yaml
@@ -54,7 +54,6 @@ spec:
 {{- end }}
     spec:
       hostNetwork: {{ .Values.useHostNetwork }}
-      hostPID: {{ .Values.useHostPID }}
       securityContext:
         runAsUser: {{ .Values.user }}
         runAsGroup: {{ .Values.group }}
diff --git a/charts/jindofs/values.yaml b/charts/jindofs/values.yaml
index 94665067..67befa07 100644
--- a/charts/jindofs/values.yaml
+++ b/charts/jindofs/values.yaml
@@ -22,7 +22,6 @@ group: 0
 fsGroup: 0
 
 useHostNetwork: true
-useHostPID: true
 
 labels: {}
 
@@ -54,6 +53,7 @@ worker:
 fuse:
   criticalPod: false
   labels: {}
+  hostPID: false
   properties:
     client.storage.rpc.port: 6101
     client.oss.retry: 5
diff --git a/charts/jindofsx/templates/fuse/daemonset.yaml b/charts/jindofsx/templates/fuse/daemonset.yaml
index ae93137d..687e1677 100755
--- a/charts/jindofsx/templates/fuse/daemonset.yaml
+++ b/charts/jindofsx/templates/fuse/daemonset.yaml
@@ -55,7 +55,7 @@ spec:
       priorityClassName: system-node-critical
       {{- end }}
       hostNetwork: {{ .Values.useHostNetwork }}
-      hostPID: {{ .Values.useHostPID }}
+      hostPID: {{ .Values.fuse.hostPID }}
       nodeSelector:
 {{- if .Values.fuse.nodeSelector }}
 {{ toYaml .Values.fuse.nodeSelector | trim | indent 8  }}
diff --git a/charts/jindofsx/values.yaml b/charts/jindofsx/values.yaml
index e0960171..196cbce5 100644
--- a/charts/jindofsx/values.yaml
+++ b/charts/jindofsx/values.yaml
@@ -57,6 +57,7 @@ worker:
 fuse:
   criticalPod: false
   labels: {}
+  hostPID: false
   annotations: {}
   env: {}
   updateStrategy:
diff --git a/charts/juicefs/Chart.yaml b/charts/juicefs/Chart.yaml
index 12d1f175..f2efad3b 100644
--- a/charts/juicefs/Chart.yaml
+++ b/charts/juicefs/Chart.yaml
@@ -1,7 +1,7 @@
 name: juicefs
 apiVersion: v2
 description: FileSystem aimed for data analytics and machine learning in any cloud.
-version: 0.2.15
+version: 0.2.16
 appVersion: v1.0.0
 home: https://juicefs.com/
 maintainers:
diff --git a/charts/juicefs/templates/fuse/daemonset.yaml b/charts/juicefs/templates/fuse/daemonset.yaml
index 40e11f99..3a190fda 100644
--- a/charts/juicefs/templates/fuse/daemonset.yaml
+++ b/charts/juicefs/templates/fuse/daemonset.yaml
@@ -61,6 +61,7 @@ spec:
       hostNetwork: {{ .Values.fuse.hostNetwork }}
       dnsPolicy: ClusterFirstWithHostNet
       {{- end }}
+      hostPID: {{ .Values.fuse.hostPID }}
       enableServiceLinks: false
       nodeSelector:
       {{- if .Values.fuse.nodeSelector }}
diff --git a/charts/juicefs/values.yaml b/charts/juicefs/values.yaml
index 70d74c7c..a13288be 100644
--- a/charts/juicefs/values.yaml
+++ b/charts/juicefs/values.yaml
@@ -48,6 +48,7 @@ worker:
   statCmd: "stat -c %i /mnt/jfs"
   podManagementPolicy: Parallel
   hostNetwork: false
+  hostPID: false
   resources:
     requests:
 #      cpu: "0.5"
@@ -81,6 +82,7 @@ configs:
 
 fuse:
   hostNetwork: false
+  hostPID: false
   subPath: ""
   criticalPod: false
   enabled: true
diff --git a/charts/thin/templates/fuse/daemonset.yaml b/charts/thin/templates/fuse/daemonset.yaml
index a5b6a823..e8e58e61 100644
--- a/charts/thin/templates/fuse/daemonset.yaml
+++ b/charts/thin/templates/fuse/daemonset.yaml
@@ -52,6 +52,7 @@ spec:
       tolerations:
         - operator: Exists
       hostNetwork: {{ .Values.fuse.hostNetwork }}
+      hostPID: {{ .Values.fuse.hostPID }}
       containers:
         - name: thin-fuse
           {{- if .Values.fuse.imageTag }}
diff --git a/charts/thin/values.yaml b/charts/thin/values.yaml
index 1a252f8d..99c00494 100644
--- a/charts/thin/values.yaml
+++ b/charts/thin/values.yaml
@@ -70,6 +70,7 @@ fuse:
   livenessProbe:
   readinessProbe:
   hostNetwork: true
+  hostPID: false
   configValue: ""
   configStorage: "configmap"
   volumes:
diff --git a/charts/vineyard/templates/fuse/daemonset.yaml b/charts/vineyard/templates/fuse/daemonset.yaml
index d1353017..3e99bda1 100644
--- a/charts/vineyard/templates/fuse/daemonset.yaml
+++ b/charts/vineyard/templates/fuse/daemonset.yaml
@@ -76,6 +76,10 @@ spec:
             value: {{ .Values.fuse.targetPath }}/rpc-conf
           - name: PRESTOP_MARKER
             value: /tmp/prestop-marker
+          {{- range $key, $value := .Values.fuse.env }}
+          - name: "{{ $key }}"
+            value: "{{ $value }}"
+          {{- end }}
           lifecycle:
             preStop:
               exec:
@@ -91,6 +95,7 @@ spec:
           - name: vineyard-rpc-conf
             mountPath: {{ .Values.fuse.targetPath }}/rpc-conf
       restartPolicy: Always
+      hostPID: {{ .Values.fuse.hostPID }}
       volumes:
         - name: vineyard-fuse-mount
           hostPath:
diff --git a/charts/vineyard/values.yaml b/charts/vineyard/values.yaml
index 9442d153..afb4b48a 100644
--- a/charts/vineyard/values.yaml
+++ b/charts/vineyard/values.yaml
@@ -99,8 +99,10 @@ fuse:
   image: vineyardcloudnative/vineyard-fluid-fuse
   imageTag: latest
   imagePullPolicy: IfNotPresent
+  env: {}
   targetPath: ""
   nodeSelector: {}
+  hostPID: false
 
 owner:
   enabled: false
diff --git a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
index 3e22f9f0..f049fe62 100644
--- a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
+++ b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
@@ -100,6 +100,12 @@ spec:
                       needed OnRuntimeDeleted cleans fuse pod only when the cache
                       runtime is deleted Defaults to OnRuntimeDeleted'
                     type: string
+                  env:
+                    additionalProperties:
+                      type: string
+                    description: Environment variables that will be used by Vineyard
+                      Fuse. Default is not set.
+                    type: object
                   image:
                     description: Image for Vineyard Fuse Default is `vineyardcloudnative/vineyard-fluid-fuse`
                     type: string
diff --git a/docs/en/dev/api_doc.md b/docs/en/dev/api_doc.md
index c9ff9eea..19349ca5 100644
--- a/docs/en/dev/api_doc.md
+++ b/docs/en/dev/api_doc.md
@@ -906,7 +906,7 @@ PodMetadata
 </em>
 </td>
 <td>
-<p>PodMetadata defines labels and annotations that will be propagated to DataLoad pods</p>
+<p>PodMetadata defines labels and annotations that will be propagated to DataMigrate pods</p>
 </td>
 </tr>
 <tr>
@@ -920,7 +920,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Affinity defines affinity for DataLoad pod</p>
+<p>Affinity defines affinity for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -934,7 +934,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Tolerations defines tolerations for DataLoad pod</p>
+<p>Tolerations defines tolerations for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -946,7 +946,7 @@ map[string]string
 </td>
 <td>
 <em>(Optional)</em>
-<p>NodeSelector defiens node selector for DataLoad pod</p>
+<p>NodeSelector defiens node selector for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -958,7 +958,7 @@ string
 </td>
 <td>
 <em>(Optional)</em>
-<p>SchedulerName sets the scheduler to be used for DataLoad pod</p>
+<p>SchedulerName sets the scheduler to be used for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -1001,6 +1001,31 @@ Kubernetes core/v1.ResourceRequirements
 <p>Resources that will be requested by the DataMigrate job. <br></p>
 </td>
 </tr>
+<tr>
+<td>
+<code>parallelism</code></br>
+<em>
+int32
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Parallelism defines the parallelism tasks numbers for DataMigrate. If the value is greater than 1, the job acts
+as a launcher, and users should define the WorkerSpec.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>parallelOptions</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ParallelOptions defines options like ssh port and ssh secret name when parallelism is greater than 1.</p>
+</td>
+</tr>
 </table>
 </td>
 </tr>
@@ -1085,7 +1110,10 @@ DatasetSpec
 </em>
 </td>
 <td>
-<p>Mount Points to be mounted on Alluxio.</p>
+<em>(Optional)</em>
+<p>Mount Points to be mounted on cache runtime. <br>
+This field can be empty because some runtimes don&rsquo;t need to mount external storage (e.g.
+<a href="https://v6d.io/">Vineyard</a>).</p>
 </td>
 </tr>
 <tr>
@@ -3754,7 +3782,7 @@ PodMetadata
 </em>
 </td>
 <td>
-<p>PodMetadata defines labels and annotations that will be propagated to DataLoad pods</p>
+<p>PodMetadata defines labels and annotations that will be propagated to DataMigrate pods</p>
 </td>
 </tr>
 <tr>
@@ -3768,7 +3796,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Affinity defines affinity for DataLoad pod</p>
+<p>Affinity defines affinity for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3782,7 +3810,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Tolerations defines tolerations for DataLoad pod</p>
+<p>Tolerations defines tolerations for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3794,7 +3822,7 @@ map[string]string
 </td>
 <td>
 <em>(Optional)</em>
-<p>NodeSelector defiens node selector for DataLoad pod</p>
+<p>NodeSelector defiens node selector for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3806,7 +3834,7 @@ string
 </td>
 <td>
 <em>(Optional)</em>
-<p>SchedulerName sets the scheduler to be used for DataLoad pod</p>
+<p>SchedulerName sets the scheduler to be used for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3849,6 +3877,31 @@ Kubernetes core/v1.ResourceRequirements
 <p>Resources that will be requested by the DataMigrate job. <br></p>
 </td>
 </tr>
+<tr>
+<td>
+<code>parallelism</code></br>
+<em>
+int32
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Parallelism defines the parallelism tasks numbers for DataMigrate. If the value is greater than 1, the job acts
+as a launcher, and users should define the WorkerSpec.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>parallelOptions</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ParallelOptions defines options like ssh port and ssh secret name when parallelism is greater than 1.</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="data.fluid.io/v1alpha1.DataProcess">DataProcess
@@ -4238,7 +4291,10 @@ Kubernetes meta/v1.Time
 </em>
 </td>
 <td>
-<p>Mount Points to be mounted on Alluxio.</p>
+<em>(Optional)</em>
+<p>Mount Points to be mounted on cache runtime. <br>
+This field can be empty because some runtimes don&rsquo;t need to mount external storage (e.g.
+<a href="https://v6d.io/">Vineyard</a>).</p>
 </td>
 </tr>
 <tr>
@@ -10140,6 +10196,19 @@ Available values are <code>Always</code>, <code>IfNotPresent</code>, <code>Never
 </tr>
 <tr>
 <td>
+<code>env</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Environment variables that will be used by Vineyard Fuse.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>cleanPolicy</code></br>
 <em>
 <a href="#data.fluid.io/v1alpha1.FuseCleanPolicy">
@@ -10239,5 +10308,5 @@ bool
 <hr/>
 <p><em>
 Generated with <code>gen-crd-api-reference-docs</code>
-on git commit <code>c7cfb1888</code>.
+on git commit <code>b9800030e</code>.
 </em></p>
diff --git a/docs/zh/dev/api_doc.md b/docs/zh/dev/api_doc.md
index c9ff9eea..19349ca5 100644
--- a/docs/zh/dev/api_doc.md
+++ b/docs/zh/dev/api_doc.md
@@ -906,7 +906,7 @@ PodMetadata
 </em>
 </td>
 <td>
-<p>PodMetadata defines labels and annotations that will be propagated to DataLoad pods</p>
+<p>PodMetadata defines labels and annotations that will be propagated to DataMigrate pods</p>
 </td>
 </tr>
 <tr>
@@ -920,7 +920,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Affinity defines affinity for DataLoad pod</p>
+<p>Affinity defines affinity for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -934,7 +934,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Tolerations defines tolerations for DataLoad pod</p>
+<p>Tolerations defines tolerations for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -946,7 +946,7 @@ map[string]string
 </td>
 <td>
 <em>(Optional)</em>
-<p>NodeSelector defiens node selector for DataLoad pod</p>
+<p>NodeSelector defiens node selector for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -958,7 +958,7 @@ string
 </td>
 <td>
 <em>(Optional)</em>
-<p>SchedulerName sets the scheduler to be used for DataLoad pod</p>
+<p>SchedulerName sets the scheduler to be used for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -1001,6 +1001,31 @@ Kubernetes core/v1.ResourceRequirements
 <p>Resources that will be requested by the DataMigrate job. <br></p>
 </td>
 </tr>
+<tr>
+<td>
+<code>parallelism</code></br>
+<em>
+int32
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Parallelism defines the parallelism tasks numbers for DataMigrate. If the value is greater than 1, the job acts
+as a launcher, and users should define the WorkerSpec.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>parallelOptions</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ParallelOptions defines options like ssh port and ssh secret name when parallelism is greater than 1.</p>
+</td>
+</tr>
 </table>
 </td>
 </tr>
@@ -1085,7 +1110,10 @@ DatasetSpec
 </em>
 </td>
 <td>
-<p>Mount Points to be mounted on Alluxio.</p>
+<em>(Optional)</em>
+<p>Mount Points to be mounted on cache runtime. <br>
+This field can be empty because some runtimes don&rsquo;t need to mount external storage (e.g.
+<a href="https://v6d.io/">Vineyard</a>).</p>
 </td>
 </tr>
 <tr>
@@ -3754,7 +3782,7 @@ PodMetadata
 </em>
 </td>
 <td>
-<p>PodMetadata defines labels and annotations that will be propagated to DataLoad pods</p>
+<p>PodMetadata defines labels and annotations that will be propagated to DataMigrate pods</p>
 </td>
 </tr>
 <tr>
@@ -3768,7 +3796,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Affinity defines affinity for DataLoad pod</p>
+<p>Affinity defines affinity for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3782,7 +3810,7 @@ Kubernetes core/v1.Affinity
 </td>
 <td>
 <em>(Optional)</em>
-<p>Tolerations defines tolerations for DataLoad pod</p>
+<p>Tolerations defines tolerations for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3794,7 +3822,7 @@ map[string]string
 </td>
 <td>
 <em>(Optional)</em>
-<p>NodeSelector defiens node selector for DataLoad pod</p>
+<p>NodeSelector defiens node selector for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3806,7 +3834,7 @@ string
 </td>
 <td>
 <em>(Optional)</em>
-<p>SchedulerName sets the scheduler to be used for DataLoad pod</p>
+<p>SchedulerName sets the scheduler to be used for DataMigrate pod</p>
 </td>
 </tr>
 <tr>
@@ -3849,6 +3877,31 @@ Kubernetes core/v1.ResourceRequirements
 <p>Resources that will be requested by the DataMigrate job. <br></p>
 </td>
 </tr>
+<tr>
+<td>
+<code>parallelism</code></br>
+<em>
+int32
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Parallelism defines the parallelism tasks numbers for DataMigrate. If the value is greater than 1, the job acts
+as a launcher, and users should define the WorkerSpec.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>parallelOptions</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ParallelOptions defines options like ssh port and ssh secret name when parallelism is greater than 1.</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="data.fluid.io/v1alpha1.DataProcess">DataProcess
@@ -4238,7 +4291,10 @@ Kubernetes meta/v1.Time
 </em>
 </td>
 <td>
-<p>Mount Points to be mounted on Alluxio.</p>
+<em>(Optional)</em>
+<p>Mount Points to be mounted on cache runtime. <br>
+This field can be empty because some runtimes don&rsquo;t need to mount external storage (e.g.
+<a href="https://v6d.io/">Vineyard</a>).</p>
 </td>
 </tr>
 <tr>
@@ -10140,6 +10196,19 @@ Available values are <code>Always</code>, <code>IfNotPresent</code>, <code>Never
 </tr>
 <tr>
 <td>
+<code>env</code></br>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Environment variables that will be used by Vineyard Fuse.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>cleanPolicy</code></br>
 <em>
 <a href="#data.fluid.io/v1alpha1.FuseCleanPolicy">
@@ -10239,5 +10308,5 @@ bool
 <hr/>
 <p><em>
 Generated with <code>gen-crd-api-reference-docs</code>
-on git commit <code>c7cfb1888</code>.
+on git commit <code>b9800030e</code>.
 </em></p>
diff --git a/pkg/common/constants.go b/pkg/common/constants.go
index 11b298d5..0659d556 100644
--- a/pkg/common/constants.go
+++ b/pkg/common/constants.go
@@ -205,3 +205,7 @@ const (
 	EnvDisableApplicationController = "KEY_DISABLE_APP_CONTROLLER"
 	EnvImagePullSecretsKey          = "IMAGE_PULL_SECRETS"
 )
+
+const (
+	RuntimeFuseHostPIDKey = "runtime.fluid.io/fuse.hostpid"
+)
diff --git a/pkg/common/hostpid.go b/pkg/common/hostpid.go
new file mode 100644
index 00000000..68009da5
--- /dev/null
+++ b/pkg/common/hostpid.go
@@ -0,0 +1,38 @@
+/*
+Copyright 2024 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+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.
+*/
+
+package common
+
+import (
+	"strconv"
+)
+
+// HostPIDEnabled check if HostPID is true for runtime fuse pod.
+func HostPIDEnabled(annotations map[string]string) bool {
+	if annotations == nil {
+		return false
+	}
+	value, exist := annotations[RuntimeFuseHostPIDKey]
+	if !exist {
+		return false
+	}
+	enabled, err := strconv.ParseBool(value)
+	// If parse failed, return false
+	if err != nil {
+		return false
+	}
+	return enabled
+}
diff --git a/pkg/ddc/alluxio/transform_fuse.go b/pkg/ddc/alluxio/transform_fuse.go
index 4f4ac428..98bec2ee 100644
--- a/pkg/ddc/alluxio/transform_fuse.go
+++ b/pkg/ddc/alluxio/transform_fuse.go
@@ -103,6 +103,7 @@ func (e *AlluxioEngine) transformFuse(runtime *datav1alpha1.AlluxioRuntime, data
 
 	// parse fuse container network mode
 	value.Fuse.HostNetwork = datav1alpha1.IsHostNetwork(runtime.Spec.Fuse.NetworkMode)
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 
 	value.Fuse.Enabled = true
 
diff --git a/pkg/ddc/alluxio/types.go b/pkg/ddc/alluxio/types.go
index b6c6ef8a..254d8c74 100644
--- a/pkg/ddc/alluxio/types.go
+++ b/pkg/ddc/alluxio/types.go
@@ -189,6 +189,7 @@ type Fuse struct {
 	ShortCircuitPolicy string               `json:"shortCircuitPolicy,omitempty"`
 	Args               []string             `json:"args,omitempty"`
 	HostNetwork        bool                 `json:"hostNetwork,omitempty"`
+	HostPID            bool                 `json:"hostPID,omitempty"`
 	Enabled            bool                 `json:"enabled,omitempty"`
 	Resources          common.Resources     `json:"resources,omitempty"`
 	Global             bool                 `json:"global,omitempty"`
diff --git a/pkg/ddc/goosefs/transform_fuse.go b/pkg/ddc/goosefs/transform_fuse.go
index 01120e87..8fa5b690 100644
--- a/pkg/ddc/goosefs/transform_fuse.go
+++ b/pkg/ddc/goosefs/transform_fuse.go
@@ -88,6 +88,7 @@ func (e *GooseFSEngine) transformFuse(runtime *datav1alpha1.GooseFSRuntime, data
 
 	value.Fuse.NodeSelector[e.getFuseLabelname()] = "true"
 	value.Fuse.HostNetwork = true
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 	value.Fuse.Enabled = true
 
 	e.transformResourcesForFuse(runtime, value)
diff --git a/pkg/ddc/goosefs/types.go b/pkg/ddc/goosefs/types.go
index d7478e99..1f20e02e 100644
--- a/pkg/ddc/goosefs/types.go
+++ b/pkg/ddc/goosefs/types.go
@@ -172,6 +172,7 @@ type Fuse struct {
 	ShortCircuitPolicy string            `yaml:"shortCircuitPolicy,omitempty"`
 	Args               []string          `yaml:"args,omitempty"`
 	HostNetwork        bool              `yaml:"hostNetwork,omitempty"`
+	HostPID            bool              `json:"hostPID,omitempty"`
 	Enabled            bool              `yaml:"enabled,omitempty"`
 	Resources          common.Resources  `yaml:"resources,omitempty"`
 	Global             bool              `yaml:"global,omitempty"`
diff --git a/pkg/ddc/jindo/transform.go b/pkg/ddc/jindo/transform.go
index da592bb1..f5e4b1fc 100644
--- a/pkg/ddc/jindo/transform.go
+++ b/pkg/ddc/jindo/transform.go
@@ -96,7 +96,6 @@ func (e *JindoEngine) transform(runtime *datav1alpha1.JindoRuntime) (value *Jind
 		Group:           0,
 		FsGroup:         0,
 		UseHostNetwork:  true,
-		UseHostPID:      true,
 		Properties:      e.transformPriority(metaPath),
 		Master: Master{
 			ReplicaCount: e.transformReplicasCount(runtime),
@@ -433,6 +432,7 @@ func (e *JindoEngine) transformFuse(runtime *datav1alpha1.JindoRuntime, value *J
 
 	// set critical fuse pod to avoid eviction
 	value.Fuse.CriticalPod = common.CriticalFusePodEnabled()
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 
 	return nil
 }
diff --git a/pkg/ddc/jindo/types.go b/pkg/ddc/jindo/types.go
index a0572cd8..62124db3 100644
--- a/pkg/ddc/jindo/types.go
+++ b/pkg/ddc/jindo/types.go
@@ -32,7 +32,6 @@ type Jindo struct {
 	Group           int                    `yaml:"group"`
 	FsGroup         int                    `yaml:"fsGroup"`
 	UseHostNetwork  bool                   `yaml:"useHostNetwork"`
-	UseHostPID      bool                   `yaml:"useHostPID"`
 	Properties      map[string]string      `yaml:"properties"`
 	Master          Master                 `yaml:"master"`
 	Worker          Worker                 `yaml:"worker"`
@@ -98,6 +97,7 @@ type Fuse struct {
 	Resources         Resources         `yaml:"resources,omitempty"`
 	MountPath         string            `yaml:"mountPath,omitempty"`
 	VirtualFuseDevice bool              `yaml:"virtualFuseDevice"`
+	HostPID           bool              `json:"hostPID,omitempty"`
 }
 
 type Mounts struct {
diff --git a/pkg/ddc/jindocache/transform.go b/pkg/ddc/jindocache/transform.go
index c2d5bde5..306b4b46 100644
--- a/pkg/ddc/jindocache/transform.go
+++ b/pkg/ddc/jindocache/transform.go
@@ -126,7 +126,6 @@ func (e *JindoCacheEngine) transform(runtime *datav1alpha1.JindoRuntime) (value
 		User:                0,
 		Group:               0,
 		UseHostNetwork:      true,
-		UseHostPID:          true,
 		Properties:          e.transformPriority(metaPath),
 		Master: Master{
 			ReplicaCount: e.transformReplicasCount(runtime),
@@ -792,6 +791,7 @@ func (e *JindoCacheEngine) transformFuse(runtime *datav1alpha1.JindoRuntime, val
 		}
 	}
 	value.Fuse.FuseProperties = properties
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 
 	// set critical fuse pod to avoid eviction
 	value.Fuse.CriticalPod = common.CriticalFusePodEnabled()
diff --git a/pkg/ddc/jindocache/types.go b/pkg/ddc/jindocache/types.go
index 5b474fee..53c9932c 100644
--- a/pkg/ddc/jindocache/types.go
+++ b/pkg/ddc/jindocache/types.go
@@ -31,7 +31,6 @@ type Jindo struct {
 	User                int                    `json:"user"`
 	Group               int                    `json:"group"`
 	UseHostNetwork      bool                   `json:"useHostNetwork"`
-	UseHostPID          bool                   `json:"useHostPID"`
 	Properties          map[string]string      `json:"properties"`
 	Master              Master                 `json:"master"`
 	Worker              Worker                 `json:"worker"`
@@ -116,6 +115,7 @@ type Fuse struct {
 	MountPath      string              `json:"mountPath,omitempty"`
 	Mode           string              `json:"mode,omitempty"`
 	Env            map[string]string   `json:"env,omitempty"`
+	HostPID        bool                `json:"hostPID,omitempty"`
 }
 
 type Mounts struct {
diff --git a/pkg/ddc/jindofsx/transform.go b/pkg/ddc/jindofsx/transform.go
index 5c34199e..6d2acea3 100644
--- a/pkg/ddc/jindofsx/transform.go
+++ b/pkg/ddc/jindofsx/transform.go
@@ -126,7 +126,6 @@ func (e *JindoFSxEngine) transform(runtime *datav1alpha1.JindoRuntime) (value *J
 		User:                0,
 		Group:               0,
 		UseHostNetwork:      true,
-		UseHostPID:          true,
 		Properties:          e.transformPriority(metaPath),
 		Master: Master{
 			ReplicaCount: e.transformReplicasCount(runtime),
@@ -736,6 +735,7 @@ func (e *JindoFSxEngine) transformFuse(runtime *datav1alpha1.JindoRuntime, value
 
 	// set critical fuse pod to avoid eviction
 	value.Fuse.CriticalPod = common.CriticalFusePodEnabled()
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 }
 
 func (e *JindoFSxEngine) transformLogConfig(runtime *datav1alpha1.JindoRuntime, value *Jindo) {
diff --git a/pkg/ddc/jindofsx/types.go b/pkg/ddc/jindofsx/types.go
index b9991c59..ec36b1b5 100644
--- a/pkg/ddc/jindofsx/types.go
+++ b/pkg/ddc/jindofsx/types.go
@@ -31,7 +31,6 @@ type Jindo struct {
 	User                int                    `json:"user"`
 	Group               int                    `json:"group"`
 	UseHostNetwork      bool                   `json:"useHostNetwork"`
-	UseHostPID          bool                   `json:"useHostPID"`
 	Properties          map[string]string      `json:"properties"`
 	Master              Master                 `json:"master"`
 	Worker              Worker                 `json:"worker"`
@@ -115,6 +114,7 @@ type Fuse struct {
 	MountPath      string              `json:"mountPath,omitempty"`
 	Mode           string              `json:"mode,omitempty"`
 	Env            map[string]string   `json:"env,omitempty"`
+	HostPID        bool                `json:"hostPID,omitempty"`
 }
 
 type Mounts struct {
diff --git a/pkg/ddc/juicefs/operations/base.go b/pkg/ddc/juicefs/operations/base.go
index 360769cb..4ef33d77 100644
--- a/pkg/ddc/juicefs/operations/base.go
+++ b/pkg/ddc/juicefs/operations/base.go
@@ -28,6 +28,7 @@ import (
 
 	"github.com/fluid-cloudnative/fluid/pkg/utils/cmdguard"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/kubeclient"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/security"
 )
 
 type JuiceFileUtils struct {
@@ -113,12 +114,11 @@ func (j JuiceFileUtils) Count(juiceSubPath string) (total int64, err error) {
 func (j JuiceFileUtils) GetFileCount(juiceSubPath string) (fileCount int64, err error) {
 	var (
 		//strs    = "du -ah juiceSubPath |grep ^- |wc -l "
-		strs    = fmt.Sprintf("ls -lR %s |grep ^- |wc -l ", juiceSubPath)
+		strs    = fmt.Sprintf("ls -lR %s |grep ^- |wc -l ", security.EscapeBashStr(juiceSubPath))
 		command = []string{"bash", "-c", strs}
 		stdout  string
 		stderr  string
 	)
-
 	stdout, stderr, err = j.exec(command)
 	if err != nil {
 		err = fmt.Errorf("execute command %v with expectedErr: %v stdout %s and stderr %s", command, err, stdout, stderr)
@@ -249,11 +249,10 @@ func (j JuiceFileUtils) GetMetric(juicefsPath string) (metrics string, err error
 }
 
 // GetUsedSpace Get used space in byte
-// use "df --block-size=1 |grep <juicefsPath>'"
+// equal to `df --block-size=1 | grep juicefsPath`
 func (j JuiceFileUtils) GetUsedSpace(juicefsPath string) (usedSpace int64, err error) {
 	var (
-		strs    = fmt.Sprintf(`df --block-size=1 |grep %s`, juicefsPath)
-		command = []string{"bash", "-c", strs}
+		command = []string{"df", "--block-size=1"}
 		stdout  string
 		stderr  string
 	)
@@ -264,9 +263,15 @@ func (j JuiceFileUtils) GetUsedSpace(juicefsPath string) (usedSpace int64, err e
 		return
 	}
 
+	var str string
+	lines := strings.Split(stdout, "\n")
+	for _, line := range lines {
+		if strings.Contains(line, juicefsPath) {
+			str = line
+			break
+		}
+	}
 	// [<Filesystem>       <Size>  <Used> <Avail> <Use>% <Mounted on>]
-	str := strings.TrimSuffix(stdout, "\n")
-
 	data := strings.Fields(str)
 	if len(data) != 6 {
 		err = fmt.Errorf("failed to parse %s in GetUsedSpace method", data)
@@ -354,8 +359,8 @@ func (j JuiceFileUtils) QueryMetaDataInfoIntoFile(key KeyOfMetaDataFile, filenam
 		j.log.Error(errors.New("the key not in  metadatafile"), "key", key)
 	}
 	var (
-		str     = "sed -n '" + line + "' " + filename
-		command = []string{"bash", "-c", str}
+		str     = "'" + line + "' " + filename
+		command = []string{"sed", "-n", str}
 		stdout  string
 		stderr  string
 	)
diff --git a/pkg/ddc/juicefs/transform.go b/pkg/ddc/juicefs/transform.go
index de19ac16..81a98bfc 100644
--- a/pkg/ddc/juicefs/transform.go
+++ b/pkg/ddc/juicefs/transform.go
@@ -28,6 +28,7 @@ import (
 	"github.com/fluid-cloudnative/fluid/pkg/ddc/base/portallocator"
 	"github.com/fluid-cloudnative/fluid/pkg/utils"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/docker"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/security"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/transfromer"
 )
 
@@ -202,7 +203,13 @@ func (j *JuiceFSEngine) genWorkerMount(value *JuiceFS, workerOptionMap map[strin
 			}
 			workerOptionMap["metrics"] = fmt.Sprintf("0.0.0.0:%d", metricsPort)
 		}
-		mountArgsWorker = []string{common.JuiceFSCeMountPath, value.Source, value.Worker.MountPath, "-o", strings.Join(genArgs(workerOptionMap), ",")}
+		mountArgsWorker = []string{
+			common.JuiceFSCeMountPath,
+			value.Source,
+			security.EscapeBashStr(value.Worker.MountPath),
+			"-o",
+			security.EscapeBashStr(strings.Join(genArgs(workerOptionMap), ",")),
+		}
 	} else {
 		workerOptionMap["foreground"] = ""
 		// do not update config again
@@ -210,18 +217,24 @@ func (j *JuiceFSEngine) genWorkerMount(value *JuiceFS, workerOptionMap map[strin
 
 		// start independent cache cluster, refer to [juicefs cache sharing](https://juicefs.com/docs/cloud/cache/#client_cache_sharing)
 		// fuse and worker use the same cache-group, fuse use no-sharing
-		cacheGroup := fmt.Sprintf("%s-%s", j.namespace, value.FullnameOverride)
+		cacheGroup := fmt.Sprintf("%s-%s", j.namespace, security.EscapeBashStr(value.FullnameOverride))
 		if _, ok := workerOptionMap["cache-group"]; ok {
 			cacheGroup = workerOptionMap["cache-group"]
 		}
 		workerOptionMap["cache-group"] = cacheGroup
 		delete(workerOptionMap, "no-sharing")
 
-		mountArgsWorker = []string{common.JuiceFSMountPath, value.Source, value.Worker.MountPath, "-o", strings.Join(genArgs(workerOptionMap), ",")}
+		mountArgsWorker = []string{
+			common.JuiceFSMountPath,
+			value.Source,
+			security.EscapeBashStr(value.Worker.MountPath),
+			"-o",
+			security.EscapeBashStr(strings.Join(genArgs(workerOptionMap), ",")),
+		}
 	}
 
 	value.Worker.Command = strings.Join(mountArgsWorker, " ")
-	value.Worker.StatCmd = "stat -c %i " + value.Worker.MountPath
+	value.Worker.StatCmd = "stat -c %i " + security.EscapeBashStr(value.Worker.MountPath)
 }
 
 func (j *JuiceFSEngine) transformPlacementMode(dataset *datav1alpha1.Dataset, value *JuiceFS) {
diff --git a/pkg/ddc/juicefs/transform_fuse.go b/pkg/ddc/juicefs/transform_fuse.go
index e0d04592..301eef8e 100644
--- a/pkg/ddc/juicefs/transform_fuse.go
+++ b/pkg/ddc/juicefs/transform_fuse.go
@@ -28,6 +28,7 @@ import (
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/common"
 	"github.com/fluid-cloudnative/fluid/pkg/utils"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/security"
 )
 
 func (j *JuiceFSEngine) transformFuse(runtime *datav1alpha1.JuiceFSRuntime, dataset *datav1alpha1.Dataset, value *JuiceFS) (err error) {
@@ -36,7 +37,7 @@ func (j *JuiceFSEngine) transformFuse(runtime *datav1alpha1.JuiceFSRuntime, data
 	}
 	mount := dataset.Spec.Mounts[0]
 
-	value.Configs.Name = mount.Name
+	value.Configs.Name = security.EscapeBashStr(mount.Name)
 
 	// transform image
 	image := runtime.Spec.Fuse.Image
@@ -112,6 +113,7 @@ func (j *JuiceFSEngine) transformFuse(runtime *datav1alpha1.JuiceFSRuntime, data
 
 	// parse fuse container network mode
 	value.Fuse.HostNetwork = datav1alpha1.IsHostNetwork(runtime.Spec.Fuse.NetworkMode)
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 	return
 }
 
@@ -129,7 +131,7 @@ func (j *JuiceFSEngine) transformFuseNodeSelector(runtime *datav1alpha1.JuiceFSR
 func (j *JuiceFSEngine) genValue(mount datav1alpha1.Mount, tiredStoreLevel *datav1alpha1.Level, value *JuiceFS,
 	sharedOptions map[string]string, sharedEncryptOptions []datav1alpha1.EncryptOption) (map[string]string, error) {
 	options := make(map[string]string)
-	value.Configs.Name = mount.Name
+	value.Configs.Name = security.EscapeBashStr(mount.Name)
 	value.Configs.EncryptEnvOptions = make([]EncryptEnvOption, 0)
 	source := ""
 
@@ -238,7 +240,7 @@ func (j *JuiceFSEngine) genValue(mount datav1alpha1.Mount, tiredStoreLevel *data
 	}
 
 	if source == "" {
-		source = mount.Name
+		source = security.EscapeBashStr(mount.Name)
 	}
 
 	// transform source
@@ -355,7 +357,13 @@ func (j *JuiceFSEngine) genFuseMount(value *JuiceFS, optionMap map[string]string
 			}
 			optionMap["metrics"] = fmt.Sprintf("0.0.0.0:%d", metricsPort)
 		}
-		mountArgs = []string{common.JuiceFSCeMountPath, value.Source, value.Fuse.MountPath, "-o", strings.Join(genArgs(optionMap), ",")}
+		mountArgs = []string{
+			common.JuiceFSCeMountPath,
+			value.Source,
+			security.EscapeBashStr(value.Fuse.MountPath),
+			"-o",
+			security.EscapeBashStr(strings.Join(genArgs(optionMap), ",")),
+		}
 	} else {
 		if readonly {
 			optionMap["attrcacheto"] = "7200"
@@ -374,11 +382,17 @@ func (j *JuiceFSEngine) genFuseMount(value *JuiceFS, optionMap map[string]string
 		optionMap["cache-group"] = cacheGroup
 		optionMap["no-sharing"] = ""
 
-		mountArgs = []string{common.JuiceFSMountPath, value.Source, value.Fuse.MountPath, "-o", strings.Join(genArgs(optionMap), ",")}
+		mountArgs = []string{
+			common.JuiceFSMountPath,
+			value.Source,
+			security.EscapeBashStr(value.Fuse.MountPath),
+			"-o",
+			security.EscapeBashStr(strings.Join(genArgs(optionMap), ",")),
+		}
 	}
 
 	value.Fuse.Command = strings.Join(mountArgs, " ")
-	value.Fuse.StatCmd = "stat -c %i " + value.Fuse.MountPath
+	value.Fuse.StatCmd = "stat -c %i " + security.EscapeBashStr(value.Fuse.MountPath)
 	return nil
 }
 
@@ -408,7 +422,7 @@ func (j *JuiceFSEngine) genFormatCmd(value *JuiceFS, config *[]string, options m
 		for _, option := range *config {
 			o := strings.TrimSpace(option)
 			if o != "" {
-				args = append(args, fmt.Sprintf("--%s", o))
+				args = append(args, fmt.Sprintf("--%s", security.EscapeBashStr(o)))
 			}
 		}
 	}
@@ -424,20 +438,20 @@ func (j *JuiceFSEngine) genFormatCmd(value *JuiceFS, config *[]string, options m
 			args = append(args, "--no-update")
 		}
 		if value.Configs.Storage != "" {
-			args = append(args, fmt.Sprintf("--storage=%s", value.Configs.Storage))
+			args = append(args, fmt.Sprintf("--storage=%s", security.EscapeBashStr(value.Configs.Storage)))
 		}
 		if value.Configs.Bucket != "" {
-			args = append(args, fmt.Sprintf("--bucket=%s", value.Configs.Bucket))
+			args = append(args, fmt.Sprintf("--bucket=%s", security.EscapeBashStr(value.Configs.Bucket)))
 		}
 		formatOpts := ceFilter.filterOption(options)
 		for k, v := range formatOpts {
-			args = append(args, fmt.Sprintf("--%s=%s", k, v))
+			args = append(args, fmt.Sprintf("--%s=%s", security.EscapeBashStr(k), security.EscapeBashStr(v)))
 		}
 		encryptOptions := ceFilter.filterEncryptEnvOptions(value.Configs.EncryptEnvOptions)
 		for _, v := range encryptOptions {
-			args = append(args, fmt.Sprintf("--%s=${%s}", v.Name, v.EnvName))
+			args = append(args, fmt.Sprintf("--%s=${%s}", security.EscapeBashStr(v.Name), v.EnvName))
 		}
-		args = append(args, value.Source, value.Configs.Name)
+		args = append(args, value.Source, security.EscapeBashStr(value.Configs.Name))
 		cmd := append([]string{common.JuiceCeCliPath, "format"}, args...)
 		value.Configs.FormatCmd = strings.Join(cmd, " ")
 		return
@@ -455,15 +469,15 @@ func (j *JuiceFSEngine) genFormatCmd(value *JuiceFS, config *[]string, options m
 		args = append(args, "--secretkey=${SECRET_KEY}")
 	}
 	if value.Configs.Bucket != "" {
-		args = append(args, fmt.Sprintf("--bucket=%s", value.Configs.Bucket))
+		args = append(args, fmt.Sprintf("--bucket=%s", security.EscapeBashStr(value.Configs.Bucket)))
 	}
 	formatOpts := eeFilter.filterOption(options)
 	for k, v := range formatOpts {
-		args = append(args, fmt.Sprintf("--%s=%s", k, v))
+		args = append(args, fmt.Sprintf("--%s=%s", security.EscapeBashStr(k), security.EscapeBashStr(v)))
 	}
 	encryptOptions := eeFilter.filterEncryptEnvOptions(value.Configs.EncryptEnvOptions)
 	for _, v := range encryptOptions {
-		args = append(args, fmt.Sprintf("--%s=${%s}", v.Name, v.EnvName))
+		args = append(args, fmt.Sprintf("--%s=${%s}", security.EscapeBashStr(v.Name), v.EnvName))
 	}
 	args = append(args, value.Source)
 	cmd := append([]string{common.JuiceCliPath, "auth"}, args...)
@@ -499,13 +513,13 @@ func (j *JuiceFSEngine) genQuotaCmd(value *JuiceFS, mount datav1alpha1.Mount) er
 			if value.Edition == CommunityEdition {
 				// ce
 				// juicefs quota set ${metaurl} --path ${path} --capacity ${capacity}
-				value.Configs.QuotaCmd = fmt.Sprintf("%s quota set %s --path %s --capacity %d", common.JuiceCeCliPath, value.Source, value.Fuse.SubPath, qs)
+				value.Configs.QuotaCmd = fmt.Sprintf("%s quota set %s --path %s --capacity %d", common.JuiceCeCliPath, value.Source, security.EscapeBashStr(value.Fuse.SubPath), qs)
 				return nil
 			}
 			// ee
 			// juicefs quota set ${metaurl} --path ${path} --capacity ${capacity}
 			cli := common.JuiceCliPath
-			value.Configs.QuotaCmd = fmt.Sprintf("%s quota set %s --path %s --capacity %d", cli, value.Source, value.Fuse.SubPath, qs)
+			value.Configs.QuotaCmd = fmt.Sprintf("%s quota set %s --path %s --capacity %d", cli, value.Source, security.EscapeBashStr(value.Fuse.SubPath), qs)
 			return nil
 		}
 	}
diff --git a/pkg/ddc/juicefs/type.go b/pkg/ddc/juicefs/type.go
index 7a6e83a9..a4f87acf 100644
--- a/pkg/ddc/juicefs/type.go
+++ b/pkg/ddc/juicefs/type.go
@@ -104,6 +104,7 @@ type Fuse struct {
 	VolumeMounts    []corev1.VolumeMount `json:"volumeMounts,omitempty"`
 	Volumes         []corev1.Volume      `json:"volumes,omitempty"`
 	HostNetwork     bool                 `json:"hostNetwork,omitempty"`
+	HostPID         bool                 `json:"hostPID,omitempty"`
 	MetricsPort     *int                 `json:"metricsPort,omitempty"`
 
 	SubPath       string            `json:"subPath,omitempty"`
diff --git a/pkg/ddc/thin/transform_fuse.go b/pkg/ddc/thin/transform_fuse.go
index 9a82a00d..cc376a41 100644
--- a/pkg/ddc/thin/transform_fuse.go
+++ b/pkg/ddc/thin/transform_fuse.go
@@ -82,6 +82,7 @@ func (t *ThinEngine) transformFuse(runtime *datav1alpha1.ThinRuntime, profile *d
 
 	// 9. network
 	value.Fuse.HostNetwork = datav1alpha1.IsHostNetwork(runtime.Spec.Fuse.NetworkMode)
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 
 	// 10. targetPath to mount
 	value.Fuse.TargetPath = t.getTargetPath()
diff --git a/pkg/ddc/thin/type.go b/pkg/ddc/thin/type.go
index c7ffd1f7..36430f15 100644
--- a/pkg/ddc/thin/type.go
+++ b/pkg/ddc/thin/type.go
@@ -63,6 +63,7 @@ type Fuse struct {
 	Ports           []corev1.ContainerPort `json:"ports,omitempty"`
 	CriticalPod     bool                   `json:"criticalPod,omitempty"`
 	HostNetwork     bool                   `json:"hostNetwork,omitempty"`
+	HostPID         bool                   `json:"hostPID,omitempty"`
 	TargetPath      string                 `json:"targetPath,omitempty"`
 	NodeSelector    map[string]string      `json:"nodeSelector,omitempty"`
 	Envs            []corev1.EnvVar        `json:"envs,omitempty"`
diff --git a/pkg/ddc/vineyard/transform.go b/pkg/ddc/vineyard/transform.go
index 06367f71..750cbdd1 100644
--- a/pkg/ddc/vineyard/transform.go
+++ b/pkg/ddc/vineyard/transform.go
@@ -15,6 +15,7 @@ package vineyard
 
 import (
 	"fmt"
+	"github.com/fluid-cloudnative/fluid/pkg/common"
 	"time"
 
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
@@ -155,9 +156,15 @@ func (e *VineyardEngine) transformFuse(runtime *datav1alpha1.VineyardRuntime, va
 	imagePullPolicy := runtime.Spec.Fuse.ImagePullPolicy
 	value.Fuse.Image, value.Fuse.ImageTag, value.Fuse.ImagePullPolicy = e.parseFuseImage(image, imageTag, imagePullPolicy)
 
+	if len(runtime.Spec.Fuse.Env) > 0 {
+		value.Fuse.Env = runtime.Spec.Fuse.Env
+	} else {
+		value.Fuse.Env = map[string]string{}
+	}
 	value.Fuse.CleanPolicy = runtime.Spec.Fuse.CleanPolicy
 
 	value.Fuse.NodeSelector = e.transformFuseNodeSelector(runtime)
+	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 
 	value.Fuse.TargetPath = e.getMountPoint()
 	e.transformResourcesForFuse(runtime, value)
diff --git a/pkg/ddc/vineyard/type.go b/pkg/ddc/vineyard/type.go
index 92ad5788..c8b274ee 100644
--- a/pkg/ddc/vineyard/type.go
+++ b/pkg/ddc/vineyard/type.go
@@ -78,10 +78,12 @@ type Fuse struct {
 	Image           string                       `json:"image,omitempty"`
 	ImageTag        string                       `json:"imageTag,omitempty"`
 	ImagePullPolicy string                       `json:"imagePullPolicy,omitempty"`
+	Env             map[string]string            `json:"env,omitempty"`
 	CleanPolicy     datav1alpha1.FuseCleanPolicy `json:"cleanPolicy,omitempty"`
 	TargetPath      string                       `json:"targetPath,omitempty"`
 	NodeSelector    map[string]string            `json:"nodeSelector,omitempty"`
 	Resources       common.Resources             `json:"resources,omitempty"`
+	HostPID         bool                         `json:"hostPID,omitempty"`
 }
 
 type TieredStore struct {
diff --git a/pkg/utils/security/escape.go b/pkg/utils/security/escape.go
new file mode 100644
index 00000000..92c11f59
--- /dev/null
+++ b/pkg/utils/security/escape.go
@@ -0,0 +1,63 @@
+/*
+Copyright 2023 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+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.
+*/
+
+package security
+
+import (
+	"fmt"
+	"strings"
+)
+
+// According to https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting
+// a -> a
+// a b -> a b
+// $a -> $'$a'
+// $'a' -> $'$\'$a'\'
+func EscapeBashStr(s string) string {
+	if !containsOne(s, []rune{'$', '`', '&', ';', '>', '|', '(', ')'}) {
+		return s
+	}
+	s = strings.ReplaceAll(s, `\`, `\\`)
+	s = strings.ReplaceAll(s, `'`, `\'`)
+	if strings.Contains(s, `\\`) {
+		s = strings.ReplaceAll(s, `\\\\`, `\\`)
+		s = strings.ReplaceAll(s, `\\\'`, `\'`)
+		s = strings.ReplaceAll(s, `\\"`, `\"`)
+		s = strings.ReplaceAll(s, `\\a`, `\a`)
+		s = strings.ReplaceAll(s, `\\b`, `\b`)
+		s = strings.ReplaceAll(s, `\\e`, `\e`)
+		s = strings.ReplaceAll(s, `\\E`, `\E`)
+		s = strings.ReplaceAll(s, `\\n`, `\n`)
+		s = strings.ReplaceAll(s, `\\r`, `\r`)
+		s = strings.ReplaceAll(s, `\\t`, `\t`)
+		s = strings.ReplaceAll(s, `\\v`, `\v`)
+		s = strings.ReplaceAll(s, `\\?`, `\?`)
+	}
+	return fmt.Sprintf(`$'%s'`, s)
+}
+
+func containsOne(target string, chars []rune) bool {
+	charMap := make(map[rune]bool, len(chars))
+	for _, c := range chars {
+		charMap[c] = true
+	}
+	for _, s := range target {
+		if charMap[s] {
+			return true
+		}
+	}
+	return false
+}


Test patch:
diff --git a/pkg/common/hostpid_test.go b/pkg/common/hostpid_test.go
new file mode 100644
index 00000000..5a35e03e
--- /dev/null
+++ b/pkg/common/hostpid_test.go
@@ -0,0 +1,79 @@
+/*
+Copyright 2024 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+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.
+*/
+
+package common
+
+import "testing"
+
+func TestHostPIDEnabled(t *testing.T) {
+	type args struct {
+		annotations map[string]string
+	}
+	tests := []struct {
+		name string
+		args args
+		want bool
+	}{
+		{
+			name: "nil, return false",
+			args: args{
+				annotations: nil,
+			},
+			want: false,
+		},
+		{
+			name: "not exist, return false",
+			args: args{
+				annotations: map[string]string{},
+			},
+			want: false,
+		},
+		{
+			name: "wrong value, return false",
+			args: args{
+				annotations: map[string]string{
+					RuntimeFuseHostPIDKey: "sss",
+				},
+			},
+			want: false,
+		},
+		{
+			name: "exist, return true",
+			args: args{
+				annotations: map[string]string{
+					RuntimeFuseHostPIDKey: "true",
+				},
+			},
+			want: true,
+		},
+		{
+			name: "exist True, return true",
+			args: args{
+				annotations: map[string]string{
+					RuntimeFuseHostPIDKey: "True",
+				},
+			},
+			want: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := HostPIDEnabled(tt.args.annotations); got != tt.want {
+				t.Errorf("HostPIDEnabled() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/pkg/ddc/juicefs/operations/base_test.go b/pkg/ddc/juicefs/operations/base_test.go
index 82c2f3bb..529983b0 100644
--- a/pkg/ddc/juicefs/operations/base_test.go
+++ b/pkg/ddc/juicefs/operations/base_test.go
@@ -447,7 +447,7 @@ func TestJuiceFileUtils_GetUsedSpace(t *testing.T) {
 		t.Fatal(err.Error())
 	}
 	a := &JuiceFileUtils{log: fake.NullLogger()}
-	_, err = a.GetUsedSpace("/tmp")
+	_, err = a.GetUsedSpace("/runtime-mnt/juicefs/kube-system/jfsdemo/juicefs-fuse")
 	if err == nil {
 		t.Error("check failure, want err, got nil")
 	}
@@ -457,7 +457,7 @@ func TestJuiceFileUtils_GetUsedSpace(t *testing.T) {
 	if err != nil {
 		t.Fatal(err.Error())
 	}
-	usedSpace, err := a.GetUsedSpace("/tmp")
+	usedSpace, err := a.GetUsedSpace("/runtime-mnt/juicefs/kube-system/jfsdemo/juicefs-fuse")
 	if err != nil {
 		t.Errorf("check failure, want nil, got err: %v", err)
 	}
diff --git a/pkg/ddc/juicefs/ufs_test.go b/pkg/ddc/juicefs/ufs_test.go
index d7bc65c7..4afb4d9c 100644
--- a/pkg/ddc/juicefs/ufs_test.go
+++ b/pkg/ddc/juicefs/ufs_test.go
@@ -38,7 +38,7 @@ func mockExecCommandInContainerForTotalFileNums() (stdout string, stderr string,
 }
 
 func mockExecCommandInContainerForUsedStorageBytes() (stdout string, stderr string, err error) {
-	r := `JuiceFS:test 207300683100160  41460043776 207259223056384   1% /data`
+	r := `JuiceFS:test 207300683100160  41460043776 207259223056384   1% /juicefs/juicefs/test/juicefs-fuse`
 	return r, "", nil
 }
 
@@ -46,7 +46,7 @@ func TestTotalStorageBytes(t *testing.T) {
 	statefulSet := &appsv1.StatefulSet{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      "test-worker",
-			Namespace: "fluid",
+			Namespace: "juicefs",
 		},
 		Spec: appsv1.StatefulSetSpec{
 			Selector: &metav1.LabelSelector{
@@ -57,7 +57,7 @@ func TestTotalStorageBytes(t *testing.T) {
 	var pod = &corev1.Pod{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      "test-work-0",
-			Namespace: "fluid",
+			Namespace: "juicefs",
 			Labels:    map[string]string{"a": "b"},
 		},
 		Status: corev1.PodStatus{
@@ -93,11 +93,11 @@ func TestTotalStorageBytes(t *testing.T) {
 			name: "test",
 			fields: fields{
 				name:      "test",
-				namespace: "fluid",
+				namespace: "juicefs",
 				runtime: &datav1alpha1.JuiceFSRuntime{
 					ObjectMeta: metav1.ObjectMeta{
 						Name:      "test",
-						Namespace: "fluid",
+						Namespace: "juicefs",
 					},
 				},
 			},
diff --git a/pkg/ddc/vineyard/transform_test.go b/pkg/ddc/vineyard/transform_test.go
index f7cd6078..3c626d3c 100755
--- a/pkg/ddc/vineyard/transform_test.go
+++ b/pkg/ddc/vineyard/transform_test.go
@@ -38,9 +38,10 @@ func TestTransformFuse(t *testing.T) {
 	}))
 
 	var tests = []struct {
-		runtime *datav1alpha1.VineyardRuntime
-		value   *Vineyard
-		expect  []string
+		runtime   *datav1alpha1.VineyardRuntime
+		value     *Vineyard
+		expect    []string
+		expectEnv map[string]string
 	}{
 		{&datav1alpha1.VineyardRuntime{
 			Spec: datav1alpha1.VineyardRuntimeSpec{
@@ -48,10 +49,11 @@ func TestTransformFuse(t *testing.T) {
 					Image:           "dummy-fuse-image",
 					ImageTag:        "dummy-tag",
 					ImagePullPolicy: "IfNotPresent",
+					Env:             map[string]string{"TEST_ENV": "true"},
 					CleanPolicy:     "OnRuntimeDeleted",
 				},
 			},
-		}, &Vineyard{}, []string{"dummy-fuse-image", "dummy-tag", "IfNotPresent", "OnRuntimeDeleted"}},
+		}, &Vineyard{}, []string{"dummy-fuse-image", "dummy-tag", "IfNotPresent", "OnRuntimeDeleted"}, map[string]string{"TEST_ENV": "true"}},
 	}
 	for _, test := range tests {
 		engine := &VineyardEngine{}
@@ -70,7 +72,9 @@ func TestTransformFuse(t *testing.T) {
 		if string(test.value.Fuse.CleanPolicy) != test.expect[3] {
 			t.Errorf("Expected Fuse CleanPolicy %s, got %s", test.expect[3], test.value.Fuse.CleanPolicy)
 		}
-
+		if !reflect.DeepEqual(test.value.Fuse.Env, test.expectEnv) {
+			t.Errorf("Expected Fuse Env %v, got %v", test.expectEnv, test.value.Fuse.Env)
+		}
 	}
 }
 
diff --git a/pkg/utils/security/escape_test.go b/pkg/utils/security/escape_test.go
new file mode 100644
index 00000000..029ab221
--- /dev/null
+++ b/pkg/utils/security/escape_test.go
@@ -0,0 +1,41 @@
+/*
+Copyright 2023 The Fluid Author.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+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.
+*/
+
+package security
+
+import "testing"
+
+func TestEscapeBashStr(t *testing.T) {
+	cases := [][]string{
+		{"abc", "abc"},
+		{"test-volume", "test-volume"},
+		{"http://minio.kube-system:9000/minio/dynamic-ce", "http://minio.kube-system:9000/minio/dynamic-ce"},
+		{"$(cat /proc/self/status | grep CapEff > /test.txt)", "$'$(cat /proc/self/status | grep CapEff > /test.txt)'"},
+		{"hel`cat /proc/self/status`lo", "$'hel`cat /proc/self/status`lo'"},
+		{"'h'el`cat /proc/self/status`lo", "$'\\'h\\'el`cat /proc/self/status`lo'"},
+		{"\\'h\\'el`cat /proc/self/status`lo", "$'\\'h\\'el`cat /proc/self/status`lo'"},
+		{"$'h'el`cat /proc/self/status`lo", "$'$\\'h\\'el`cat /proc/self/status`lo'"},
+		{"hel\\`cat /proc/self/status`lo", "$'hel\\\\`cat /proc/self/status`lo'"},
+		{"hel\\\\`cat /proc/self/status`lo", "$'hel\\\\`cat /proc/self/status`lo'"},
+		{"hel\\'`cat /proc/self/status`lo", "$'hel\\'`cat /proc/self/status`lo'"},
+	}
+	for _, c := range cases {
+		escaped := EscapeBashStr(c[0])
+		if escaped != c[1] {
+			t.Errorf("escapeBashVar(%s) = %s, want %s", c[0], escaped, c[1])
+		}
+	}
+}