Skip to content

Instantly share code, notes, and snippets.

@edp1096
Last active June 17, 2024 18:49
Show Gist options
  • Save edp1096/61f3f6d15f0fbf1307e67ab24ed2f9fb to your computer and use it in GitHub Desktop.
Save edp1096/61f3f6d15f0fbf1307e67ab24ed2f9fb to your computer and use it in GitHub Desktop.
오렌지파이5플러스 설정 메모

운영체제 설치 및 설정

시작 전 참고

  • 저장매체 - 나는 아래꺼 모두 사용함
    • sd카드 - 제조사 기본 이미지 server 버전. nvme 이미징 작업용
    • usb 외장 메모리 또는 외장 ssd - 이미지 배포판 저장용
    • nvme ssd - 부팅 및 주 저장매체
  • 전원 아답터
    • 상품 - 네이버에서 5v4a로 검색
    • nvme류의 부품을 달면 과부하시 순간적으로 16와트 넘게 튀므로 5V/4A 필요. 달린게 없으면 5V/3A 충전기도 괜찮음.
    • EU방식은 헐거워서 안되고 KR방식은 위의 제품이 전부임. 라즈베리파이5 어댑터는 KR방식이 없어서 아웃.
    • 오렌지파이5플러스 운영체제
      • Joshua Riek's ubuntu-rockchip - 링크
        • 추천 - 오렌지파이 기본 이미지보다 쓰기 좋음
        • 기본 id / password - ubuntu / ubuntu
        • 현재 24.04 Noble numbat으로 버전업된 것 같다. 커널은 rockchip-linux bsp 6.1
      • Armbian - 링크
      • 제조사 기본 이미지 - 링크
        • 비추 - 저장소 주소가 화웨이, 이미지는 암비안 옛날꺼 베이스라서 걍 암비안 쓰는게 낫다.
        • 기본 id / password - orangepi / orangepi
        • 나는 급할 때 쓰려고 sd카드로만 하나 만들어 놓음

sd카드 이미징

  • 윈도우 - Etcher 사용. https://etcher.balena.io
  • 리눅스 - dd 사용. 나는 Etcher로 ssd 이미징이 안돼서 sd카드로 띄운 리눅스에서 dd로 이미징

리눅스 콘솔에서 nvme ssd에 우분투 이미징

sudo fdisk -l | grep "nvme0n1"
lspci
sudo dd bs=1M if=/dev/zero of=/dev/nvme0n1 count=2000 status=progress
sudo dd bs=1M if=우분투이미지.img of=/dev/nvme0n1 status=progress oflag=direct

usb메모리 마운트

  • 나의 경우, nvme ssd에 이미지 씌울 때, sd로 부팅해서 usb 외장하드에 이미지 다운받아 작업했음
sudo mkdir /media/usb
ls /dev/sd*
# sudo mount -t ntfs-3g /dev/sda1 /media/usb
sudo mount -t exfat /dev/sda1 /media/usb

트러블슈팅

  • x윈도
    • 이미지 부팅 안됨 - dd로 삭제없이 될 때까지 이미지 쓰기
    • 한글 - 국산(tian, kime) 입력기는 arm 바이너리 없어서 패스
      • 국산입력기인 nimf가 제일 좋은데 배포가 안될 때가 있다. 나는 apt가 아닌 deb 파일이 걸려있을 때 다운받아 설치함.
      • 외산을 쓰려면 fcitx5, fcitx5-hangul 설치 및 재시작 > 설정에서 hangul 추가
    • htop 온도가 N/A로 표시됨 - 뭔짓을 해도 안되니 포기하고 psensor 사용
    • 블루투스 느림(스피커 레이턴시) - 블투 포기하고 aux 단자 스피커 사용
  • 크로미엄에서 넷플릭스 M7111-1331 오류 - 아래 옵션을 직접 실행하거나 바로가기 생성
chromium-browser --user-agent="Mozilla/5.0 (X11; CrOS aarch64 15236.80.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
# 데이터폴더를 따로 잡아서 실행
chromium-browser --user-data-dir="/home/username/.chrome_ott_data" --user-agent="Mozilla/5.0 (X11; CrOS aarch64 15236.80.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
  • 뱅킹
    • 기본 agent로 KB국민은행은 보안 프로그램이 필요 없어서 브라우저 인증서로 잘 동작하고, 다른 은행은 강제하는 보안프로그램이 Linux aarch64를 지원하지 않아서 포기
    • 위 넷플릭스용 agent 사용시, 지원하지 않는 OS라고 하기 때문에 기본 agent 전용으로 user-dir을 따로 만들거나 해야됨

기타

파란색LED 끄기

  • 의미없이 반짝이는게 눈에 거슬려서 녹색LED만 깜빡이게 systemd 서비스로 추가.
  • 원래 그럴 의도는 아니었는데 정상 부팅되면 녹색LED만 깜빡여서 부팅 상태 확인 용도로도 괜찮은 거 같다.
sudo vi /etc/systemd/system/heartbeat-green-only.service
[Unit]
Description=LED Control Service
After=sysinit.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo none > /sys/class/leds/blue_led/trigger && echo heartbeat > /sys/class/leds/green_led/trigger'

[Install]
WantedBy=multi-user.target
sudo systemctl enable heartbeat-green-only.service

ubuntu-rockchip 데스크톱 추가 설치

  • Gnome extension manager
sudo apt install gnome-shell-extension-manager
  • Gnome tweaks
sudo apt install gnome-tweak-tool

mpv플레이어 옵션

* 파란화면, 녹색화면 나올 때 - `--hwdec=videotoolbox`
* 볼륨 작을 때 - `--volume-max=200`

GPU performance flag

아래처럼 하던지 아니면, export 제외한 아래 환경변수를 /etc/environment 에 추가

export PAN_MESA_DEBUG=gofaster,gl3

패킷 RST 플래그 무시

윈도우의 GoodbyeDPI 비스무리하게.. SNI, DPI 등. iptables 설치 필요

sudo iptables -A INPUT -p tcp --tcp-flags RST RST --sport 443 -j DROP

잡다

  • 소비전력 - 모니터 2개, 스피커, 랜선 1개, usb 유선 키보드/마우스 연결한 상태
    • 평상시 5~10w
    • 최대부하(거의 일어나지 않음) 15w+@
  • hdmi 모니터 3개 - 잘 되지만 hdmi 단자가 있는 usb-c 허브를 뺐다 끼웠다 할 때 화면 복구가 제대로 안될 수 있다.

끝.

클러스터 - 네트워크 설정

개요

  • Orange Pi 5 Plus에 붙어있는 듀얼랜을 이용하여 daisy chain topology로 cluster 꾸미기.. 위한 초기작업 메모
  • sbc 4개 사용 - 인터넷에 연결되는 메인이 sbc1, 이후 순서대로 2,3,4 연결
  • 사용 운영체제: ubuntu-rockchip server

Ethernet 설정

  • device 이름은 sbc 모두 동일하고, usb-c 전원단자 옆에 enP3p49s0, 다음은 enP4p65s0

각 sbc의 netplan 설정

  • sbc1 - 하나는 외부 인터넷, 나머지 하나는 내부 연결용
# sudo vi /etc/netplan/50-cloud-init.yaml
network:
  ethernets:
    enP3p49s0:
      dhcp4: true
      optional: true
    enP4p65s0:
      addresses: [172.16.0.10/24]
  version: 2
  renderer: networkd
  • sbc2 - 브릿지(br0)로 묶음
# sudo vi /etc/netplan/50-cloud-init.yaml
network:
  ethernets:
    enP3p49s0:
      addresses: [172.16.10.20/24]
    enP4p65s0:
      addresses: [172.16.10.21/24]
  bridges:
    br0:
      interfaces: [enP3p49s0, enP4p65s0]
      addresses: [172.16.0.20/24]
      routes:
        - to: default
          via: 172.16.0.10
      nameservers:
        addresses: [8.8.8.8, 8.8.8.4]
  version: 2
  • sbc3 - 브릿지(br0)로 묶음
# sudo vi /etc/netplan/50-cloud-init.yaml
network:
  ethernets:
    enP3p49s0:
      addresses: [172.16.10.30/24]
    enP4p65s0:
      addresses: [172.16.10.31/24]
  bridges:
    br0:
      interfaces: [enP3p49s0, enP4p65s0]
      addresses: [172.16.0.30/24]
      routes:
        - to: default
          via: 172.16.0.10
      nameservers:
        addresses: [8.8.8.8, 8.8.8.4]
  version: 2
  • sbc4 - 하나만 쓰고 하나는 안써서 dhcp로 내버려둠. sbc4 뒤에 sbc를 추가하려면 sb2, sbc3과 같은 형식으로 설정
# sudo vi /etc/netplan/50-cloud-init.yaml
network:
  ethernets:
    enP3p49s0:
      addresses:
        - 172.16.0.40/24
      routes:
        - to: default
          via: 172.16.0.10
      nameservers:
        addresses: [8.8.8.8, 8.8.8.4]
    enP4p65s0:
      dhcp4: true
      optional: true
  version: 2

netplan 설정 후 적용

  • sbc1 ~ sbc4 모두 실행
sudo netplan apply

통신 뚫기

ip_forward 활성화

  • sbc1 ~ sbc4 모두 설정
# sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1

# 설정 적용
sudo sysctl -p

외부 ping 안나갈 경우

  • 아래 마스커레이드 설정은 iptables 말고 ufw나 nftables 사용해도 됨
  • sbc1만 설정
# iptables 설치, 설정
sudo apt install iptables

sudo iptables -t nat -A POSTROUTING -o enP3p49s0 -j MASQUERADE

# iptables 설정 저장/관리 서비스 설치, 실행
sudo apt install iptables-persistent

sudo service netfilter-persistent save
sudo service netfilter-persistent start

# 테스트
# - POSTROUTING/MASQUERADE 설정 후, 아이피로 핑 요청시 응답을 받아야 됨
# - persistent 패키지가 저장/로드 기능이니까 재부팅해도 핑 응답을 받아야 됨
# - netplan 설정에서 nameservers 설정이 없으면 도메인으로 핑 요청시 응답 못 받음
ping 8.8.8.8
ping yahoo.com
ping bing.com
ping google.com

SSH/SFTP 터널링

  • 외부에서 sbc1 거쳐서 나머지 sbc로 접속하기
  • https://github.com/edp1096/tunnel 사용. 실행방법은 링크의 README.md 참고
  • 윈도우에서도 되는지는 확인 안 함

설정 - golang tunnel 실행에 필요한 config.yaml 내용들

  • sbc1 - 프록시이므로 필요 없음
  • sbc2
proxyserver:
  address: 192.168.100.43
  port: 22
  username: ubuntu
  authmethod: privatekey # password or privatekey or agent
  password: mypassword
  privatekey: ~/.ssh/my_key.pem
internalserver:
  address: 172.16.0.20
  port: 22
localport: 1620
  • sbc3
proxyserver:
  address: 192.168.100.43
  port: 22
  username: ubuntu
  authmethod: privatekey # password or privatekey or agent
  password: mypassword
  privatekey: ~/.ssh/my_key.pem
internalserver:
  address: 172.16.0.30
  port: 22
localport: 1630
  • sbc4
proxyserver:
  address: 192.168.100.43
  port: 22
  username: ubuntu
  authmethod: privatekey # password or privatekey or agent
  password: mypassword
  privatekey: ~/.ssh/my_key.pem
internalserver:
  address: 172.16.0.40
  port: 22
localport: 1640

rsa key 이용해서 로그인

검색하면 많이 나오니까 생략. 나는 어차피 장난감이라 ssh-keygen -t rsa로 만들어진 키페어 하나로 pub키를 모든 sbc의 ~/.ssh/authorized_keys에 복붙하고 비밀키만능열쇠로 사용.

확인

sbc2 접속 테스트

ssh -i ~/.ssh/my_key.pem ubuntu@localhost -p1620
# Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.10.160-rockchip aarch64)
# ...

끝.

K3s 설치

설치

  • Setup server - get node 실행 시 EXTERNAL-IP는 조금 늦게 뜸
curl -sfL https://get.k3s.io | sh -s - \
    --write-kubeconfig-mode 644 \
    --node-ip 172.16.0.10 \
    --node-external-ip 192.168.100.43

kubectl get node -o wide

kubectl get all -o wide

kubectl get service --all-namespaces
  • Setup agent
# At server
sudo cat /var/lib/rancher/k3s/server/node-token
# `tokentokentokentoken`
# At agent
curl -sfL https://get.k3s.io | K3S_URL=https://172.16.0.10:6443 \
    K3S_TOKEN="tokentokentokentoken" sh -

Server API Proxy

sudo kubectl proxy --address="0.0.0.0" --port=8080 --accept-hosts="^*$"

제거

# https://docs.k3s.io/installation/uninstall

# Kill all
# /usr/local/bin/k3s-killall.sh
sudo k3s-killall.sh

# Uninstall server
# /usr/local/bin/k3s-uninstall.sh
sudo k3s-uninstall.sh

# Uninstall worker
# /usr/local/bin/k3s-agent-uninstall.sh
sudo k3s-agent-uninstall.sh

Agent 먼저 종료 시, Agent 대기 없이 Server 바로 강제 종료

sudo vi /etc/systemd/system/shutdown-k3s.service
[Unit]
Description=Kill containerd-shims on shutdown
DefaultDependencies=false
Before=shutdown.target umount.target

[Service]
ExecStart=/usr/local/bin/k3s-killall.sh
Type=oneshot

[Install]
WantedBy=shutdown.target
sudo systemctl enable shutdown-k3s.service

Traefik dashboard

  • 포트포워딩 (sbc1)
kubectl --namespace kube-system port-forward deployments/traefik 9000:9000 &
curl localhost:9000/dashboard/
# <!DOCTYPE html><html><head><title>Traefik</title><meta charset=utf-8>...
  • ssh 터널링 - sbc1용 설정 생성 / config_1.yaml
# Proxy SSH server
proxyserver:
  address: 192.168.100.43
  port: 22
  username: ubuntu
  authmethod: privatekey # password or privatekey or agent
  password: mypassword
  privatekey: ~/.ssh/my_key.pem

# Internal (SSH) server
internalserver:
  address: 127.0.0.1
  port: 9000

# Port for localhost connection
localport: 1619
  • 접속
./tunnel_linux_arm64 ./config_1.yaml &
curl localhost:1619/dashboard/
# <!DOCTYPE html><html><head><title>Traefik</title><meta charset=utf-8>...

끝.

파티션 축소, fs 추가

  • 476.42GB(512GB) -> 384GB / 92.42GB 로 분할 후, 92.42GB를 btrfs로 설정
  • 섹터/블록 계산하면 1이 틀려서 동작 안되는 경우 생겨서 그냥 바이트로 입력
  • 확인 때문에 재부팅을 여러 번 했는데 btrfs용 파티션 생성할 때 재부팅없이 한 번에 해도 됨

nvme 크기 축소

sbc1 ~ sbc4 모두 아래와 같이 진행

  • sd 부팅 - 오렌지파이5플러스용 서버 기본이미지 알아서 굽고 부팅..

  • known_host 체크 건너뛰기 #1 - 모니터 안쓰고 ssh접속시 같은 ip 충돌 무시

ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" userid@hostip
  • known_host 체크 건너뛰기 #2 - 옵션이 길어서 매번 입력하는게 귀찮으면 ~/.ssh/config에 아래 내용 추가
# ~/.ssh/config
LogLevel ERROR
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
  • resize #1 - resize2fs
e2fsck -f /dev/nvme0n1p2
# ...
sudo resize2fs /dev/nvme0n1p2 384G
# resize2fs 1.46.5 (30-Dec-2021)
# Resizing the filesystem on /dev/nvme0n1p2 to 100663296 (4k) blocks.
# The filesystem on /dev/nvme0n1p2 is now 100663296 (4k) blocks long.
  • resize #2 - fdisk
sudo fdisk /dev/nvme0n1
p
# Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
# ...
#
# Device           Start        End   Sectors   Size Type
# /dev/nvme0n1p2 1081344 1000215182 999133839 476.4G Linux filesystem

d
2
# Partition 2 has been deleted.

n
2
First sector (34-1000215182, default 1081344): 걍 엔터
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1081344-1000215182, default 1000215182): +384G
# Created a new partition 2 of type 'Linux filesystem' and of size 384 GiB.
# Partition #2 contains a ext4 signature.
######## !!!아래 주의!!! : 시그니처 지우면 부팅 안되므로 반드시 N 눌러서 시그니처 유지할 것.
######## mkfs, gdisk, parted로 새로 만들 수 있지만 귀찮기 때문에 유지하는게 낫다.
Do you want to remove the signature? [Y]es/[N]o: N
# The signature will be removed by a write command.

w
# The partition table has been altered.
# Calling ioctl() to re-read partition table.
# ...
  • 확인
lsblk
# nvme0n1     259:0    0 476.9G  0 disk 
# ├─nvme0n1p1 259:1    0   512M  0 part 
# └─nvme0n1p2 259:2    0   384G  0 part 

e2fsck -f /dev/nvme0n1p2

파티션 추가 - SD로 부팅. nvme로 부팅하면 도로 확장될 수 있음

384GB로 줄이고 아래와 같이 남은 공간에 파티션 생성

  • fdisk
sudo fdisk /dev/nvme0n1
n
Partition number (3-128, default 3): 걍 엔터
First sector (34-1000215182, default 806389760): 걍 엔터
Last sector (806387713-1000215182, default 1000215182): 걍 엔터

w
# The partition table has been altered.
# Calling ioctl() to re-read partition table.
# ...

nvme 부팅 및 xfs 또는 btrfs 생성

fdisk -l 실행시 아래 msg의 빨간색 메시지가 나오면 아래 parted 같이 실행

  • msg
GPT PMBR size mismatch (8191 != 32767) will be corrected by write.
The backup GPT table is not on the end of the device.
  • parted
sudo parted -l
# ...
# you can fix the GPT to use all of the space (an extra 24576 blocks) or continue
# with the current setting? 
Fix/Ignore? F 
# ...
  • xfs 생성
lsblk
# nvme0n1     259:0    0 476.9G  0 disk 
# ├─nvme0n1p1 259:1    0   512M  0 part 
# ├─nvme0n1p2 259:2    0   384G  0 part 
# └─nvme0n1p3 259:3    0  92.4G  0 part 

sudo mkfs.xfs -f /dev/nvme0n1p3
  • btrfs 생성
lsblk
# nvme0n1     259:0    0 476.9G  0 disk 
# ├─nvme0n1p1 259:1    0   512M  0 part 
# ├─nvme0n1p2 259:2    0   384G  0 part 
# └─nvme0n1p3 259:3    0  92.4G  0 part 

sudo mkfs.btrfs -f /dev/nvme0n1p3

끝.

GlusterFS 설치

개요

  • 구성 - 여기서는 아래와 같이 서버/클라를 구분했지만, 모든 노드를 서버/클라로 잡아줘도 상관없다.
    • sbc1(opi5p1): 클라이언트
    • sbc2(opi5p2): 서버/노드/피어
    • sbc3(opi5p3): 서버/노드/피어
    • sbc4(opi5p4): 서버/노드/피어
  • 디스크 - 92GB x 3노드 ~= 278GB

준비

  • K3s 설치를 제외하고 이전 메모에 적어둔 모든 작업을 먼저 진행
  • 모든 sbc의 /etc/hosts에 아래 내용 추가
127.0.0.1 localhost
...

172.16.0.10 opi5p1
172.16.0.20 opi5p2
172.16.0.30 opi5p3
172.16.0.40 opi5p4

설치 - Server

  • fs 준비 - 모든 노드에서
sudo mkdir /mnt/glufs
sudo mount /dev/nvme0n1p3 /mnt/glufs
  • glusterfs-server 설치 및 활성화 - 모든 노드에서
sudo apt install glusterfs-server

sudo systemctl start glusterd
systemctl enable glusterd
  • 각 피어 연결 - 아무거나 하나의 노드에서
# 여기서는 opi5p2에서 실행
sudo gluster peer probe opi5p3
sudo gluster peer probe opi5p4

# 연결상태 확인
sudo gluster peer status
sudo gluster pool list
  • 볼륨 생성 (Distributed Volume) - 아무거나 하나의 노드에서
# 여기서는 opi5p2에서 실행
sudo gluster volume create dist_vol \
opi5p2:/mnt/glufs/brick \
opi5p3:/mnt/glufs/brick \
opi5p4:/mnt/glufs/brick

# 볼륨 확인
sudo gluster volume info
  • 볼륨 서비스 시작
sudo gluster volume start dist_vol

설치 - Client

  • fs 준비 - 헷갈릴거 같아서 /mnt대신 /media로 잡음
sudo mkdir /media/gludisk
  • glusterfs-client 설치
sudo apt install glusterfs-client
  • 마운트
sudo mount.glusterfs opi5p2:/dist_vol /media/gludisk

동작 확인 - 자동화 귀찮다. 전체 재부팅 시 확인만..

  • 서버 - xfs 마운트 > gluster volume 재시작
# 모든 노드에서 입력
sudo mount /dev/nvme0n1p3 /mnt/glufs

# 하나의 노드에서 입력
sudo gluster volume stop dist_vol
sudo gluster volume start dist_vol
  • 클라이언트
sudo mount.glusterfs opi5p2:/dist_vol /media/gludisk

끝.

MPI

노드

  • 구성 - opi5p1 ~ opi5p4 까지 총 4대
  • OpenMP, MPICH, OpenMPI 중에 OpenMPI 사용. 장난감 수준에서는 딱히 차이가 없다고 한다.
  • 검색해보면 ssh와 nfs가 필요하다는데 모르겠고 ssh만 설정함

openmpi 설치

  • 소스 컴파일 안하고 걍 apt로 설치
sudo apt install openmpi-bin openmpi-common libopenmpi-dev

설치 확인

# 모든 노드에서 실행
mpicc --showme
# gcc -I/usr/lib/aarch64-linux-gnu/openmpi/include -I/usr/lib/aarch64-linux-gnu/openmpi/include/openmpi -L/usr/lib/aarch64-linux-gnu/openmpi/lib -lmpi

ssh 키 등록

  • ssh-agent 실행 및 키 등록
# 모든 노드에서 실행
eval `ssh-agent`
ssh-add .ssh/my_key.pem
# Identity added: .ssh/my_key.pem (username@opi5p0)
  • 등록된 키 목록 - 키 등록했는지 확인이 필요하면
ssh-add -l
  • 등록된 키 삭제 - 키를 잘못 등록했으면
# 골라서 삭제
ssh-add -d .ssh/my_key.pem

# 모조리 삭제
ssh-add -D
  • 이후 모든 노드에서 ssh username@opi5p1 ~ 4 까지 접속해보고 known_host에 추가시킨다.

테스트

  • 예제 코드
/*
 hellompi.c
 source: https://bconfiden2.github.io/2022/05/15/mpi-cluster
 */

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    MPI_Init(NULL, NULL);

    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    printf("Hello world from processor %s, rank %d out of %d processors\n",
           processor_name, world_rank, world_size);

    MPI_Finalize();
}
  • 예제 코드를 아래와 같이 컴파일 후 실행
mpicc hellompi.c
mpirun -np 4 -host opi5p1,opi5p2,opi5p3,opi5p4 ./a.out 
# Hello world from processor opi5p1, rank 0 out of 4 processors
# Hello world from processor opi5p3, rank 2 out of 4 processors
# Hello world from processor opi5p4, rank 3 out of 4 processors
# Hello world from processor opi5p2, rank 1 out of 4 processors

끝.

기타 설치

Node.js 20 LTS

기본 상태에서는 16 보다 높은 버전으로 올리지 못한다

  • apt 키, 저장소 추가
sudo apt install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
  • 우선순위 설정 - liujianfeng1994-ubuntu-rockchip-multimedia-jammy.list 보다 먼저 걸리게 설정
# sudo touch /etc/apt/preferences.d/nodesource
# sudo vi /etc/apt/preferences.d/nodesource

Package: *
Pin: origin deb.nodesource.com
Pin-Priority: 1601
  • 설치 - 기존 설치본은 sudo apt remove nodejs 명령으로 삭제 후 설치
sudo apt update
sudo apt install nodejs

Yarn (classic)

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/yarn-keyring.gpg
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

sudo apt update
sudo apt install yarn

생각나면 계속 작성.

끝.

@lian6605
Copy link

재밌게 잘 봤습니다

@edp1096
Copy link
Author

edp1096 commented May 26, 2024

재밌게 잘 봤습니다

감사합니다 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment