문서 검색

그림으로 배우는 리눅스

그림으로 배우는 리눅스 표지

실습 환경

🛠️

사용하는 기술

  • 클라우드: GCP Compute Engine
  • 배포판: AlmaLinux
  • 머신 타입: e2-small
  • 디스크: 30GB
  • 리전/존: asia-northeast3-a

배포판에서 최적의 리눅스를 선택하자

Linux OS 를 사용하기로 마음 먹었다면 현재 환경에서 가장 최적의 배포판을 선택해야 한다. 그 중 가장 핵심이 되는 것은 비용과 지원 기간이다

왜 항상 리눅스는 배포판을 선택해서 설치할까?

리눅스는 오픈소스로 공개 되며, 누구나 자신의 데스크탑에 커널을 설치하고 필요한 애플리케이션만 골라서 사용자 정의 환경을 구성할 수 있다.

매번 이렇게 구성하면 좋겠지만, 시간과 리눅스를 지탱하는 기술에 대한 지식이 필요하게 되어 쉽게 설치할 수 있도록 배포판을 선택하여 설치하는 것이 합리적이다.

레드햇과 데비안 계열

리눅스 배포판은 왜 레드햇과 데비안 계열로 크게 두 가지로 나눌까?

두 계열의 대표적인 차이점은 패키지 관리 방식에 있다.

리눅스는 커널 + 응용 프로그램 + 패키지 관리 도구 의 모음인 운영 체제인데, 두 프로젝트가 관리하는 패키지 관리 도구가 서로 다른점이 있다.

  • Red Hat: rpm, yum, dnf
  • Debian: apt

그 밖에도 레드헷 계열은 상업용 배포판을 관리하며 유료 버전과 커뮤니티 버전을 동시에 제공한다. 반면에, 데비안 계열은 커뮤니티 버전을 제공하며 상업용과 같이 보안 체계에 민감하다면 오픈소스인 데비안 계열 대신 상업용인 레드햇 계열을 선택할 수 있다.

즉, 결론적으로 유료를 지불하지만 안정성을 위한 서버 OS 를 사용한다면 레드햇 계열, 적당한 안정성과 사용자 편의를 위한 여러 패키지들을 사용하고 싶다면 데비안 계열을 선택한다.

레드햇 계열에서 유료 패키지를 제거한 버전이 Cent OS, 현재 Rocky Linux 이고 데비안 계열에서 입문자를 위해 제공 하는 운영체제가 우리가 흔히 알고 있는 ubuntu 이다.

wiki.debianusers.or.kr
https://wiki.debianusers.or.kr/index.php?title=Debian과_Redhat의_차이점
tigerteam.tistory.com
https://tigerteam.tistory.com/86

비용과 지원 기간이 최적의 선택을 하는 근거인 이유

업무용 서버에서 문제가 발생하는 것을 낙관적으로 생각하는 사람이 있을까? 이런 전제 조건을 깔고 안정성을 선택한다면 유료에 대한 선택지가 존재한다.

유료 버전은 업무 환경에서 문제가 발생하지 않기를 원하거나 만일의 경우로 문제가 발생한다면 빠른 지원을 받을 수 있는 배포판이다.

반대로, 무료 버전은 문제가 발생하더라도 스스로 해결 해 나가야 한다.

배포판은 대부분 1년에 2 번 정도 릴리즈 된다. 그런데 매 번 릴리즈 될 때 마다 이전 버전에 지원이 끊겨, 매번 OS 업데이트 같은 거대한 작업을 해야 한다고 생각해보자.

릴리즈가 메이저 버전에 해당하면 지원하는 패키지 등 동작하던 것들이 동작하지 않을 수 있다. 그렇기 때문에 매 번 OS 업데이트 하기는 힘든건 사실이다.

우리가 선택하는 배포판을 보면, 레드햇 계열의 Rocky Linux는 10년을 지원하고, Ubuntu 는 LTS 버전을 선택 할 경우 5년간 지원 한다.

하지만 반대로 페도라 같은 경우는 13개월 정도 지원하는 것으로 알려져있으니 지원이 중단될 때 매번 새로운 버전으로 업데이트 하는 것을 고려했을 때 배포판을 결정하는 것이 바람직하다.

리눅스의 사용자 와 그룹

리눅스는 기본적으로 여러 사용자가 한 대의 PC 를 사용하는 것을 전제로 만들어졌다. 그래서 사용자를 관리할 수 있도록 역할이 존재하는데 이를 관리자 사용자, 시스템 사용자, 일반 사용자로 분류 되어 사용한다.

📝

역할 별 권한

  • 관리자 사용자: 이하 root 는 리눅스에서 고유한 유저로 소프트웨어 레벨에서 실행 시킬 수 있는 명령어를 모두 사용할 수 있다.
  • 시스템 사용자: 백그라운드로 동작하는 프로그램의 명령어를 실행 한다.
  • 일반 사용자: 서버에 접근할 수 있도록 권한을 부여 받은 일반 사용자로, 유저 그룹과 권한에 따라 실행시킬 수 있는 명령어가 나뉜다.

리눅스에서 모든 파일과 디렉터리는 소유자, 그룹, 다른 사용자에 대한 권한 정보를 가지고 있다.

기본적으로 파일에 대한 권한을 보는 명령어는 ls 커맨드 -l 옵션을 사용하는 것이며, 순서는 소유자/그룹/다른 사용자 순서로 읽는다.

-rw-r--r--. 1 juhwan juhwan 0 Aug  9 07:36 test.txt

juhwan 유저는 읽기/쓰기, 그룹은 읽기, 다른 사용자는 읽기가 허용된 test.txt 파일이다. 해당 파일의 권한을 변경하기 위해서 chmod 로 설정할 수 있고, 흔히 숫자로 표현하여 사용한다.

📝

숫자로 설정하는 퍼미션

  • 읽기: read - 4
  • 쓰기: write - 2
  • 실행: execute - 1

총 7 까지의 권한을 부여할 수 있으며 chmod 777 로 주는 순간 나를 포함한 모든 사용자가 읽고 쓰고 실행할 수 있는 파일이 생성 된다.

예전 AWS 서버에 접근하기 위해서 pem 파일을 400으로 변경해야 했는데, 이는 권한이 너무 많아 탈취 당하는 것을 막기 위해 현재 사용자만 읽을 수 있도록 변경 하도록 강제 했다.

리눅스의 그룹 관리

리눅스에서 유저 한 명을 생성하면 유저 이름과 동일한 그룹과 홈 디렉터리가 자동으로 생성 된다. 이는 리눅스에서 그룹 단위로 관리하는 방식을 채택하고 있기 때문이다. 그렇기 때문에 일반 사용자를 생성할 때는 기존에 있는 그룹에 소속되도록 생성하는 것이 원칙이다.

아래 명령어를 통해 프라이머리 그룹을 지정할 수 있다.

usermod -g group user

또한, 일반 사용자는 복수의 그룹에 소속될 수 있으며 이 경우 가장 우선되는 그룹인 프라이머리 그룹을 지정해야 한다.

📝

sudo (superuser do) 를 허용하는 그룹

sudoroot 전용 커맨드를 일반 사용자도 실행할 수 있도록 허용하는 커맨드이다. 하지만, 모든 사용자가 sudo 를 사용하면 관리자 역할이 모두 부여 되는 것이기 때문에 이를 실행할 수 있는 그룹인 wheel 이라는 그룹으로 관리된다.

리눅스의 사용자 관리

사용자를 추가할 때는 useradd 커맨드로 생성하게 되는데, 이 때 패스워드는 설정할 수 없기 때문에 passwd 커맨드를 입력하여 생성 한다.

이렇게 생성된 패스워드는 관리자도 알 수 없기 때문에 분실 했다면 해당 유저의 패스워드를 재설정 해야 한다.

📝

패스워드가 저장된 파일

루트 디렉터리 아래 /etc/shadow 라는 파일을 열어보면 비밀번호가 난수화 되어 저장되어 있는 것을 볼 수 있다.

과거에는 /etc/passwd 에 저장되었지만, 보안상의 문제로 변경 되었다.

특정 유저를 삭제하려면 userdel 커맨드로 삭제하며 유저와 그룹은 삭제 되지만 홈 디렉터리는 그대로 남아있다.

셸이 제공하는 기능

일반적으로 sh 라는 셸을 사용하지만, 현대 리눅스 배포판은 기본적으로 bash 를 사용 한다.

사내 과거 인프라 환경에서 특정 이미지는 오래 된 버전의 이미지를 사용하고 있었는데 이 때 bash 가 존재하지 않아 sh 셸로 접근 했던 기억이 있다.

이 때 자동 완성이 안되어 무척 불편했었는데, 지금까지 편하게 써왔기 때문에 모든 셸이 지원하는 줄 알았었다.

📝

bash 가 제공하는 편리한 기능

  1. 상, 하 방향키를 통해 히스토리 커맨드 불러오기
  2. 자동완성(tab) 지원
  3. 와일드카드 를 이용한 검색

내장 커맨드와 외부 커맨드 들이 다양하게 셸 안에 존재하는데, 이 때 확인하는 방법은 type 이라는 커맨드를 통해 알 수 있다.

내장 커맨드인 경우 type cd 라고 검색하면, cd is a shell builtin 라고 나오게 된다. 반대로, 외부 커맨드인 경우 type find 라고 검색하면, find is /usr/bin/find 라고 기능이 존재하는 디렉터리 위치를 나타낸다.

리눅스의 심볼릭 링크

심볼릭 링크는 윈도우에서 바로가기 아이콘과 같은 역할을 한다.

i 노드

i 노드는 인간은 파일에 대해 이름을 붙여 인식하지만, 커널은 단순히 파일에 번호를 붙여서 식별하는데 이 번호를 i 노드라고 한다.

리눅스는 디스크에 여유 공간이 있더라도, i 노드의 최대 할당 수를 초과 하면 파일을 생성할 수 없다.

  • 이 때 디렉터리와 심볼릭 링크도 같이 포함 됨
📝

남은 i 노드 수 확인하기

df -i 커맨드를 입력하고 IFree 라는 컬럼이 사용 가능한 i 노드 수에 해당한다.

[juhwan.lee@linux-practice ~]$ df -i
Filesystem       Inodes  IUsed    IFree IUse% Mounted on
devtmpfs         245138    362   244776    1% /dev
tmpfs            250899      2   250897    1% /dev/shm
tmpfs            819200    523   818677    1% /run
efivarfs              0      0        0     - /sys/firmware/efi/efivars
/dev/sda2      15625240 100982 15524258    1% /
/dev/sda1             0      0        0     - /boot/efi
tmpfs             50179     16    50163    1% /run/user/1000

하드 링크와 심볼릭 링크

리눅스에서 다뤄지는 모든 파일에 대해 이름을 붙일 수 있다. 이는 리눅스의 파일 시스템이 이를 i 노드 라는 파일 정보로 관리하기 때문이다.

📝

파일을 참조 하는 방법

  • 원본 파일과 동일한 i 노드를 공유하는 하드링크
  • 원본 파일의 경로를 기록하는 심볼릭 링크

하드 링크는 파일 내용 자체는 복제하지 않아 같은 i 노드를 참조하는 모든 하드 링크를 삭제 해야만 파일 데이터가 실제 삭제 된다. 이러한 이유 때문에 실제로는 심볼릭 링크를 더 많이 사용한다.

심볼릭 링크를 생성할 때에는 ln -s 커맨드를 사용 해야 하는데, 이 때 -s 옵션을 제외하면 하드 링크가 생성 된다.

아래 커맨드는 file1.txt 라는 파일에 대한 심볼릭 링크를 만든다.

ln -s file1.txt file2.txt

이 때 주의할 점은 원본 파일 이름을 변경하지 않는 것이다.

아카이브와 압축

파일이나 폴더를 하나로 묶어 하나의 파일로 만드는 것을 아카이브 라고 하고, 파일의 크기를 줄이는 것을 압축 이라고 한다.

리눅스는 아카이브 기능의 대표적인 커맨드로 tar 가 있고, 압축은 gzip 이 있다.

일반적인 윈도우나 MacOS 환경에서 압축이라는 용어는 파일을 하나로 합치는 아카이브와 파일의 크기를 줄이는 압축의 개념이 동시에 실행 되지만, 리눅스는 이를 분리하여 생각 한다.

패키지 관리

리눅스에서 소프트웨어 하나를 설치하기 위해서는 기본적으로 소스코드를 가져와 컴파일 하는 방식이다.

간단하게 깃허브에 있는 소스코드를 하나 다운 받아, make, install 등의 명령어를 차례대로 입력하는 행위가 설치 과정이다.

이런 불필요한 과정을 추상화 하여 제거하고, 간편하게 설치할 수 있도록 제공하는 것이 패키지이다.

그 중 책에서 실습으로 진행 중인 배포판인 RedHat 계열의 AlmaLinux 는 대표적으로 RPM,yum, dnf 를 사용 한다.

rpm 은 의존성이 존재하여 설치 과정에서 실패하게 되면 직접 하나씩 다 설치해야 했다. 반면에 dnf 는 의존성이 존재하는 패키지들을 자동으로 설치 해주며, yum 커맨드의 후속 버전이다.

파일 시스템

파일 시스템은 리눅스 배포판 마다 모두 다르며, 현재 책에서 사용하는 AlmaLinux 버전에서는 XFS 를 사용한다.

그 외에 ext4, btrfs 를 사용하며 윈도우는 NTFS, macOSAPFS 가 주로 사용 된다.

파일 시스템은 하드디스크 등의 장치를 효율적으로 관리하기 위해 블록이나 클러스터라 불리는 고정 크기의 단위로 파일을 분할해 저장한다.

한 개의 파일로 보이는 대상은 실제로 여러 개의 블록으로 나뉘어 저장되고, 이 블록들이 어디에 저장 되어 있는지를 테이블로 관리한다.

  • 테이블로 관리하는 덕분에 생성, 이동, 복사, 삭제할 수 있도록 배치하여 이름과 실제 데이터를 연결할 수 있다.

또한, 파일 시스템이 다루는 파일이 반드시 하드 디스크와 같은 저장 장치에 있을 필요가 없다. 리눅스에서는 네트워크상의 파일은 물론, 입/출력 장치와 같은 다양한 장치도 파일로 다룬다.

💡

파일 시스템이 파일들을 구분하는 방법

서버에 접속하여 장치 파일이 모여있는 디렉터리에 ls /dev 명령어를 입력하면 위 사진처럼 앞에 문자로 표기된다.

  • b: 블록 장치
  • c: 문자 장치
  • d: 디렉터리
  • l: 심볼릭 링크

AlmaLinux 에서는 XFS 를 사용한다고 했지만, 대부분의 리눅스는 ext4 파일 시스템을 사용 한다.

그 외에도 MS-DOS 같은 운영 체제는 과거에 FAT 라는 파일 시스템을 사용 했다.

이 FAT 는 용량이 너무 큰 저장 장치에 적합하지 않지만, USB, SD 카드 같이 비교적 용량이 작은 미디어에서 자주 사용 된다. 그마저도 미디어에 대한 용량이 점차 커지면서 exFAT 로 대체되는 추세이다.

리눅스의 마운트 개념

유닉스 계열 파일 시스템에서는 디렉터리가 항상 루트가 중심인 트리 구조를 사용하는데, 이는 실제 디스크상의 배치와 관계없는 논리적 구조이다.

즉, 리눅스의 디렉터리 구조는 하드웨어 자체와는 분리되어 있기 때문에, 설정이나 확장을 유연하게 할 수 있다.

이 디렉터리 트리에 장치를 연결하는 것을 마운트 라고 하고, 분리하는 것을 언마운트 라고 한다.

위에서 살짝 언급 되었던 USB 메모리나 이동식 디스크를 마운트하기 위해서는 /mnt 아래에 임의의 디렉터리를 만든 뒤에 마운트 명령어를 입력한다.

mkdir /mnt/usb
mount -t vfat /dev/sdf1 /mnt/usb

프로세스

서버에서 자주 사용하는 lsless 같은 커맨드는 평소에 하드디스크에 실행 파일 형태로 저장 되어있으면서, 실행 되기만을 기다린다.

실행 시점이 되면 커널이 해당 실행 파일을 메모리로 불러온 뒤 CPU 가 이를 처리하는데 이렇게 메모리에 올라간 실행 파일을 프로세스라고 한다.

리눅스는 이 프로세스를 단위로 메모리를 확인하고 관리할 수 있고, 프로세스는 파일 단위에 쓰여지기 때문에 ps 명령어를 입력하지 않아도 프로세스를 볼 수 있다.

위 사진에서 숫자는 프로세스의 ID 로 프로세스가 시작해서 종료할 때까지 변하지 않는다. 그렇기에 이 프로세스 ID 를 사용해 프로세스를 조작하게 된다.