이 페이지의 내용
gNOI 운영 체제(OS) 서비스
gNOI 운영 체제(OS) 서비스를 사용하여 대상 네트워크 디바이스의 소프트웨어를 업그레이드합니다.
gNOI OS 서비스를 사용하여 대상 디바이스의 소프트웨어를 업그레이드할 수 있습니다. 프로토 정의 파일은 https://github.com/openconfig/gnoi/blob/master/os/os.proto 에 있습니다.
소프트웨어 설치에는 서비스 RPC에 해당 OS 하는 세 가지 주요 단계가 있습니다.
- 장착
- 활성화
- 다음을 확인합니다.
서비스 RPC를 사용하여 OS 소프트웨어 설치 패키지를 디바이스로 전송하고, 지정된 소프트웨어 버전에 대해 구성을 검증하고, 소프트웨어를 설치할 수 있습니다. 설치된 소프트웨어 버전을 다음 부팅 버전으로 설정하고 소프트웨어 버전을 확인할 수도 있습니다.
또한 gNOI system 서비스 SetPackage() RPC를 사용하여 디바이스에 소프트웨어를 설치할 수 있습니다. 자세한 정보는 gNOI 시스템 서비스를 참조하십시오.
지원되는 RPC
| RPC | 설명 | 릴리스에 도입된 내용 |
|---|---|---|
Activate() |
다음 재부팅 시 사용할 소프트웨어 버전을 설정합니다.
참고:
Junos 디바이스는 메시지의 필드를
참고:
Junos OS Evolved 릴리스 25.2R1 이전에는 소프트웨어 |
Junos OS Evolved 22.2R1 |
Install() |
소프트웨어 설치 패키지를 대상으로 전송하고, 소프트웨어에 대한 구성의 유효성을 검사하고, 소프트웨어를 설치(스테이징)합니다. 지정된 소프트웨어 이미지가 디바이스에 이미 설치되어 있는 경우, 소프트웨어 이미지에 대해 현재 구성을 검증하고 검증된 구성을 해당 소프트웨어 버전과 연관된 실행 구성으로 저장합니다.
참고:
Junos 디바이스는 메시지의 필드를
참고:
Junos OS Evolved 릴리스 25.2R1 |
Junos OS Evolved 22.2R1 |
Verify() |
실행 중인 소프트웨어 버전을 확인합니다. 이 RPC는 대상이 성공할 때까지 부팅되는 동안 여러 번 호출될 수 있습니다.
참고:
Junos 디바이스는 VerifyResponse를 지원 |
Junos OS Evolved 22.2R1 |
OS 서비스 개요
gNOI OS 서비스 RPC를 사용하면 Junos OS Evolved를 실행하는 디바이스에서 소프트웨어를 관리할 수 있습니다. Junos OS Evolved는 여러 버전의 소프트웨어를 저장 매체에 저장합니다. 각 소프트웨어 버전에 대해 Junos OS Evolved는 소프트웨어 버전이 마지막으로 실행되었을 때 실행 중이던 구성도 저장합니다.
표 2 에는 다양한 Junos OS Evolved 릴리스의 RPC 작업이 요약되어 있습니다. Junos OS Evolved 릴리스 25.2R1부터는 즉시 활성화하지 않고 소프트웨어를 설치하고, 설치된 소프트웨어 버전에 대해 현재 구성을 검증하고, 설치된 소프트웨어 버전을 활성화할 수 있습니다.
| RPC |
Junos OS Evolved 릴리스 24.4R1 및 이전 버전 |
Junos OS Evolved 릴리스 25.2R1 이상 |
|---|---|---|
|
|
소프트웨어 설치 패키지를 디바이스로 전송합니다. |
소프트웨어 설치 패키지를 디바이스로 전송합니다. |
| – | 지정된 소프트웨어 버전(신규 또는 이전에 설치됨)에 대해 현재 구성을 검증합니다. |
|
| – | 지정된 소프트웨어 버전이 아직 설치되지 않은 경우 소프트웨어를 설치합니다. |
|
| – | 검증된 현재 구성을 지정된 소프트웨어 버전과 연관된 실행 구성으로 저장합니다. |
|
|
|
지정된 소프트웨어 버전에 대해 현재 구성을 검증합니다. |
– |
| 소프트웨어를 설치합니다. |
– | |
| 지정된 소프트웨어 버전을 다음 부팅 버전으로 설정합니다. |
지정된 소프트웨어 버전을 다음 부팅 버전으로 설정합니다. |
|
| (선택 사항) 디바이스를 재부팅합니다. |
(선택 사항) 디바이스를 재부팅합니다. |
|
|
|
실행 중인 소프트웨어 버전을 확인합니다. |
실행 중인 소프트웨어 버전을 확인합니다. |
Junos OS Evolved 릴리스 25.2R1 및 이후 버전에서는 RPC가 Install() 지정된 소프트웨어 설치 패키지를 대상 디바이스의 디렉터리로 /var/tmp/ 전송하고, 소프트웨어에 대한 구성을 검증하며, 해당 소프트웨어 버전이 디바이스에 아직 설치되지 않은 경우 소프트웨어를 설치합니다. 대상 파일명은 메시지 필드 version 에 정의된 값입니다.TransferRequest RPC는 Activate() 지정된 소프트웨어 버전을 다음 부팅 버전으로 설정하고 선택적으로 디바이스를 재부팅하여 소프트웨어를 활성화합니다. 설치된 소프트웨어 버전을 활성화할 수 있습니다.
기존 소프트웨어 버전을 실행 Install() 하고 지정하는 경우, Install() 소프트웨어에 대해 현재 구성을 검증하고 검증된 구성을 해당 소프트웨어 버전과 연관된 실행 구성으로 저장합니다. 소프트웨어 버전이 다음 부팅 버전으로 설정된 경우, Install() 그 과정에서 비활성화합니다. 따라서 특정 소프트웨어 버전이 최근 구성 변경과 함께 작동하는지 확인할 수 있습니다.
네트워크 디바이스 구성
시작하기 전에:
- gRPC 서비스 구성에 설명된 대로 네트워크 디바이스에서 gRPC 서비스를 구성합니다.
- gNOI 서비스 구성에 설명된 대로 gNOI 작업을 지원하도록 네트워크 관리 시스템을 구성합니다.
서비스 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
"""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=32767,
help='The server port. Default is 32767')
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 install 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='Software version. 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
--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=32767 --user_id=gnoi-user --source_package=/home/lab/images/junos-evo-install-ptx-x86-64-25.2R1.9-EVO.iso --timeout=1800 --version=25.2R1.9-EVO
Junos OS Evolved 릴리스 23.4R1부터 , Install(), 및 Verify() RPC의 Activate()필드는 version 패키지 이름 대신 소프트웨어 버전 문자열(에 /system/state/software-version표시된 대로)을 사용합니다.
애플리케이션 실행
클라이언트가 응용 프로그램을 실행하면 응용 프로그램은 로컬 장치에서 네트워크 장치의 디렉터리로 /var/tmp 패키지를 복사하고 패키지를 설치한 다음 장치를 다시 부팅하여 설치를 완료합니다.
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 start 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: 25.2R1.9-EVO -- Use Activate to set the next boot Image Executing GNOI::OS::Activate Installation complete for 25.2R1.9-EVO
변경 내역 표
기능 지원은 사용 중인 플랫폼과 릴리스에 따라 결정됩니다. 기능 탐색기를 사용하여 플랫폼에서 기능이 지원되는지 확인합니다.
Install() 부터 RPC는 소프트웨어 설치 패키지를 디바이스에 복사하고, 지정된 소프트웨어 버전에 대해 구성을 검증하고, 소프트웨어를 설치하며, RPC는
Activate() 지정된 소프트웨어 버전을 다음 부팅 버전으로 설정합니다. 이전 릴리스
Install() 에서는 소프트웨어 설치 패키지를 디바이스에 복사하고
Activate() 소프트웨어에 대한 구성을 검증하고 소프트웨어를 설치하고 소프트웨어 버전을 다음 부팅 버전으로 설정합니다.
Install() 하여 소프트웨어 이미지에 대해 현재 구성을 검증하고 검증된 구성을 해당 소프트웨어 버전과 연관된 실행 구성으로 저장할 수 있습니다.
Install(), 및
Verify() RPC의
Activate()필드는
version 패키지 이름 대신 소프트웨어 버전 문자열(에
/system/state/software-version표시된 대로)을 사용합니다.