📌 리눅스 SSH 세션 끊김 문제 해결법
터미널 접속하고 나서, root 계정으로 vi /etc/profile 파일로 들어간 다음, TMOUT 부분이 있을 것이다.
나는 rocky linux를 사용하고, 처음에는 900초로 설정되어있던 거를 7200초로 변경하였다.
세션을 끊은 뒤, 다시 접속하면 영구적으로 적용이 완료될 것이다.

터미널 접속하고 나서, root 계정으로 vi /etc/profile 파일로 들어간 다음, TMOUT 부분이 있을 것이다.
나는 rocky linux를 사용하고, 처음에는 900초로 설정되어있던 거를 7200초로 변경하였다.
세션을 끊은 뒤, 다시 접속하면 영구적으로 적용이 완료될 것이다.

sudo systemctl disable --now unattended-upgrades
sudo apt remove unattended-upgrades
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
sudo apt-mark hold nvidia-driver-<version>
sudo apt-mark hold linux-image-<version>
sudo apt-mark hold linux-image-generic linux-headers-generic
sudo systemctl disable snapd.service
sudo systemctl disable snapd.socket
sudo systemctl disable snapd.seeded.service
sudo systemctl disable --now apt-daily.timer apt-daily-upgrade.timer
ls /etc/cron.daily/
-----
0anacron apport apt-compat cracklib-runtime dpkg logrotate man-db
ls /etc/systemd/system/*.timer
sudo apt purge apport -y
sudo chmod -x /etc/cron.daily/0anacron
sudo chmod -x /etc/cron.daily/apt-compat
apt-mark showhold | grep nvidia
---
nvidia-driver-535-server
nvidia-dkms-535-server
libnvidia-compute-535-server:amd64
... 등등
apt-mark showhold | grep linux
---
linux-image-5.15.0-91-generic
linux-headers-5.15.0-91-generic
systemctl is-enabled unattended-upgrades
ls -l /etc/cron.daily/
apt-mark showhold

이 포스트는 RHEL 8 기반 시스템에서 CUDA 개발 환경과 NVIDIA 드라이버를 수동으로 구축하는 과정을 정리한 것입니다. 로컬 패키지 저장소 설정부터 GPU 드라이버, CUDA 설치까지의 전체 흐름을 담았습니다.
ISO 또는 USB를 통해 마운트된 RHEL 설치 미디어에서 리포지터리를 복사하고 설정합니다.
mkdir /local_repo
cp -r /run/media/User/RHEL-8–4–0-/AppStream /local_repo/
cp -r /run/media/User/RHEL-8–4–0-/BaseOS /local_repo/
chown -R User:User /local_repo/AppStream /local_repo/BaseOS
리포지터리 설정 파일 작성 (/etc/yum.repos.d/local.repo):
[AppStream]
name=AppStream
baseurl=file:///local_repo/AppStream
enabled=1
gpgcheck=0
[BaseOS]
name=BaseOS
baseurl=file:///local_repo/BaseOS
enabled=1
gpgcheck=0
🌐 언어 및 지역 설정 (한국어) — 선택
sudo dnf install glibc-locale-source glibc-langpack-ko -y
sudo localectl set-locale LANG=ko_KR.UTF-8
locale
sudo dnf groupinstall "Development Tools" -y
sudo dnf install -y epel-release
sudo dnf install -y gcc kernel-devel-$(uname -r) kernel-headers-$(uname -r) dkms elfutils-libelf-devel
sudo bash -c 'echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf'
sudo dracut --force
sudo reboot
# 재부팅 후 nouveau가 비활성화되었는지 확인:
lsmod | grep nouveau # 출력 없으면 성공
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.154.05/NVIDIA-Linux-x86_64-535.154.05.run
chmod +x NVIDIA-Linux-x86_64-535.154.05.run
# GUI 모드 종료 (텍스트 모드로 부팅)
sudo systemctl set-default multi-user.target
sudo reboot
# 재부팅 후 설치:
sudo ./NVIDIA-Linux-x86_64-535.154.05.run
# 설치 완료 후 GPU 확인:
nvidia-smi
sudo dnf config-manager --add-repo=https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
sudo dnf clean all
sudo dnf makecache
sudo dnf install -y cuda-12-2
sudo dnf install -y cuda-toolkit-12-2
sudo bash -c 'cat <<EOF > /etc/profile.d/cuda.sh
export PATH=/usr/local/cuda-12.2/bin:\$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:\$LD_LIBRARY_PATH
EOF'
source /etc/profile.d/cuda.sh
nvidia-smi # GPU 상태 확인
nvcc --version # CUDA 컴파일러 버전 확인
sudo systemctl set-default graphical.target
sudo reboot

firewall-cmd --state
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=block
firewall-cmd --list-all
firewall-cmd --zone=block --add-service=<서비스명>
firewall-cmd --zone=block --add-service=http
firewall-cmd --zone=block --add-rich-rule='rule family="ipv4" source address="IP" port port="포트" protocol="tcp" accept'
firewall-cmd --runtime-to-permanent
systemctl restart firewalld

만약 사용하는 port가 없고, 프로세스 이름으로 health check를 하려면, 먼저 리눅스 서버에 python 설치한다. 그리고, sh 파일을 만들어야 한다.
#!/bin/bash
# 체크할 프로세스의 경로를 변수에 저장합니다.
PROCESS_PATH="프로세스 이름"
# 프로세스가 실행 중인지 확인합니다.
if pgrep -f "$PROCESS_PATH" > /dev/null
then
PROCESS_STATUS=1 # 프로세스가 실행 중이면 1
else
PROCESS_STATUS=0 # 프로세스가 실행 중이지 않으면 0
fi
# Prometheus 메트릭 포맷으로 출력합니다.
echo "# HELP process_up Is the process running (1 for yes, 0 for no)"
echo "# TYPE process_up gauge"
echo "process_up $PROCESS_STATUS"
해당 코드는 프로세스가 실행 중인지 아닌지 체크하는 code, 위의 sh 파일을 주기적으로 확인하는 sh파일 생성
#!/bin/bash
while true; do
/usr/local/bin/b2b_check.sh > /var/www/html/metrics
sleep 15
done
(선택) 시스템 서비스 등록을 해줘도 됨.
해당 파일을 python설치하면 기본적으로 있는 http로 데이터를 받아 prometheus가 데이터를 받을 수 있게 만들어 준다.
그리고, 그라파나에서 해당 프로세스 체크를 PromQL — 대시보드 형태로 제작하면 된다.

Linux | network-interface 설정을 보는 방법은 network-interface를 확인해야 함
ip addr로 현재 활성화 된 네트워크 이름을 확인
cd /etc/sysconfig/network-scripts/디렉토리에서 활성화된 네트워크 인터페이스 이름과 관련한 ifcfg-“”” 파일 확인
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#BOOTPROTO=dhcp 이렇게 주면 자동 ip 설정.
# 이렇게 없으면 수동 ip 설정.
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
# 이건 unique 값
NAME="""
# 이건 unique 값
UUID="""
# 이건 unique 값
DEVICE="""
ONBOOT=yes # yes 로 하면 부팅 할 때 ip 자동 노출.
IPADDR=192.168.1.1
PREFIX=27 # netmask 규칙
GATEWAY=192.168.0.1
DNS1="""
IPV6_PRIVACY=no
ZONE=block # 방화벽 존 active
주석 처리를 참고해 고정 IP 설정 할 수 있음

yum install -y wget
sudo yum install gcc pcre-devel zlib-devel make unzip openssl-devel
wget http://nginx.org/download/nginx-1.26.2.tar.gz
tar -zxvf nginx-1.26.2.tar.gz
rm -rf nginx-1.26.2.tar.gz
cd nginx-1.26.2
./configure --with-http_ssl_module
make
sudo make install
sudo /usr/local/nginx/sbin/nginx
실행이 되면 잘 설치된 것. 잘 설치 되었으면 시스템 등록을 하기 위해 프로세스 kill
ps -ef | grep nginx
# 해서 나온 프로세스를 kill.
kill -9 "프로세스 넘버"
sudo vi /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
/usr/local/nginx/sbin/nginx -v

su-root
root 권한으로 명렁어 수행하기
sudo {command}
su (switch user) : 로그아웃 없이 계정 전환 명령어
sudo (superuser do) : root 권한으로 수행하는 명령어

yum update 할 때 실패하는 경우가 있음
이럴 때,
# cd /etc/yum.repos.d/
# vi CentOS-Base.repo
을 변경해주면 된다
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.kakao.com/centos/$releasever/os/$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
# kakao
baseurl=http://mirror.kakao.com/centos/$releasever/updates/$basearch
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://centos.mirror.cdnetworks.com/$releasever/extras/$basearch
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://centos.mirror.cdnetworks.com/$releasever/centosplus/$basearch
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://centos.mirror.cdnetworks.com/$releasever/contrib/$basearch
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
위와 같은 내용으로 repo 파일을 변경해주자

리눅스에서 물리 터널을 가상 터미널로 다중화하여 특정 서비스 또는 프로그램을 백그라운드에서 돌리다가, 필요하면 포어그라운드로 가져오는 명령
# ubuntu.
apt install screen
# centOS
yum install screen
명령어
# 백그라운드에 있는 세션 리스트를 가져온다
screen -ls
# 유저가 지정한 ‘세션명’으로 screen을 시작한다
screen -R 세션명
# screen -R 세션명
이미 존재하는 ‘세션명’을 포어그라운드로 들고와 작업을 진행
# screen -D -R 세션명
이전 세션이 attach 된 상태라면 detach 하고 세션을 복원
# screen -r -d
세션 강제로 detach
# screen -X 세션명
동시에 여러 사용자가 한 화면을 공유하면서 작업을 진행
# screen -X -S 세션명 kill
해당 ‘세션’을 삭제
# Ctrl + a + d
스크린 attach이후 스크린을 detach하는 단축키
# Ctrl + a + k
스크린 attach이후 스크린을 종료하면서 빠져나옴
# Ctrl + a + esc
위 명령을 사용하면서 방향키를 사용하면 스크롤 가능
# Ctrl + a + |
세로로 화면 분할
# Ctrl + a + ?
키보드 단축키 보기
vi ~/.screenrc 해당 파일을 생성하고, 밑 코드를 입력 후 저장
defscrollback 5000
termcapinfo xterm* ti@:te@
startup_message off
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n*%t%{-}%+w %= %c ${USER}@%H"
bindkey -k k1 select 0
bindkey -k k2 select 1
bindkey -k k3 select 2