

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 AWS IoT Greengrass V2 核心裝置遷移至非根目錄
<a name="migrate-to-nonroot"></a>

**重要**  
本主題說明建議的遷移方法。您可能需要針對裝置組態、作業系統和安裝的軟體調整這些步驟。

根據預設， 會在 Linux 裝置上以根使用者身分 AWS IoT Greengrass 執行。您可以透過遷移 AWS IoT Greengrass 核心裝置以僅具有 AWS IoT Greengrass 所需的 Linux 功能的非根使用者身分執行 ，來改善裝置的安全狀態。您可以遷移單一裝置或跨機群擴展遷移。

## 考量事項
<a name="migrate-nonroot-considerations"></a>

遷移至非根目錄之前，請考慮下列事項：
+ 此遷移程序適用於在具有 systemd AWS IoT Greengrass 的 Linux 上執行 nucleus (Java 型） AWS IoT Greengrass 的核心裝置。它不適用於執行 nucleus lite AWS IoT Greengrass 的裝置。
+ 遷移生產機群之前，請在開發環境中的單一裝置上測試遷移。

## 遷移單一裝置
<a name="migrate-nonroot-single-device"></a>

此遷移程序遵循中所述的方法[解決方案 3：使用元件使用者分隔 AWS IoT Greengrass V2 將 設定為非根目錄](setup-greengrass-non-root.md#non-root-solution-3)。開始之前，請先完成該主題中的先決條件，包括允許非根使用者以個別使用者身分執行元件的 sudoers 組態。

使用此程序在遷移機群之前遷移單一裝置。

### 步驟 1：建立非根使用者和群組
<a name="migrate-nonroot-step1"></a>

連線至您的裝置，並建立 AWS IoT Greengrass 執行身分為 的系統使用者和群組。將 {{user-name}} 和 {{group-name}} 取代為您要使用的名稱。

```
sudo groupadd --system {{group-name}}
sudo useradd --system --create-home --shell /sbin/nologin -g {{group-name}} {{user-name}}
```

### 步驟 2：備份檔案擁有權
<a name="migrate-nonroot-step2"></a>

停止 AWS IoT Greengrass 並儲存目前的檔案擁有權結構，以便在需要復原時進行還原。

```
sudo systemctl stop greengrass.service
sudo mkdir -p /opt/greengrass-backup
sudo find /greengrass/v2 -exec stat -c 'chown %U:%G "%n"' {} \; | sudo tee /opt/greengrass-backup/restore_ownership.sh > /dev/null
sudo chmod 700 /opt/greengrass-backup/restore_ownership.sh
```

**注意**  
本主題中的命令使用 `/greengrass/v2`做為 AWS IoT Greengrass 根路徑。如果您安裝 AWS IoT Greengrass 到不同的位置，請將 取代`/greengrass/v2`為實際的 AWS IoT Greengrass 根路徑。

### 步驟 3：變更檔案擁有權
<a name="migrate-nonroot-step3"></a>

將 AWS IoT Greengrass 目錄的擁有權轉移給非根使用者。

```
sudo chown -R {{user-name}}:{{group-name}} /greengrass/v2
```

### 步驟 4：建立系統化的捨棄覆寫
<a name="migrate-nonroot-step4"></a>

建立下拉式清單和組態檔案，指示 systemd 以具有必要 Linux 功能的非根使用者 AWS IoT Greengrass 身分執行。

```
sudo mkdir -p /etc/systemd/system/greengrass.service.d
```

遷移使用位於 的系統化插入式覆寫檔案`/etc/systemd/system/greengrass.service.d/10-nonroot.conf`。插入式覆寫會取代基礎服務檔案中的設定，而不直接修改。此覆寫會將系統化 設定為以具有一組有限 Linux 功能的非根使用者身分執行 AWS IoT Greengrass 服務。移除下拉式目錄會導致系統還原為基本`greengrass.service`檔案，該檔案會以原始組態做為根目錄執行。

`/etc/systemd/system/greengrass.service.d/10-nonroot.conf` 使用下列內容建立 檔案：

```
[Service]
User={{user-name}}
AmbientCapabilities=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE
CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE
ProtectSystem=strict
ReadWritePaths=/greengrass/v2 /tmp
```

如需這些系統化指令和所需功能的資訊，請參閱 [解決方案 3：使用元件使用者分隔 AWS IoT Greengrass V2 將 設定為非根目錄](setup-greengrass-non-root.md#non-root-solution-3)。

### 步驟 5：重新載入系統化並啟動 AWS IoT Greengrass
<a name="migrate-nonroot-step5"></a>

執行下列命令以重新載入系統化協助程式並啟動 AWS IoT Greengrass。

```
sudo systemctl daemon-reload
sudo systemctl start greengrass.service
```

### 步驟 6：驗證遷移
<a name="migrate-nonroot-step6"></a>

確認 AWS IoT Greengrass 以非根使用者身分執行。

```
sudo systemctl status greengrass.service
ps -ef | grep greengrass
```

輸出會將非根使用者顯示為程序擁有者，而非 `root`。

接著，確認所有部署的元件都在執行中。您必須在裝置上部署 `aws.greengrass.Cli`元件，才能執行此命令。

```
sudo /greengrass/v2/bin/greengrass-cli component list
```

每個元件都應報告 `RUNNING`或 `State`的 `FINISHED`。 `FINISHED`是 的預期終端狀態`aws.greengrass.Nucleus`。在您考慮遷移完成之前，請先調查處於 `BROKEN`或 `ERRORED` 狀態的任何元件。

### 復原單一裝置
<a name="migrate-nonroot-single-rollback"></a>

如果您需要還原 AWS IoT Greengrass 以根身分執行，請移除插入式覆寫、還原檔案擁有權，然後重新啟動 AWS IoT Greengrass。

```
sudo systemctl stop greengrass.service
sudo rm -rf /etc/systemd/system/greengrass.service.d
sudo bash /opt/greengrass-backup/restore_ownership.sh
sudo systemctl daemon-reload
sudo systemctl start greengrass.service
```

[步驟 6：驗證遷移](#migrate-nonroot-step6) 再次從 執行驗證命令，以確認 AWS IoT Greengrass 以根身分執行。程序應顯示`root`為擁有者。

確認轉返成功後，您可以選擇清除遷移成品：
+ **備份目錄** — `/opt/greengrass-backup` 如果您計劃稍後重試遷移，您可以保留 ，或將其移除：

  ```
  sudo rm -r /opt/greengrass-backup
  ```
+ **非根使用者和群組** — 如果您不再計劃以非根使用者 AWS IoT Greengrass 身分執行，您可以移除您在步驟 1 中建立的使用者和群組：

  ```
  sudo userdel {{user-name}}
  sudo groupdel {{group-name}}
  ```

  如果其他服務或元件使用此使用者，請勿移除使用者。

## 遷移裝置機群
<a name="migrate-nonroot-fleet"></a>

在單一裝置上驗證遷移後，您可以跨機群擴展遷移。選擇下列其中一種方法：
+ [使用自訂 AWS IoT Greengrass 引導元件](#migrate-nonroot-fleet-bootstrap)
+ [使用 AWS Systems Manager](#migrate-nonroot-fleet-ssm)

### 使用自訂 AWS IoT Greengrass 引導元件
<a name="migrate-nonroot-fleet-bootstrap"></a>

您可以建立自訂 AWS IoT Greengrass 元件，將整個機群的單一裝置遷移步驟自動化。此方法為獨立式，且僅使用 AWS IoT Greengrass 部署。它不需要外部工具，例如 Systems Manager。

元件使用引導生命週期，並將 `RequiresPrivilege` 設定為 `true`，在部署期間將元件做為根目錄執行。引導指令碼會執行與單一裝置程序相同的特殊權限操作：
+ 如果非根使用者和群組尚未存在，請建立這些使用者和群組。
+ 備份用於轉返的檔案擁有權結構。
+ 將 AWS IoT Greengrass 根目錄的擁有權變更為非根使用者。
+ 建立系統化的下拉式清單覆寫檔案。
+ 重新載入系統化協助程式。
+ 使用代碼 101 結束以重新啟動裝置。

**重要**  
元件必須以代碼 101 而非 100 結束。結束程式碼 100 只會重新啟動 AWS IoT Greengrass JVM 程序，該程序使用已快取在記憶體中的系統化服務組態。完整重新啟動會強制系統化從磁碟讀取新的插入式覆寫，並以非根使用者 AWS IoT Greengrass 身分啟動。重新啟動會暫時中斷裝置上的所有服務。

讓元件等冪，以便在您已遷移裝置時重新部署不會失敗。

遷移部署完成後，請確認您的裝置是以非根使用者身分執行。如需詳細資訊，請參閱[步驟 6：驗證遷移](#migrate-nonroot-step6)。您可以部署驗證元件來檢查執行中的使用者並報告結果，或在 AWS IoT Greengrass 主控台中監控部署狀態。

#### 設定復原機制
<a name="migrate-nonroot-fleet-bootstrap-rollback"></a>

若要在機群中遠端還原根組態，您的遷移元件必須設定復原機制。其中一種方法是使用 systemd 來監控觸發檔案。此方法需要下列系統化資源：
+ 移除捨棄覆寫、從備份還原原始檔案擁有權、重新載入系統化協助程式，並以 AWS IoT Greengrass 根目錄重新啟動的*復原指令碼*。
+ 以根目錄執行轉返指令碼的系統化 *oneshot 服務*。一個 oneshot 服務會執行單一任務，然後結束，而不是做為長期協助程式執行。
+ 監控特定檔案路徑的系統化*路徑單位*，例如 `/greengrass/v2/rollback/.rollback-trigger`。當檔案出現時，路徑單位會自動啟動 oneshot 復原服務。

透過此機制，您可以部署建立觸發檔案的簡單 AWS IoT Greengrass 元件來復原裝置。系統化路徑單位會偵測檔案、執行復原服務做為根目錄，並還原 AWS IoT Greengrass 至其原始根組態。

### 使用 AWS Systems Manager
<a name="migrate-nonroot-fleet-ssm"></a>

如果您使用 Systems Manager 來管理裝置，您可以建立 SSM 文件來自動化單一裝置遷移步驟。由於 SSM 獨立執行 AWS IoT Greengrass，因此可以直接停止並重新啟動 AWS IoT Greengrass 服務，而無需重新啟動裝置。

您的 SSM 文件必須符合下列要求：
+ 停止 AWS IoT Greengrass 並備份目前的服務組態和檔案擁有權結構。
+ 建立非根使用者和群組。
+ 將 AWS IoT Greengrass 目錄的擁有權變更為非根使用者。
+ 建立系統化的下拉式清單覆寫檔案。
+ 重新載入系統化協助程式並啟動 AWS IoT Greengrass。
+ 確認 以非根使用者身分成功 AWS IoT Greengrass 啟動。

若要跨機群執行遷移，請使用 Systems Manager Run Command，針對使用標籤或資源群組的裝置執行 SSM 文件。您可以在 Systems Manager 主控台中監控命令執行狀態，顯示每個目標裝置的結果，包括任何錯誤。

若要轉返，請建立個別的 SSM 文件以停止 AWS IoT Greengrass、移除捨棄覆寫、還原原始檔案擁有權、重新載入系統化協助程式，並以根 AWS IoT Greengrass 重新啟動。針對您需要復原的裝置執行本文件。

如需在受管節點上執行命令的詳細資訊，請參閱[使用 Systems Manager Run Command 執行命令](https://docs.aws.amazon.com/systems-manager/latest/userguide/run-command.html)。