Tagged: Linux

Spring boot 에 systemd 유닛 만들기

요즘 프로젝트를 하고 있는데, 역시나 자바 시스템이 있다. Spring Boot3 을 사용하고 있고 자바 17을 쓰는등 나름대로 괜찮은 환경에서 개발이 이루어지고 있다. 그런데, 이것을 서버에서 배포를 하고 Spring Boot 를 실행해야 하는데, 어떻게 하나 봤더니 초보자 수준도 못 벗어나는 설정을 하고 있으니… 안타까운 마음에 어떻게 하는 것이 좋은 것인지 한번 적어봤다.

Spring boot, jar 실행 파일

Spring Boot3 를 컴파일 하면 jar 파일 나온다. 그리고 별다른 서버 없이도 바로 실행하고 접속이 가능해 진다. 한가지 재미있는 사실은 많은 사람들이 Spring boot3 에 실행 파일 jar 이 내장된 WAS 서버가 구동되면서 실행된다는 걸 모른다는 거다. 심지여 그것이 Tomcat 이라는 것도. 물론 어떤 프로그래밍 모델인지에 따라서 Tomcat 이 되기도 하고 Netty 되기도 하지만, 과연 Reactive Programming Model 로 짜는 사람이 몇이나 있나 싶다. 대부분 Spring MVC 이고 Servlet 이면 기본적으로 Tomcat 이 구동된다. 내장형 Tomcat

프로젝트에서 쓰는 방법

현재 프로젝트에서는 jar 실행을 위해서 스크립트 파일을 만들었다. 대략 다음과 같다.

자바 옵션인 -D 옵션과 jar 실행 파일을 인자로 주고 있다. 그런데, 특이하게도 데몬화를 하지 않았고 많은 초보자식 설정인 nohup 도 없다. 이렇게되면 프로그램이 포그라운드(Foreground) 실행이되어서 쉘이 묶이게 된다.

어떻게 했지? 봤더니 systemd 에 이 실행파일을 넣고 systemd 를 통해서 시작/중지를 하고 있었다. 다음과 같다.

‘ExecStart=’ 에 쉘 스크립트 실행 파일을 지정해 주고 있다.

왜 이렇게 해야 하나? 왜? 이해 할 수 없는 구조다.

Spring 공식 문서

Systemd 유닛에 등록하는 방법은 Spring 공식문서에도 나와 있다.

57.1.2 Installation as a systemd service

이 문서에 나온 systemd 유닛 파일은 프로젝트 유닛 파일과 다르다. 공식 문서에 내용은 그냥 아주 기초적인 내용만 적혀 있다. 실제 프로젝트에 적용하기에는 무리가 있다.

설정파일 작성

Spring boot 를 위한 설정을 systemd 유닛에서 사용할 수 있는 별도의 파일로 작성한다. 이 설정은 JAVA_OPTS 의 내용을 담으면 된다.

이것을 이제 systemd 에서 사용하면 다음과 같다.

공식문서에 나와 있는 내용과 EnvironmentFile 속성으로 외부에서 JAVA_OPTS 를 지정한 내용을 읽어오도록 하면 충분히 사용가능해 진다.

프로젝트에서 처럼 스크립트로 한번 감싸고 이것을 다시 systemd 유닛에서 실행되도록 할 필요가 없다는 것이다.

몇가지 개선 설정

공식문서는 간단한 예이다. 실행이 가능한 정도의 유닛 파일일 뿐이다. systemd 를 이용해 자바 애플리케이션을 실행할 때에는 여러가지를 고려해야 한다.

일단 자바 애플리케이션은 네트워크를 기반으로 한다. 따라서 네트워크 온라인 상태여야 한다. 또, StdOut, StdErr 를 Journal 로 내보내도록 해야 한다.

node_exporter 설치하기

node_exporter 는 OS 에 대한 각종 지표를 수집해주는 exporter 다. Prometheus 가 읽어 갈수 있도록 작은 웹서버로 작동된다.

설치야 바이너리로 배포를 하기 때문에 아키텍쳐에 맞게 다운받아서 설치를 하면 된다. 압축 풀고 시작하면 그만일 정도로 아주 간단하다. Prometheus 에 exporter들은 대부분 간단하다. 복잡하게 설치하지는 않는다.

그런데… 고려해야하는 부분이 존재한다. 일단, 설치부터…

Download & Install

다운로드는 Github 저장소에 받으면 된다.

node_exporter 디렉토리가 보이고 그 안에 node_exporter 바이너파일이 있다. 이것을 적당한 곳으로 이동시키놓으면 끝난다.

어떻게 시작/중지 할건지…

여기서 이제 고민을 해야한다. 많은 사람들은 이것을 쉘 스크립트와 nohup 을 사용하는 사람들이 있다. 어느 시대에 살고 있는 사람들인지 의심이 될 정도인데, 이제는 init script 도 다 없어질 만큼 대부분의 배포판들이 systemd 로 다 전환이 완료된 상태다.

그러면 당연히 systemd 로 하면 되지! 하지만 여기서 문제가 된다.

현재 systemd 는 지속적으로 지금도 버전업이 되고 있다. 그러다보니 특정 버전을 기준으로 특정 기능이 지원이되고 안되고가 갈리게 된다.

systemd 버전 240 …. (대체 어떻게 버전 관리를.. 어떻게 기능을 많이 집어넣었으면 버전이 240 이여.. -_-;; ) 왠만하면 systemd 버전 240 이상을 사용할 것을 권한다. 그런데, 이게 말처럼,, 240버전을 써라~~ 한다고 되는게 아니다.

systemd 는 리눅스 시스템의 뼈대라고 보면된다. 핵심중에 핵심! 그러다보니 systemd 는 배포판과 함께 제공되고 묶여 있다. 240버전을 쓰고 싶다면 240버전을 가진 배포판을 써야 한다는 뜻이 된다.

  • Ubuntu 22.04: 249.11-0ubuntu3.12
  • RHEL 8.10: 239-82.el8_10.1

이런 저런 사유로 배포판을 선택하고 거기다 버전을 선택하게 된다. 내가 하고 있는 프로젝트에서는 CentOS, RHEL 7.9 가 대부분이고 RHEL 8 은 최신형으로 취급하는데.. systemd 만 놓고 보면 RHEL 8 도 그다지 마음에 들지 않는 부분이다.

개인적으로 RHEL 8 도 이제는 끝물이다. RHEL 9 의 버전이 이제는 벌써 9.3을 벗어나고 있기 때문에 이제는 RHEL 9 로가야 한다.

아무튼, 말이 길었는데, systemd 유닛으로 만들어 보자..

일단, node_exporter 에는 많은 옵션들이 있다. Prometheus exporter 들이 많은 옵션들을 제공한다. 이러한 옵션들은 별도의 파일로 작성하고 쉘 변수로 만들어 두고 systemd 유닛에서 읽어들이도록 하면 된다.

/etc/sysconfig/node_exporter 파일에 다음과 같이 내용을 적어준다.

/etc/sysconfig/node_exporter 는 RedHat 기반에 적합하다. Ubuntu 면 /etc/sysconfig 디렉토리가 없기 때문에 Ubuntu 레이아웃에 맞는 곳에 넣으면 된다.

systemd 유닛 파일은 별거 없다.

딱 보면 별거 없다….. 하지만,,, 240 이하에서는 출력되는 로그들… 일명 Standard Out 들을 어떻게 처리할까? 그냥 이대로 둬도 되나? 결론은 되긴 한다. 이렇게 그대로 두면 node_exporter 가 뭔가를 출력하면 stdout, stderr 로 내보낸다. 그러면 systemd 는 이것을 /var/log/syslog 파일에 기록하게 된다.

하지만, systemd 로 변경되면서 나온 journal 에 기록을 하고 싶을지도 모른다. 이왕이면 그렇게하는게 좋기도 하다. 그래서 다음과 같이 [Service] 세션에 StandardOutput 옵션을 준다.

콘솔에도 출력을…. 뭐.. 이건 옵션이다. 여기서 systemd 버전에 따라서 파일에 redirect 가 가능하기도 하고 불가능하기도 하다. StandardOutput 에 옵션이 inherit, null, tty, journal, kmsg, journal+console, kmsg+console, file:path, append:path, truncate:path 이렇게 되어 있다. 이게 다 가능한게 아니다. 버전에 따라서 가능하기도 하고 불가능하기도 하다.

Systemd 버전

새로운 배포판에 따라서 systemd 의 버전이 달라진다. 문제는 대부분 systemd 버전이 특정 시점까지만 업데이트가 된다. 시스템에 뼈대이다 보니 확 갈아 엎을 수 없는 것이여서 그럴거다.

이러다보니 특정 기능을 탐이 나는 때가 있는데, OS 를 다 갈아 엎어야하는 고충이 있다. 그래서 이왕이면 새로운 시스템을 구축할때에는 왠만하면 최신판을 쓰는게 좋다. Ubuntu 라면 24.04, RedHat 이면 9.0 을 사용하길 권한다.

Running a arm64 of guest on x86_64 host via kvm

최근들어 arm64 아키텍쳐가 인기가 많아졌다. 애플의 실리콘 반도체라고 불리는것도 arm64 기반이며 Windows 11 도 arm64 에서도 작동된다. 리눅스는 오래전부터 다양한 아키텍쳐로 포팅이되었기 때문에 arm64 를 위한 배포판도 다양하게 존재한다. 문제는 arm64 아키텍쳐를 경험하기 위해서 arm64 하드웨어가 있어야 했지만, 이제는 x86_64 기반의 가상머신을 이용하면 arm64 아키텍쳐를 게스트로 운영할 수 있다.

이 문서는 x86_64 기반 가상머신에서 arm64 아키텍쳐기반의 게스트를 실행하는 방법에 대해서 기술한 것이다.

x86_64 가상머신

x86_64 아키텍쳐 기반의 가상머신으로 리눅스 운영체제를 기반으로 KVM 을 활용하고 있다. GUI 툴로서 virt-manager, CLI 로는 virsh 를 활용해서 간단하게 게스트를 생성하고 운영하고 있다. arm64 아키텍쳐 게스트를 운영하기 위한 호스트로서 x86_64 아키텍쳐 기반 가상머신 스펙은 다음과 같다.

  • OS: Ubuntu 22.04
  • Kernel: 5.15.0-207.156.6.el9uek.x86_64
  • CPU: AMD Ryzen 7 2700X Eight-Core Processor

libvirt vs QEMU

arm64 아키텍쳐기반 게스트를 운영하기 위해서는 QEMU 를 사용해야 한다. QEMU 는 가상머신 에뮬레이터라고 생각하면 된다. 문제는 QEMU 는 CLI 기반만 제공한다.

반면에 libvirt 는 KVM/QEMU 등을 지원하는 일종의 핸들러 라이브러리고 생각하면 된다. libvirt 를 이용하면 xml 기반으로 게스트 관련 가상머신 스펙을 정의할 수 있으며 virt-manager 와같은 GUI 툴도 활용할 수 있다.

QEMU 에뮬레이터라고 했기 때문에 arm64 를 위한 QEMU 에뮬레이터를 설치하면 arm64 기반 게스트 운영체제를 운영할 수 있다. 다음과 같이 arm64 를 위한 QEMU 에뮬레이터를 설치해준다.

위 패키지를 설치가 완료되면 다음과 같이 virt-manager 에서 게스트를 생성할때에 Architecture options 이 생긴다.

qemu-system-arm 패키지 설치후 virt-manager 에서 Architecture options 이 나타난다.

arm64 를 위한 지원 파일 생성(Optional)

Ubuntu22.04 에서는 이 과정이 필요하지 않다.

arm64 게스트 실행을 위해서 파일이 필요하다. 첫번째로 NVRAM 변수들을 저장하기 위한 플래쉬 볼륨(Flash volume) 을 생성해야 한다.

두번째로 ARM UEFI 펌웨어 파일이 필요하다.

이제 필요한 사항은 모두 갖춰졌다.

Amazon Linux Arm64 이미지 실행

처음부터 Arm64 기반 OS 를 게스트로 설치하면서 생성할 수도 있다. 하지만 이미 있는 Arm64 기반 OS를 가져다 쓸 수도 있다. 여기서는 Amazon Linux 를 가져다 사용해 보도록 하겠다.

Amazon Linux 는 Amazon 이 AWS 서비스에서 사용할 목적으로 만든 배포판이다. 현재 Amazon Linux2 와 Amazon Linux3 등 다양한 버전을 제공한다. 최근 프로젝트가 Amazon Linux2 를 많이 사용하고 있어서 Amazon Linux2 Arm64 기반 OS 이미지를 게스트로 한번 실행 보도록 하겠다.

Amazon Linux2 는 다음과같이 다운로드 할 수 있다. 이미지 파일은  Amazon Linux 2 virtual machine images 에서 찾을 수 있다.

seed.iso 만들기

Amazon Linux2 는 기본적으로 ec2-user 라는 시스템 계정이 있으며, 로그인을 위해 패스워드 방식이 아닌 SSH 인증키 방식을 사용한다. 하지만 배포되는 이미지에 맞는 인증키가 따로 없기 때문에 부팅과정에서 이 부분을 변경하도록 해야하는데, 이를 위해서 seed.iso 를 만들어 게스트 OS 에 CD-ROM 에 넣어 부팅해준다. 이 부분에 대한 설명은 다음의 페이지에서 찾을 수 있다.

간단하게, 시스템 호스트 이름(나중에 변경하면 된다) 과 ec2-user 에 로그인 패스워드를 변경하도록 seed.iso 파일을 만들어 보도록 하겠다.

먼저 작업을 위한 디렉토리 seedconfig 만들고 meta-data, user-data 파일을 생성한다.

로그인이 가능하도록 필요한 부분만 넣었다. 이제 다음과 같이 seed.iso 파일을 생성해 준다.

virt-manager 로 Amazon Linux2 생성하기

이제 준비할 것들은 모두 갖췄다. virt-manager 를 이용해서 Amazon Linux2 를 구동해 보자.

새로운 게스트 생성하기

OS 이미지가 있기 때문에 Import 로 하고 Arm64 는 aarch64 로 선택, Machine Type 은 virt 다.

amazon linux2 이미지, 운영체제 종류 선택

다운로드 받은 amazon linux2 이미지와 운영체제 종류를 선택한다. 운영체제 종류를 잘 모르겠다면 Generic Linux 로 해도 된다.

Memory, Cpu 는 사양에 맞게 조절해주고 다음을 선택한다.

Customize configuration before install 필수

가상머신 이름을 지정하고 네트워크 선택을 한다음에 반드시 Customize configuration before install 를 체크해 준다. 그리고 Finish 를 하면 다음과 같은 화면이 나온다.

Firmware 를 Custom 선택

Firmware 를 Custom 으로 하고 no-secboot.fd 선택해 준다. 그리고 설치를 시작해 준다.

정상적으로 부팅

정상적으로 부팅이 된다. 로그인이 안되기 때문에 앞에서 만든 seed.iso 파일을 이용해야 한다. 이를 위해서 Amazon Linux2 게스트 OS 에 CD-ROM 하드웨어를 추가해 준다.

CD-ROM 하드웨어 추가

이제 VM 을 다시 시작시키면 seed.iso 에 user-data 에 설정한 ec2-user 의 패스워드로 로그인이 가능해 진다.

정상적으로 로그인 성공

정상적으로 로그인이 성공했다. ec2-user 는 기본적으로 sudoer 권한을 가지고 있기 때문에 sudo 를 이용해서 root 작업을 할 수 있다.

sshd 에 설정에서 패스워드 인증을 활성화 해준다.

설정을 변경해 줬기 때문에 sshd 를 재시작 해준다.

이렇게 sshd 로 패스워드 인증방식을 활성화 했기 때문에 원격에서 접속도 가능해진다.

마지막으로 Amazon Linux2 게스트 를 셧다운 해주고 seed.iso 를 위한 CD-ROM 하드웨어를 삭제해준다.

민트 리눅스에 KVM 가상환경 구성하기

민트 리눅스 21.03 에서 KVM 가상환경을 구성해 본다. 구성에 핵심은 KVM 의 네트워크 설정이다. 앞서 설정한 OpenvSwitch 를 이용하도록 설정 해야 한다.

네트워크 환경

KVM 가상화를 위해서는 네트워크 환경을 먼저 고려해야 한다. 필자의 경우에는 공유기를 이용하고 있다. 외부 광랜으로 들어온 라인을 모뎀에서 받아서 이더넷로 변환해준다. 여기서 랜선으로 공유기에 연결하고 각 컴퓨터에 연결해서 쓴다.

공유기는 다들 아는 IpTime 인데, IpTime 은 새로운 장비가 접속되면 자동으로 사설IP 를 할당해 준다. 이것을 외부로 내보낼때는 NAT 기능을 이용해서 하나의 인터넷 라인으로 공유기 안쪽에 많은 장비를 사용할 수 있게된다.

KVM 가상화를 하게되면 브릿지 네트워크가 생성된다. 이 브릿지 네트워크는 NAT 모드로 작동된다. 172.x.x.x 대역으로 게스트에게 자동으로 IP 를 할당해 준다. 마치 IpTime 공유기와 같은데, 문제는 이렇게 되면 다른 컴퓨터에서 게스트에 접속할 수가 없게 된다. NAT 는 단반향으로 게시트에서 바깥으로 접속은 할 수 있지만 바깥에서 게스트로 접속은 불가능하다. 가능한 방법은 Port 포워딩인데, 포트마다 설정을 해줘야 하는 번거로움이 있다.

KVM 네트워크 설정을 NAT 가 아닌 브릿지(Bridge) 모드로 설정하고 드라이버를 OpenvSwitch 로 설정하면 호스트 컴퓨터에 브릿지 네트워크인 OpenvSwitch 를 통해서 IpTime 에서 사설 IP를 받게 된다. IpTime 내에 네트워크 모두 접속이 가능해 진다.

KVM 을 위한 패키지 설치

다음과 같이 패키지를 설치해 준다.

KVM 를 위한 브릿지 네트워크 설정

주의해야 할 것은 OpenvSwitch 를 사용하도록 설정을 해야 한다. 민트 리눅스 21.03 은 특이하게도 KVM 설치해도 네트워크 설정이 없다. 다음과 같이 확인이 가능하다.

네트워크를 정의하기 위해서 다음과 같이 xml 파일을 작성해 준다.

forward 모드를 ‘bridge’ 이고 virtualport 의 타입이 openvswitch 여야 한다. 파일이 작성되었다면 이제 이것을 KVM 네트워크로 정의해 줘야 한다.

이로써 KVM 구성이 완료 됐다. 이제 virt-manager 를 이용해서 잘 게스트 OS 를 설치해 본다.

일반 계정으로 KVM 이용하기

KVM 설치하게 되면 root 계정으로만 사용할 수 있도록 되었다. 일반계정으로 사용하기 위해서는 다음과 같이 libvirt 그룹에 일반 계정을 추가해주면 된다.

이제 libvritd 의 설정 파일을 다음과 같이 변경한다.

설정을 변경했기 때문에 다음과 같이 재시작해 준다.

Linux HotSwap 사용하기

컴퓨터 하드웨어가 발달하면서 기존 서버시스템의 기능을 데스크탑에서도 사용할 수 있게 되었다. 그중에 하나가 Hot Swap 이다. 스토리지(Storage) 를 컴퓨터를 끄지 않고도 교체할 수 있는게 Hot Swap 기능이다.

BIOS 설정

Hot Swap 을 이용하기 위해서는 BIOS 에 기능을 활성화 해줘야 한다. 제조사마다 BIOS 설정 메뉴가 다르지만 내가 사용하는 메인보드의 경우에는 다음과 같이 설정이 가능하다.

Hot Plug 라고 이름이 다르지만 이것이 Hot Swap 이다. 만을 BlOS 에서 이 메뉴가 없다면 메인보드에서 Hot Swap 기능을 제공하지 않는 것이다.

Linux 에서 사용하기

대부분의 최근의 Linux 커널에서는 Hot Swap 를 지원 한다. 별다른 설정없이 리눅스 배포판이라면 모두 사용이 가능하도록 되어 있다. 먼저 작동하고 있는 Disk 하나를 예를들어 Hot Swap 을 사용해보자.

먼저 다음과 같이 Disk 의 파워를 꺼야 한다. 이는 Disk 꺼내기 위한 것으로 전원을 끄지 않고 갑자기 꺼내버리면 Disk 가 파손될 우려가 있기 때문에 파워를 꺼야 한다.

sdc 디스크에 대해서 파워를 끄도록 한 명령어다. 커널 파라메터 설정으로 파워를 끄게 된다. 그렇게되면 lsblk 명령어로 디스크가 안보이게 된다. 그리고 커널 메시지에 다음과 같이 표시 된다.

이제 하드디스크를 꺼내고 새로운 하드 디스크를 장착하면 된다. 새로운 하드 디스크를 장착하게 되면 최근의 리눅스 커널에서 자동으로 새로운 하드 디스크를 알아 차린다. 이 내용은 커널 메시지로 다음과 같이 나온다.

lsblk 로 보면 새로운 디스크가 인식된게 보이게 된다.

만약 이렇게 자동으로 디스크가 인식되지 않는다면 SCSI 디스크 ReScan 기능을 이용해야 한다. Hot Swap 은 SCSI 의 host 번호를 이용해 작동됨으로 SCSI host 번호를 알아야 한다. 하지만 리눅스에서는 /dev/sdc 형식인데 SCSI host 번호와는 다른데, 다음과 같이 알아내야 한다.

위 결과에서 중간에 host4, host5 가 바로 SCSI host 번호 이다. 이렇게 확인된 SCSI host 번호를 이용해서 ReScan 하도록 다음과 같이 할 수 있다.

이렇게 수동으로 ReScan 를 하게 되며 하드 디스크를 인식하게 된다.

  • Camera: SM-F711N
  • Taken: 28 9월, 2023
  • Focal length: 4.25mm
  • ISO: 640
  • Shutter speed: 1/30s

리눅스 부팅 복구하기

VMPlayer 에서 RHEL 8.8 을 설치하고 사용하다가 KVM 으로 이미지를 바꿔서 옮겼다. 그리고 부팅을 했는데, 부팅이 되지 않았다. Graphic 모드를 끄고 부팅 메시지를 봤는데 다음과 같이 멈췄서 부팅이 되지 않는 것이였다.

KVM에서 RHEL8.8 부팅 멈춤

부팅이 되도록 해야하는데, 어떻게 진행했는지 기록해 본다.

다른 KVM VM 에 디스크로 붙이기

부팅이 멈춘 RHEL8.8 VM 이미지를 다른 VM 의 디스크로 붙인다. virsh 명령어를 이용해서 디스크를 추가 할 수 있다. 먼저, KVM VM 을 시작 시켜놔야 한다. 구동되고 있는 VM 에 디스크를 라이브로 붙일 수 있다.

OL85 VM 에서 디스크가 추가 되었는지를 다음과 같이 확인한다.

vdb 로 디스크가 붙인 것을 확인할 수 있다. 이제 뭔가를 할 수 있게 됐다.

부팅 복구 하기

이제부터는 일반적인 부팅 문제와 비슷하다. 보통 Grub2가 복구가 안되었거나 뭔가 문제가 있을때에 이런 방법을 자주 사용한다. 그러다보니 여러가지 방법들이 존재하는데, 가장 손 쉬운 방법은 설치ISO 이미지로 Rescure 모드로 부팅을 하는 것이다.

RHEL 8 이기 때문에 Rocky Linux 8 설치 이미지를 다운로드 받는다.

이걸 이제 복구를 위한 RHEL8 VM 에 DVD 이미지로 붙여준다. 그러면 다음과 같이 부팅이 된다.

Troubleshooting 메뉴 선택

위 화면처럼 나오는데 여기서 Troubleshooting 메뉴를 선택한다.

Rescue a Rocky Linux System 선택

위 화면처럼 Rescue a Rocky Linux system 메뉴를 선택한다.

1 번을 선택

이렇게 1번을 선택하면 쉘(Shell)이 떨어진다. 화면에 안내처럼 chroot 명령어를 이용해서 시스템 작업을 할 수 있다.

부팅 복구 작업

쉘만 있으면 이제 부팅 복구 작업을 할 수 있다.

위와같이 부팅램이미지를 재 생성해줬다. Grub2 의 문제는 아니였기 때문에 부팅이미지를 재 생성으로 문제가 해결 되었다.

Rocky Linux 9 에 Open vSwitch 세팅하기

Rocky Linux 9 는 RHEL 9 (RedHat Enterprise Linux 9) 의 크론 버전이다. RHEL9는 상용인 반면에 Rokcy Linux 는 무료다.

RHEL9나 Rokcy Linux 9 로 넘어오면서 변화한 것중에 하나가 ifcfg-eth0 파일이다. 이 파일은 /etc/sysconfig/network-scripts 디렉토리에 존재했었고 eth0 네트워크 장치에 대한 네트워크 설정 정보가 저장되었었다. 부팅을하면서 Network-Manager 데몬이 이 파일을 읽어 실행했었다. 하지만 RHEL9과 Rokcy Linux 에서는 이 파일을 더 이상 사용하지 않고 nmcli 명령어를 통해서 세팅을 하도록 변경 되었다.

이러한 변화는 Open vSwitch 세팅에서도 영향을 준다. 우분투와 다르게 RHEL9, Rocky Linux 9 에서는 nmcli 명령어를 통해서 Open vSwitch 를 설정하게 된다.

주의

절대로 원격에서 작업을 해서는 안된다. 외부와 연결하는 네트워크 작업이기 때문에 원격에서 작업을 했을 경우 다시 접속이 안될 수 있다.

Open vSwitch 설치

Rocky Linux 9 에서 Open vSwitch 설치는 패키지로 제공한다. 다음과 같이 설치가 가능하다.

Open vSwitch 를 NetworkManager 가 다룰수 있도록 다음과 같이 패키지를 설치해 준다.

NetworkManger 를 위한 Open vSwitch 플러그인 이다.

nmcli

이제 네트워크 작업은 직접 파일을 조작하는 대신에 nmcli 명령어를 이용하는 방법을 사용해야 한다.

현재 연결 정보를 보여준다.

이제 nmcli 를 이용해서 Open vSwitch 설정을 다음과 같이 해준다.

설정을 다하고 난 후에 재부팅을 한번 해준다.

그리고 nmcli 명령어를 사용해 상태을 확인 한다.

Open vSwitch 설정 확인

ovs-vsctl 명령어를 통해서 설정이 반영이 되었는지 확인해야 한다.

ip a 확인

ip a 명령어를 통해서 확인해 본다.

RHEL9, Rocky Linux 9 에서 어떻게 Open vSwitch 를 설정하는지 알아 봤다.

WOL 설정

Wake On Lan 은 Ethernet 선과 연결된 상태에서 컴퓨터에 전원을 켜지는 기능을 말한다. 이 기능을 사용하기 위해서는 먼저 메인보드에서 지원을 해줘야 한다. 한가지 더 주의해야 하는 것은 메인보드마다 설정 방법이 다 다르다.

이 작업을 했던 컴퓨터는 ASRock B550M Pro4 였는데, BIOS 설정에 Boot 메뉴에 Power On Lan 설정이 있어서 Enable 을 해줬지만 되지 않았다. Advanced 설정에서 ACPI 메뉴가 존재하는데 여기서 PCIE 를 이용한 Power On Lan 설정이 존재하는데 이것을 Enable 을 해줘야 한다.(정확한 메뉴는 기억이 나지 않는다. 메뉴얼을 찾아보면 쉽게 찾을 수 있다.)

이렇게 했는데도 WOL 기능이 되지 않는다면 이것은 리눅스의 설정을 해줘야 함을 의미 한다. 앞서 Open vSwitch 설정을 해준 관계로 외부 접속을 위한 디바이스의 연결 이름이 일반적으로 다르다.

보통은 enp4s0 의 인터페이스 이름이 존재해야 하지만 그건 없다. Open vSwitch 설정 마지막에서 enp4s0 인터페이스 설정을 지웠기 때문인데, 이렇게 되면 어디다 해줘야 하는지가 헷깔리게 된다.

이럴때는 외부와 연결되는 물리적 장치 이름을 찾고, 그것과 연결된 인터페이스 이름을 찾으면 된다. 위 예제에서 외부와 연결된 장치는 enp4s0 이며 이 장치의 인터페이스 이름은 ovs-if-enp4s0 이다. 이 인터페이스에서 WOL 설정을 해주면 된다.

먼저 nmcli 명령어를 이용해서 상태를 살펴본다.

802-3-ethernet.wake-on-lan 의 값이 default 이다. 이것을 magic 으로 세팅해주면 된다. 다음과 같이 한다.

이렇게 한 다음에 가능하면 두번 재부팅하라고 하지만.. 글쎄… 한번만 해줘도 잘됐었다. 여러번 테스트를 해봤는데 문제없이 잘되었다.

한가지 덧붙이자면 WOL 기능을 사용하기 위해서는 절대로 전원 플러그를 뽑아서는 안된다. 멀티탭에 각 구에 전원이 On/Off 스위치가 있을 경우에 전원을 차단해서도 안된다. 전원 플러그를 뽑았다가 다시 꼽아도 안된다. 반드시 전원 플러그를 꼽고 한번은 리눅스로 부팅을 해주고 난 후에 리눅스를 Shutdown 해주고 그리고 전원 플러그는 그대로 연결이 되어 있어야 한다.

WOL 기능은 공유기에 내장되어 있는 경우가 많다. 공유기를 이용하면 원격에서도 컴퓨터를 켤수 있고 공유기의 포워드 기능을 이용하면 켜진 컴퓨터로 외부에서 접속이 가능하다. 프로젝트 할때마다 자주 써먹는 유용한 방법이다.

KVM Image 용량 증설하기

KVM 가상화를 운영하고 있는데, 운영중인 VM 하나가 용량이 부족해지는 상황이 발생했다. KVM 가상화 VM 의 용량은 결국 이미지 파일 한개임으로 이 이미지 파일의 용량을 늘려주면 VM 의 용량이 사실상 늘어나는 것으로 생각했다.

하지만 현시점(2023) 에서 검색을 해보니 다양한 방법들이 존재했다. 그 중에는 VM 이미지를 로컬에 마운트해서 늘려주는 방법도 존재했지만 너무나 복잡해 보였다. 좀 더 쉬운 방법이 없을까 해서 검색한 결과 가장 쉬워보이는 것을 발견했고 이 방법으로 손쉽게 VM 용량을 늘리는데 성공했다.

VM 상태

용량을 늘리려는 VM 의 상태는 다음과 같다.

/dev/vda1 으로 파티션 하나로 보이지만 사실 SWAP 파티션도 존재한다. 이 SWAP 파티션의 /dev/vda2 디바이스이며 약 2G 용량을 차지한다.

VM 이미지 경로

VM 을 운영하는 Host 서버에서 VM 의 이미지가 어디에 있는지를 다음과 같이 살펴볼 수 있다.

VM 이미지 정보

VM 이미지의 정보를 아는 것은 매우 중요하다. VM 이미지의 타입이 존재하는데 raw, qemu 타입이다. 어떤 타입인지에 따라서 VM 이미지 용량을 늘리는 방법이 달라진다.

또, 가상 크기와 디스크 크기 정보 표시되는데 간혹 이 크기가 서로 다를 수가 있다.

기존 이미지 백업

혹시 모를 불상사를 방지하기 위해서 기존 이미지를 백업해 두자.

패키지 설치

VM 이미지를 늘리기 위한 작업을 위해서 필요한 패키지를 설치 해준다. 설치는 환경이 RedHat 기반이기 때문에 dnf 명령어로 설치를 하였다. 설치하는 패키지 이름은 배포판마다 다를 수 있다.

이 패키지를 설치하게 되면 virt-resize 명령어를 사용할 수 있다.

VM 이미지 디스크 정보

앞에서 VM 이미지 정보를 표시했다면 이제는 이미지 안에 디스크 정보를 봐야 한다. 각각 설치한 방법이 다르고 파티션 정보도 다르기 표시 되기 때문에 이를 잘 파악해야 한다.

VM 이미지 내의 디스크 정보는 다음과 같이 알 수 있다.

단일 파티션 /dev/sda1 만 보이지만 virt-df 명령어의 한계로 보인다. 왜냐하면 SWP 파티션도 존재하기 때문인데, 이 SWAP 파티션은 표시되지 않았다.

virt-filesystems 명령어를 통해서 이를 정확하게 알 수 있다.

위 정보를 보면 전체 50G 에 /dev/sda1 과 /dev/sda2 로 나뉘어 있다. /dev/sda2 는 swap 파티션으로 virt-df 일때는 나오지 않았다.

용량 증설을 위한 이미지 생성

다음과 같이 백업한 이미지를 가지고 작업을 진행한다.

이 작업은 매우 중요하다. truncate 명령어를 이용하는 것인데, -r 옵션으로 용량 증설을 위한 이미지를 만들었다. 그리고 그 이미지에 용량 증설을 설정한다. 여기서는 10G 용량을 늘린다

루트(/) 피티션 /dev/sda1 크기 변경

VM 이미지 내의 파티션 정보는 /dev/sda1 으로 보인다. 여기서 주의해야 할 것은 VM 이 가동된 후에 이미지 정보의 디바이스 이름은 /dev/vda1 으로 다르다. virt-df 혹은 virt-filesystems 나온 내용을 기반으로 디바스 이름을 정해야 한다.

용량 증설은 루트 파티션만 하면 됨으로 /dev/sda1 의 크기를 변경할 것이다.

변경 요약을 보면 /dev/sda1 의 용량이 증설될 것인데, 이 파티션의 파일시스템이 ext4 임으로 resize2fs 방법을 이용해서 크기가 확장될 것임을 알려주고 있다.

진행 상태를 보면 Copying /dev/sda1 으로 나오고 실행 명령어에서 변경전 이미지와 truncate 명령어로 새롭게 생성한 이미지를 인자로 줬는데, 아마도 변경전 이미지를 truncate 명령어로 새롭게 생성한 이미지에 순차적인 복사를 하는 것으로 보인다.

이미지 용량에 따라서 작업 시간는 차이를 보일 것이다.

새로운 이미지로 VM 시작한 후 파티션 확인

/mnt7/ubuntu20.04-new.img 이미지로 VM 을 부팅한다. 그리고 난 후 다음과 같이 파티션 용량이 늘었는지 체크한다.

용량이 10G 늘었다.

파일시스템 용량을 봐 본다.

앞에서 변경 요약을 보면 파일시스템이 뭔지를 파악하고 거기에 맞게 파티션 Resize 작업도 해주는 것으로 보인다. ext4 의 경우 resize2fs, XFS 의 경우에는 xfs_growfs 을 사용하는데 이런 작업은 파티션의 크기를 변경하는 것으로 VM 이미지 용량 증설과 함께 해준다.

따라서 별도의 파티션 용량 증설작업은 필요하지 않다.

VIM lightline 플러그인

vim 을 사용할때에 필요한 것이 상태바(Status Bar) 다. 보통은 airline 을 많이 쓰는데, 여러가지 의존성이 필요해서 사용하기에 쉽지가 않다.

lightline 은 의존성이 복잡하지 않고 간단하게 사용할 수 있다. 다음과 같이 .vimrc 에 설정을해주면 된다.

t_Co=256 설정과 아래 두가지 부분의 설정이 핵심으로 보면 된다.

Ansible, 특정 동작 대기/확인 하기

Ansible 을 사용할때에 특정 동작에 대해서 대기한 후에 진행하도록 해야할 필요가 있다. 대표적인 것이 Tomcat 과 같은 경우인데, Tomcat 이 시작을 하게 되면 애플리케이션이 동작하기까지 몇 초의 시간이 더 걸린다. 웹 애플리케이션이 정상적으로 접속을 받기 전에 또 다른 작업을 하게 될 경우에 문제가 된다.

wait_for

Ansible 에서는 위와같은 경우를 위해서 wait_for 라는 것을 지원한다. 예제를 보면 단번에 이해할 수 있다.

포트 80 을 체크해 10초동안 딜레이를 가진다.

다음 예제를 보자.

tomcat.pid 파일이 생성되면 다음 스텝으로 진행 된다.

또 다음 예제를 보자.

tomcat.pid 파일이 삭제되면 다음을 진행한다.

위 예제2,3을 활용하면 Tomcat 웹 애플리케이션을 배포할때에 활용가능하다.