Operating System (OS)는 하드웨어나 네트워크를 제어하는 것으로 개발 업무 시스템으로는 대부분 리눅스를 사용합니다. 리눅스는 1991년에 리누스 토르발즈 (버젼관리 시스템 git 또한 만드신 분..) 이 개발한 Unix 호환 서버 OS로 자원봉사자나 기업의 엔지니어로 구성된 커뮤니티에 의해 지속적으로 수정 관리되는 오픈소스입니다. 대부분의 서버와 모바일, 임베디드 시스템의 OS로 사용됩니다.
리눅스 커널
리눅스는 커널을 통해 메모리, 파일 시스템, 프로세스를 관리하고 디바이스를 제어합니다. 사용자는 리눅스 커널을 통해 디바이스에 접근하며, 실행된 프로세스에 PID를 할당하여 관리합니다. 또한 프로세스가 실행되기 위해서 메모리에 탑재되어야 되는데, 리눅스 커널은 프로그램/데이터를 물리 메모리에 효율적으로 할당하면서 실행이 끝난 프로세스가 사용하던 메모리 영역을 해제합니다. 특히 메모리의 물리적인 영역을 초과하는 프로세스가 실행될 경우 보조기억장치에 가상 메모리 영역 (swap)을 생성하여 사용빈도를 기반으로 메모리-스왑영역 간의 교환 업무를 담당합니다.
우리가 일반적으로 리눅스 커맨드 라인 (CLI)에 입력하는 명령어들은 모두 쉘 (Shell) 이라는 커널에 명령을 내릴 수 있는 interactive 프로그램에 의해 실행됩니다. 즉, 밑의 그림과 같이 CLI를 통해 사람이 알고 있는 명령 문자열을 입력하면 쉘은 이를 읽고 (Read) 이를 해석하여 명령어를 실행시키고 (Eval) 실행된 결과를 출력하면서 (Print) 이 과정을 반복합니다 Loop). 따라서 쉘은 REPL이라고도 합니다.
쉘에서 실행하고자 하는 명령을 모아서 *.sh 텍스트 파일에 기술한 것을 쉘 스크립트라고 합니다. 쉘 스크립트 문법으로 제어 구문을 사용할 수 있기 때문에 조건 분기나 반복적인 처리가 가능합니다. 쉘에는 여러 종류가 있으나 보통 bash 쉘이 디폴트로 이용할 수 있고 /bin/sh 의 심볼릭 링크로 확인할 수 있습니다.
리눅스 파일 시스템
리눅스는 파일 시스템을 통해 하드디스크, USB, CD, DVD 등과 같은 데이터 저장 매체에 접근합니다. 특히, 리눅스는 VFS (Virtual File System)이라는 장치를 사용하여 데이터가 하드디스크, 플래시 메모리, 스토리지 서버에 저장되어 있든지 상관없이 데이터에 대한 투과 접근을 가능하게 합니다. 즉, 다양한 저장 매체마다 존재하는 여러 종류의 파일 시스템에 대하여 공통된 인터페이스를 제공하여 애플리케이션 입장에서 데이터가 어디에 저장되어 있는지 상관없이 동작할 수 있게 합니다.
위의 그림처럼 open, read, write, cp 등과 같은 시스템 콜을 사용하여 MS-DOS 파일을 리눅스의 EXT2 파일 시스템으로 복사한다고 하여도 VFS에 의해 각 디바이스가 모두 파일로 취급되어 목적지의 파일 시스템 유형을 알 필요가 없습니다.
VFS가 지원하는 파일 시스템은 ext2, 3, 4 와 같은 리눅스 파일 시스템과 MS-DOS, VFAT, NTFS 와 같은 마이크로소프트 파일 시스템, IS0-9660 의 CD-ROM 파일 시스템, 네트워크로 연결된 다른 컴퓨터의 파일에 쉽게 접근하게 해주는 NFS 등이 있습니다.
VFS의 핵심 개념은 모든 파일 시스템을 표현할 수 있는 Common File Model을 도입하는 것으로서 Common File Model에는 1) 마운트된 파일 시스템에 대한 모든 정보를 저장하는 Super Block 객체, 2) 특정 파일 하나의 일반 정보를 저장하는 Inode 객체, 3) 디렉토리 항목과 이에 대응하는 파일의 연결에 대한 정보를 담고 있는 Dentry 객체, 4) 파일 입출력 정보를 기록하는 File Descriptor 객체로 구성되어 있습니다. 즉, Super Block과 Inode 객체는 디스크 상에 존재하는 자료 구조이고 나머지 객체는 리눅스 커널 상에 존재하는 자료 구조로 생각할 수 있습니다.
위의 그림에서 3개의 프로세스가 동일한 파일에 접근하고 두 개의 프로세스는 같은 하드 링크를 사용하여 접속한다면 세 프로세스 모두 파일 입출력을 관리하는 파일 객체를 소유하지만 Dentry 객체는 하드 링크 하나당 하나만 필요하기 때문에 두 프로세스는 같은 디엔트리 객체에 접근하게 됩니다. 또한, VFS는 가장 최근에 사용된 디엔트리 객체를 디엔트리 캐시에 저장함으로서 파일의 물리적 접근에 필요한 아이노드 객체에 대한 빠른 접근을 가능하게 합니다. 또한 Super Block 객체에는 s_op 라는 구조체를 통하여 Inode 객체를 할당하고 읽고 쓰는 여러 루틴을 담고 있습니다.
정리하면 어떠한 태스크를 수행할 때 파일은 커널 상에서 File 자료 구조로 표현 되는데 이 구조 안에 f_op라는 필드가 존재하여 read나 write 등의 파일 시스템을 처리하는 함수에 대한 포인터를 담고 있습니다. 처리하는 함수의 수행을 위해 디엔트리 객체, 아이노드 객체 순으로 접근하여 파일에 접근하게 됩니다.
리눅스 루트 디렉토리
리눅스는 설치된 커널을 비롯하여 각종 커맨드나 설정 파일이 루트 디렉토리에 FHS (Filesystem Hierarchy Standard)라는 규격에 의해 표준화되어 배치됩니다. 리눅스의 일반적인 디렉토리 구성은 다음과 같습니다.
디렉토리 | 역할 |
/bin | ls, cp, cd 와 같은 기본 커맨드를 저장하는 디렉토리. 권한에 상관없이 모두 사용 가능 |
/boot | OS 시작에 필요한 파일을 배치하는 디렉토리 |
/dev | 하드디스크 등의 디바이스 파일을 저장하는 디렉토리. /dev/sda는 SCSI 타입의 하드 디스크를 나타내며, /dev/tty는 키보드 등과 같은 표준입출력 관련 단말 디바이스를 나타냄. /dev/null 은 아무 것도 아니다를 나타내며 필요가 없어진 출력을 버릴 때나 빈 파일로 사용 |
/etc | OS나 애플리케이션이 작동하는데 필요한 설정 파일이 저장되어 있는 디렉토리. /etc/hosts는 IP 주소와 도메인명을 연결하는 파일이며 /etc/passwd는 사용자의 비밀 번호가 저장되어 있음 |
/home | 일반 사용자의 홈 디렉토리로 시스템 이용자가 자유롭게 사용 가능한 디렉토리 |
/proc | 커널 및 프로세스 정보가 저장된 디렉토리로 /proc 아래에 있는 숫자 폴더는 프로세스 ID를 의미함. /proc/cpuinfo를 통해 CPU 정보, /proc/partitions를 통해 디스크 파티션 정보, /proc/version을 통해 커널 버젼 정보 확인 가능 |
/sbin | mount나 reboot과 같은 시스템 관리용 커맨드가 저장된 디렉토리 |
/usr | 종 프로그램이 저장된 디렉토리로 애플리케이션은 보통 /usr/local에 저장됨 |
/var | 시스템 부팅 등의 가동과 함께 일어나는 변화를 기록한 로그 파일을 기록한 디렉토리 |
리눅스 보안
리눅스는 하드웨어와 같은 하위 레이어부터 애플리케이션 레이어까지 상당히 넓은 범위에 대해 보안 기능을 제공합니다. 먼저 리눅스에서는 시스템을 이용할 수 있는 사용자 계정에 권한을 설정할 수 있습니다. 권한은 시스템 전체를 관리할 수 있는 root와 그 외의 일반 사용자가 있으며 각 계정 혹은 설정한 그룹에 따른 액세스 권한에 대한 퍼미션을 부여하여 파일이나 디렉토리에 대한 접근 권한을 제어할 수 있습니다. (chmod)
또한 리눅스는 iptables를 (커널 2.4 버젼 이상에서 사용되는 방화벽 도구) 이용하여 리눅스에 내장된 패킷 필터링 및 네트워크 주소 변환 (NAT, Network Address Translation) 등을 제어할 수 있습니다. 패킷 필터링이란 패킷의 헤더 부분 (보낸 곳의 IP 주소, 받는 곳의 IP 주소 포트 등)을 보고 특정 조건에 부합한 패킷에 대해 전송, 파기, 주소 수정 등을 수행합니다.
'Computer > Docker' 카테고리의 다른 글
Docker 이미지 커맨드 (0) | 2021.04.03 |
---|---|
Docker의 작동 구조 (0) | 2021.03.27 |
Docker의 기능 (0) | 2021.03.27 |
컨테이너 - Docker (0) | 2021.03.26 |
하드웨어와 네트워크 (0) | 2021.03.22 |