SSH Permission denied (publickey)

주로 시스템을 설정하는 초기에 발생하는 문제인데 private key가 제대로 있고 file permission도 잘 설정 되어 있음에도 ssh 접속을 시도하면 권한 오류가 발생하는 경우가 있다.

$ ssh -T git@github.com
git@github.com: Permission denied (publickey). 

해결하는 방법은 사용하려는 private key를 ssh-add 명령어를 이용해서 ssh-agent에게 추가해 주는 것인데, 만약 ssh-agent가 동작하지 않는 상태라면 이 동작에도 오류가 발생한다.

$ ssh-add ~/.ssh/my_private_key 
Could not open a connection to your authentication agent.

이와 같은 인증 agent 관련한 문제가 생길 때는 ssh-agent를 실행해서 나오는 결과물을 화면에 붙여 넣으면 된다.

# SSH-agent를 실행하면 환경변수 값들이 화면에 출력된다.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;

# 이것들을 그대로 화면에 붙여넣고
$ SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;
Agent pid 3261

# ssh-add를 시도한다.
$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

그런데 복붙하는 건 너무 번거로우니까 eval command를 사용해서 ssh-agent의 결과물을 그대로 수행하도록 하면 복붙한 것과 동일한 효과를 낼 수 있다.

$ eval `ssh-agent`
Agent pid 4416

$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

매번 로그인 할 때 마다 반복 하는 건 귀찮으니까 .bashrc 같은곳에 넣어두자.

#.bashrc
...
eval `ssh-agent`
ssh-add ~/.ssh/my_private_key

다시 로그인해서 시험해보면 permission error가 없이 잘 실행되는 걸 볼 수 있다.

$ ssh -T git@github.com
Hi litcoder! You've successfully authenticated, but GitHub does not provide shell access.

OpenCore Legacy Patcher – 최신 macOS 최신버전으로 올리기

오래된 나의 2016년생 Intel MacBook Pro는 2025년 11월 현재 Monterey에서 더 이상 OS 업그레이드가 지원 되지 않는다. 우연히 OCLP(OpenCore Legacy Patcher) project를 알게 되었는데 2020년에 시작된 이 프로젝트는 부팅 단계에서 최신 OS가 지원되는 하드웨어인것 처럼 macOS를 속여서 최신 버전의 OS를 설치할 수 있도록 해준다. 2025년 11월 현재 Intel CPU를 지원해주는 최신 버전인 Sequoia를 설치해 보고자 OCLP를 설치해 보았다.

공식 지원이 되지 않는 최신 OS를 굳이 설치 하려고 시도한 이유는 여러 응용프로그램에서 macOS 버전에 따라 설치가 되지 않는 경우가 있기 때문이었다.

예를 들면 MS Teams나 Homebrew 처럼…

OCLP를 설치하는 것은 How to install 문서에 잘 명시된 과정을 따라 하는 것으로 어렵지 않게 진행 할 수 있었다.

설치파일은 GitHub의 release page에서 다운로드 받을 수 있는데, OpenCore-Patcher.pkg를 받으면 되고, AutoPkg-Assets.pkg는 필요에 따라 자동으로 다운로드 되는 것이서 따로 다운로드 받을 필요가 없다.

설치 순서는 다음과 같이 진행한다.

  1. macOS Installer 생성
  2. OpenCore 빌드 및 설치
  3. Reboot 할 때 Option key를 눌러서 OpenCore로 진입
  4. 설치 후 과정(post-installation) 수행

3번을 실행하기 위해서는 부팅하는 동안 Option key는 누르고 있다가 부팅 선택화면에서 OpenCore를 선택해 준다. 설치 과정동안 서너번 정도 스스로 재부팅 하고 나서는 모든 설치 과정이 완료 되었다.

디스크 포맷을 수행 하지 않아서인지 부팅 후에는 이전에 사용하던 설정이 모두 보존 되어 있었다.

설치 가이드 문서에는 USB thumb drive없이 부팅하기 위한 안내가 있었는데, 그동안 수정된것인지 내 경우에는 이 과정이 없이도 잘 동작했다.

설치가 완료된 후 부팅 할 때마다 거슬려 보이는 OS 선택창(Boot Picker)이 있는데, 이것은 post-installation 문서에 명시된 다음의 순서대로 변경하면 없앨 수 있다.

Boot Picker 없애기

먼저 가장 아래에 있는 Settings 버튼을 눌러서 설정으로 진입한다.

Build 탭의 오른쪽에 있는 “Show OpenCore Boot Picker”를 선택해제하고 Return 버튼을 눌러서 나간 다음 “Build and Install OpenCore” 메뉴를 선택해서 빌드를 수행한다.

그리고 나서는 처음 OCLP을 설치할 때 처럼 하드디스크에 Boot picker가 제거된 새로운 버전 인스톨 해주면 이전의 부팅화면 처럼 Boot picker없이 실행된다.

Post-Install Root Patch

이제, post-install root patch 버튼을 눌러서 필요한 하드웨어 드라이버를 설치하면 모든 업그레이드 과정이 완료된다.

업그레이드 때문에 post-install root patch가 실패 한다면

OS 업그레이드에 대한 정보를 수신한 경우 이 때문에 업그레이드를 수행 하지 않아서 post-install root patch를 진행할 수 없다는 메세지가 뜨면서 진행이 멈추는데 이 때는 다음의 명령어서 관련 정보를 삭제한 후 리붓을 수행하면 진행 할 수 있다.

# Remove software update files
sudo rm -rf /System/Library/AssetsV2/com_apple_MobileAsset_MacSoftwareUpdate/*

# Remove Update files
sudo rm -f /System/Volumes/Update/Update.plist
sudo rm -f /System/Volumes/Update/Preflight.plist

# NOTE: 리붓 필수!!

OCPL를 통해서 하는 것이 아닌 직접 OS 업그레이드는 위험할 수 있으니 막아 두자.

Settings -> General -> Software Update -> Automatic updates

이제 MS teams도 설치하고 MacPorts에서 Homebrew로 돌아가야지.

OpenVINO로 Intel NPU에서 추론 실행하기

Intel 14세대 Meteor Lake 부터 NPU가 함께 embedding되어 제공된다. Linux system에서 사용하려면 kernel version 6.2이상이 설치되어 있어야 한다.

NPU 디바이스 확인

CPU: Intel(R) Core(TM) Ultra 5
OS: Ubuntu 24.04
Linux kernel: 6.14.0-33-generic

lspci 명령어로 NPU 디바이스가 인식되어 있는지를 확인할 수 있다.

$ lspci -v|grep -A 9 NPU
00:0b.0 Processing accelerators: Intel Corporation Arrow Lake NPU (rev 01)
        DeviceName: Onboard - Other
        Subsystem: Gigabyte Technology Co., Ltd Device 7270
        Flags: bus master, fast devsel, latency 0, IRQ 154, IOMMU group 6
        Memory at 6408000000 (64-bit, non-prefetchable) [size=128M]
        Memory at 6410065000 (64-bit, non-prefetchable) [size=4K]
        Capabilities: <access denied>
        Kernel driver in use: intel_vpu
        Kernel modules: intel_vpu

커널에서 잘 인식 되었다면 아래의 경로에 디바이스 노드가 보이게 된다.

$ ls -l /dev/accel/accel0 
crw-rw---- 1 root render 261, 0 Oct 10 19:27 /dev/accel/accel0

Linux용 NPU driver 설치

이제 NPU를 Linux에서 사용하기 위한 드라이버를 설치해야 한다. 관련한 내용은 Intel GitHub의 Linux NPU driver release 문서에 자세히 설명되어 있다.

GitHub의 release page를 찾아가서 압축파일을 다운로드 받아 dpkg로 설치하면 모든 준비가 완료된다.

wget https://github.com/intel/linux-npu-driver/releases/download/v1.24.0/linux-npu-driver-v1.24.0.20251003-18218973328-ubuntu2404.tar.gz
tar -xf linux-npu-driver-v1.24.0.20251003-18218973328-ubuntu2404.tar.gz

sudo apt update
sudo apt install libtbb12

sudo dpkg -i *.deb

# Level zero가 설치되지 않은경우에만
wget https://github.com/oneapi-src/level-zero/releases/download/v1.24.2/level-zero_1.24.2+u24.04_amd64.deb
sudo dpkg -i level-zero*.deb

OpenVINO device 목록 확인

OpenVINO의 Core() class안에 있는 available_devices 멤버 변수를 출력하면 사용가능 한 추론 장치의 목록이 표시되는데 아래와 같이 CPU, GPU와 함께 NPU가 표시되는 것을 볼 수 있다.

python3 -m venv .venv
source .venv/bin/activate
(.venv) pip install setuptools
(.venv) pip install openvino openvino-dev
(.venv)$ python3 -c "from openvino import Core; print(Core().available_devices)"
['CPU', 'GPU', 'NPU']

성능측정 결과

Ultralytics의 문서를 따라 YOLOV11n을 OpenVINO용으로 변환해서 OpenVINO benchmark_app으로 측정하였다.

NPU 벤치마크 결과는 다음과 같다. CPU보다 다소 좋은 성능을 보이고, 실행하는 동안 CPU utilization이 증가되지 않는 것이 확인된다.

$ benchmark_app -m ./yolo11n_openvino_model/yolo11n.xml -d NPU
...
[ INFO ] Execution Devices:['NPU']
[ INFO ] Count:            9704 iterations
[ INFO ] Duration:         60033.42 ms
[ INFO ] Latency:
[ INFO ]    Median:        24.50 ms
[ INFO ]    Average:       24.52 ms
[ INFO ]    Min:           23.54 ms
[ INFO ]    Max:           69.62 ms
[ INFO ] Throughput:   161.64 FPS

CPU로 수행한 결과는 다음과 같다.

$ benchmark_app -m ./yolo11n_openvino_model/yolo11n.xml -d CPU
...
[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:            6351 iterations
[ INFO ] Duration:         60047.25 ms
[ INFO ] Latency:
[ INFO ]    Median:        24.51 ms
[ INFO ]    Average:       28.31 ms
[ INFO ]    Min:           23.05 ms
[ INFO ]    Max:           45.46 ms
[ INFO ] Throughput:   105.77 FPS

iGPU로 실행했을 때 throuput은 가장 좋으나 Max latency가 높은 것이 관찰되는데 아마도 로딩을 위한 메모리 복사 소요 시간으로 추정된다.

$ benchmark_app -m ./yolo11n_openvino_model/yolo11n.xml -d GPU
...
[ INFO ] Execution Devices:['GPU.0']
[ INFO ] Count:            87056 iterations
[ INFO ] Duration:         60013.22 ms
[ INFO ] Latency:
[ INFO ]    Median:        10.77 ms
[ INFO ]    Average:       10.83 ms
[ INFO ]    Min:           4.51 ms
[ INFO ]    Max:           1010.93 ms
[ INFO ] Throughput:   1450.61 FPS