직렬 콘솔과 상호작용

이 페이지에서는 인스턴스의 직렬 콘솔에 대한 대화형 액세스를 사용 설정하여 부팅 및 네트워킹 문제 디버깅, 인스턴스 오작동 문제 해결, GRUB(GRand Unified Bootloader)와의 상호작용 및 기타 문제해결 태스크를 수행하는 방법을 설명합니다.

가상 머신 인스턴스에는 가상 직렬 포트가 4개 있습니다. 직렬 포트와 상호작용은 입력 및 출력이 완전한 텍스트 모드이고 그래픽 인터페이스 또는 마우스 지원이 없다는 점에서 터미널 창 사용과 유사합니다. 인스턴스의 운영체제, BIOS, 기타 시스템 수준 항목은 종종 직렬 포트에 출력을 쓰고 프롬프트의 명령어나 답변과 같은 입력을 허용할 수 있습니다. 일반적으로 이러한 시스템 수준 항목은 첫 번째 직렬 포트(포트 1)를 사용하고 직렬 포트 1은 종종 직렬 콘솔이라고도 합니다.

직렬 콘솔에 어떤 명령어도 실행하지 않고 직렬 포트 출력을 확인해야만 하는 경우 getSerialPortOutput 메서드를 호출하거나 Stackdriver Logging을 사용하여 인스턴스가 직렬 포트에 작성한 정보를 읽을 수 있습니다(직렬 포트 로그 보기 참조). 하지만 SSH를 통해 인스턴스에 액세스할 때 문제가 발생하거나 완전히 부팅되지 않은 인스턴스 문제를 해결해야 하는 경우 직렬 콘솔에 대한 대화형 액세스를 사용 설정하면 인스턴스의 모든 직렬 포트에 연결하고 상호작용할 수 있습니다. 예를 들어 직접 명령어를 실행하고 직렬 포트의 프롬프트에 응답할 수 있습니다.

직렬 포트를 사용 설정 또는 중지하면 메타데이터 서버에서 허용하는 모든 부울 값을 사용할 수 있습니다. 자세한 내용은 부울 값 설정을 참조하세요.

시작하기 전에

이 태스크에 필요한 권한

이 태스크를 수행하려면 다음과 같은 권한이 있어야 합니다.

  • 인스턴스에 대한 compute.instances.setMetadata 권한(특정 인스턴스에서 대화형 액세스를 사용 설정하는 경우)
  • 프로젝트에 대한 compute.projects.setCommonInstanceMetadata 권한(프로젝트 전체에서 대화형 액세스를 사용 설정하는 경우)

직렬 콘솔에서 대화형 액세스 사용 설정

개별 VM 인스턴스 또는 전체 프로젝트에 대화형 직렬 콘솔 액세스를 사용 설정할 수 있습니다.

프로젝트에 대한 액세스 사용 설정

프로젝트에서 대화형 직렬 콘솔 액세스를 사용 설정하면 프로젝트에 포함된 모든 VM 인스턴스에 액세스를 사용 설정할 수 있습니다.

기본적으로 대화형 직렬 포트는 중지되어 있습니다. serial-port-enable 키를 FALSE로 설정하여 명시적으로 중지할 수도 있습니다. 어떠한 경우에도 인스턴스별 설정이 프로젝트 수준 설정 또는 기본 설정보다 우선 적용됩니다.

Console

  1. Google Cloud Console에서 메타데이터 페이지로 이동합니다.

    메타데이터로 이동

  2. 수정을 클릭하여 메타데이터 항목을 수정합니다.
  3. serial-port-enable 키를 사용하고 값이 TRUE인 새 항목을 추가합니다.
  4. 변경사항을 저장합니다.

gcloud

gcloud 명령줄 도구를 사용하여 다음과 같이 project-info add-metadata 명령어를 입력합니다.

gcloud compute project-info add-metadata \
        --metadata serial-port-enable=TRUE

API

API에서 projects().setCommonInstanceMetadata 메서드를 요청하고 값이 TRUEserial-port-enable 키를 제공합니다.

    {
     "fingerprint": "FikclA7UBC0=",
     "items": [
      {
       "key": "serial-port-enable",
       "value": "TRUE"
      }
     ]
    }

VM 인스턴스에 대한 액세스 사용 설정

특정 인스턴스에 대한 대화형 직렬 콘솔 액세스를 사용 설정할 수 있습니다. 인스턴스별 설정이 있는 경우에는 이 설정이 프로젝트 수준 설정보다 우선 적용됩니다. 또한 프로젝트 수준에서 액세스가 사용 설정되어 있더라도 serial-port-enableTRUE 대신 FALSE로 설정하면 특정 인스턴스에 대한 액세스를 중지할 수 있습니다. 마찬가지로 프로젝트에 대한 액세스가 명시적으로 또는 기본적으로 중지되어 있더라도 인스턴스 한 개 이상에 대한 액세스를 사용 설정할 수 있습니다.

Console

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 액세스를 사용 설정할 인스턴스를 클릭합니다.
  3. 수정을 클릭합니다.
  4. 원격 액세스 섹션에서 직렬 포트 연결 사용 설정 체크박스를 전환합니다.
  5. 변경사항을 저장합니다.

gcloud

gcloud 명령줄 도구를 사용하여 instances add-metadata 명령어를 입력하고 instance-name을 인스턴스 이름으로 바꿉니다.

    gcloud compute instances add-metadata instance-name \
        --metadata serial-port-enable=TRUE

API

API에서 키가 serial-port-enable이고 값이 TRUEinstances().setMetadata 메서드를 요청합니다.

    POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance/setMetadata
    {
     "fingerprint": "zhma6O1w2l8=",
     "items": [
      {
       "key": "serial-port-enable",
       "value": "TRUE"
      }
     ]
    }
    

직렬 콘솔에 연결

인스턴스의 직렬 콘솔에 대한 대화형 액세스를 사용 설정하면 Google Cloud Console, gcloud 명령줄 도구, 타사 SSH 클라이언트를 사용하여 직렬 콘솔에 연결할 수 있습니다.

직렬 콘솔은 SSH 키로 사용자를 인증합니다. 특히 공개 SSH 키를 프로젝트 또는 인스턴스 메타데이터에 추가하고 비공개 키를 연결하려는 로컬 머신에 저장해야 합니다. gcloud 도구 및 Google Cloud Console이 SSH 키를 자동으로 프로젝트에 추가합니다. 타사 클라이언트를 사용하는 경우 SSH 키를 수동으로 추가해야 할 수 있습니다.

Console

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 연결하려는 인스턴스를 클릭합니다.
  3. 원격 액세스에서 직렬 콘솔에 연결을 클릭하여 기본 포트(포트 1)에 연결합니다.
  4. 다른 직렬 포트에 연결하려면 직렬 콘솔에 연결 버튼 옆에 있는 아래쪽 화살표를 클릭하고 포트 번호를 알맞게 변경합니다.
  5. Windows 인스턴스의 경우 버튼 옆에 있는 드롭다운 메뉴를 열고 포트 2에 연결하여 직렬 콘솔에 액세스합니다.

gcloud

gcloud 명령줄 도구를 사용하여 연결하려면 gcloud compute connect-to-serial-port 하위 명령어를 사용합니다. instance-name을 직렬 콘솔에 액세스하려는 인스턴스의 이름으로 바꿉니다.

gcloud compute connect-to-serial-port instance-name

기본적으로 connect-to-serial-port 명령어는 직렬 콘솔의 포트 1에 연결됩니다. Windows VM 인스턴스에 연결하려면 대신 포트 2에 연결합니다.

gcloud compute connect-to-serial-port instance-name \
        --port 2

그 외 다른 포트에 연결하려면 --port 플래그를 사용하여 다른 포트 번호를 제공합니다. 포트 번호를 1부터 4까지(포함) 제공할 수 있습니다. 포트 번호에 대한 자세한 내용은 직렬 포트 번호 지정 이해를 참조하세요.

기타 SSH 클라이언트

클라이언트를 통해 TCP 포트 9600에 연결한 경우에만 기타 타사 SSH 클라이언트를 사용하여 인스턴스의 직렬 콘솔에 연결할 수 있습니다.

예를 들어 다음 SSH 명령어는 프로젝트 ID가 myproject인 프로젝트에서 이름이 example-instance이고 사용자 이름이 jane인 인스턴스의 기본 직렬 포트(1)에 연결합니다. 인스턴스는 us-central1-f 영역에 있습니다. private-ssh-key-file을 인스턴스의 비공개 SSH 키 파일로 바꿉니다.

ssh -i private-ssh-key-file -p 9600 myproject.us-central1-f.example-instance.jane@ssh-serialport.googleapis.com
     

즉, 다음과 같은 로그인과 주소 정보를 사용하여 인스턴스의 직렬 콘솔에 연결할 수 있습니다.

    project-id.zone.instance-name.username.options@ssh-serialport.googleapis.com
    

다음을 바꿉니다.

  • project-id: 이 인스턴스의 프로젝트 ID입니다.
  • zone: 인스턴스의 영역입니다.
  • instance-name: 인스턴스 이름입니다.
  • username: 인스턴스 연결에 사용할 사용자 이름입니다. 일반적으로는 로컬 머신의 사용자 이름입니다.
  • options: 이 연결에 지정할 수 있는 추가 옵션입니다. 예를 들어 특정 직렬 포트를 지정하고 모든 고급 옵션을 지정할 수 있습니다. 포트 번호는 1부터 4까지(포함) 가능합니다. 포트 번호에 대한 자세한 내용은 직렬 포트 번호 지정 이해를 참조하세요. 생략할 경우 직렬 포트 1에 연결합니다.

Windows VM 인스턴스에 연결하려는 경우 다음 명령어를 사용하여 포트 2를 통해 연결합니다.

    ssh -i private-ssh-key-file -p 9600 project-id.zone.instance-name.username.port=2@ssh-serialport.googleapis.com
    

타사 SSH 클라이언트를 사용하여 연결하는 데 문제가 있는 경우 --dry-run 명령줄 옵션으로 gcloud compute connect-to-serial-port 명령어를 실행하여 자동으로 실행된 SSH 명령어를 확인할 수 있습니다. 그러면 사용 중인 명령어와 옵션을 비교할 수 있습니다.

보안 연결 설정

gcloud 명령줄 도구가 아닌 타사 SSH 클라이언트를 사용하는 경우 Google의 직렬 포트 서버 SSH 키를 확인하여 명의 도용 또는 중간자 공격으로부터 보호되는지 확인할 수 있습니다. 서버 SSH 키를 확인하도록 시스템을 설정하려면 다음 단계를 완료합니다.

  1. Google의 직렬 포트 서버 SSH 키를 다운로드합니다.
  2. 알려진 호스트 파일을 엽니다. 일반적으로 ~/.ssh/known_hosts에 있습니다.
  3. 키 앞에 ssh-serialport.googleapis.com을 추가하여 서버 SSH 키의 콘텐츠를 추가합니다. 예를 들어 서버 키에 ssh-rsa AAAAB3NzaC1yc... 행이 있으면 ~/.ssh/known_hosts에 다음과 같은 행이 있어야 합니다.

    ssh-serialport.googleapis.com ssh-rsa AAAAB3NzaC1yc...

보안상의 이유로 Google에서 Google 직렬 포트 서버의 SSH 키를 변경할 수 있습니다. 클라이언트가 서버 키 인증에 실패하면 즉시 연결 시도를 종료하고 이전 단계를 완료하여 새 Google 직렬 포트 서버 SSH 키를 다운로드합니다.

호스트 키를 업데이트한 후에도 클라이언트에서 호스트 인증 오류가 계속 발생하면 직렬 포트에 대한 연결 시도를 중지하고 Google 지원에 연락하세요. 호스트 인증이 실패한 연결에 어떠한 사용자 인증 정보도 제공해서는 안 됩니다.

직렬 콘솔에서 연결 해제

직렬 콘솔에서 연결을 해제하려면 다음을 수행합니다.

  1. ENTER 키를 누릅니다.
  2. ~.(물결표시와 마침표)을 입력합니다.

~?를 입력하거나 SSH의 설명 페이지를 검토하여 다른 명령어를 탐색할 수 있습니다.

man ssh

다음과 같은 메서드를 사용하여 연결 해제를 시도하지 마세요.

  • CTRL+ALT+DELETE 키 조합 또는 기타 유사 조합. 직렬 콘솔에서 PC 키보드 조합을 인식하지 못하므로 이 메서드는 작동하지 않습니다.

  • 게스트에서 네트워크 또는 모뎀 연결을 인식하지 못하므로 exit 또는 logout 명령어는 작동하지 않습니다. 이 명령어를 사용하면 콘솔이 닫혔다가 다시 열리고 사용자는 세션에 연결되어 있습니다. 세션에 exitlogout 명령어를 사용 설정하려는 경우 on-dtr-low 옵션을 설정하여 명령어를 사용 설정할 수 있습니다.

로그인 프롬프트로 직렬 콘솔에 연결

완전히 부팅된 인스턴스에서 발생한 문제를 해결하거나 인스턴스에서 이전 단일 사용자 모드를 부팅한 후에 발생하는 문제를 해결하려는 경우 직렬 콘솔에 액세스를 시도하면 로그인 정보를 입력하라는 메시지가 표시될 수 있습니다.

기본적으로 Google에서 제공하는 시스템 이미지는 로컬 사용자에게 비밀번호 기반 로그인을 허용하도록 구성되어 있지 않습니다. 인스턴스에서 직렬 포트 로그인으로 사전 구성된 이미지를 실행 중인 경우에 메시지가 나타나면 직렬 콘솔에 로그인할 수 있도록 가상 머신 인스턴스에서 로컬 비밀번호를 설정해야 합니다.

로컬 비밀번호 설정

다음 안내에서는 사용자가 지정된 비밀번호를 사용하여 인스턴스의 직렬 콘솔에 로그인할 수 있도록 가상 머신 인스턴스에서 사용자의 로컬 비밀번호를 설정하는 방법을 설명합니다.

  1. 인스턴스에 연결합니다. instance-name을 인스턴스 이름으로 바꿉니다.

    gcloud compute ssh instance-name
  2. 인스턴스에서 다음 명령어로 로컬 비밀번호를 만듭니다. 이렇게 하면 현재 로그인된 사용자의 비밀번호가 설정됩니다.

    sudo passwd whoami
  3. 프롬프트를 따라 비밀번호를 만듭니다.

  4. 그런 다음 인스턴스에서 로그아웃하고 직렬 콘솔에 연결합니다.

  5. 메시지가 표시되면 로그인 정보를 입력합니다.

다른 직렬 포트에서 로그인 설정

대부분의 Linux 운영체제에서 로그인 프롬프트는 기본적으로 포트 1에서 사용 설정되어 있습니다. 하지만 포트 1에서는 종종 데이터 로깅으로 인해 과부하가 걸려 다른 정보가 포트에 출력될 수 있습니다. 대신 인스턴스에서 다음 명령어 중 하나를 실행하면 포트 2(ttyS1)와 같은 다른 포트에서 로그인 프롬프트를 사용 설정할 수 있습니다. 직렬 포트 번호 지정 이해에서 인스턴스에 사용할 수 있는 포트 목록을 확인할 수 있습니다.

다음 표에는 직렬 콘솔 로그인과 기본 포트로 사전 구성된 이미지가 나와 있습니다.

운영체제 기본으로 로그인 프롬프트가 있는 포트 서비스 관리
CentOS 6 1 upstart
CentOS 7 1 systemd
CoreOS 1 systemd
COS 1 systemd
Debian 8 1 systemd
Debian 9 1 systemd
OpenSUSE 13 1 systemd
OpenSUSE Leap 1 systemd
RHEL 6 1 upstart
RHEL 7 1 systemd
SLES 11 1 sysvinit
SLES 12 1 systemd
Ubuntu 14.04 1 upstart
Ubuntu 16.04 1 systemd
Ubuntu 17.04 1 systemd
Ubuntu 17.10 1 systemd
Windows COM2 없음

추가 직렬 포트에서 로그인 프롬프트를 사용 설정하려면 다음 안내를 완료합니다.

systemd

Linux 운영체제의 경우 systemd를 사용합니다.

  • 다음 재부팅까지 서비스를 일시적으로 사용 설정합니다.

    sudo systemctl start serial-getty@ttyS1.service
  • 다음 재부팅부터 서비스를 영구적으로 사용 설정합니다.

    sudo systemctl enable serial-getty@ttyS1.service

upstart

Linux 운영체제의 경우 upstart를 사용합니다.

  1. ttyS1를 반영하도록 기존 ttyS0.conf 파일을 복사 및 수정하여 새 /etc/init/ttyS1.conf 파일을 만듭니다. 예를 들면 다음과 같습니다.

    • Ubuntu 14.04:

      sudo sh -c "sed -e s/ttyS0/ttyS1/g < /etc/init/ttyS0.conf > /etc/init/ttyS1.conf"
    • RHEL 6.8 및 CentOS 6.8:

      sudo sh -c "sed -ne '/^# # ttyS0/,/^# exec/p'  < /etc/init/serial.conf  | sed -e 's/ttyS0/ttyS1/g' -e 's/^# *//' > /etc/init/ttyS1.conf"
  2. 다시 시작하지 않고 ttyS1에서 로그인 메시지에서 시작합니다.

    sudo start ttyS1

sysvinit

sysvinit를 사용하는 Linux 운영체제의 경우 다음 명령어를 실행합니다.

     sudo sed -i~ -e &#39;s/^#T([01])/T\1/&#39; /etc/inittab
     sudo telinit q

직렬 포트 번호 지정 이해

각 가상 머신 인스턴스에는 직렬 포트가 4개 있습니다. getSerialPortOutput API와의 일관성을 위해 각 포트에는 1부터 4까지 번호가 지정됩니다. Linux 및 기타 유사 시스템에서는 직렬 포트에 0부터 3까지 번호가 지정됩니다. 예를 들어 많은 운영체제 이미지에서 해당되는 기기는 /dev/ttyS0부터 /dev/ttyS3까지입니다. Windows는 COM1부터 COM4까지의 직렬 포트를 참조합니다. Windows에서 COM3으로 인식하는 항목과 Linux에서 ttyS2로 인식하는 항목에 연결하려면 포트 3을 지정해야 합니다. 아래 표를 통해 연결할 포트를 파악할 수 있습니다.

가상 머신 인스턴스 직렬 포트 표준 Linux 직렬 포트 Windows COM 포트
1 /dev/ttyS0 COM1
2 /dev/ttyS1 COM2
3 /dev/ttyS2 COM3
4 /dev/ttyS3 COM4

많은 Linux 이미지가 커널 및 시스템 프로그램에서 메시지를 로깅하는 데 포트 1(/dev/ttyS0)을 사용합니다.

직렬 브레이크 전송

Magic SysRq 키 기능을 사용하면 시스템 상태와 관계없이 하위 수준 태스크를 수행할 수 있습니다. 예를 들어 Magic SysRq 키 기능을 사용하여 파일 시스템 동기화, 인스턴스 재부팅, 프로세스 종료, 파일 시스템 마운트 해제 등을 수행할 수 있습니다.

시뮬레이션된 직렬 브레이크를 사용하여 Magic SysRq 명령어를 전송하려면 다음 안내를 따르세요.

  1. ENTER 키를 누릅니다.
  2. ~B(물결표시와 대문자 B)를 입력합니다.
  3. Magic SysRq 명령어를 입력합니다.

직렬 콘솔 감사 로그 보기

Compute Engine에서는 누가 인스턴스의 직렬 콘솔에 연결했고 연결 해제했는지 추적하는 감사 로그를 제공합니다. 로그를 보려면 로그 뷰어에 대한 권한이 있거나 프로젝트 뷰어 또는 편집자여야 합니다.

  1. Google Cloud Console에서 로그 페이지로 이동합니다.

    로그 페이지로 이동

  2. 드롭다운 메뉴를 확장하고 GCE VM Instance를 선택합니다.
  3. 검색창에 ssh-serialport.googleapis.com을 입력하고 Enter 키를 누릅니다.
  4. 감사 로그 목록이 표시됩니다. 이 로그에서는 직렬 콘솔과의 연결 및 연결 해제를 설명합니다. 자세한 내용을 보려면 항목을 확장합니다.

    직렬 콘솔의 감사 로그.

감사 로그에서 다음을 수행할 수 있습니다.

  1. protoPayload 속성을 확장합니다.
  2. 이 로그가 해당되는 활동을 보려면 methodName을 검색합니다(연결 또는 연결 해제 요청). 예를 들어 이 로그가 직렬 콘솔의 연결 해제를 추적하면 메서드 이름은 "google.ssh-serialport.v1.disconnect"입니다. 마찬가지로 연결 로그는 "google.ssh-serialport.v1.connect"라고 표시됩니다. 감사 로그 항목은 직렬 콘솔에서 각 세션의 시작과 종료 시에 기록됩니다.

다양한 로그 유형에 맞는 다양한 감사 로그 속성이 있습니다. 예를 들어 연결과 관련된 감사 로그에는 고유한 연결 로그 속성이 있는 반면 연결 해제의 감사 로그에는 고유한 속성 집합이 있습니다. 두 로그 유형 모두를 공유하는 특정 감사 로그 속성도 있습니다.

모든 직렬 콘솔 로그

속성
requestMetadata.callerIp 연결이 시작된 IP 주소 및 포트 번호입니다.
serviceName ssh-serialport.googleapis.com
resourceName 프로젝트 ID, 영역, 인스턴스 이름, 직렬 포트 번호가 포함된 문자열로, 해당되는 직렬 콘솔을 나타냅니다. 예를 들어 projects/myproject/zones/us-east1-a/instances/example-instance/SerialPort/2example-instance 인스턴스의 포트 번호 2(COM2 또는 /dev/ttyS1이라고도 함)입니다.
resource.labels 인스턴스 ID, 영역, 프로젝트 ID를 식별하는 속성입니다.
timestamp 세션 시작 또는 종료 시간을 나타내는 타임스탬프입니다.
severity NOTICE
operation.id 세션을 고유하게 식별하는 ID 문자열로, 이 문자열을 사용하여 연결 해제 항목과 해당 연결 항목을 연결할 수 있습니다.
operation.producer ssh-serialport.googleapis.com

연결 로그

속성
methodName google.ssh-serialport.v1.connect
status.message Connection succeeded.
request.serialConsoleOptions 직렬 포트 번호를 포함하여 요청이 지정된 모든 옵션입니다.
request.@type type.googleapis.com/google.compute.SerialConsoleSessionBegin
request.username 이 요청에 지정된 사용자 이름으로, 일치시킬 공개 키를 선택하는 데 사용됩니다.
operation.first TRUE
status.code 성공적인 연결 요청의 경우 google.rpc.Code.OKstatus.code 값은 작업이 오류 없이 성공적으로 완료되었음을 나타냅니다. 이 속성의 열거형 값이 `0`이므로 status.code 속성은 표시되지 않습니다. 하지만 google.rpc.Code.OKstatus.code 값을 검사하는 모든 코드는 예상대로 작동합니다.

연결 해제 로그

속성
methodName google.ssh-serialport.v1.disconnect
response.duration 세션이 지속된 시간(초)입니다.
response.@type type.googleapis.com/google.compute.SerialConsoleSessionEnd
operation.last TRUE

실패한 연결 로그

연결에 실패할 경우 Compute Engine은 감사 로그 항목을 만듭니다. 실패한 연결 로그는 성공한 연결 항목과 매우 유사하지만 실패한 연결을 나타내는 다음과 같은 속성을 포함합니다.

속성
severity ERROR
status.code

오류를 가장 잘 설명하는 정식 Google API 오류 코드입니다. 다음은 발생 가능한 오류 코드입니다.

status.message 사람이 읽을 수 있는 이 항목의 메시지입니다.

대화형 직렬 콘솔 액세스 사용 중지

특정 인스턴스 또는 프로젝트에서 메타데이터를 변경하여 대화형 직렬 콘솔 액세스를 중지하거나 조직 정책을 설정하여 조직의 일부인 프로젝트 한 개 이상에서 모든 VM 인스턴스에 대한 대화형 직렬 콘솔 액세스를 중지할 수 있습니다.

특정 인스턴스 또는 프로젝트에서 대화형 직렬 콘솔 중지

compute.instanceAdmin.v1 역할이 부여된 사용자뿐만 아니라 프로젝트 소유자 및 편집자도 특정 인스턴스 또는 프로젝트에서 메타데이터를 변경하여 직렬 콘솔에 대한 액세스를 중지할 수 있습니다. 직렬 콘솔 액세스를 사용 설정할 때와 마찬가지로 serial-port-enable 메타데이터를 FALSE으로 설정합니다.

serial-port-enable=FALSE

예를 들어 다음과 같이 gcloud 명령줄 도구를 사용하여 이 메타데이터를 특정 인스턴스에 적용할 수 있습니다.

    gcloud compute instances add-metadata instance-name \
        --metadata=serial-port-enable=FALSE
    

프로젝트에 메타데이터를 적용하려면 다음 명령어를 사용합니다.

    gcloud compute project-info add-metadata \
        --metadata=serial-port-enable=FALSE
    

조직 정책을 통해 대화형 직렬 콘솔 액세스 중지

조직의 orgpolicy.policyAdmin 역할을 부여받은 경우 메타데이터 서버에서 대화형 직렬 콘솔 액세스가 사용 설정되어 있는지 여부와 관계없이 직렬 콘솔에 대한 대화형 액세스를 방지하는 조직 정책을 설정할 수 있습니다. 조직 정책을 설정하면 정책이 serial-port-enable 메타데이터 키를 효율적으로 재정의하고 조직 또는 프로젝트의 사용자가 대화형 직렬 콘솔 액세스를 사용 설정할 수 없습니다. 기본적으로 이 제약조건은 FALSE로 설정되어 있습니다.

대화형 직렬 콘솔 액세스를 사용 중지하는 제약조건은 다음과 같습니다.

compute.disableSerialPortAccess

이 정책을 조직에 설정하려면 다음 안내를 완료합니다. 정책을 설정한 후에는 프로젝트별로 예외를 허용할 수 있습니다.

gcloud

gcloud 명령줄 도구를 사용하여 정책을 설정하려면 resource-manager enable-enforce 명령어를 실행합니다. organization-id조직 ID로 바꿉니다. 예를 들면 1759840282입니다.

    gcloud alpha resource-manager org-policies enable-enforce \
        --organization organization-id compute.disableSerialPortAccess
    

API

API에서 정책을 설정하려면 다음 URL에 대한 POST 요청을 만듭니다. organization-name조직 이름으로 바꿉니다. 예를 들면 organizations/1759840282입니다.

     POST https://cloudresourcemanager.googleapis.com/v1beta1/organization-name:setOrgPolicy

요청 본문에는 다음과 같은 제약조건이 있는 policy 객체를 포함해야 합니다.

"constraint": "constraints/compute.disableSerialPortAccess"

예:

     {
       "policy":
       {
         "booleanPolicy":
         {
           "enforced": TRUE
         },
         "constraint": "constraints/compute.disableSerialPortAccess"
       }
     }
     

이 정책은 즉시 적용되므로 조직 내 모든 프로젝트에서 직렬 콘솔에 대한 대화형 액세스 허용을 즉시 중지합니다.

일시적으로 정책을 중지하려면 disable-enforce 명령어를 사용합니다.

gcloud alpha resource-manager org-policies disable-enforce \
        --organization organization-id compute.disableSerialPortAccess
    

또는 요청 본문에서 enforced 매개변수를 FALSE로 설정하는 API 요청을 만들 수 있습니다.

    {
      "policy":
      {
        "booleanPolicy":
        {
          "enforced": FALSE
        },
        "constraint": "constraints/compute.disableSerialPortAccess"
      }
    }
    

프로젝트 수준에서 조직 정책 설정

프로젝트별로 동일한 조직 정책을 설정할 수 있습니다. 이렇게 하면 조직 수준의 설정이 재정의됩니다.

gcloud

특정 프로젝트에 이 정책 시행을 중지하려면 다음 명령어를 사용합니다. project-id를 프로젝트 ID로 바꿉니다.

gcloud alpha resource-manager org-policies disable-enforce \
        --project project-id compute.disableSerialPortAccess
    

같은 값의 enable-enforce 명령어를 사용하여 이 정책 시행을 사용 설정할 수 있습니다.

API

API에서 프로젝트에 대화형 직렬 콘솔 액세스를 사용 설정하려면 다음 URL에 대한 POST 요청을 만듭니다. 이 때 project-id를 프로젝트 ID로 바꿉니다.

    POST https://cloudresourcemanager.googleapis.com/v1beta1/projects/project-id:setOrgPolicy

요청 본문에는 다음과 같은 제약조건이 있는 policy 객체를 포함해야 합니다.

"constraint": "constraints/compute.disableSerialPortAccess"

예:

    {
      "policy":
      {
        "booleanPolicy":
        {
          "enforced": FALSE
        },
        "constraint": "constraints/compute.disableSerialPortAccess"
      }
    }
    

도움말 및 유용한 정보

  • 표준 SSH 클라이언트를 사용하여 연결하는 데 문제가 있지만 gcloud compute connect-to-serial-port 연결에 성공한 경우 --dry-run 명령줄 옵션으로 gcloud compute connect-to-serial-port를 실행하여 자동으로 실행된 SSH 명령어를 확인하고 사용 중인 명령어와 옵션을 비교하는 것이 도움이 될 수 있습니다.

  • 비트 전송률(전송 속도라고도 함)을 설정할 때 stty 9600과 같이 원하는 모든 비트 전송률을 설정할 수 있지만 일반적으로 기능에서는 유효한 비율을 115,200bps(약 11.5kB/초)로 설정합니다. 이는 많은 OS 이미지가 직렬 콘솔에서 9,600과 같이 느린 비트 전송률로 기본 설정되어 느리게 부팅되기 때문입니다.

  • 일부 OS 이미지에는 직렬 포트에 부적절한 기본값이 있습니다. 예를 들어 CentOS 7에서 콘솔의 Enter 키에 대한 stty icrnl 기본값은 CR(^M이라고도 함)을 전송하는 것입니다. Bash 셸은 사용자가 비밀번호를 설정한 후 password: 프롬프트에서 멈춘 것처럼 보이는 이유를 궁금해할 때까지 이를 마스크할 수 있습니다.

  • 일부 OS 이미지에는 특정 방식으로 포트에 셸을 연결할 경우 기본적으로 중지되는 작업 제어 키가 있습니다. 이러한 키의 예시는 ^Z^C입니다. setsid 명령어가 이를 수정할 수 있습니다. 또는 job control is disabled in this shell 메시지가 표시될 경우 방해할 수 있는 명령어를 실행하지 않도록 주의하세요.

  • 시스템에 사용 중인 창의 크기를 알려주고 Bash 및 편집자가 이를 올바르게 관리할 수 있도록 하는 것이 유용할 수 있습니다. 그렇지 않으면 Bash 또는 편집자가 사용 가능한 행 및 열 수에 대한 잘못된 가정을 토대로 디스플레이 조작을 시도하므로 비정상적인 디스플레이 동작이 발생할 수 있습니다. stty rows Y cols X 명령어 및 stty -a 플래그를 사용하여 설정을 확인합니다. 예를 들어 창이 120자 x 60행인 경우는 stty rows 60 cols 120입니다.

  • 예를 들어 SSH를 사용하여 머신 A를 머신 B에 연결한 후 머신 C 등에 연결하여 중첩된 SSH 세션을 만들고, 연결 해제 또는 직렬 브레이크 신호를 전송하려면 물결표(~) 명령어를 사용합니다. 올바른 SSH 클라이언트를 가져오려면 물결표 문자를 충분하게 추가해야 합니다. 물결표 하나 다음에 오는 명령어는 머신 A의 SSH 클라이언트에서 해석되고 연속 물결표 두 개 다음의 명령어(Enter~~)는 머신 B의 클라이언트에서 해석됩니다. 이러한 방식으로 계속됩니다. Enter 키를 한 번만 눌러도 가장 안쪽의 SSH 대상까지 전달됩니다. 이는 물결표 이스케이프 기능을 제공하는 모든 SSH 클라이언트에 해당됩니다.

    필요한 물결표 문자 수를 파악하기 어려우면 Enter 키를 누른 후 인스턴스가 물결표를 다시 에코할 때까지 물결표 문자를 한 번에 하나씩 입력합니다. 이는 사용자가 체인 끝에 도달했고 이제 물결표 명령어를 가장 많이 중첩된 SSH 클라이언트에 전송하려면 입력한 물결표보다 하나 적은 물결표가 필요함을 알고 있다는 것을 나타냅니다.

고급 옵션

최대 연결 제어

이 직렬 포트에 한 번에 만들 수 있는 동시 연결 수를 제어하도록 max-connections 속성을 설정할 수 있습니다. 연결 기본값 및 최대 수는 5입니다. 예를 들면 다음과 같습니다.

    gcloud compute connect-to-serial-port instance-name \
        --port port-number \
        --extra-args max-connections=3
ssh -i private-ssh-key-file -p 9600 project-id.zone.instance-name.username.max-connections=3@ssh-serialport.googleapis.com

재생 옵션 설정

기본적으로 직렬 콘솔에 연결할 때마다 다른 SSH 클라이언트에서 데이터의 마지막 줄 10개가 표시되는지 여부와 관계없이 마지막 줄 10개가 재생됩니다. 다음 옵션을 설정하여 이 설정을 변경하면 반환되는 줄 및 줄 수를 제어할 수 있습니다.

  • replay-lines=N: N을 재생할 줄 수로 설정합니다. 예를 들어 N이 50이면 콘솔 출력의 마지막 줄 50개가 포함됩니다.
  • replay-bytes=N: 가장 최근의 N바이트를 재생합니다. 또한 Nnew로 설정하면 어떠한 클라이언트로도 전송되지 않은 모든 출력이 재생됩니다.
  • replay-from=N: 제공한 절대 바이트 색인부터 출력을 재생합니다. getSerialPortOutput 요청을 만들어 직렬 콘솔 출력의 현재 바이트 색인을 가져올 수 있습니다. replay-from을 설정하면 다른 모든 재생 옵션은 무시됩니다.

gcloud 명령줄 도구를 사용하여 connect-to-serial-port 명령어 뒤에 다음 항목을 추가합니다. 여기서 N은 지정된 줄 수(또는 선택한 재생 옵션에 따라 바이트 또는 절대 바이트 색인)입니다.

--extra-args replay-lines=N

타사 SSH 클라이언트를 사용할 경우 SSH 명령어에 이 옵션을 제공합니다.

ssh -i private-ssh-key-file -p 9600 myproject.us-central1-f.example-instance.jane.port=3.replay-lines=N@ssh-serialport.googleapis.com

이 옵션의 조합도 사용할 수 있습니다. 예를 들면 다음과 같습니다.

replay-lines=N, replay-bytes=new
지정된 줄 수를 재생하거나 어떠한 클라이언트로도 전송되지 않은 모든 출력 중 더 큰 출력을 재생합니다. 이 플래그 조합과 연결할 첫 번째 클라이언트에서는 직렬 포트로 전송된 모든 출력을 볼 수 있지만 이후에 연결하는 클라이언트에서는 마지막 줄 N개만 볼 수 있습니다. 예를 들면 다음과 같습니다.
gcloud compute connect-to-serial-port instance-name--port port-number --extra-args replay-lines=N,replay-bytes=new
ssh -i private-ssh-key-file -p 9600 project-id.zone.instance-name.username.replay-lines=N.replay-bytes=new@ssh-serialport.googleapis.com
replay-lines=N, replay-bytes=M
이 플래그에서 설명된 최대 줄 또는 바이트 수를 넘지 않는 수 중 더 적은 수를 재생합니다. 이 옵션은 N 또는 M 바이트를 초과하여 재생하지 않습니다.
gcloud compute connect-to-serial-port instance-name--port port-number --extra-args replay-lines=N,replay-bytes=M
ssh -i private-ssh-key-file -p 9600 project-id.zone.instance-name.username.replay-lines=N.replay-bytes=M@ssh-serialport.googleapis.com

중단된 출력 처리

각 직렬 포트의 가장 최근 출력 1MiB는 항상 사용 가능하며 일반적으로 SSH 클라이언트는 직렬 포트에서 어떠한 출력도 놓치면 안 됩니다. 어떠한 이유로 인해 SSH 클라이언트가 일정 시간 동안 출력 수신을 중단하지만 연결을 해제하지 않고 새 데이터를 1MiB 이상 생성한 경우 SSH 클라이언트가 일부 출력을 놓칠 수 있습니다. SSH 클라이언트가 직렬 콘솔 포트의 출력을 따라잡을 수 있는 충분한 속도로 데이터를 수신하지 않으면 on-dropped-output 속성을 콘솔 동작 방식을 결정하도록 설정할 수 있습니다.

이 속성으로 다음 중 해당되는 옵션을 설정합니다.

  • insert-stderr-note: SSH 클라이언트의 stderr에 출력이 중단되었음을 나타내는 메모를 삽입합니다. 기본 옵션입니다.
  • ignore: 자동으로 출력을 중단하고 다른 작업은 수행하지 않습니다.
  • disconnect: 연결을 종료합니다.

예:

    gcloud compute connect-to-serial-port instance-name \
        --port port-number \
        --extra-args on-dropped-output=ignore
ssh -i private-ssh-key-file -p 9600 project-id.zone.instance-name.username.on-dropped-output=ignore@ssh-serialport.googleapis.com

exit 또는 logout 명령어를 사용하여 연결 해제 사용 설정

직렬 콘솔에 연결할 때 on-dtr-low 속성을 disconnect로 설정하여 exit 또는 logout 명령어에서 연결 해제를 사용 설정할 수 있습니다.

gcloud 명령줄 도구에서 다음 플래그를 connect-to-serial-port 명령어 뒤에 추가합니다.

--extra-args on-dtr-low=disconnect

타사 SSH 클라이언트를 사용할 경우 SSH 명령어에 이 옵션을 제공합니다.

ssh -i private-ssh-key-file -p 9600 myproject.us-central1-f.example-instance.jane.port=3.on-dtr-low=disconnect@ssh-serialport.googleapis.com

disconnect 옵션을 사용 설정하면 운영체제가 부팅 중에 직렬 포트를 재설정하므로 인스턴스를 재부팅하면 인스턴스가 연결을 1회 이상 해제할 수 있습니다.

이 옵션의 기본 설정은 none이고 DTR 줄이 변경될 때 아무 것도 변경되지 않습니다. 이 항목을 none으로 변경하면 직렬 콘솔에서 연결 해제되지 않은 상태로 인스턴스를 재부팅할 수 있습니다. 하지만 콘솔은 exit 또는 logout 명령어와 같은 일반적인 방식을 통해 또는 Ctrl+d와 같은 일반적인 키 조합을 통해 연결 해제되지 않습니다.

다음 단계