귀하의 경험을 개선할 수 있도록 도와주십시오.

귀하의 의견을 알려주십시오.

2분이 소요되는 설문 조사에 시간을 내주시겠습니까?

Announcement: Our new, consolidated Junos CLI Reference is now available.

close
external-header-nav
keyboard_arrow_up
list Table of Contents

이 기계 번역이 도움이 되었습니까?

starstarstarstarstar
Go to English page
면책 조항:

이 페이지는 타사 기계 번역 소프트웨어를 사용해 번역됩니다. 주니퍼 네트웍스에서는 우수한 품질의 번역을 제공하기 위한 합리적인 수준의 노력을 기울이지만 해당 컨텐츠의 정확성을 보장할 수 없습니다. 본 번역에 포함된 정보의 정확성과 관련해 의문이 있는 경우 영문 버전을 참조하시기 바랍니다. 다운로드 가능한 PDF는 영어로만 제공됩니다.

gNOI 운영 체제(OS) 서비스

date_range 22-Mar-24

요약 gNOI 운영 체제(OS) 서비스를 사용하여 대상 네트워크 장치의 소프트웨어를 업그레이드합니다.

gNOI OS 서비스를 사용하여 대상 장치에서 소프트웨어를 업그레이드할 수 있습니다. proto 정의 파일은 https://github.com/openconfig/gnoi/blob/master/os/os.proto 에 있습니다.

소프트웨어 설치에는 서비스 RPC에 해당하는 세 가지 OS 주요 단계가 있습니다.

  • 설치
  • 활성화
  • 확인

RPC는 Install() 지정된 이미지를 대상 디바이스의 디렉터리로 /var/tmp/ 전송합니다. 대상 파일 이름은 메시지 version 필드에 정의된 TransferRequest 값입니다. RPC는 Activate() 이미지를 설치하고 디바이스를 재부팅하여 새로 설치된 이미지를 활성화합니다. RPC는 Verify() 디바이스에서 OS 버전을 검증합니다.

참고:

gNOI system 서비스 SetPackage() RPC를 사용하여 디바이스에 소프트웨어를 설치할 수도 있습니다. 자세한 내용은 gNOI 시스템 서비스를 참조하세요.

지원되는 RPC

표 1: 지원되는 os.proto RPC
릴리스에 도입된 RPC 설명
Activate()

다음 재부팅 시 사용되는 OS 버전을 설정합니다.

Activate() 플래그가 생략되거나 로 설정된 경우 no_reboot 대상을 재부팅합니다 False. 재부팅이 요청된 OS 버전을 부팅하지 못하면 대상이 이전 OS 패키지로 롤백됩니다.

참고:

Junos 디바이스는 메시지의 필드를 ActivateRequest 지원하지 standby_supervisor 않습니다.

진화한 Junos OS 22.2R1

Install()

소프트웨어 이미지를 대상으로 전송합니다.

참고:

Junos 디바이스는 메시지의 필드를 TransferRequest 지원하지 standby_supervisor 않습니다.

진화한 Junos OS 22.2R1

Verify()

실행 중인 OS 버전을 확인합니다. 이 RPC는 성공할 때까지 대상이 부팅되는 동안 여러 번 호출될 수 있습니다.

참고:

Junos 디바이스는 VerifyResponse를 지원하지 verify_standby 않습니다.

진화한 Junos OS 22.2R1

네트워크 디바이스 구성

시작하기 전에:

서비스 RPC를 OS 사용하기 위해 추가 구성이 필요하지 않습니다.

예: 설치 및 활성화

이 예제에서 클라이언트는 다음 작업을 수행하는 Python 응용 프로그램을 실행합니다 gnoi_os_install_activate.py .

  • 소프트웨어 패키지를 로컬 네트워크 관리 시스템에서 네트워크 디바이스로 복사합니다.
  • 네트워크 장치에 패키지를 설치합니다.
  • 네트워크 디바이스를 재부팅하여 새 소프트웨어 이미지를 활성화합니다.

애플리케이션은 메시지와 함께 InstallRequest() RPC를 호출하여 Install() 파일을 전송합니다. 응용 프로그램은 각 10% 전송 완료 간격에서 진행률 메시지를 내보내 파일 전송의 진행률을 추적합니다. 파일 전송에 성공하면 애플리케이션은 RPC를 Activate() 호출하여 이미지를 설치하고 대상을 다시 부팅합니다.

응용 프로그램은 채널을 설정하기 위해 모듈을 가져옵니다 grpc_channel . 이 grpc_channel 모듈은 gNOI 서비스 구성에 설명되어 있습니다. 응용 프로그램의 인수는 파일에 저장됩니다 args_os_install_activate.txt . 응용 프로그램 및 인수 파일은 다음과 같습니다.

gnoi_os_install_activate.py

content_copy zoom_out_map
          
         
               
"""gRPC gNOI OS Install, Activate utility."""

from __future__ import print_function
import argparse
import logging
import os
from functools import partial
from getpass import getpass

import os_pb2
import os_pb2_grpc
from grpc_channel import grpc_authenticate_channel_mutual

MAX_BYTES = 65536


def get_args(parser):
    parser.add_argument('--server',
                        dest='server',
                        type=str,
                        default='localhost',
                        help='Server IP or name.  Default is localhost')

    parser.add_argument('--port',
                        dest='port',
                        nargs='?',
                        type=int,
                        default=50051,
                        help='The server port. Default is 50051')

    parser.add_argument('--client_key',
                        dest='client_key',
                        type=str,
                        default='',
                        help='Full path of the client private key.  Default ""')

    parser.add_argument('--client_cert',
                        dest='client_cert',
                        type=str,
                        default='',
                        help='Full path of the client certificate.  Default ""')

    parser.add_argument('--root_ca_cert',
                        dest='root_ca_cert',
                        required=True,
                        type=str,
                        help='Full path of the Root CA certificate.')

    parser.add_argument('--user_id',
                        dest='user_id',
                        required=True,
                        type=str,
                        help='User ID for RPC call credentials.')

    parser.add_argument('--no_reboot',
                        dest='no_reboot',
                        type=int,
                        default=0,
                        help='Reboot immediately or not.  Default 0 (Reboot immediately)')

    parser.add_argument('--source_package',
                        dest='source_package',
                        type=str,
                        default='',
                        help='Full path of the source file.  Default ""')

    parser.add_argument('--timeout',
                        dest='timeout',
                        type=int,
                        default=600,
                        help='Timeout in seconds.  Default 600')

    parser.add_argument('--version',
                        dest='version',
                        type=str,
                        default='',
                        help='OS version to activate.  Default is ""')

    args = parser.parse_args()
    return args


def send_rpc(channel, metadata, args):
    print("Executing GNOI::OS::Install")
    stub = os_pb2_grpc.OSStub(channel)
    it = []

    # Create file transfer request
    req = os_pb2.InstallRequest()
    req.transfer_request.version = args.version
    it.append(req)

    # Read source package and add to request
    source_package_bytes = os.path.getsize(args.source_package)
    with open(args.source_package, "rb") as file:
        # Read data in 64 KB chunks and calculate checksum and data messages
        for data in iter(partial(file.read, MAX_BYTES), b''):
            req = os_pb2.InstallRequest()
            req.transfer_content = data
            it.append(req)

    req = os_pb2.InstallRequest()
    req.transfer_end.SetInParent()
    it.append(req)

    next_pct = 0
    transfer_percent = 0
    validated = False
    activated = False

    try:
        responses = stub.Install(
            iter(it), metadata=metadata, timeout=args.timeout)
        print("OS Install start\n")

        for response in responses:
            rsp_type = response.WhichOneof('response')
            if rsp_type == 'install_error':
                print("%s: %s -- %s\n" % (rsp_type,
                      response.install_error.type, response.install_error.detail))
                raise Exception("Install Error")
            elif rsp_type == 'transfer_ready':
                print("%s: %s\n" % (rsp_type, response.transfer_ready))
            elif rsp_type == 'transfer_progress':
                transfer_percent = int(float(
                    response.transfer_progress.bytes_received) / float(source_package_bytes) * 100)
                if 0 == (transfer_percent % 10) and transfer_percent != next_pct:
                    next_pct = transfer_percent
                    print("Transfer percent complete: %s%%" % transfer_percent)
                    logging.info('Transferring file %s%%', transfer_percent)
            elif rsp_type == 'validated':
                print("%s: %s -- %s\n" % (rsp_type,
                      response.validated.version, response.validated.description))
                logging.info('Validated: %s', response.validated.version)
                validated = True

        if transfer_percent > 0 and validated:
            print("Executing GNOI::OS::Activate")
            req = os_pb2.ActivateRequest()
            req.version = args.version
            req.no_reboot = args.no_reboot
            activate_response = stub.Activate(
                req, metadata=metadata, timeout=args.timeout)
            rsp_type = activate_response.WhichOneof('response')
            if rsp_type == 'activate_ok':
                activated = True

    except Exception as e:
        logging.error('Error installing package: %s', e)
        print(e)
    else:
        if activated:
            logging.info('Installation complete: %s', args.version)
            print('Installation complete for %s' % args.version)


def main():
    parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
    args = get_args(parser)

    grpc_server_password = getpass("gRPC server password for executing RPCs: ")
    metadata = [('username', args.user_id),
                ('password', grpc_server_password)]

    try:
        # Establish grpc channel to network device
        channel = grpc_authenticate_channel_mutual(
            args.server, args.port, args.root_ca_cert, args.client_key, args.client_cert)
        response = send_rpc(channel, metadata, args)
    except Exception as e:
        logging.error('Received error: %s', e)
        print(e)


if __name__ == '__main__':
    logging.basicConfig(filename='gnoi-install.log',
                        format='%(asctime)s %(levelname)-8s %(message)s',
                        level=logging.INFO,
                        datefmt='%Y-%m-%d %H:%M:%S')
    main()

args_os_install_activate.txt

content_copy zoom_out_map
--root_ca_cert=/etc/pki/certs/serverRootCA.crt
--client_key=/home/lab/certs/client.key
--client_cert=/home/lab/certs/client.crt
--server=10.53.52.169
--port=50051
--user_id=gnoi-user
--source_package=/home/lab/images/junos-evo-install-ptx-x86-64-22.3R1.9-EVO.iso
--timeout=1800
--version=22.3R1.9-EVO
참고:

Junos OS Evolved 릴리스 23.4R1 version 부터 , Install(), 및 Verify() RPC의 Activate()필드는 패키지 이름 대신 소프트웨어 버전 문자열(에 /system/state/software-version표시됨)을 사용합니다.

응용 프로그램 실행

클라이언트가 응용 프로그램을 실행하면 응용 프로그램은 로컬 장치에서 네트워크 장치의 디렉터리로 /var/tmp 패키지를 복사하고 패키지를 설치한 다음 장치를 재부팅하여 설치를 완료합니다.

content_copy zoom_out_map
lab@gnoi-client:~/src/gnoi/proto$ python3 gnoi_os_install_activate.py @args_os_install_activate.txt
gRPC server password for executing RPCs: 
Creating channel
Executing GNOI::OS::Install
OS Install response

transfer_ready: 

Transfer percent complete: 10%
Transfer percent complete: 20%
Transfer percent complete: 30%
Transfer percent complete: 40%
Transfer percent complete: 50%
Transfer percent complete: 60%
Transfer percent complete: 70%
Transfer percent complete: 80%
Transfer percent complete: 90%
Transfer percent complete: 100%
validated: 22.3R1.9-EVO -- Use Activate to Validate and Integrity Check the installed Image

Executing GNOI::OS::Activate
Installation complete for 22.3R1.9-EVO

변경 내역 테이블

기능 지원은 사용 중인 플랫폼 및 릴리스에 따라 결정됩니다. 기능 탐색기 를 사용하여 플랫폼에서 기능이 지원되는지 확인합니다.

릴리스
설명
23.4R1-에보
Junos OS Evolved 릴리스 23.4R1 version 부터 , Install(), 및 Verify() RPC의 Activate()필드는 패키지 이름 대신 소프트웨어 버전 문자열(에 /system/state/software-version표시됨)을 사용합니다.
external-footer-nav