반응형

Kernel 버전

커널버전은 항상 설치된 버전 중에서 최 상위 버전으로 항상 default로 선택 가능하게 되어 있다.
드라이버는 커널 버전에 정확한 숫자에 의존성을 가지고 있기 때문에 사용하는 드라이버가 특정 버전 커널에만 의존적이거나 지원이 된다면, 커널 버전이 올라갈 경우 해당 디바이스는 사용이 불가하기 때문에 가끔 특정 커널 버전에 고정을 해야 하는 경우가 있따.

Kernel 과거 버전 고정하기

현재 설치된 커널 버전 확인

$ sudo dpkg --list | egrep -i --color 'linux-image|linux-headers'

이 명령어로 앞에 ii 또는 ic 라고 나올 수 있는데 각 의미는 아래와 같다.

  • ii : ‘It should be installed and it is installed’
  • rc : ‘It’s removed/uninstalled but it’s configuration files are still there’
    당연하지만 이미 설치된 커널 버전 으로 고정이 가능하다.
    설치가 되지 않았을 경우에는 원하는 커널을 설치 후에 진행해야 한다.

명령어를 시행하면 아래의 형식으로 내용이 출력된다.

ii  linux-headers-6.5.0-18-generic             6.5.0-18.18~22.04.1                     amd64        Linux kernel headers for version 6.5.0 on 64 bit x86 SMP
ii  linux-headers-6.8.0-48-generic             6.8.0-48.48~22.04.1                     amd64        Linux kernel headers for version 6.8.0 on 64 bit x86 SMP
ii  linux-headers-generic-hwe-22.04            6.8.0-48.48~22.04.1                     amd64        Generic Linux kernel headers
ii  linux-image-6.5.0-18-generic               6.5.0-18.18~22.04.1                     amd64        Signed kernel image generic
ii  linux-image-6.8.0-48-generic               6.8.0-48.48~22.04.1                     amd64        Signed kernel image generic
ii  linux-image-generic-hwe-22.04              6.8.0-48.48~22.04.1                     amd64        Generic Linux kernel image

$menuentry_id_option

menuentry_id_option은 GRUB에서 설정에서 사용되는 옵션으로 각 부팅의 항목의 UUID로 사용된다. 이것은 GRUB Bootloader에서 여러개의 커널 항목에서 특정 항목에 사용되는 ID를 정의한다. 여기에 특정 커널의 UUID로 지정을 해줄 경우 Bootloader에서 해당 커널로 Boot sequence를 진행하게 된다.

$ grep submenu /boot/grub/grub.cfg 

명령어를 실행하면 아래와 같은 형식으로 출력된다.

submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {

위의 출력 내용 중 gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282 내용을 아래에서 사용하니 저장해둔다.

Kernel 정보 확인

$ grep gnulinux /boot/grub/grub.cfg

커널에서 원하는 커널 정보를 확인한다.

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
  menuentry 'Ubuntu, with Linux 5.4.0-42-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-42-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
  menuentry 'Ubuntu, with Linux 5.4.0-42-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-42-generic-recovery-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
  menuentry 'Ubuntu, with Linux 5.4.0-39-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-39-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
  menuentry 'Ubuntu, with Linux 5.4.0-39-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-39-generic-recovery-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {

만약에 위의 커널 정보 중에서 5.4.0-42-generic 을 사용하고 싶을 경우 gnulinux-5.4.0-42-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282을 사용하면 된다.

grub 설정

grub에 default에 대한 항목을 아래와 같이 설정해준다.

$ sudo vi /etc/default/grub

기본적으로 GRUB_DEFAULT=0으로 되어 있는데, 기본으로 가장 상위 버전으로 부팅이 되는 것으로 생각하면 된다.

GRUB_DEFAULT="gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282>gnulinux-5.4.0-42-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282"

아래와 같이 변경한 내용을 grub에 적용해준다.

$ sudo update-grub
$ reboot

부팅 이후에 원하는 버전으로 부팅이 되었는지 확인해보자

$ uname -a
반응형
반응형

fstab 수정시 옵션을 설정할 수 있는데 보통 구글링하면 defaults로 설정되어 있다.

여기서 default로 "s"를 빼고 작성시 리부팅할때 fstab 비정상 동작으로 boot sequence가 중단될 수 있다.

이럴 경우 ssh daemon이 정상적으로 뜨지 않아서 데이터 센터 등에 서버가 있을 경우 난감한 상황이 발생할 수 있다.

 

처음 작성할 때에 defaults가 아닌 nofail로 설정할 경우, 해당 설정이 정상적이지 않더라도 mount를 비활성화하고 boot sequence를 계속하게 할 수 있다.

차라리 그냥 다른 이유에서도 mount가 비정상 상황이 발생하더라도 nofail로 boot seqence를 계속하도록 수정하는게 중요할 것 같다.

반응형
반응형

다음은 SSH 포트(기본 22번 포트)와 3000, 3001번 포트만 허용하고 나머지는 차단하는 iptables 명령어.

설정 명령어
SSH 포트를 먼저 허용 (기본적으로 22번 포트를 사용). 만약 SSH 포트를 변경했다면 해당 포트로 수정.

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

필요한 포트를 허용 (예: 3000번, 3001번 포트).

sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3001 -j ACCEPT

로컬호스트(127.0.0.1)에서 오는 트래픽은 허용.

sudo iptables -A INPUT -i lo -j ACCEPT

기본 정책을 설정하여 나머지 모든 입력 트래픽을 차단.

sudo iptables -P INPUT DROP

나가는 트래픽은 허용하려면 아래 명령을 추가.

sudo iptables -P OUTPUT ACCEPT

연결이 이미 허용된 세션(ESTABLISHED, RELATED)에 대해서는 계속 허용하도록 설정.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

이 설정을 완료하면 SSH(22번 포트), 3000번 포트, 3001번 포트만 허용되고 나머지 트래픽은 모두 차단.

설정 저장
Ubuntu에서는 iptables 설정이 서버 재부팅 후에도 유지되도록 저장해야 함.

iptables-persistent 패키지를 설치:

sudo apt install iptables-persistent

설정을 저장합니다:

sudo netfilter-persistent save

이제 iptables 설정이 시스템 재부팅 후에도 유지됨.

반응형
반응형

Ubuntu 22.04에서 기본적으로 제공되는 방화벽 도구는 UFW(Uncomplicated Firewall) 임 UFW는 간단한 명령어로 방화벽을 설정하고 관리할 수 있도록 도와주며, 아래는 UFW를 사용해 방화벽을 설정하는 방법임.

참고
SSH 연결 상태에서 진행시 default incoming deny rule이 먼저 적용시에 연결이 끊길경우 서버에 물리적으로 모니터 연결해서 붙어야함.
혹시 불안한 경우에는 아래와 같이 진행함.

SSH 포트 허용:

sudo ufw allow ssh

기본 정책 설정 (모든 들어오는 트래픽 차단):

sudo ufw default deny incoming

마지막으로 방화벽을 활성화:

sudo ufw enable

아래는 일반적인 설정 방법

  1. UFW 설치 확인
    일반적으로 UFW는 Ubuntu에 기본 설치되어 있지만, 설치되지 않은 경우에는 다음 명령어로 설치할 수 있음:
sudo apt update  
sudo apt install ufw  
  1. 방화벽 상태 확인
    현재 UFW가 활성화되어 있는지 확인:
sudo ufw status  

이 명령어를 실행하면 방화벽이 활성화되어 있는지, 어떤 규칙이 설정되어 있는지 알 수 있음.

  1. 기본 정책 설정
    UFW의 기본 정책을 설정함. 일반적으로 모든 들어오는 트래픽은 차단하고 나가는 트래픽은 허용하는 방식으로 설정함.
sudo ufw default deny incoming  
sudo ufw default allow outgoing  
  1. 특정 포트 허용하기
    자주 사용하는 서비스의 포트를 허용하려면 다음과 같이 설정함.

SSH 포트 (기본 22번 포트)를 허용:

sudo ufw allow ssh  

HTTP(80번 포트)와 HTTPS(443번 포트)를 허용:

sudo ufw allow http  
sudo ufw allow https  

특정 포트를 허용(ex. 8080 포트):

sudo ufw allow 8080  
  1. IP 주소 또는 네트워크 대역 허용
    특정 IP 주소나 네트워크 대역만 허용하려면 다음과 같이 설정.

특정 IP 주소에서 SSH 접속을 허용:

sudo ufw allow from 192.168.1.100 to any port 22  

특정 대역 (예: 192.168.1.0/24)에서 특정 포트를 허용:


sudo ufw allow from 192.168.1.0/24 to any port 80  
  1. UFW 활성화 및 비활성화
    방화벽을 활성화:
sudo ufw enable  

비활성화하려면:

sudo ufw disable  
  1. 방화벽 규칙 삭제
    잘못 설정된 규칙을 삭제하고 싶을 때는 delete 옵션을 사용.

ex) 8080 포트를 허용하는 규칙을 삭제:

sudo ufw delete allow 8080  
  1. 방화벽 로그 설정
    방화벽의 로그를 활성화:
sudo ufw logging on  

로그를 비활성화:

sudo ufw logging off  
  1. 전체 상태 확인
    설정한 방화벽 규칙을 다시 확인하려면 다음 명령어를 사용함.
sudo ufw status verbose  

이렇게 하면 방화벽의 상태와 함께 설정된 규칙들을 자세히 볼 수 있음.

반응형
반응형

포인트

  • 그냥 watch 사용시에는 어디가 바꼈는지 매번 눈으로 확인해야 하는데, 이것을 diff 명령어로 틀린 부분만 표시할 수 있음.
  • 색을 표시하는 부분은 색코드를 직접 이용할 수 있지만 watch 명령어와 사용시 색이 표시 되지 않고 색 코드가 그대로 노출되는 되기 때문에 일반적으로 output에 색코드를 직접 기입하는 대신에 tput을 이용하면 색을 표시할 수 있음

샘플 코드

#!/bin/bash

# temp file
LAST_OUTPUT="/tmp/last_df_output.txt"
NEW_OUTPUT="/tmp/new_df_output.txt"

# color supporting check
if [ -t 1 ]; then
    RED=$(tput setaf 1)
    RESET=$(tput sgr0)
else
    RED=""
    RESET=""
fi

# initial output 
df -h > "$LAST_OUTPUT"

while true; do
    # new output
    df -h > "$NEW_OUTPUT"

    if ! cmp -s "$NEW_OUTPUT" "$LAST_OUTPUT"; then
        clear
        # diff will be printed in red color
        diff --unchanged-line-format="%L" --old-line-format="" --new-line-format="${RED}%L${RESET}" "$LAST_OUTPUT" "$NEW_OUTPUT"
    fi

    # last output store
    mv "$NEW_OUTPUT" "$LAST_OUTPUT"

    # time interval
    sleep 1
done
반응형
반응형

Bash 스크립트에서 매번 if [ $? -ne 0 ];을 써서 명령어의 실행 결과를 확인하는 건 번거롭고 코드가 지저분해 보일 수 있다. 이를 깔끔하게 처리할 수 있는 몇 가지 방법을 소개한다.

  1. set -e 사용
    스크립트에 set -e를 추가하면, 명령어가 실패할 때(exit code가 0이 아닐 때) 자동으로 스크립트 실행이 중지된다. 이렇게 하면 매번 $?를 체크할 필요가 없어진다.
#!/bin/bash
set -e

# 명령어 실행 (실패하면 스크립트가 중지됨)

command\_1  
command\_2

echo "이 메시지는 위 명령어들이 성공한 경우에만 출력됨"  

set -e는 스크립트 실행을 중단해야 할 때 유용하지만, 모든 경우에 적합하지 않을 수 있다. 실패해도 계속 실행해야 하는 상황이라면 다른 방법을 고려하는 게 좋다.

  1. 함수로 처리
    자주 사용하는 에러 확인을 함수로 만들어 놓으면 매번 $?를 확인하는 중복을 줄일 수 있다.
#!/bin/bash

check\_command() {  
"$@"  
if \[ $? -ne 0 \]; then  
echo "Error: '$\*' 명령어가 실패했습니다." >&2  
exit 1  
fi  
}

check\_command ls /path/to/dir  
check\_command another\_command  

check_command 함수는 전달받은 명령어를 실행하고, 실패하면 에러 메시지를 출력한 뒤 스크립트를 종료하는 방식이다.

  1. 명령어 체인 (&&와 || 사용)
    명령어가 성공하거나 실패할 때 각각 다른 동작을 하고 싶다면 &&와 ||를 사용하는 것도 깔끔하다.
command && echo "성공" || echo "실패"  
&&는 명령어가 성공했을 때 실행되고, ||는 명령어가 실패했을 때 실행된다. 단순한 에러 처리를 할 때 유용하다.
  1. 트랩(Trap) 사용
    스크립트 전체에서 에러가 발생할 경우에 대한 공통 처리가 필요하다면 trap을 사용할 수 있다. 특정 상황이나 에러 발생 시 자동으로 호출되는 함수를 정의할 수 있다.
#!/bin/bash

trap 'echo "Error occurred at line $LINENO"; exit 1' ERR

# 명령어 실행

command\_1  
command\_2  

이 코드는 ERR 신호가 발생할 때, 즉 명령어가 실패하면 해당 트랩이 실행돼 에러 메시지를 출력하고 스크립트를 종료한다.

반응형
반응형

필요 패키지 설치

$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

gpg key 추가

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Repository 추가

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

업데이트

$ sudo apt update

Docker 설치

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

필요시 Reboot 혹은 docker service restart

$ sudo reboot now

or 

$ sudo systemctl restart docker

Docker service 확인

$ systemctl status docker

User docker group 권한 추가

$ sudo gpasswd -a ${USER} docker

이후 shell 종료 및 재접속 필요

반응형
반응형

Client 에서 Key 생성

$ cd ${HOME}
$ ssh-keygen -t rsa -P ""

Key 등록

$ ssh-copy-id -i ${HOME}/.ssh/rd_rsa.pub <USER>@<IP>

Test

$ ssh <USER>@<IP>
반응형
반응형

Ubuntu GUI 영상 캡쳐 방법(22.04)

간단하게 PrintScreen 버튼으로 이미지/동영상 캡쳐 가능
동영상 캡쳐시 상단에 중지 버튼으로 중지시 까지 영상 캡쳐됨

mp4 변환

기본적으로 영상 캡쳐시 포멧은 webm 포멧임.
mp4로 ffmpeg를 이용해서 간단하게 converting 할 수 있음.

기본 변환 방법

 $ ffmpeg -i <INPUT FILE> -vcodec libx264 -acodec aac <OUTPUT FILE>

Scale 지정 converting 방법

 $ ffmpeg -i <INPUT FILE> -vf "scale=<WIDTH>:<HEIGHT>" -vcodec libx264 -acodec aac <OUTPUT FILE>

Scale 지정시 Width 고정(예.1280), Height 가변

 $ ffmpeg -i <INPUT FILE> -vf "scale=1280:trunc(720/2)*2" -vcodec libx264 -acodec aac <OUTPUT FILE>

FPS 지정

영상 캡쳐를 하면 원본 영상 화질과 상관없이 무겁다. FPS를 지정하고 싶을 경우

 $ ffmpeg -i <INPUT FILE> -vf "scale=1280:trunc(720/2)*2" -vcodec libx264 -acodec aac -r <FPS NUM> <OUTPUT FILE>
반응형
반응형

Docker container 내에서 GUi를 사용하기

Host의 XServer를 컨테이너와 공유해서 Container 내에서 GUI를 사용하는 방법.
X11 Forwarding을 사용하거나, Display를 통해서 사용 가능
다만 Forwarding을 하거나 Display에 대한 DISPLAY 환경 변수를 미리 정의를 하고 생성해야됨.

Host에서 Docker와 xserver 통신 설정

$ xhost +local:docker

Docker run parameter

 --volume /tmp/.X11-unix:/tmp/.X11-unix:ro -e DISPLAY=unix$DISPLAY

혹시 안될 경우

 --volume /tmp/.X11-unix:/tmp/.X11-unix:ro -e DISPLAY=$DISPLAY

혹시 안될 경우

 --volume /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY
반응형

+ Recent posts