Post

[DevOps]Linux

여태까지 Windows에서 작업을 진행하였는데, 친숙한 GUI는 좋았지만 사용하다보면 호환되지 않는 라이브러리 등이 존재하지 않아 애를 먹었던 적이 몇번 있었다. 특히, CUDA1는 주로 Linux 환경에서 개발되고 최적화되어 있으며 TensorFlow와 PyTorch는 Linux에 대한 CUDA 지원을 강화하고 있어 이런 부분에 대해 해결책을 찾다보니 Linux를 사용하기 시작하게 되었다.

Linux

linux는 단일형 커널로 shell을 거치지 않음.

shell
kernel(OS의 컴퓨터 프로그램)과 user간의 인터페이스 역할

Ubuntu

Linux에서도 다양한 배포판이 존재하는데, 그 중에서 점유율이 제일 높은 Ubuntu를 사용하기로 결정했다.

image linux 배포판 점유율 출처 : https://w3techs.com/technologies

Linux directoy 구조

image linux dir 구조 출처 : https://coding-factory.tistory.com/499

  • /bin: 기본 실행 가능한 명령어(binary)들이 위치하는 디렉토리입니다.
  • /boot: 부팅 시에 필요한 파일들이 위치하는 디렉토리로, 커널 이미지와 부트 로더 파일들이 저장됩니다.
  • /dev: 장치 파일(device)들이 위치하는 디렉토리입니다. 시스템의 하드웨어 장치들은 여기에 파일로 표현됩니다.
  • /etc: 시스템의 설정 파일들이 위치하는 디렉토리입니다. 네트워크, 사용자, 서비스, 패키지 관리와 관련된 설정 파일들이 있습니다.(fstab:시스템 부팅과 같이 자동 mount되는 항목 및 옵션, passwd:패스워드 저장)
  • /home: 사용자의 홈 디렉토리들이 위치하는 디렉토리입니다. 각 사용자는 여기에 자신의 디렉토리를 가지게 됩니다.
  • /lib: 공유 라이브러리들이 위치하는 디렉토리입니다. 프로그램들이 이 라이브러리들을 사용하여 실행됩니다.
  • /usr: 시스템의 추가 소프트웨어들이 위치하는 디렉토리입니다. /usr/bin 디렉토리에는 사용자들이 실행하는 프로그램들이, /usr/lib 디렉토리에는 추가 라이브러리들이 위치합니다.
  • /var: 변동성 있는 파일들이 위치하는 디렉토리입니다. 로그 파일, 임시 파일 등이 여기에 저장됩니다.

기본 내용

Pipe : | # 파이프 왼쪽 명령어의 출력을 오른쪽 명령어로 입력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# root 유저 : #, 일반 유저 : $
[username]:[pw]:[UID]:[Group ID]:[user info]:[home dir]:[shell] # shell 형태
[root@localhost ~]$ # 예시

# switch user, defalut root user
su 

# using root authority in current account
sudo 

# 로그인된 사용자의 자세한 정보 [사용자 ID] [터미널 이름] [로그인 날짜와 시간] (접속한 원격주소)
who 
# current user
whoami 
# 로그인 되어 있는 UID 출력
users 
# get back to before account
logout(or exit) 

/bin/sh(bourne shell) 
/bin/bash(bourne-again shell) # linux 표준 셀, sh기반 csh. ksh의 장점 결합

# Manual
man [Option] [command, File] 
# 주어진 텍스트를 터미널에 출력하는데 사용.
echo [option] [text] 

# 다른 시스템을 Linux시스템에서 인식하게 만드는 것. 즉, 파일 시스템을 연결하고 사용할 수 있게함.
mount [옵션] <장치 또는 경로> <마운트 지점> 

패키지 관리

1
2
3
4
5
6
apt install # 패키지 관리를 위해 사용되는 명령어
apt-get install # 패키지 관리를 위해 사용되는 명령어
yum | Yellow dog Update, pakage management 
systemctl [option] [service] # ststem daemon, 서비스 관리
# option | daemon-reload, start, stop, status, is-active, enable(자동실행)
# /etc/systemd/system/zookeeper.service # service 생성 위치

파일 및 디렉토리 관리

1
2
3
4
5
6
7
8
9
10
ls: 디렉토리 내용을 나열합니다.
cd [디렉토리]: 지정된 디렉토리로 이동합니다.
pwd: 현재 작업 중인 디렉토리를 출력합니다.
touch [파일명]: 빈 파일을 생성합니다.
cp [옵션] [원본 파일] [대상 파일]: 파일을 복사합니다.
mv [옵션] [원본 파일] [대상 파일]: 파일을 이동하거나 이름을 변경합니다.
rm [옵션] [파일]: 파일을 삭제합니다.
rmdir [option] [디렉터리] : 디렉터리를 삭제합니다.
mkdir [옵션] [디렉토리 이름]: 디렉토리를 생성합니다.
find [찾을 디렉터리 경로] [option] [찾은 후 동작 옵션]

파일 내용 확인 및 편집

1
2
3
4
5
cat [파일명]: 파일의 내용을 출력합니다.
less [파일명]: 파일의 내용을 페이지 단위로 출력합니다.
head [옵션] [파일명]: 파일의 앞부분을 출력합니다.
tail [옵션] [파일명]: 파일의 뒷부분을 출력합니다.
grep [패턴] [파일명]: 파일에서 특정 패턴을 검색합니다.

권한 관리

1
2
3
chmod [권한] [파일명]: 파일의 권한을 변경합니다.
chown [사용자명] [파일명]: 파일의 소유자를 변경합니다.
chgrp [그룹명] [파일명]: 파일의 그룹을 변경합니다.

프로세스 관리

1
2
3
ps: 실행 중인 프로세스를 나열합니다.
kill [프로세스ID]: 지정된 프로세스를 종료합니다.
top: 시스템의 실시간 프로세스 상태를 모니터링합니다.

시스템 정보

1
2
3
4
5
6
uname -a: 시스템의 정보를 출력합니다.
df -h: 디스크 사용량을 확인합니다.
free -h: 메모리 사용량을 확인합니다.
ifconfig: 네트워크 인터페이스의 정보를 출력합니다.
free # 시스템 메모리 상태 체크
vmstat # 가상 메모리 상태 체크

소유권/권한 관리

1
2
chmod 777 /etc/initta # 허가권 변경
chown [소유자] [File or Directory # 소유권 변경

압축 및 압축 해제

1
2
tar -cvf [압축파일명.tar] [파일/디렉토리] # 파일 또는 디렉토리를 tar 압축합니다.
tar -xvf [압축파일명.tar] # tar 압축을 해제합니다.

프로세스 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
Foreground 프로세스 | 프로세스가 종료되는 시점에 실행 결과를 확인하는 형태
Background 프로세스 | 프로세스가 동작하더라도 쉘에서 동작 여부를 직접 확인 할 수 없는 프로세스
jobs | 백그라운드 프로세스 목록
bg | fg 프로세스를 bg로 전환
fg | bg 프로세스를 fg로 전환

ps [option] # 프로세스들의 상황(스냅샷)을 보여줌 -a : 실행중 프로세스, -e : 모든 정보 프로세스 
kill [option] [PID] # 1 : 로그아웃, 2:CTRL+C(키보드로 중지), 9:강제종료,19:CTRL + Z(실행 정지)\
skill [option] [UID] # 시스템에 접속한 사용자 및 터미널 종료

대화형 프로세스 | 터미널과 세션을 통해 정보를 주고 받으며 실행되는 프로세스
Batch 프로세스 | 사용자가 지정한 작업을 일괄적 수행
Daemon | Background상태에서 지속적으로 실행되는 프로세스

네트워크 관리

1
2
3
ifconfig # 연결된 네트워크 정보
route # 라우팅 테이블 정보 확인
ping [호스트/도메인] # 호스트 또는 도메인에 ping을 보냅니다.

리눅스 서버구축

현재 개인 노트북 환경에서는 windows의 GUI를 포기할 수는 없어 WSL2를 활용하여 사용하고 있다. 자세한 내용은 ‘WSL2 환경’에서 확인하길 바란다.

원격접속

원격 접속은 클라우드 서비스와 더불어 현대적인 IT 인프라 구조에서 필수적인 요소입니다. 가상머신 및 컨테이너 인스턴스들은 Linux를 기반으로 제공이되며, 이를 통해 확장성과 유연성을 제공하는 동시에 리소스의 효율성을 높일 수 있습니다. 또한, 다양한 분야에서 팀원들이 분산되어 서로 협력하고, 동시에 작업을 진행이 가능하며 물리적인 장소의 제한을 받지 않게 되는 등 효율적인 운영, 작업의 유연성, 팀 협업을 강화할 수 있습니다.

터널링

터널링 이란? a.k.a SSH Port Forwarding
라우팅 되지 않은 비 표준 프로토콜 패킷을 터널링을 사용해 원격지 컴퓨터로 전달하며 암호화 기능 추가, 방화벽 우회 가능합니다.

Linux에서 원격 접속을 할 수 있는 다양한 방법(SSH, VNC, RDP, Telnet)들이 있는데 일반적으로 SSH를 사용합니다.

Telnet원격 접속(암호화 X, TCP 23 Port)
SSH원격 접속(암화화 O, TCP 22 Port)
Local SSH Tunneling타겟 시스템 측에 SSH server가 존재
Remote SSH Tunneling타겟 시스템 측에 SSH server가 존재하지 않음.

SSH Tunneling

1
2
3
4
5
6
7
8
9
10
# 터널링 구성
ssh root@[Server IP] -L [Local Port]:[Forwarding IP]:[Forwarding Port] 

#[서버 IP]: 접속할 원격 서버의 IP 주소입니다.
#[로컬 포트]: 로컬 시스템에서 터널링할 포트 번호입니다.
#[포워딩 IP]: 포워딩할 서버 또는 IP 주소입니다.
#[포워딩 포트]: 포워딩할 포트 번호입니다.

# 터널 접속
nc 127.0.0.1 [Local Port] 

VSC연결

  • “Remote-SSH” 확장 설치
  • 설치 후 “Remote-SSH:Open SSH Configuration File…“를 눌러 config 파일을 수정.
    1
    2
    3
    4
    5
    
      Host myserver
          HostName [서버 IP 주소]
          User [사용자명]
          Port [SSH 포트 번호]
          IdentityFile [개인 키 파일 경로]
    
  • “Remote-SSH: Connect to Host…“를 선택하여 Host 연결.



  1. NVIDIA의 CUDA는 GPU를 사용한 고성능 병렬 컴퓨팅을 가능하게 합니다. 

This post is licensed under CC BY 4.0 by the author.