반응형

 



virsh, virt-install 명령 테스트한 날짜: 2023년 8월 7일

 

KVM을 사용하다보면, Virt-Manager라는 GUI 툴이 조작하기 편해서 계속 Virt-Manager만 사용하게 된다.

그런데 가끔 SSH 터미널만 사용할 수 있는 환경이거나 CLI Command만 이용해서 Script를 작성할 때는 virsh를 꼭 사용해야 한다.

 

Virtual Machine 생성하기 (그리고 VM에 OS 설치하기)

##
##  2023년 1월에 실제 Ubuntu 설치할 때 사용했던 명령.
##   참고: --disk 옵션에 기존에 사용했던 qcow image file을 사용하면 kernel을 못 찾는다는 에러 발생.
##        원인은 아직 모르겠음.
##   참고: 아래 명령을 수행하고 대략 55초 정도 지나야 Console에 text message가 출력된다.
##        (내가 사용한 HW Spec: i7-11700, 64GB)
##        따라서 느긋하게 기다려야 제대로 설치가 가능하다.
##

## 참고: size 단위는 GB.

## Case: OS 설치하면서 VM instance 시작하기
##       (주의: OS 설치하면서 VM start 할 때는 --osinfo 옵션을 빼야 한다.)

$ virt-install \
  --name my-vm \
  --ram 4096 \
  --vcpus 2 \
  --disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
  --disk /mnt/hdd0/virtual_machine/harbor-2nd-storage.qcow2,size=500 \
  --graphics none \
  --network network=br-ex \
  --console pty,target.type=virtio \
  --autoconsole text \
  --location /home/iso/ubuntu-22.04.1-live-server-amd64.iso
 


## Case: 기존 사용했던 VM 이미지를 이용하여 VM instance 기동하기.

$ virt-install \
  --import \               ## 기존 VM image 파일을 이용하겠다는 옵션
  --osinfo ubuntu22.04 \   ## 이 osinfo 옵션을 꼭 추가해야 한다.
  --name my-vm \
  --ram 4096 \
  --vcpus 2 \
  --disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
  --graphics none \
  --network network=br-ex \
  --console pty,target.type=virtio \
  --autoconsole text

  
  
##
## CPU Pinning, Hugepages 설정이 필요해서 사용했던 명령.
##

$ virt-install --import \
  --name my-machine \
  --vcpus 4 \
## CPU Pinning  
  --cpuset=2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32 \
  --memory=4096 \
## Hugepages  
  --memorybacking hugepages=on \
  --numatune 0 \
  --disk /mydir/my-machine.qcow2 \
  --network bridge=my-br \
  --network bridge=ems-br \
  --os-variant rhel7.9 \
  --noautoconsole
  
  
  ##
  ## 주의:
  ##  아래 --osinfo, --os-variant 옵션을 사용하면 VM instance 생성할 때 오류가 발생한다.
  ##  꼭 필요한 옵션이 아니니까, 아래 2가지 옵션을 사용하지 않는 것이 좋다. (2023년 1월 현재)
  ##    --osinfo ubuntu22.04
  ##    --os-variant ubuntu22.04
  ##
  
  
  ##
  ## 주의:
  ##  VM instance 내부에서 OS 설치가 끝나고, 자동 reboot되어야 하는게 정상이지만
  ##  가끔 OS termination 단계에서 실패하고 멈춘 경우가 있다.
  ##  reboot 시도 후 30초 후에도 console 화면의 변화가 없다면
  ##  과감하게 VM instance destroy를 시도한다.  (아래 명령을 사용)
  ##  
  $  
  ##

 

위 `virt-install` 명령을 실행하면, 바로 아래 화면이 출력되고

이 화면에서 대략 55~60초 정도 기다려야 다음 설치 화면으로 넘어간다.

 

 

위 화면에서 대략 55~60초 정도 기다리면, 드디어 아래와 같이 OS 설치 시작 화면이 나온다.

 

 

비록 Text Terminal 이지만, 조금이라도 예쁜 설치 화면을 원하면 "rich mode"를 선택한다.

이후부터는 일반적인 Ubuntu OS 설치 절차와 같다.

 

 

 

 

 

 

Virtual Machine 목록 보기

$  virsh list --all
 Id   Name     State
-------------------------
 1    x-node   running
 -    am0      shut off
 -    aw0      shut off
 -    aw1      shut off
 $

 

 

Virtual Machine 기동하기

##
## am0 가상 머신을 기동하기
##

$  virsh start am0
Domain am0 started


##
## am0 가상 머신이 기동되었는지 확인하기
##

$  virsh list --all
 Id   Name     State
-------------------------
 1    x-node   running
 2    am0      running
 -    aw0      shut off
 -    aw1      shut off
$

 

 

Virtual Machine 종료하기

##
## Graceful Termination of VM instance
## (참고로, 아래 숫자 2는 VM의 ID이다)
##

$  virsh shutdown 2
Domain 2 is being shutdown

$


##
## VM instance 강제 종료
## (참고로, 아래 숫자 2는 VM의 ID이다)
##

$ virsh destroy 2


##
## VM instance 삭제하기
##
$ virsh undefine vm-name

 

 

Virtual Machine의  Console에 접속하기

$  virsh console x-node
Connected to domain x-node
Escape character is ^]

CentOS Linux 8
x-node login: root
Password: ......

[root@x-node ~]# _

 

 

qcow2 image file size 조정 (resize)

##
## 원하는 size로 vm image를 재조정할 수 있다.
## 최초에 작게 만들어진 volume image 용량을 더 크게 늘리기 위해서 사용한다.
##

$ qemu-img  resize  myvm.qcow2  100G


##
##  아래 명령과 같이 수행하여 기존 VM image에서 빈 공간을 제거하고 size를 줄일 수 있다.
##  보통 qcow2 파일을 다른 장비로 옮길 때, vm image size를 줄이기 위한 용도로 사용된다.
##  참고: 원본 qcow2 이미지 파일은 유지되므로 별도로 백업하지 않아도 된다.
 
$  qemu-img convert -O qcow2 source_image.qcow2 shrunk_image.qcow2


##
## volume image 정보를 열람한다.
##

$ qemu-img  info    myvm.qcow2

 

 

qcow2 image 파일 생성하기

##
## 만약 qcow2 type의 virtual volume을 만들고 싶다면 아래와 같이 명령을 수행.
## Volume size는 250GB로 지정했지만, 실제로는 qcow2 파일에 meta data만 생성하기 때문에
## 실제 사이느는 1MB 밖에 안 되고, 시간도 3초 정도 밖에 안 걸린다.
##

$  qemu-img  create  -f qcow2  my-virtual-volume.qcow2  250G

 

 

VM의 OS Type 전체 목록 열람하기

$  virt-install --osinfo list
...
ubuntu-lts-latest, ubuntu-stable-latest, ubuntu22.04, ubuntujammy
ubuntu21.10, ubuntuimpish
ubuntu21.04, ubuntuhirsute
ubuntu20.10, ubuntugroovy
ubuntu20.04, ubuntufocal
...
$

 

 

기존 VM instance에 disk 추가하기

$ virsh edit my-vm

... 중간 생략 ...

  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' discard='unmap'/>
      <source file='/var/lib/libvirt/images/my-vm-a.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </disk>
    ##
    ## FIXME: 이 부분을 추가한다.
    ##
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/opt/virtual_storage/vol_01.qcow2'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x09' slot='0x00' function='0x0'/>
    </disk>
    
... 중간 생략 ...

$ virsh reboot my-vm

## 또는 아래와 같이 hypervisor를 restart한다.

$ systemctl restart libvirt-bin

 

위 방식과 다르게 virt-install 명령으로 disk를 추가하여 VM instance를 재시작한다.

virt-install \
  --import \
  --name my-vm \
  --osinfo ubuntu22.04 \
  --ram 2048 \
  --vcpus 2 \
  --disk  /opt/virtual_machine/my-vm.qcow2 \
  --disk  /opt/virtual_machine/my-new-disk.qcow2 \
  --graphics none \
  --network network=br-ex \
  --console pty,target.type=virtio \
  --autoconsole text

 

 

 

 

 


 

 

##
## 채용 관련 글
##
제가 일하고 있는 기업 부설연구소에서 저와 같이 연구/개발할 동료를 찾고 있습니다.
(이곳은 개인 블로그라서 기업 이름은 기재하지 않겠습니다. E-mail로 문의주시면 자세한 정보를 공유하겠습니다.)

근무지 위치:
  서울시 서초구 서초동, 3호선 남부터미널역 근처 (전철역 출구에서 회사 입구까지 도보로 328m)
필요한 지식 (아래 내용 중에서 70% 정도를 미리 알고 있다면 빠르게 협업할 수 있음):
  - 운영체제 (학부 3~4학년 때, 컴퓨터공학 운영체제 과목에서 배운 지식 수준):
    예를 들어, Processor, Process 생성(Fork)/종료, Memory, 동시성, 병렬처리, OS kernel driver  
  - Linux OS에서 IPC 구현이 가능
    예를 들어, MSGQ, SHM, Named PIPE 등 활용하여 Process간 Comm.하는 기능 구현이 가능하면 됨. 
  - Algorithm(C언어, C++ 언어로 구현 가능해야 함)
    예를 들어, Hashtable, B-Tree, Qsort 정도를 C 또는 C++로 구현할 수 있을 정도 
  - Network 패킷 처리 지식(Layer 2 ~ 4, Layer 7)
    예를 들어, DHCP Server/Client의 주요 Feature를 구현할 정도의 능력이 있으면 됨.
  - Netfilter, eBPF 등 (IP packet hooking, ethernet packet 처리, UDP/TCP packet 처리)
  - IETF RFC 문서를 잘 읽고 이해하는 능력 ^^
  # 위에 열거한 내용 외에도 제가 여기 블로그에 적은 내용들이 대부분 업무하면서 관련이 있는 주제를 기록한 것이라서
  # 이 블로그에 있는 내용들을 잘 알고 있다면, 저희 연구소에 와서 연구/개발 업무를 수행함에 있어서 어려움이 없을 겁니다.
회사에서 사용하는 프로그래밍 언어:
  - 프로그래밍 언어: C, C++, Go
    (참고: 아직 연구소 동료들이 Rust를 사용하진 않습니다만, 새 언어로써 Rust를 사용하는 것을 고려하는 중)
근무 시간:
  - 출근: 8~10시 사이에서 자유롭게 선택
  - 퇴근: 8시간 근무 후 퇴근 (오후 5시 ~ 7시 사이)
  - 야근 여부: 거의 없음 (내 경우, 올해 상반기 6개월간 7시 이후에 퇴근한 경우가 2회 있었음)
  - 회식 여부: 자유 (1년에 2회 정도 회식하는데, 본인이 집에 가고 싶으면 회식에 안 감. 왜 참석 안 하는지 묻지도 않음)
외근 여부:
  - 신규 프로젝트 멤버 -> 외근 전혀 하지 않음 (나는 신규 프로젝트만 참여해서 지난 1년 동안 한번도 외근 없었음)
  - 상용 프로젝트 멤버 -> 1년에 5회 미만 정도로 외근
팀 워크샵 여부:
  - 팀 워크샵 자체를 진행하지 않음. (워크샵 참석하는 거 싫어하는 개발자 환영 ^^)
연락처:
  - "sejong.jeonjo@gmail.com"  # 궁금한 점은 이 연락처로 문의주세요.
  - 블로그 비밀 댓글 (제가 하루에 한번씩 댓글 확인하고 있음)
원하는 인재상:
  - 우리 부설연구소는 "긴 호흡으로 프로젝트를 진행"하기 때문에 최소 2년간 한 가지 주제를 꾸준하게 연구/개발할 수 있는 개발자를 원함.
  - 우리 부설연구소는 자주적으로 연구 주제를 찾아서 업무를 하기 때문에 능동적으로 생각하고 행동하는 동료를 원함.
  - 차분하게 연구 주제에 몰입하고, 해법을 찾는 것을 즐기는 사람.
내가 느끼는 우리 연구소의 장점:
  - 갑/을 관계가 없음. (제가 근무하고 있는 연구소는 SI업종이 아니라서 갑/을 회사 개념이 없음)
  - 연구소 자체적으로 연구 주제를 발굴하고 시스템을 개발하기 때문에 개발 일정에 대한 스트레스가 적음
  - 빌딩 전체를 우리 회사가 사용하므로 분위기가 산만하지 않음.
  - 근처에 예술의전당, 우면산 둘레길이 있어서 점심 시간에 산책하기 좋음 ^^
  - 연구소 동료들 매너가 Good (2년간 일하면서 한번도 감정에 스크레치 생기거나 얼굴 붉히며 싸운 적 없음 ^^)
반응형
작성일: 2024년 3월 13일

 

 

CLI 명령 환경 vs. GUI  환경 비교

QEMU/KVM이 돌아가는 Baremetal machine(또는 Host machine)이 GNOME 같은 GUI Desktop 환경이 아닌 경우에는

  1)  QEMU/KVM 서버에 SSH 연결해서

  2)  터미널에서 virsh 명령을 이용해서 VM instance를 기동, 종료, 조회 작업을 해야 한다.

 

virsh CLI 명령에 익숙해지면 어려운 점은 없는데, CPU Memory 통계를 보거나 각종 VM instance의 가상 HW 리소스를 볼 때는

GUI 환경의 Virtual Machine Manager가 편한다.

 

간단하게 아래 화면을 비교해보자 !   어느 것이 더 사용하기 편하겠는가?

 

GUI 환경의 Virtual Machine Manager vs.&nbsp; 터미널 환경의 virsh 명령

 

 


 

Ubuntu 22.04에 Virtual Machine Manager(virt-manager)를 설치하는 절차

 

 

준비 작업: SSH 접속 가능 여부 확인 (필수)

아래와 같이 QEMU/KVM이 설치된 서버에 SSH 접속이 되는지 꼭 확인해야 한다.

아래  SSH 접속에서 중요한 점은 "list of known hosts"에 [my-host.com]을 추가하는 과정이다.

SSH 접속만 잘 된다면, "list of know hosts"에 my-host.com이 잘 추가되었다고 생각하면 된다.

 

[My-PC] $ ssh -p 22678 root@my-host.com

The authenticity of host '[my-host.com]:22678 ([233.52.11.184]:22678)' can't be established.
ED25519 key fingerprint is SHA256:YBk..........................Kg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added '[my-host.com]:22678' (ED25519) to the list of known hosts.

[my-host.com] $

 

 

Virtual Machine Manager 원격 접속 설정하기

Virtual Machine Manager의 원격 접속을 설정하는 방법은 아래와 같다.

(그냥 예제 화면을 보면서 따라하면 된다)

 

아래 [ Virtual Machine Manager ] 화면에서 [ File ] -> [ Add Connection... ] 메뉴를 선택한다.

 

 

 

[ Add Connection ] 창이 열리면, 각 설정 항목에 값을 입력한다.

  - Hypervisor: QEMU/KVM 을 입력  (특별한 경우가 아니라면, 이 값을 선택하자)

  - Username:  root   (특별한 경우가 아니라면, root 계정을 사용하자)

  - Hostname:  my-host.com:22678  (각자의 인터넷 주소를 사용하자. 왼쪽 22678은 SSH 포트 번호를 의미한다.)

 

 

 

위 화면에서 설정이 끝나면, [ Connect ] 버튼을 누른다.

아래와 같이 원격지 Host machine의 QEMU(KVM)에 연결된 것을 볼 수 있을 것이다.

 

 

 

 

초기 설정에서 주의할 점  (FAQ)

만약 [Virtual Machine Manager]가 QEMU/KVM 서버로 Connect 실패한다면, 

위 "준비 작업"에서 설명한 서버 쪽에 SSH 접속을 한번 해주어야 한다.

SSH 터미널을 열 때, 경고 메시지가 한번 나오는데 여기서 Yes를 입력해주어야 위 GUI가 잘 연결된다.

 

.

.

.

.

.


 

 

macOS에 Virtual Machine Manager(virt-manager)를 설치하는 절차

 

 

대부분 설정하는 과정은 Ubuntu 22.04와 macOS가 비슷하고,
설치하는 명령(brew vs. apt)만 다르다.
따라서 Ubuntu 22.04에서 동일하게 설정했던 내용은 생략하고, 다른 점만 기술하겠다.

 

 

준비 작업: SSH 접속 가능 여부 확인 (필수)

아래와 같이 내 Macbook(또는 Mac Mini)에서 QEMU/KVM이 설치된 서버에 SSH 접속이 되는지 꼭 확인해야 한다.

아래  SSH 접속에서 중요한 점은 "list of known hosts"에 [my-host.com]을 추가하는 과정이다.

SSH 접속만 잘 된다면, "list of know hosts"에 my-host.com이 잘 추가되었다고 생각하면 된다.

 

[My-Macbook] $ ssh -p 22678 root@my-host.com

The authenticity of host '[my-host.com]:22678 ([233.52.11.184]:22678)' can't be established.
ED25519 key fingerprint is SHA256:YBk..........................Kg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added '[my-host.com]:22678' (ED25519) to the list of known hosts.

[my-host.com] $

 

 

virt-manager 설치하기

참고 매뉴얼: https://formulae.brew.sh/formula/virt-manager

$ brew install virt-manager

 

 

virt-manager 기동하기 (실행하기)

Ubuntu 22.04와 가장 크게 다른 점이 이 부분이다.

Ubuntu 22.04에서는 [Virtual Machine Manager] 실행 아이콘을 찾아서 클릭하면 virt-manager 프로세스가 기동되지만,

macOS에서는 아래와 같이 옵션을 붙여서 실행해줘야 한다.

$ virt-manager -c "qemu:///session" --no-fork

 

아래와 같이 [Virtual Machine Manager]가 구동될 것이다.

 

macOS에서 구동된 Virtual Machine Manager

 

 

참고: 나머지 virt-manager GUI에서 QEMU/KVM 원격 접속 설정하는 절차는 Ubuntu 22.04와 동일하므로 생략함.
         원격 접속 설정까지 마무리하면, 아래와 같이 전체 VM instance list가 보인다.

 

 

macOS에서 구동된 Virtual Machine Manager

 


 

반응형
작성일: 2024년 2월 16일

 

VirtualBox가 돌아가는 Linux Baremetal 장비에 Desktop GUI를 사용할 수 없는 경우가 있다.

그런 경우는 VirtualBox CLI(명령행 인터페이스)를 이용하여 VM을 관리해야 한다.

VirtualBox CLI에 관해 자세한 내용을 확인하고 싶다면, 아래 Oracle VirtualBox 공식 메뉴얼을 읽는 것을 추천한다.

 

    [ 참고 문서: Controlling VirtualBox from the Command Line ]

    https://www.oracle.com/technical-resources/articles/it-infrastructure/admin-manage-vbox-cli.html

 

내가 자주 사용하는 VBoxManage CLI 명령만 추려 보면 아래와 같다.

 

##
## 전체 VM instance 리스트를 보기
##   (참고: Shutdown 상태의 VM까지 모두 보여준다.)
##
$ VBoxManage list vms
"MyExampleVM" {e8904c82-aaaa-bbbb-cccc-dddddbcb0f3}
"SejongVM"    {e8904c82-aaaa-bbbb-cccc-dddddbcb0f5}
"JeonjoVM"    {e8904c82-aaaa-bbbb-cccc-dddddbcb0f7}


$ VBoxManage list vms -l   ## 상세 정보를 보기
... 출력 내용 생략 ...

##
## 현재 동작하고 있는 전체 VM instance 리스트를 보기
##
$ VBoxManage list runningvms
"MyExampleVM" {e8904c82-aaaa-bbbb-cccc-dddddbcb0f3}
"SejongVM"    {e8904c82-aaaa-bbbb-cccc-dddddbcb0f5}


##
## 특정 VM instance에 대한 상세한 정보를 보기
##
$ VBoxManage showvminfo MyExampleVM


##
## 새로운 VM instance 생성하기
##
$ VBoxManage list ostypes    ## VirtualBox가 제공하는 OS Type 목록을 보여준다.
ID:          OpenSUSE_64
Description: openSUSE (64-bit)
Family ID:   Linux
Family Desc: Linux
64 bit:      true

ID:          Ubuntu_64
Description: Ubuntu (64-bit)
Family ID:   Linux
Family Desc: Linux
64 bit:      true
... 이하 생략 ...


$ VBoxManage createvm  --name MyNewUbuntuVM --ostype Ubuntu_64 --register
... 출력 내용 생략 ...


##
## VM Properties 설정하기
##
$ VBoxManage modifyvm  MyNewUbuntuVM --cpus 2 --memory 2048 --vram 12


##
## Virtual Network Adapter 설정하기
##
$ VBoxManage modifyvm  MyNewUbuntuVM --nic1 bridged --bridgeadapter1 eth0


##
## VM instance를 구동하기
##
$ VBoxManage startvm  MyNewUbuntuVM
또는
$ VBoxManage startvm  MyNewUbuntuVM --type headless   ## 화면으로 출력되는게 없도록 VM 구동


##
## VM instance를 강제 종료하기
##
$ VBoxManage controlvm  MyNewUbuntuVM  poweroff

 

 

 


 

반응형

 


 

작성일: 2023년 9월 15일

 

South Carolina 대학의 'Open Virtual Switch Lab Series' 문서를 바탕으로 내가 실습한 내용을 이곳에 정리함.
( Network namespace 개념부터 차곡차곡 쌓아 올리면서 Open vSwitch Use Case를 설명하기 때문에 공부하는 사람에게 많은 도움이 된다 )

참고 문서:
    [ 링크 클릭 ]  OVS 실습 문서 (Open Virtual Switch Lab Series, 2021년 09월 30일)
    [ 링크 클릭 ]  OVS 개념 및 구성 소개 [ Link ]

 

 

 

 


 

 

Linux namespaces 간 Networking 위해 Open vSwitch 구성

원본:

OVS - Linux namespace and Open vSwitch.pdf
2.13MB

 

 

 

[개념 그림] Open vSwitch와 각 Namespace 간 Networking

 

아래 그림을 기반으로 Open vSwitch와 Namespace를 구성하여 테스트한다.

위 그림에 묘사된 것과 같이 Network를 구성하기 위해 아래 명령을 작성했다. (따라해보면 위 그림과 똑같은 Network 만들어진다)

 

## root namespace에 존재하는 모든 network interface를 조회
$ ip link

## 네임스페이스 my-ns-a, my-ns-b 를 생성
$ ip netns add my-ns-a
$ ip netns add my-ns-b

## Linux kernel에 존재하는 모든 namespace 조회
$ ip netns
my-ns-b
my-ns-a

## 'my-ns-a' 네임스페이스에 존재하는 network interface 조회
$ ip netns exec my-ns-a ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

## 가상 스위치 'sw1'를 생성
$ ovs-vsctl add-br sw1

## root namespace에 존재하는 network interface를 조회
$ ip link
... 중간 생략 ...
47: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 86:3d:02:69:23:4f brd ff:ff:ff:ff:ff:ff
48: sw1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 16:68:07:5d:c0:40 brd ff:ff:ff:ff:ff:ff

## Open vSwitch에 namespace를 연결하기
##  1) veth peer 생성하기
$ ip link add my-ns-a-eth0 type veth peer name sw1-eth1

$ ip link add my-ns-b-eth0 type veth peer name sw1-eth2

$ ip link
... 중간 생략 ...
47: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 86:3d:02:69:23:4f brd ff:ff:ff:ff:ff:ff
48: sw1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 16:68:07:5d:c0:40 brd ff:ff:ff:ff:ff:ff
51: sw1-eth1@my-ns-a-eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether be:01:52:6f:4b:58 brd ff:ff:ff:ff:ff:ff
52: my-ns-a-eth0@sw1-eth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 96:24:a4:bf:78:f3 brd ff:ff:ff:ff:ff:ff
53: sw1-eth2@my-ns-b-eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 46:d4:ad:57:18:20 brd ff:ff:ff:ff:ff:ff
54: my-ns-b-eth0@sw1-eth2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 2a:78:4d:57:db:37 brd ff:ff:ff:ff:ff:ff

##  2) veth peer를 각각의 namepace에 연결하기 (Attaching to namespaces)
$ ip link set my-ns-a-eth0 netns my-ns-a

$ ip link set my-ns-b-eth0 netns my-ns-b

$ ip netns exec my-ns-a ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
52: my-ns-a-eth0@if51: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 96:24:a4:bf:78:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 0

$ ip netns exec my-ns-b ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
54: my-ns-b-eth0@if53: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 2a:78:4d:57:db:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0


##  3) 가상 스위치 sw1에 veth peer를 연결하기 (Attaching veth peer to switch sw1) 
$ ovs-vsctl add-port sw1 sw1-eth1

$ ovs-vsctl show
...
    Bridge sw1
        Port sw1
            Interface sw1
                type: internal
        Port sw1-eth1
            Interface sw1-eth1
...

$ ovs-vsctl add-port sw1 sw1-eth2

$ ovs-vsctl show
...
    Bridge sw1
        Port sw1
            Interface sw1
                type: internal
        Port sw1-eth2
            Interface sw1-eth2
        Port sw1-eth1
            Interface sw1-eth1
...


## 가상 스위치의 network port를 activate 하기. (Turning up the network port)
$ ip link set sw1-eth1 up

$ ip link set sw1-eth2 up

$ ip link 
...
51: sw1-eth1@if52: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue master ovs-system state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
    link/ether be:01:52:6f:4b:58 brd ff:ff:ff:ff:ff:ff link-netns my-ns-a
53: sw1-eth2@if54: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue master ovs-system state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
    link/ether 46:d4:ad:57:18:20 brd ff:ff:ff:ff:ff:ff link-netns my-ns-b
...

## 각각의 namespace에 IP address를 할당하기
$ ip netns exec my-ns-a ip link set dev my-ns-a-eth0 up

$ ip netns exec my-ns-b ip link set dev my-ns-b-eth0 up

$ ip netns exec my-ns-a ip address add 192.168.1.10/24 dev my-ns-a-eth0

$ ip netns exec my-ns-b ip address add 192.168.1.20/24 dev my-ns-b-eth0

## 설정 정보 확인하기
$ ip netns exec my-ns-a ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
52: my-ns-a-eth0@if51: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 96:24:a4:bf:78:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.10/24 scope global my-ns-a-eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9424:a4ff:febf:78f3/64 scope link
       valid_lft forever preferred_lft forever

$ ip netns exec my-ns-b ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
54: my-ns-b-eth0@if53: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 2a:78:4d:57:db:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.20/24 scope global my-ns-b-eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::2878:4dff:fe57:db37/64 scope link
       valid_lft forever preferred_lft forever

## namespace 'my-ns-a'의 routing table 확인하기
$ ip netns exec my-ns-a ip route
192.168.1.0/24 dev my-ns-a-eth0 proto kernel scope link src 192.168.1.10

## namespace 'my-ns-b'의 routing table 확인하기
$ ip netns exec my-ns-b ip route
192.168.1.0/24 dev my-ns-b-eth0 proto kernel scope link src 192.168.1.20

## namespace 'my-ns-a'에서 bash shell 시작하기
$ ip netns exec my-ns-a bash

$ ifconfig
my-ns-a-eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::9424:a4ff:febf:78f3  prefixlen 64  scopeid 0x20<link>
        ether 96:24:a4:bf:78:f3  txqueuelen 1000  (Ethernet)
        RX packets 86  bytes 21517 (21.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1006 (1.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ ping 192.168.1.20 -c 2
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.079 ms

--- 192.168.1.20 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1007ms
rtt min/avg/max/mdev = 0.079/0.083/0.088/0.004 ms

$ traceroute 192.168.1.20
traceroute to 192.168.1.20 (192.168.1.20), 64 hops max
  1   192.168.1.20  0.452ms  0.003ms  0.002ms

 

 

 


 

반응형

 

HP DL-380, DL-580 또는 Dell PowerEdge 장비처럼 network port가 4~10개가 넘는 경우

Network 물리 포트와 OS에 할당된 Network port 이름간 관계를 찾기가 어렵다.

 

이럴 때, ethtool 명령으로 특정 포트 이름의 물리 포트가 어떤 것인지 찾을 수 있다.

예를 들어, 아래처럼 명령을 수행하면 eth0 포트에 해당하는 물리 포트의 램프가 아주 빠르게 깜빡깜빡거린다.

 

 

##
## eth0 포트의 램프를 깜빡거리게 한다.
##

$  ethtool -p eth0
^C


##
## eno2 포트의 램프를 깜빡거리게 한다.
##

$  ethtool -p eno2
^C

 

반응형

 


 

명령어(CLI)로 조회하기

## 방법 A-1
$ curl ipinfo.io
{
  "ip": "211.33.55.12",
  "city": "Yongsan-dong",
  "region": "Seoul",
  "country": "KR",
  "loc": "37.5032,126.9989",
  "org": "AS3786 LG DACOM Corporation",
  "postal": "06547",
  "timezone": "Asia/Seoul",
  "readme": "https://ipinfo.io/missingauth"
}


## 방법 A-2
$ curl ipinfo.io/ip
211.33.55.12


## ----------------------------------------------------------------

## 방법 B
$  dig -6 TXT +short o-o.myaddr.l.google.com @ns1.google.com
"211.33.55.12"

 

 

웹 브라우저로 조회하기

https://www.whatismyip.com/

 

What Is My IP? Shows Your Public IP Address - IPv4 - IPv6

See the IP address assigned to your device. Show my IP city, state, and country. What Is An IP Address? IPv4, IPv6, public IP explained.

www.whatismyip.com

 


 

 

반응형

 


 

테스트한 날짜:  2024년 2월 20일
테스트에 사용한 OS: Ubuntu 22.04

 

Linux 장비를 PPTP Client로 사용하기 위한 방법

Client 입장에서 Linux PC를 PPTP 서버와 GRE Tunnel을 생성하는 방법이다.

 

전제 조건:
    아래 PPTP Client 예제를 수행하기 전에 PPTP 서버가 이미 구성되어 있어야 한다. 
    IPTIME 같은 인터넷 공유기에 PPTP 서버 기능이 있으니까, 쉽게 테스트하려면 IPTIME 공유기를 이용하는 것이 좋다.

 

잠깐 !!
Linux 장비(Ubuntu 22.04)에 PPTP Server를 구축할 계획이라면, 아래 문서를 참고하기 !

 

       https://andrewpage.tistory.com/361

 

##########################################################
## Client Linux OS에서 아래의 명령을 수행
##########################################################

##########################################################
## pptp 관련 패키지를 설치한다.
##########################################################
$  sudo apt install pptp-linux


##########################################################
## /etc/ppp/options 파일을 편집한다.
##########################################################
$  cat  /etc/ppp/options

lock
noauth
nobsdcomp
nodeflate
refuse-pap
refuse-eap
refuse-chap
refuse-mschap
mtu 1400

$

##########################################################
## /etc/ppp/chap-secrets 파일을 편집한다.
##########################################################
$  cat  /etc/ppp/chap-secrets

sejong  PPTP  "my-password" *

$

##########################################################
##  /etc/ppp/peers/sejong 파일을 편집한다.
##########################################################
$  cat  /etc/ppp/peers/sejong

pty "pptp 55.123.12.123 --nolaunchpppd"
name sejong
remotename PPTP
file /etc/ppp/options
ipparam sejong




##########################################################
## << 참고:  이 작업은 필요한 경우만 할 것 !!! >>
##
## 이 내용은 꼭 필요한 것은 아닌데, ppp0 tunnel port가 생성되고 IP address가 설정되고 나서
## static routing table에 추가하고 싶은 내용이 있다면, 
## 아래와 같이 ip-up 파일에 route 명령을 추가한다. 
## (이렇게 하는 것이 정석적 방법인지는 모르겠다.  일단, 나는 이렇게 사용하고 있다.)
##########################################################
$  cat  /etc/ppp/ip-up

... (중간 생략) ...
ip route add 192.168.0.0/24 dev ppp0    # <-- 나는 이 내용을 추가했다.

$


##########################################################
## 이제 설정 작업은 모두 끝났다. pon 명령을 실행하면 잘 동작할 것이다. ^^
##########################################################

##########################################################
## 위에서 설정한 파일을 이용하여 PPTP 서버와 GRE 터널을 만든다.
## 참고로 pon 명령은 "ppp on"을 줄인 말이다.
##########################################################
$  pon  sejong  debug  dump  logfd 2  nodetach

...
...
local  IP address 192.168.0.220
remote IP address 192.168.0.1
Script /etc/ppp/ip-up started (pid 14290)
Script /etc/ppp/ip-up finished (pid 14290), status = 0x0

 

참고로, 위 pon 명령을 수행하면 명령행 prompt가 출력되지 않는다.
왜냐하면 pon 명령이 백그라운드로 동작하는 것이 아니기 때문에 pod 명령을 수행한 터미널은 이 상태로 두고,
다른 터미널을 하나 더 열어서 작업해야 한다.
새 터미널에서 아래와 같이 VPN 서버 쪽으로 ping을 보내본다.

 

$  ping 192.168.0.1

ing 192.168.0.1 -c 1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=4.45 ms

--- 192.168.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 4.448/4.448/4.448/0.000 ms

$

 

 


 

PPTP 및 GRE Tunnel 설정 관련 문서

 

 

PPTP Client - ArchWiki

pptpclient is a program implementing the Microsoft PPTP protocol. As such, it can be used to connect to a Microsoft VPN network (or any PPTP-based VPN) provided by a school or workplace. Installation Install the pptpclient package. Configure To configure p

wiki.archlinux.org

 

 


 

반응형

Ubuntu 22.04에서는 VPN 설정하는 것이 아주 쉽다.

아래의 Network Setting 화면에서 [ VPN ] 항목 옆에 있는 + 버튼을 누르고 VPN  Server 정보를 입력하기만 하면 끝이다.

 

 

 

 

위와 같이 설정하고, VPN 연결을 활성화하는 버튼을 누른다.

 

 

 

그런데 VPN 연결을 몇시간 사용하다보면, 간혹 모르는 사이에 끊어지는 경우가 있다.

그런 경우 아래와 같은 nmcli CLI 명령을 crontab에 추가하고 1시간 간격으로 자동 실행하도록 하면 편하다.

 

$  nmcli con up id "VPN1"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/24)
$

 

 

알아두면 좋은 명령어 예시

 

##
## VPN 연결 정보 조회
##

$  nmcli con
NAME                UUID                                  TYPE       DEVICE      
VPN1                b0838d77-ae82-4573-a15b-fba0f8884594  vpn        enp4s0      
Wired connection 1  bef5ca16-baca-35e4-8259-e5dbbacbe1c0  ethernet   enp4s0      
$


$  nmcli con down id VPN1

+ Recent posts