본문 바로가기
DevOps/Linux, Git

[Linux] Linux 알아가기

by DUSTIN KANG 2024. 4. 2.

리눅스?

리눅스(linux)운영체제의 한 종류로 리누스 토르발즈라는 분이 취미 삼아 유닉스를 기반으로 만든 운영체제 입니다. 오픈 소스로 되어 있기 때문에 사람들이 다양한 분야에 적용하여 사용할 수 있었죠.

 

리눅스 배포판

리눅스 배포판은 리눅스 커널, GNU 등 여러가지 자유로운 소프트웨어로 구성된 운영체제입니다. 대표적으로 우분투(Ubuntu), Fedora, 데비안(Debian), CentOS등이 있습니다. 이 배포판으로는 여러가지 차이가 있지만 패키지 관리에 따라 비슷한 부분도 존재합니다.

  • Red Hat-Based
    • Fedora, CentOS
    • `rpm`이나 `yum` 패키지 관리도구를 이용하며 설치나 관리, 업데이트가 쉬운 편입니다.
  • Debian-Based
    • Ubuntu, Debian
    • `apt` 패키지 관리도구를 사용하며 보통 개인용이나 데스크톱에서 많이 사용하는 편입니다. 
Unix와 Linux의 차이
앞서 나왔듯, 리눅스는 유닉스를 기반으로 만든 운영체제입니다. 가장 큰 차이점으로 리눅스는 공용 라이선스(GPL)이기 때문에 자유롭게 사용할 수 있다는 점입니다. 그래서 리눅스는 PC나 안드로이드, 스마트 워치등에서 사용합니다.

 

리눅스 컴포넌트

  • 커널(Kernel) : 시스템 콜을 제공하거나 프로세스, 파일 시스템, I/O등을 관리하는 운영체제의 핵심 부분입니다.
  • 쉘(Shell) : 사용자와 운영체제와 인터렉트를하는 인터페이스
  • 파일시스템 : 하드디스크와 메인 메모리의 속도차를 줄이기 위해 개발된 파일이나 자료를 쉽게 찾는 방법
  • GNU Tool : 소프트웨어를 만드는 프로그래밍 도구의 집합을 말합니다.

Root

  • Root : 루트 계정은 유저 계정을 관리하는 강력한 계정으로 모든 명령어를 접근하는데 제한이 없습니다. 
    • Root 디렉토리 : 가장 위에 있는 디렉토리를 말합니다. `/`를 입력하면 루트 디렉토리를 확인할 수 있습니다.
    • root User로 로그인하는 것은 보안상 위험한 방법입니다. 대신에 `sudo`(superuser do)를 사용하면 잠시 권한을 빌리게 됩니다.
`sudo`는 잠시 root 권한을 빌리는 명령어입니다. 그러나 일시적으로 권한을 빌리는 것은 번거로운 일입니다.
그래서 `sudo -s`나 `sudo su`를 사용하는 경우가 있는데 이 둘에도 차이가 있습니다. 둘다 권한을 반 영구적으로 빌리는 것이지만 `sudo -s`로 전환했을 때 Home 디렉토리는 사용자의 홈 디렉토리가 되고 `su`는 /root 디렉토리가 됩니다. 즉, 루트 계정으로 전환하는 것입니다. 여기서 환경변수 까지 전환하는 명령어는 `su - root`입니다. 

 

*먼저, AWS에서 EC2서버를 생성한 다음, key 허가를 변경 후 ssh 인증키로 Linux 서버와 연결합니다.

다음 명령어를 통해 Linux 서버의 정보를 알 수 있습니다.

만약 해당 서버에서 Root 계정으로 전환하고 싶으면 `sudo su`를 사용하면 됩니다.

 


리눅스 파일 시스템

리눅스는 EXT(Extended File System)이라는 파일 시스템을 사용합니다.

ext는 초기버전인 extfs 이후로 성능이나 저널링, 확장성을 추가해 ext4까지 발전하게 됩니다.

저널링(Journaling)
inode나 비트맵의 수정이 있는 경우 내용을 로그로 남기는 것을 말합니다. 
하나의 파일에는 메타데이터(확장자, 이름, 권한 등)와 데이터가 있습니다. 그 중 메타 데이터는 inode라는 자료구조로 inode 블록에 저장이 됩니다. inode는 `ls -i` 명령어를 입력했을 때 가장 좌측에 뜨는 숫자를 말합니다.

 

그럼, 리눅스의 디렉토리 구조는 어떻게 되어 있을까요?

리눅스의 디렉토리 구조는 트리 구조로 이루어져 있지만 링크로 연결되어 있습니다. 링크에는 심볼릭 링크(Symbolic Link; Soft Link)하드 링크(Hard Link)가 있습니다. 

☝️ inode(index node)
inode
는 소유권한이나 접근 모드등 메타 데이터가 포함되어 있는 자료구조를 말합니다. 하지만 파일에 대한 이름이나 데이터는 포함되어 있지 않습니다. ex) 소유권, 파일 유형, 권한, 타임스탬프, 링크 카운트, 데이터 블록에 대한 포인터 등 

 

Hard Link(하드링크, `ln`)

하드 링크는 해당 파일의 inode를 직접적으로 가리킵니다.  원본 파일을 그대로 복제한 것이기 때문에 원본 파일이 사라지더라도 데이터만 있으면 접근이 가능합니다(원본 파일과 관계가 없습니다.).

  • 하나의 하드링크를 통해 데이터를 변경하면 모든 하드링크 또한 자동으로 반영되게 됩니다. 

Soft Link(소프트 링크, 심볼릭 링크, `ln -s`)

소프트 링크는 inode가 아닌 다른 파일이나 디렉토리를 가리킵니다. 즉, 파일의 inode와는 독립적인 링크입니다.

  • 댕글링 링크 : 원본파일이 삭제되거나 변경되면 소프트링크는 끊어지고 더 이상 작동하지 않습니다.
더보기

실습

먼저 리눅스 환경에서 다음 처럼 `origin.txt` 파일을 생성합니다.

touch origin.txt
echo "hello" > origin.txt
cat origin.txt

 

그 다음 `origin.txt`의 하드링크(`hard.txt`)와 소프트 링크(`soft.txt`)를 생성합니다.

`stat 파일명` 명령어로 링크가 되어있는 파일 수, 링크 카운트를 확인할 수 있습니다.

하드 링크의 카운트는 2 소프트 링크의 카운트는 1입니다.

ln origin.txt hard.txt
ln -s origin.txt soft.txt

 

만약 여기서, `origin.txt`를 삭제하게 되면 어떤 일이 벌어질까요?

rm origin.txt

하드 링크의 카운트는 1, 소프트 링크의 카운트는 1입니다.

원본 파일을 삭제하게 되면 소프트링크는 위와 같이 댕글링 링크로 남게됩니다.

리눅스 주요 디렉토리

리눅스의 파일 구조는 다음과 같은 트리 구조를 가지고 있습니다(FHS).

 

더보기

리눅스 주요 디렉토리 

 

/bin `cp`,`mv`,`ls`등 쉘 명령 바이너리 파일이 저장된 디렉토리입니다.
/sbin /bin과 비슷하지만 시스템 관리와 관련된 명령어를 저장하는 디렉토리입니다. `fdisk` `ifconfig`(root 권한 필요)
/etc 시스템과 관련된 설정(configure)파일이 존재하는 디렉토리입니다. `ssh`나 `hostname` `sudoer`등 암호나 네트워크 파일이 존재하는 디렉토리입니다.
/home 사용자들의 개인 디렉토리가 존재하는 공간입니다. 서버에 접속할 때 보통 시작점입니다.
/opt 외부 응용 프로그램을 설치하거나 저장할 때 사용하는 디렉토리입니다. Mac에서는 homebrew가 저장되어 있습니다.
/var 로깅이나 캐시, 사용자 추적, 디버깅 등 로그 파일들을 관리하는 디렉토리입니다.
/dev 하드웨어 장치와 관련된 파일들이 존재하는 디렉토리입니다. (USB, 하드웨어)
/tmp 주기적으로 지우고 실행할 수 있는 임시파일이 저장되는 공간입니다.
/lib /bin이나 /sbin에 있는 바이너리 파일을 실행하는 유틸리티 파일 공간입니다.
/usr 시스템 관리자가 아닌 일반 사용자가 사용하는 디렉토리 공간입니다. 
/run 실행중인 서비스와 관련된 파일이 저장되는 디렉토리 공간입니다.

 

 


기본적인 리눅스 명령어

파일 디렉토리 권한, 소유권

리눅스의 파일 권한과 소유권에 대한 명령어는 대표적으로 3가지가 있습니다.

  • chown : 파일이나 디렉토리의 소유권을 변경하는 명령어
  • chmod : 파일이나 디렉토리의 권한을 변경하는 명령어

앞에서 부터 파일 타입(Type), 권한(mod), 소유권(owner, group)을 말합니다.

## chown

# chown owner:group file/dir : 해당 파일의 소유권을 kim이 갖게 변경한다.
chown kim file.txt

# chown options owner file/dir : 해당 디렉토리의 소유권을 kim이 갖게 변경한다.
# Recursively Change
chown -R kim /home/files 


## chmod

# 해당 파일을 유저에겐 R,W,E 권한, 그룹에겐 R,W 권한, 이외에겐 R 권한을 부여
chmod 751 file.txt

# 그룹에게 Write(w) 권한을 부여(+)
chmod g+w file.txt
더보기

리눅스 기본 명령어

명령어 설명 옵션
`cd` 디렉토리를 이동할 때 사용하는 명령어  
`pwd` 현재 작업중인 절대 경로를 출력  
`ls` 현재 디렉토리 모든 파일 출력 `-l` : long listing
`-a` : All File
`touch` 빈 파일을 생성할 때 만드는 명령어  
`cp` 디렉토리나 파일을 복사할 때 사용하는 명령어 `-r` : 디렉토리 내 서브디렉토리도 복사
`-f` : 오버라이딩할 때
`mkdir` 새로운 디렉토리 생성  `-p` : 디렉토리가 있더라도 에러가 나지 않음
`rm` 삭제 명령어 `-r` : 디렉토리 삭제
`-rf`: 강제 제거
`find [path] [expression]` 시작점(path) 아래 모든 디렉토리 검색 find [path] -name ""
find [path] -type f -mtime -7 : 지난 일주일동안 고쳐진 파일 타입 검색
--help 명령어 대한 설명을 확인  
man 명령어에 대한 메뉴얼 확인  
  • `*.txt` : 하나 이상의 파일을 찾을 때 사용하는 와일드 카드
  • `?.txt` : 하나의 파일을 찾을 때 사용하는 와일드 카드
  • `file[a-c].txt` : filea.txt ~ filec.txt 까지 대괄호(`[]`) 안에 해당하는 문자가 있는 파일을 찾을 때 사용하는 와일드 카드
  • `file[!123].txt` : 반대 방향으로 찾는 와일드 카드, [!1]의 경우 1을 제외한 파일을 찾음.

Crontab

크론탭은 특정한 시간이나 인터벌(interval) 별로 반복되는 주기로 실행하기 위한 명령어입니다. 크론탭은 크론 잡(Cron Job)을 만들어  제거(`-u`), 조회(`-l`), 편집(`-e`)등의 옵션으로 진행할 수 있습니다. 시간을 변경할 때 복잡하거나 이게 맞나? 싶은 경우가 있는데 crontab.guru 사이트에서 쉽게 확인할 수 있습니다.

 

# 크론 시작
/sbin/service cron start

# 크론이 실행중인지 확인
ps -ef | grep cron | grep -v grep

# 크론 편집
crontab -e

# 매 10분마다 script 실행
*/10 * * * * /path/to/script

Signal

시그널은 작업을 수행하거나 이벤트를 응답하기 위해 프로세스에 알림을 보내는 프로세스 간 통신(IPC)의 한 형태을 말합니다.

가장 대표적인 시그널로 3가지 있습니다. `kill -l`로 확인할 수 있습니다. 

  • SIGKILL (9) :  프로세스를 종료하라고 명령어하는 신호입니다. "종료해!!"
  • SIGTERM (15) : 종료 명령어를 소프트하게 보내는 명령어입니다. "종료부탁드려요!" 
  • SIGINT (2) : 중단 신호를 말합니다. 예시로 `Ctrl + C`로 중단할 때랑 비슷합니다.

프로세스 상태(`ps`) 명령어

프로세스 상태를 나타내는 `ps` 명령어는 다양한 옵션을 이용해 활성화된 프로세스 정보를 표시할 수 있습니다.

 

  • %CPU : 프로세스의 CPU 사용량을 말합니다.
  • %MEM : 프로세스의 메모리 사용량을 말합니다.
  • VSZ : 프로세스의 가상메모리 사이즈(KiB)를 말합니다.
  • RSS : Swap이 안된 메모리 사이즈를 말합니다.
  • STAT : 프로세스 상태 코드
    • S(Sleeping)
    • s(Session Leader: 리눅스 시작시 초기 실행)
    • D(I/O 작업 중인 대기 상태의 프로세스)
    • T(정지된 상태의 프로세스)
    • Z( 좀비 상태의 프로세스)
    • R(실행중인 프로세스)

`Top` 명령어

  • `uptime` : 현재 시간, 시스템 작동 시간, 로그인한 계정 수, Load Average( 1분동안, 5분 동안, 15분동안의 평균)
  • `lscupu` : 시스템의 CPU 정보 확인
명령어 설명
`h` `?` 메뉴얼 확인
`k [PID]` 프로세스 종료 신호 보내기
`u` 특정 유저가 속해있는 프로세스 확인
`P` 프로세스 리스트 별로 정렬
`M` 메모리 사용 별로 정렬
`T` CPU Time 별로 정렬
`f` 어떤 컬럼을 볼지 필터링 `d`로 토글
`r` 프로세스 우선순위 정하기 (Renice)
`q` 종료(space는 새로고침)

 

 


디스크 관련 명령어

`du` disk Usage

해당 명령어는 파일이나 디렉토리가 사용하는 디스크 공간을 나타내는 명령어입니다. 

  • `-h` : 사용하는 디스크 공간의 사이즈를 GB, MB, KB 등 단위로 보여줍니다.
  • `-s` : 각 요소의 전체를 요약해서 보여줍니다.
  • `-a` : 디렉토리 내 모든 파일들의 내역을 보여줍니다.
  • `--max-depth=1` : 1단계 depth 만큼 보여주는 옵션

`df` disk free

해당 명령어는 마운트된 모든 파일 시스템의과 사용가능한 그리고 사용하고 있는 디스크 공간을 나타내는 명령어입니다. 

  • `-h` : 사용 가능한 디스크 공간의 사이즈를 GB, MB, KB 등 단위로 보여줍니다.
  • `-t` : 파일 시스템의 타입을 보여줍니다.
  • `--total` : 파일 시스템의 전체 사용량을 제공합니다.

 


☕️ 포스팅이 도움이 되었던 자료

오늘도 저의 포스트를 읽어주셔서 감사합니다.

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.