반응형
작성일: 2026년 3월 5일

 

 

이 문서는 Linux 커널이 네트워크 트래픽을 어떻게 받고 처리하는지, DMA·링 버퍼·softIRQ·NAPI·RPS까지 한 흐름으로 정리한 요약이다.

 

1. DMA 링 버퍼와 TX/RX 링의 관계

DMA 링 버퍼와 TX/RX 링은 같은 개념을 가리킨다. 네트워크 카드는 소프트웨어(커널 드라이버)가 할당한 메모리 영역을 DMA로 직접 접근하며, 이 공유 메모리 구조를 흔히 “DMA 링 버퍼” 또는 “TX/RX 링”이라고 부른다.

구성 요소

  • 링(Ring): RAM에 있는 고정 크기의 원형 큐. 각 항목은 디스크립터(또는 주소)로, 실제 패킷이 들어 있는 버퍼를 가리킨다.
  • TX 링: 전송할 데이터가 들어 있는 RAM 버퍼의 시작/끝 주소(디스크립터)를 담는다.
  • RX 링: NIC가 수신 패킷을 쓸 RAM 버퍼의 주소를 담는다. NIC는 DMA로 이 버퍼에 직접 쓴다.
  • NIC 레지스터: 링 버퍼가 위치한 RAM 주소를 NIC가 알 수 있도록 레지스터에 설정된다.

DMA Ring buffer와 TX/RX Ring 관계

 

 

링과 버퍼는 모두 DMA 가능 메모리로 할당된다. 링은 지속적으로 NIC와 공유되므로 coherent/consistent DMA, 버퍼는 흐름 단위이므로 streaming DMA로 다루는 경우가 많다.

 

네트워크 링 버퍼의 역할

네트워크 링 버퍼는 NIC가 DMA로 직접 접근하는 메모리 영역이다. 크게 두 부분이 있다.

  • 링(큐) 부분: 고정 크기의 원형 FIFO 큐. 각 항목은 디스크립터(또는 메모리 주소)로, 실제 데이터가 들어 있는 영역을 가리킨다.
  • 버퍼(메모리) 부분: 실제 패킷 데이터가 들어가는 영역. 커널이 할당하고 디스크립터를 통해 링과 연결한다.

RX 링 버퍼는 수신용, TX 링 버퍼는 송신용이다. 둘 다 특정 네트워크 인터페이스에 묶여 있으며, 해당 인터페이스로 송수신하는 모든 트래픽이 이 링을 공유한다.

2. softIRQ 시스템과 ksoftirqd 초기화

디바이스는 “처리할 일이 있다”는 것을 IRQ(인터럽트)로 알린다. 네트워크의 경우 NIC가 패킷 도착 시 IRQ를 발생시킨다. IRQ 핸들러는 최우선으로 실행되며 다른 IRQ를 막을 수 있기 때문에, 커널은 짧게만 처리하고 나머지 작업을 softIRQ로 미룬다.

softIRQ는 “IRQ 컨텍스트 밖”에서 실행되는 지연 처리 메커니즘이다. 네트워크 수신의 경우 이 작업이 ksoftirqd 커널 스레드에서 실행된다.

부팅 시 초기화 순서

  1. ksoftirqd 스레드 생성: CPU당 하나씩 kernel/softirq.c의 spawn_ksoftirqd → smpboot_register_percpu_thread로 생성된다. 실제 루프에서 돌리는 함수는 run_ksoftirqd이다.
  2. softnet_data: CPU당 하나씩 생성된다. 네트워크 처리에 필요한 구조체 참조(예: poll_list)를 담는다. NAPI 폴 워커는 napi_schedule 등으로 이 poll_list에 붙는다.
  3. NET_RX_SOFTIRQ 등록: net_dev_init에서 open_softirq로 NET_RX_SOFTIRQ를 등록하고, 핸들러로 net_rx_action을 지정한다. 수신 패킷의 실제 처리는 이 함수에서 이뤄진다.
Linux OS 부팅시, softIRQ 시스템 초기화 순서
CPU당 ksoftirqd와 softnet_data가 만들어진 뒤 NET_RX_SOFTIRQ가 net_rx_action과 연결된다.

 

3. 데이터 도착부터 softIRQ까지

패킷이 도착하면 NIC → DMA → IRQ → 드라이버 → NAPI 스케줄 → softIRQ 순으로 진행된다.

하드웨어/드라이버 측

  1. 패킷이 NIC에 도착한다.
  2. NIC가 DMA로 패킷 데이터를 RAM의 RX 링이 가리키는 버퍼에 쓴다(CPU는 관여하지 않음).
  3. NIC가 IRQ를 발생시킨다.
  4. 드라이버에 등록된 IRQ 핸들러가 실행된다.
  5. NIC에서 IRQ를 클리어해 이후 패킷에 대해 다시 IRQ를 낼 수 있게 한다.
  6. NAPI softIRQ 폴 루프를 napi_schedule로 시작한다. 이 호출은 비트 플래그를 세우고 현재 CPU의 poll_list에 해당 디바이스의 NAPI 구조체를 넣는 정도만 하고, 실제 무거운 작업은 softIRQ로 넘긴다.

데이터 도착부터 softIRQ 처리까지의 시퀀스.

 

NIC가 DMA로 쓴 뒤 IRQ만 걸고, 실제 수신 처리는 ksoftirqd에서 이뤄진다.

 

softIRQ 쪽 (ksoftirqd)

  1. napi_schedule로 해당 CPU의 poll_list에 NAPI 폴 구조체가 추가된다.
  2. 해당 CPU의 softIRQ pending 비트가 설정되어, 그 CPU의 ksoftirqd가 “처리할 패킷이 있다”는 것을 알게 된다.
  3. ksoftirqd 커널 스레드의 run_ksoftirqd가 동작한다.
  4. __do_softirq가 pending을 보고, 등록된 핸들러인 net_rx_action을 호출한다. 무거운 수신 처리 작업은 IRQ 핸들러가 아니라 이 softIRQ 컨텍스트(ksoftirqd)에서 수행된다.

정리하면, NIC는 DMA로 RX 링 버퍼에만 쓰고, CPU는 IRQ에서 최소한의 일만 한 뒤 softIRQ로 “나중에 처리”를 맡기고, 실제로 RX 링에서 패킷을 꺼내서 프로토콜 스택으로 넘기는 것은 net_rx_action → 드라이버 poll (예: igb_poll)이다.

4. net_rx_action와 수신 처리

net_rx_action은 현재 CPU의 poll_list에 있는 NAPI 구조체들을 순회하며, 각 디바이스의 poll 함수를 호출한다.

처리 흐름 요약

  1. net_rx_action이 NAPI 폴 리스트에서 NAPI 구조체를 꺼낸다.
  2. budget과 경과 시간을 확인해 softIRQ가 CPU를 독점하지 않도록 한다.
  3. 등록된 poll 함수를 호출한다(예: igb_poll). 이 함수가 RAM의 RX 링 버퍼에서 패킷을 가져온다.
  4. 패킷은 napi_gro_receive로 넘어가 GRO(Generic Receive Offload) 등을 처리한다.
  5. GRO에서 묶이거나, 그렇지 않으면 netif_receive_skb → 프로토콜 스택으로 전달된다.
net_rx_action 처리 흐름

 

NAPI(New API) poll이 RX 링에서 패킷을 꺼내 GRO를 거쳐 netif_receive_skb로 넘긴다.

 

net_rx_action/igb_poll이 멈추는 경우

  • 처리 시간이 너무 길어질 때
  • budget 한도에 도달했을 때 (CPU 사용 제한)
  • 더 읽을 데이터가 없을 때

budget 소진이나 시간 제한 때문에 아직 처리할 패킷이 있는데 루프가 끝나면 /proc/net/softnet_stat의 세 번째 필드(time_squeeze)가 증가한다. 이 값이 0보다 크면 한도에 걸린 것이다. CPU 여유가 있다면 netdev_budget을 올려서 net_rx_action이 더 많은 패킷을 처리하도록 할 수 있다.

# 기본값 300, 필요 시 증가
echo 900 > /proc/sys/net/core/netdev_budget

5. RPS (Receive Packet Steering)

RPS가 꺼져 있으면:

  • netif_receive_skb → __netif_receive_core → 탭(예: PCAP) → 프로토콜 핸들러(예: ip_rcv)로 직접 전달된다.

RPS가 켜져 있으면:

  • netif_receive_skb → enqueue_to_backlog. 패킷이 CPU별 입력 큐에 들어가고, 해당 원격 CPU의 NAPI 구조체가 그 CPU의 poll_list에 추가되며 IPI가 큐에 넣어진다. 그러면 원격 CPU의 ksoftirqd가 깨어나 같은 방식으로 net_rx_action → process_backlog로 그 CPU의 입력 큐에서 패킷을 꺼낸 뒤 __netif_receive_core → 프로토콜 스택으로 넘긴다. 즉, 수신 처리 부하가 여러 CPU에 나뉜다.

RPS 유무에 따른 경로

 

RPS를 쓰면 패킷이 CPU별 큐로 나뉘고 IPI로 다른 CPU의 ksoftirqd가 깨어나 부하가 분산된다.

멀티큐 NIC는 큐별로 다른 CPU에 IRQ를 붙여 softIRQ 부하를 나누고, RPS는 큐 수보다 CPU가 많을 때 추가로 부하를 분산할 때 유용하다.

 

6. 프로토콜 스택부터 사용자 소켓까지

__netif_receive_core 이후 경로는 대략 다음과 같다.

  1. IPv4의 경우 ip_rcv로 패킷 수신.
  2. netfilter 및 라우팅 최적화.
  3. 로컬로 오는 패킷은 상위 프로토콜(UDP 등)로 전달.
  4. UDP면 udp_rcv → udp_queue_rcv_skb, sock_queue_rcv로 사용자 소켓의 수신 버퍼에 큐잉. 그 전에 BPF 등이 처리될 수 있다.
Protocol Stack부터 User Socket 까지 흐름도

ip_rcv → netfilter/라우팅 → UDP → 소켓 큐 → 사용자 공간.

 

7. 모니터링 및 튜닝

링/큐 크기와 드롭

링은 고정 크기 원형 큐이므로, 처리보다 도착이 빠르면 큐가 가득 차 패킷이 드롭된다.

ethtool -S enp8s0f0 | grep drop

 

드롭이 늘면:

  • 멀티큐 사용: ethtool -l로 현재 설정, ethtool -L로 큐 개수 조정. 큐가 여러 개면 DMA/처리 부하가 여러 CPU에 나뉜다.
  • 큐(디스크립터) 길이 증가: ethtool -g로 최대/현재 값 확인, ethtool -G로 조정. 큐를 길게 하면 처리량은 늘 수 있지만 지연 변동이 커질 수 있고, 짧으면 지연은 줄일 수 있지만 드롭 위험이 있다.

softIRQ 소비 확인

cat /proc/net/softnet_stat | awk '{print $3}'

세 번째 필드가 time_squeeze이다. 0보다 크면 budget/시간 제한으로 아직 처리할 패킷이 있는데 루프가 끝난 경우다. CPU 여유가 있으면 netdev_budget을 올려 본다.

수신 처리 호출 스택 예시

# 예: netif_receive_skb_internal 부근 커널 스택
netif_receive_skb_internal+1
napi_gro_receive+186    # RX 링에서 꺼낸 직후
igb_poll+1153
net_rx_action+329
__do_softirq+222
...

 

 


 

관련 문서

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/network_troubleshooting_and_performance_tuning/tuning-irq-balancing

 

Chapter 2. Tuning IRQ balancing | Network troubleshooting and performance tuning | Red Hat Enterprise Linux | 10 | Red Hat Doc

The kernel stores the interrupt counters in the /proc/interrupts file. To display the counters for a specific NIC, such as enp1s0, enter: grep -E "CPU|enp1s0" /proc/interrupts CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 105: 141606 0 0 0 0 0 IR-PCI-MSI-edge enp1s0-rx-0

docs.redhat.com

 

 

https://tungdam.medium.com/linux-network-ring-buffers-cea7ead0b8e8

 

Linux network ring buffers

Trying to cover what I don’t know about Linux network

tungdam.medium.com

 

https://blog.packagecloud.io/illustrated-guide-monitoring-tuning-linux-networking-stack-receiving-data/

 

Illustrated Guide to Monitoring and Tuning the Linux Networking Stack: Receiving Data | Packagecloud Blog

This post illustrates guides to monitor and tune the Linux networking stack in great detail with the focus on receiving data.

blog.packagecloud.io

 

 

 

Network Socket Buffer 구조 및 데이터 이동 과정

 

 

SoftIRQ 처리 과정

 

반응형

 

작성일: 2026년 3월 5일

 

Linux OS에서 QCOW2, ISO, LOG 파일, 동영상 미디어 파일 등을 CLI 명령으로 복사할 때

복사 진행 정도를 확인하려면 아래의 방법을 이용하면 된다.

 

cp 명령 대신 rsync 명령을 사용

## 파일 1개 복사할 때
$ rsync --progress origin_file_name dest_file_name

## Directory 전체 복사할 때
##  참고: -a 옵션은 permission, timestamp 정보를 유지하도록 함
$ rsync -a --info=progress2 origin_dir_name dest_dir_name

 

progress 명령을 사용

이미 cp, mv 명령을 실행한 뒤, 다른 터미널에서 progress 명령을 실행하여 진행 상황을 본다.

$ sudo apt install progress

## 아래 명령은 cp, mv 등 파일 복사/이동에 관한 process 등을 자동으로 찾아서 진행률을 보여준다.
$ progress -mw

 

반응형
작성일: 2026년 3월 5일

 

 

Linux kernel source code를 다운로드하기

git clone --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

 

위 git 명령은 최신 mainline 코드를 가져온다.

방금 다운로드한 kernel version을 확인하려면, Makefile을 열어서 파일 내용의 위 5줄을 읽어야 한다.

$ cat Makefile

VERSION = 7
PATCHLEVEL = 0
SUBLEVEL = 0
EXTRAVERSION = -rc2
NAME = Baby Opossum Posse

... 중간 생략 ...

 

만약 특정 version의 kernel source  code를 가져와서 build하고 싶다면, 아래 예시와 같이 `git fetch` 명령을 실행해야 한다. 

$ git fetch origin tag v6.19 --no-tags
$ git checkout v6.19

## 또는 아래와 같이 처음부터 `git clone`할 때, 특정 tag를 지정해서 가져온다.
$ git clone --depth 1 --branch v6.19 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux-6.19

 

Kernel source code를 build하기 위해 필요한 utility program을 설치하기

sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev libdw-dev dwarves bc pkg-config rsync cpio zstd

 

Kernel source code를 Compile하기

`make menuconfig` 명령을 실행하여 필요한 빌드 옵션을 On/Off 설정한다.

`make munuconfig` 화면에서 build option을 설정했으면, Signature 체크용 인증서 정보를 삭제한다. (아래 명령을 참고)

./scripts/config --set-str SYSTEM_TRUSTED_KEYS "" --set-str SYSTEM_REVOCATION_KEYS ""

 

 

`make` 명령을 수행한다.

source code 분량이 많기 때문에 -j 옵션을 추가하여 make 명령을 수행해야 한다.

-j 옵션이 없는 상태로 compile하면, 하루 종일 build해야 한다.

make -j$(nproc)

또는 

make -j2

 

 

Tip: 참고할 내용

Kernel source code Build에 걸리는 시간:

[ CPU 8 Core를 사용할 때 ]

  - HW 사양: Intel i7-11700 @ 2.50GHz

  - Build time: 32분 걸림

[ CPU 1 Core를 사용할 때 ]

  - HW 사양: Intel i7-11700 @ 2.50GHz

  - Build time: 3시간 40분 걸림

 

Build된 kernel binary file을 Machine에 적용하는 방법

1. Module 설치

sudo make modules_install

위 명령은 .ko module file을 /lib/modules/6.19.0/ 같은 directory에 복사한다.

 

2. Kernel 설치 (Kernel image 복사, Grub 설정 변경)

sudo make install

위 명령은 bzImage 파일과 System.map 파일을 /boot directory에 복사하고

Ubuntu/Debian 같은 배포판 리눅스에서는 /sbin/installkernel 스크립트를 이용하여 initramfs 파일을 생성하고 update-grub 절차까지 수행한다.

 

3. Reboot 후 새 kernel 선택

sudo reboot

컴퓨터가 reboot되면서, GRUB 화면이 보일 것이다.

이때 [ Advanced options ] - [ Linux 6.19.0 ] 을 선택하고, OS booting 과정을 진행하면 된다.

 

4. 새 kernel 적용 여부 확인

$ uname -r
6.19.0-11-generic

 

내가 build한 kernel version과 같은지 확인한다.

반응형
작성일: 2025년 11월 25일

 

 

Ubuntu 22.04, Ubuntu 24.04를 사용하면서 절전모드(Suspend Mode, Sleep Mode)와 관련한 문제를 만나게 되었다.

예를 들어, Ubuntu 24.04가 절전모드로 바뀌었다가 다시 깨어날 때, Intel I225-V NIC가 인식되지 않는 경우가 있다.

 

이런 경우는 Kernel에서 해당 Hardware와 관련한 kernel module을 제거했다가 다시 추가하면 문제가 해결된다.

그런데 매번 Ubuntu OS가 Suspend mode에서 깨어날 때마다 `modprobe -r igc && modprobe  igc` 같은 명령을 입력하기는 번거롭다.

그래서 아래처럼 설정 파일을 작성해 놓으면, Suspend mode에서 깨어날 때 자동으로 Kernel module을 제거, 추가하는 것을 자동화할 수 있다.

 

$ cat /etc/systemd/system/i225-fix.service

[Unit]
Description=Fix for Intel I225-V after suspend
After=suspend.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/sbin/modprobe -r igc && /sbin/modprobe igc"

[Install]
WantedBy=suspend.target

$

 

 

위와 같이 설정 파일을 작성하고 테스트 삼아서 Ubuntu OS를 Suspend mode(절전 모드)로 바꾸었다가 다시 깨워보자.

네트워크 포트가 잘 인식되는 것을 볼 수 있을 것이다.

 

반응형

 

작성일: 2025년 11월 3일

 

 

macOS와 Ubuntu를 모두 사용하다보면, UX를 macOS 쪽으로 통일하고 싶은 마음이 생긴다.

이런 생각을 가진 사람이 많았는지 Linux에서 macOS의 UX를 흉내낸 설정 도구가 이미 만들어져 있다.

100% 똑같게 만든 것은 아니지만, macOS를 사용하던 사람이 Ubuntu UX를 헷갈리지 않게 사용할 수 있도록 만들어져 있긴 한다.

 

설정 과정이 복잡하지만, 아래 동영상을 따라하면 잘 동작한다.

 

https://www.youtube.com/watch?v=cavlr-mZkoY

반응형
작성일: 2025년 4월 1일

 

 

Ubuntu OS를 처음 설치한 후, 아래와 같이 App 설치하고 초기 설정 작업을 해놓으면 나중에 업무할 때 편하다.

 

App 설치 (Utility Program 설치)

## root 계정 암호 설정하기

$ sudo passwd root
$ apt update -y
$ apt install -y vim  htop  iftop git  curl  openssh-server  tree  lrzsz  terminator net-tools

 

 

/etc/ssh/sshd_config 파일에서 Root Login Permit 설정하기

주의: 폐쇄망, Air-Gapped Network 에서만 Root Login Permit 설정을 사용하고 Public network에서 접근 가능한 장비라면 이 설정을 사용하면 안 된다. (보안 취약성 때문에)

 

## ... 파일을 열고 직접 수정하고, 아래 명령을 수행 ...
$ systemctl restart sshd

 

 

sudo 설정

"/etc/sudoers.d/myaccountname" 파일에 아래와 같이 설정 1줄을 추가한다. 

myaccountname ALL=(ALL) NOPASSWD:ALL

 

.vimrc 파일 수정

$ cat << EOF >> ~/.vimrc
color koehler
set tags=./tags,./my/proj/tags
set tabstop=4 softtabstop=4 shiftwidth=4  
set expandtab  
set autoindent
EOF

 

 

Network 설정 (Ubuntu 22.04 , Ubuntu 24.04 버전을 사용하는 경우)

$ cat << EOF >> /etc/netplan/00-installer-config.yaml

network:
  version: 2
  ethernets:
    enp1s0:
      dhcp4: false
      addresses: [192.168.122.20/24]
      routes:
        - to: default
          via: 192.168.122.1
      nameservers:
        addresses: [1.1.1.1, 8.8.8.8]
    enp2s0:
      addresses: [16.0.0.253/24]
    enp3s0:
      addresses: [48.0.0.253/24]
      
EOF

 

Network 설정 (Ubuntu 20.04 이전 버전을 사용하는 경우)

$ cat << EOF >> /etc/network/interface

auto ens3 
iface ens3 inet static 
address 10.10.12.30
netmask 255.255.255.0 
gateway 10.10.12.1 
dns-nameservers 8.8.8.8 8.8.4.4 

auto ens4 
iface ens4 inet static 
address 192.168.1.201 
netmask 255.255.255.0 
network 192.168.1.0 
broadcast 192.168.1.255 
gateway 192.168.1.1 
dns-nameservers 8.8.8.8 8.8.4.4 

EOF

 

 

반응형

 

테스트한 날짜: 2025년 4월 4일
사용한 OS: Ubuntu 22.04 / Ubuntu 24.04

 

Open vSwitch 설치

Open vSwitch를 설치한다.

$ sudo -s

$ apt update -y 

$ apt install -y openvswitch-common openvswitch-switch

$ apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

 

 

libvirt-daemon과 virt-manager간 연동이 되려면, OS를 한번 Reboot 해줘야 한다.

 

 

Open vSwitch 설정

KVM Hypervisor의 VM이 사용할 Virtual Switch를 구축한다.

$ sudo -s

##
## br-ex 라는 이름의 Virtual Switch를 만든다.
##

$ ovs-vsctl add-br br-ex

$ ovs-vsctl show


##
## 인터넷과 연결된 Port를 eth0라고 가정한다.
## 이 eth0 port를 br-ex switch에 추가한다.
## [ 주의 ]
##   eth0 port를 bridge에 추가하는 순간, 기존에 eth0로 networking하던 것들이 모두 단절되니까
##   eth0 외에 eth1과 같이 여분의 network port를 추가로 만들어 놓는 것이 좋다.
##

$ ovs-vsctl add-port br-ex eth0

$ ovs-vsctl show


##
## netplan 설정 파일을 작성한다. (아래 예제를 참고)
##

$ cat /etc/netplan/00-installer-config.yaml

network:
  version: 2
  ethernets:
    eth0:                ## ovs bridge에 추가한 eth0 포트에는 IP 주소를 할당하지 않는다.
      dhcp4: false
    br-ex:               ## ovs bridge의 br-ex 포트에 eth0에 있는 주소를 설정한다.
      addresses:
      - 10.1.4.64/24
      routes:
        - to: 10.1.4.0/24
          via: 10.1.4.1   
        - to: default
          via: 10.1.4.1
      nameservers:
        addresses:
        - 1.1.1.1
        - 8.8.8.8
    eth1:
      addresses:
      - 10.1.3.171/24
      routes:
        - to: 10.1.3.0/24
          via: 10.1.3.1      
      nameservers:
        addresses:
        - 1.1.1.1
        - 8.8.8.8
    eth2:
      dhcp4: false
    eth3:
      dhcp4: false
      
$ netplan apply

$ ifconfig br-ex

... 생략 ...

 

위와 같이 수행한 후, Ubuntu OS를 Reboot해서 Network Port eth0, br-ex가 정상적으로 구성되는지 확인한다.

(꼭, Reboot해야 하는 것은 아닌데 설정이 적용되는지 확인하는 차원에서 Reboot해보는 것을 권장한다)

 

 

 

KVM의 Network Profile 작성

KVM이 위에서 만든 br-ex virtual switch를 사용할 수 있도록 network profile을 작성한다.

$  cat > br-ex.xml <<-EOF

<network> 
 <name>br-ex</name>        # KVM이 User에게 출력해주는 이름 
 <forward mode='bridge'/> 
 <bridge name='br-ex'/>    # OVS가 가지고 있는 실제 bridge name 
 <virtualport type='openvswitch'/> 
</network> 
EOF

$

 

 

 

KVM에 Network Bridge 정보 등록

KVM 명령어인 virsh을 이용하여 br-ex switch 정보를 등록한다.

$ virsh  net-define  br-ex.xml
$ virsh  net-start  br-ex
$ virsh  net-autostart  br-ex
$ virsh  net-list​

 

위 설정 작성 후, Ubuntu Desktop 화면에서 'Virtual Manager' App을 실행하면 'br-ex' switch를 사용할 수 있다.

 

 

 

블로그 작성자: sejong.jeonjo@gmail.com

 

반응형
작성일: 2024년 8월 14일

 

 

CPU 온도 모니터링

$ apt install lm-sensors

$ sensors-detect --auto

$ systemctl restart module-init-tools

$ watch sensors

 

 

프로세스 별 Network traffic 모니터링

$ apt install nethogs

$ nethogs eth0

$ apt install iftop

$ iftop -i eth0

 

 

 

 

 

 

 

 

 


 

+ Recent posts