🐧 Linux 기초 다지기: 필수 명령어부터 시스템 관리까지

오늘은 리눅스 환경 설정부터 일상적인 파일 및 디렉토리 관리, 그리고 프로세스 제어에 이르는 다양한 리눅스 기본 명령어를 학습했다. 특히 Docker 컨테이너 환경에서 리눅스를 직접 다루며 실용적인 사용법을 익혔다.

💡 리눅스, 왜 중요할까?

리눅스는 서버 운영체제의 표준이자, 클라우드 환경의 핵심이다. 개발자라면 리눅스 환경에 대한 이해는 필수적이다. 오늘 배운 명령어들은 리눅스 시스템을 효율적으로 다루고 문제를 해결하는 데 있어 강력한 기반이 될 것이다.


⚙️ Docker를 이용한 리눅스 환경 설정

Docker를 활용하여 가볍고 빠르게 리눅스 개발 환경을 구축하는 방법을 실습했다.

1. Ubuntu 컨테이너 실행 및 필수 패키지 설치

# Ubuntu 컨테이너에 접속
docker exec -it ubuntu2 /bin/bash

# 필수 외 패키지 모두 설치 (unminimize는 최소 설치된 시스템에서 추가 패키지를 설치하여 일반적인 사용 환경으로 만듦)
$ unminimize

# 서버1에서 기본 유틸리티 및 SSH 서버 설치
apt-get update 
apt-get install net-tools vim openssh-server ssh sudo info man-db less psmisc nano tzdata cron

# 시간대 설정 (예: Asia / Seoul)
# 6. Asia / 69. Seoul

# SSH 원격 접속을 위한 설정 변경: PermitRootLogin yes
# /etc/ssh/sshd_config 파일에서 PermitRootLogin 옵션을 찾아 'yes'로 변경

# root 비밀번호 설정 (외부 접속용)
passwd root  

# SSH 서비스 시작
service ssh start

2. SSH를 이용한 컨테이너 간 접속

# 서버2에서 서버1(ubuntu01) 또는 다른 컨테이너(ubuntu02)로 SSH 접속
# 예: ssh root@127.0.0.1 -p 23 (ID@접속할주소)

🛠️ 리눅스 기본 명령어 익히기

파일 및 디렉토리 관리, 시스템 정보 확인 등 리눅스 사용에 필수적인 명령어들을 살펴보았다.

0. 명령어 사용법 찾기 🔍

리눅스 명령어의 사용법을 모를 때 활용할 수 있는 다양한 방법들이다.

명령어 설명 특징
whatis 가장 간략한 설명 제공 키워드가 완전히 일치해야 함. mandb 업데이트 필요 시 sudo mandb
info 상세한 정보 제공 U: 한 단계 위로, Q: Info 화면 종료
명령어 --help 명령어의 간략한 도움말 출력 가장 빠르고 기본적인 도움말
man 가장 상세한 매뉴얼 페이지 제공 엔터: 한 줄씩, 스페이스: 한 화면씩, B: 뒤로, /단어: 검색, n: 다음 검색, q: 종료

💡 man 페이지 활용 팁

man 페이지는 일반적으로 8개의 섹션으로 나뉘어 있다. 특정 섹션의 매뉴얼을 보고 싶다면 man [섹션 번호] [명령어] 형식으로 사용한다. (예: man 5 passwdpasswd 파일 형식에 대한 매뉴얼을 보여줌)

1. ls (list) 📂: 파일 및 디렉토리 목록

현재 디렉토리의 파일과 서브 디렉토리를 나열한다.

$ ls             # 현재 디렉토리 목록
$ ls /usr        # 특정 디렉토리 목록
$ ls -l          # 상세 정보 (long format)
$ ll             # 'ls -l'의 단축 명령어
$ ls -a          # 숨겨진 파일 포함 모든 파일 출력
$ ls -F          # 파일 종류를 나타내는 기호 추가 (/: 디렉토리, *: 실행 파일, @: 심볼릭 링크)
$ ls -aF         # 여러 옵션 함께 사용
$ ls -w 30       # 출력 너비 지정 (long option: --width 30, --width=30)
$ ls --quote-name # 파일 이름을 "로 묶어서 출력 (long option: --quote)

2. pwd (print working directory) 📍: 현재 작업 디렉토리 출력

현재 작업 중인 디렉토리의 절대 경로를 표시한다.

💡 절대 경로 vs. 상대 경로

  • 절대 경로: 루트 디렉토리(/)부터 시작하는 전체 경로 (예: /home/user/documents). 명확하지만 길고 시스템 의존적일 수 있다.
  • 상대 경로: 현재 디렉토리를 기준으로 하는 경로. . (현재 디렉토리), .. (부모 디렉토리)를 사용한다. (예: ./file.txt, ../dir1)

3. cd (change directory) ➡️: 디렉토리 변경

현재 작업 디렉토리를 변경한다.

$ cd /home/user/Documents # 절대 경로로 이동
$ cd                    # 홈 디렉토리로 이동
$ cd ~                  # 홈 디렉토리로 이동
$ cd ~/hello            # 홈 디렉토리 하위의 hello 디렉토리로 이동

4. mkdir (make directory) ➕: 새 디렉토리 생성

새로운 디렉토리를 생성한다.

$ mkdir new_directory         # 새 디렉토리 생성
$ mkdir -p hello/test/dir1    # 중간 경로가 없어도 디렉토리 생성 (-p 옵션)

5. cat (concatenate) 📄: 파일 내용 출력 및 연결

파일의 내용을 화면에 표시하거나 여러 파일을 연결하여 출력한다.

$ echo hello >> file.txt    # file.txt에 "hello" 추가
$ cat file.txt              # file.txt 내용 출력
$ cat file1.txt file2.txt > combined.txt # 두 파일 내용을 합쳐 combined.txt 생성
$ cat -n file1.txt          # 행 번호와 함께 파일 내용 출력
$ cat /etc/hostname         # 시스템 호스트 이름 파일 내용 출력

6. cp (copy) 📋: 파일 또는 디렉토리 복사

파일 또는 디렉토리를 복사한다.

$ cp file1.txt file3.txt    # file1.txt를 file3.txt로 복사
$ cp -r dir1 dir2           # 디렉토리 복사 (-r: 재귀적 복사)
$ cp -i file.txt new_file.txt # 덮어쓰기 전 확인 (-i 옵션)

7. mv (move) ↔️: 파일 또는 디렉토리 이동/이름 변경

파일 또는 디렉토리를 이동하거나 이름을 변경한다.

$ mv file.txt file3.txt     # file.txt를 file3.txt로 이름 변경
$ mv file3.txt dir3/        # file3.txt를 dir3 디렉토리로 이동
$ mv -i file.txt new_file.txt # 덮어쓰기 전 확인 (-i 옵션)

8. rm (remove) 🗑️: 파일 또는 디렉토리 삭제

파일 또는 디렉토리를 삭제한다. 주의: 삭제 시 복구 불가능!

$ rm file.txt               # 파일 삭제
$ rm file.txt file1.txt     # 여러 파일 삭제
$ rm *.txt                  # .txt 확장자를 가진 모든 파일 삭제
$ rm -r directory           # 디렉토리와 그 내용 삭제 (-r: 재귀적 삭제)
$ rm -i *.txt               # 삭제 전 확인 (-i 옵션)

⚠️ rm 명령어 사용 시 주의!

리눅스에서 rm 명령어는 삭제 확인 메시지 없이 즉시 파일을 삭제한다. -i 옵션을 사용하면 삭제 전 확인 메시지가 출력되어 실수를 방지할 수 있다.

9. rmdir (remove directory) ❌: 빈 디렉토리 제거

비어있는 디렉토리를 제거한다. 비어있지 않으면 에러가 발생한다.

$ rmdir empty_directory     # 빈 디렉토리 삭제

10. touch (touch) 📝: 파일 생성 또는 타임스탬프 업데이트

새로운 빈 파일을 생성하거나 기존 파일의 타임스탬프를 업데이트한다.

$ touch new_file.txt        # 새 빈 파일 생성
$ touch file.txt            # 기존 파일의 타임스탬프 업데이트
$ touch file{1..100}        # file1부터 file100까지 여러 파일 생성

11. which (which) ❓: 프로그램 경로 확인

명령어의 실행 파일 경로를 확인한다.

$ which crontab             # crontab 명령어의 실행 파일 경로 확인

12. whereis (where is) 🗺️: 프로그램 관련 파일 확인

명령어와 관련된 모든 파일(실행 파일, 소스, 매뉴얼 페이지 등)의 위치를 보여준다.

$ whereis crontab           # crontab 관련 모든 파일 위치 확인

13. less (less) 📜: 파일 내용 스크롤 표시

긴 파일의 내용을 스크롤하며 볼 수 있게 해준다. cat보다 큰 파일 보기에 적합하다.

$ less /etc/bash.bashrc     # bash.bashrc 파일 내용 스크롤하며 보기

💡 less 사용법

  • Space: 한 화면 아래로 이동
  • b: 한 화면 위로 이동
  • /검색어: 아래 방향으로 검색
  • ?검색어: 위 방향으로 검색
  • n: 다음 검색 결과로 이동
  • q: 종료

14. grep (global regular expression print) 🔎: 특정 패턴 검색

파일 또는 출력에서 특정 패턴을 검색한다. 파이프(|)와 함께 자주 사용된다.

$ grep "search_term" file.txt # file.txt에서 "search_term" 검색
$ ps -ef | grep ssh          # 실행 중인 프로세스 중 ssh 관련 프로세스 검색
$ grep -i man /etc/passwd    # 대소문자 구분 없이 "man" 검색
$ grep -v man /etc/passwd    # "man"이 포함되지 않은 줄 검색
$ grep -e 검색어1 -e 검색어2 # 여러 검색어 사용

15. echo (echo) 💬: 텍스트 출력

텍스트 줄을 화면에 표시한다.

$ echo "Hello, World!"      # "Hello, World!" 출력

16. df (disk free) 📊: 디스크 여유 공간 확인

디스크 공간 사용량을 표시한다.

$ df -h                     # 사람이 읽기 쉬운 형식으로 디스크 사용량 표시

17. du (disk usage) 📦: 디스크 사용량 확인

파일 및 디렉토리의 디스크 사용량을 표시한다.

$ du -sh /home/user/        # /home/user/ 디렉토리의 총 사용량 요약

18. ps (process status) 🏃: 프로세스 상태 확인

현재 실행 중인 프로세스를 나열한다.

$ ps aux                    # 모든 사용자 프로세스 상세 정보 출력
$ ps -ef | grep init        # init 프로세스 검색

19. kill (kill) 💥: 프로세스 종료

지정된 프로세스를 종료한다.

$ kill 12345                # PID 12345인 프로세스 종료

20. top (top) 📈: 실시간 프로세스 모니터링

시스템 프로세스에 대한 동적 뷰를 실시간으로 표시한다.

$ top                       # 실시간 프로세스 모니터링 시작

파일에 별명(링크)을 생성한다. 하드링크와 심볼릭(소프트) 링크 두 종류가 있다.

구분 하드링크 (Hard Link) 소프트링크 / 심볼릭 링크 (Soft Link / Symbolic Link)
개념 원본 파일과 동일한 물리적 위치(inode)를 가리키는 새 디렉토리 항목 다른 파일이나 디렉토리의 경로를 가리키는 특수한 유형의 파일 (바로가기)
특징 - 원본과 사본 구분이 없음
- 다른 파일 시스템/파티션에 걸쳐 있을 수 없음
- 디렉토리에는 생성 불가
- 원본 삭제 시 모든 하드링크 삭제 전까지 데이터 유지
- 원본 파일이 삭제되면 “깨진” 링크가 됨
- 여러 파일 시스템/파티션에 걸쳐 있을 수 있음
- 파일 및 디렉토리 모두에 생성 가능
생성 ln source_file hardlink ln -s source_file_or_directory softlink
예시 ln file.txt hardlink_to_file.txt ln -s file.txt softlink_to_file.txt
ln -s my_directory softlink_to_my_directory

💡 심볼릭 링크 활용 사례

  • 긴 경로명 단축: 자주 사용하는 긴 경로를 짧은 링크로 만들어 접근성 향상.
  • 여러 버전 프로그램 관리: 프로그램의 특정 버전을 가리키는 latest와 같은 심볼릭 링크를 사용하여 버전 관리 용이.

22. find (find) 🔍: 파일 검색

특정 조건에 맞는 파일이나 디렉토리를 검색한다.

$ find / | grep log         # 루트 디렉토리에서 "log" 문자열이 포함된 파일/디렉토리 검색
$ find / -type f -name "*log" # 루트 디렉토리에서 이름이 "*log"로 끝나는 파일 검색

23. tree (tree) 🌳: 디렉토리 구조 출력

디렉토리의 계층적 구조를 트리 형태로 출력한다.

$ tree                      # 현재 디렉토리의 트리 구조 출력
$ tree / | grep log | less  # 루트 디렉토리의 트리 구조에서 "log" 검색 후 less로 보기

24. 텍스트 편집기 (nano, vi, vim, emacs) ✍️

파일을 편집하기 위한 다양한 텍스트 편집기.

$ nano file.txt             # nano 편집기로 file.txt 열기
$ vi file.txt               # vi 편집기로 file.txt 열기
$ vim file.txt              # vim 편집기로 file.txt 열기

25. apt (Advanced Package Tool) 📦: 패키지 관리

데비안 기반 리눅스(Ubuntu 등)에서 패키지를 관리하는 명령어.

$ sudo apt update           # 패키지 목록 업데이트
$ sudo apt-get install 패키지명 # 특정 패키지 설치

26. awk (awk) ✂️: 텍스트 처리 도구

파일이나 데이터 스트림에서 특정 패턴을 찾아 처리하고 분석하는 데 사용되는 강력한 도구.

# sample.txt 내용:
# John Doe 30
# Jane Smith 25
# Sam Brown 20

$ awk '{ print $2 }' sample.txt         # 두 번째 필드(이름) 출력
$ awk '$3 == 25 { print $0 }' sample.txt # 세 번째 필드(나이)가 25인 줄 전체 출력
$ awk '{ sum += $3; count++ } END { print "Average age:", sum/count }' sample.txt # 평균 나이 계산
$ awk 'BEGIN { print "Processing..." } { print $0 }' sample.txt # BEGIN 블록 사용

# 실습: sample.txt에서 나이가 25살 이상인 사람들의 last 이름과 나이를 출력
$ awk '$3 >= 25 { print $2, $3 }' sample.txt

# sample2.csv 내용:
# John,Doe,30
# Jane,Smith,25
# Sam,Brown,20

$ awk -F',' '{ print $1, $2 }' sample2.csv # 콤마(,)를 필드 구분자로 사용하여 첫 번째, 두 번째 필드 출력

# 프로세스 관리 예시
$ yes > /dev/null &   # 부하 발생
$ ps aux | awk '$3 > 50 {print $1, $3, $11}' # CPU 사용률 50% 초과하는 프로세스 확인
$ ps aux | awk '$3 > 50 { print $2 }' | xargs kill -9 # CPU 사용률 50% 초과하는 프로세스 강제 종료

27. visudo (visual sudo) 🛡️: sudo 권한 관리

sudoers 파일을 안전하게 편집하여 특정 사용자에게 sudo 명령 권한을 부여한다.

$ sudo visudo               # sudoers 파일 편집기 실행

💡 visudo 사용 이유

sudoers 파일을 직접 편집하면 문법 오류 시 시스템에 심각한 문제를 초래할 수 있다. visudo는 저장 전 문법 검사를 수행하여 안전하게 편집할 수 있도록 돕는다.


✨ 오늘의 회고

  • ls, cd, cp, mv, rm 등 파일 및 디렉토리 관리의 핵심 명령어를 숙달했다.
  • grep, awk 와 같은 강력한 텍스트 처리 도구를 활용하여 cli 환경에서 데이터를 분석하고 필터링하는 능력을 길렀다.