
# 切换或重置轻量算力节点服务器操作系统
#### 场景描述
当轻量算力节点的操作系统镜像不满足要求时，可以进行切换或重置。本文介绍以下几种切换操作系统的方式：
- 在ModelArts控制台的轻量算力节点页面切换或重置操作系统（推荐）
- 在裸金属服务器控制台切换操作系统
- 使用BMS Go SDK的方式切换裸金属服务器操作系统
- 使用Python封装API的方式切换裸金属服务器操作系统
 
#### 约束限制
- 节点状态要求：轻量算力节点状态只有处于"已停止"、"重置OS失败"、"切换OS失败"时，才可以切换或重置操作系统。否则可能会导致操作失败，因为系统盘无法被卸载，导致无限循环卸载盘。
- 操作系统要求：目标操作系统必须是该Region下的IMS公共镜像或者私有共享镜像。
- 普通节点和超节点的子节点支持切换操作系统或重置操作系统，同时也支持批量操作。
- 超节点本身仅支持切换操作系统，但不支持重置操作系统。超节点本身不支持批量切换操作系统。
 
#### 操作影响
重置或切换轻量算力节点操作系统的影响如下：
1. 系统盘ID变化：切换或重置操作系统后，EVS系统盘ID会变化，和下单时订单中的EVS ID已经不一致，导致无法进行EVS系统盘扩容操作。系统会提示"当前订单已到期，无法进行扩容操作，请续订"。
2. userdata配置影响：切换操作系统时，userdata的注入可能不会生效，特别是在configdriver模式下。客户需要确保在创建节点时传入userdata参数，或者在切换后手动配置必要的设置。因此切换或者重置操作系统后，建议通过挂载数据盘EVS或挂载SFS盘等方式进行存储扩容。
3. 应用和模型影响：切换操作系统可能影响已部署的应用或模型，因为依赖的软件包或库可能需要重新安装或配置。用户需要重新配置必要的依赖项以确保应用正常运行。
4. 裸金属服务器风险：对于裸金属服务器，升级操作系统内核或驱动可能导致不兼容，影响系统启动或基本功能。如果需要升级，请联系云服务商确认。
用户在进行切换或重置操作系统操作前，应确保节点处于关机状态，检查当前配置，备份重要数据，并在必要时联系技术支持以确认操作的可行性。
#### 在ModelArts控制台的轻量算力节点页面切换或重置操作系统
1. 登录[ModelArts管理控制台](https://console.huaweicloud.com/modelarts)，在左侧导航栏中，选择"资源管理 \> 轻量算力资源 \> 轻量算力节点"页面。
2. 在资源列表页，在轻量算力节点的"普通节点"或"超节点"列表中，单击右侧操作列的"更多 \> 切换操作系统"或"更多 \> 重置操作系统"，在弹出的确认对话框中，确认信息无误，然后单击"确定"，完成操作。 此时轻量算力节点普通节点或超节点的状态显示"切换操作系统中"或"重置操作系统中"。
   在普通节点列表页，勾选多个节点，在右上角"更多"中可以批量执行"切换操作系统"或"重置操作系统"操作。
   在超节点详情页的节点列表，勾选多个子节点，可以批量执行"切换操作系统"或"重置操作系统"操作。
   
 
#### 在BMS控制台切换操作系统
1. 获取操作系统镜像。
   由云服务官方提供给客户的操作系统镜像，在IMS镜像服务的共享镜像处进行接收即可，参考如下图操作。
   图1共享镜像   
   ![](https://support.huaweicloud.com/resmgmt-modelarts/figure/zh-cn_image_0000002087372477.png "点击放大")
   
   
2. 切换操作系统。 对轻量算力节点资源对应的裸金属服务器，对其进行关机操作，完成关机后，才可以执行切换操作系统操作。
   在裸金属服务的更多选项中，单击切换操作系统，如下图所示。
   图2切换操作系统   
   ![](https://support.huaweicloud.com/resmgmt-modelarts/figure/zh-cn_image_0000002119594369.png "点击放大")
   
   在切换操作系统界面，选择上一步接收到的共享镜像即可。
   
#### 使用BMS Go SDK的方式切换操作系统
以下为BMS使用Go语言通过SDK方式切换操作系统的示例代码。
```
package main
import (
"fmt"
        "os"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
bms "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bms/v1"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bms/v1/model"
region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bms/v1/region"
)
func main() {
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；
// 本示例以ak和sk保存在环境变量中来实现身份验证为例，运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
ak := os.Getenv("HUAWEICLOUD_SDK_AK")
sk := os.Getenv("HUAWEICLOUD_SDK_SK")
auth := basic.NewCredentialsBuilder().
WithAk(ak).
WithSk(sk).
Build()
client := bms.NewBmsClient(
bms.BmsClientBuilder().
WithRegion(region.ValueOf("cn-north-4")).
WithCredential(auth).
Build())
keyname := "KeyPair-name"
userdata := "aGVsbG8gd29ybGQsIHdlbGNvbWUgdG8gam9pbiB0aGUgY29uZmVyZW5jZQ=="
request := &model.ChangeBaremetalServerOsRequest{
ServerId: "****input your bms instance id****",
Body: &model.OsChangeReq{
OsChange: &model.OsChange{
Keyname: &keyname,
Imageid: "****input your ims image id****",
Metadata: &model.MetadataInstall{
UserData: &userdata,
},
},
},
}
response, err := client.ChangeBaremetalServerOs(request)
if err == nil {
fmt.Printf("%+v\n", response)
} else {
fmt.Println(err)
}
}
```
#### Python封装API方式切换BMS操作系统
以下为BMS使用Python语言通过API方式切换操作系统的示例代码。
```
# -*- coding: UTF-8 -*-
import requests
import json
import time
import requests.packages.urllib3.exceptions
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
class ServerOperation(object):
    ################################ IAM认证API#################################################
    def __init__(self, account, password, region_name, username=None, project_id=None):
        """
        :param username:  if IAM user,here is small user, else  big user
        :param account: account big  big user
        :param password: account
        :param region_name:
        """
        self.account = account
        self.username = username
        self.password = password
        self.region_name = region_name
        self.project_id = project_id
        self.ma_endpoint = "https://modelarts.{}.myhuaweicloud.com".format(region_name)
        self.service_endpoint = "https://bms.{}.myhuaweicloud.com".format(region_name)
        self.iam_endpoint = "https://iam.{}.myhuaweicloud.com".format(region_name)
        self.headers = {"Content-Type": "application/json",
                        "X-Auth-Token": self.get_project_token_by_account(self.iam_endpoint)}
    def get_project_token_by_account(self, iam_endpoint):
        body = {
            "auth": {
                "identity": {
                    "methods": [
                        "password"
                    ],
                    "password": {
                        "user": {
                            "name": self.username if self.username else self.account,
                            "password": self.password,
                            "domain": {
                                "name": self.account
                            }
                        }
                    }
                },
                "scope": {
                    "project": {
                        "name": self.region_name
                    }
                }
            }
        }
        headers = {
            "Content-Type": "application/json"
        }
        import json
        url = iam_endpoint + "/v3/auth/tokens"
        response = requests.post(url, headers=headers, data=json.dumps(body), verify=True)
        token = (response.headers['X-Subject-Token'])
        return token
    def change_os(self, server_id):
        url = "{}/v1/{}/baremetalservers/{}/changeos".format(self.service_endpoint, self.project_id, server_id)
        print(url)
        body = {
            "os-change": {
                "adminpass": "@Server",
                "imageid": "40d88eea-6e41-418a-ad6c-c177fe1876b8"
            }
        }
        response = requests.post(url, headers=self.headers, data=json.dumps(body), verify=False)
        print(json.dumps(response.json(), indent=1))
        return response.json()
if __name__ == '__main__':
    # 调用API前置准备，初始化认证鉴权信息
    server = ServerOperation(username="xxx",
                             account="xxx",
                             password="xxx",
                             project_id="xxx",
                             region_name="cn-north-4")
    server.change_os(server_id="0c84bb62-35bd-4e1c-ba08-a3a686bc5097")
```
