실무에서 리눅스를 사용하면서 잘 만들어진 시스템이라는게 이런 것이구나를 느꼈다.
리눅스에서 서버 관리를 할 때 필요한 명령어들을 찾아서 썼지만, 각 명령어들이 이루고 있는 상관관계나 원리, 정보를 어디서 수집해 오도록 설계되어 있는지는 한참을 헤매서 알 수 있었던 것 같다. (파일의 위대함과 정교한 구조..)
그 간의 경험과 책을 읽으면서 원리와 구조를 이해하면서 리눅스를 공부하고자 스터디를 시작하였고 [모던 리눅스 교과서] 스터디에 참여하게 되었다.
1. 리눅스 소개
- 모던 리눅스에서 모던의 의미?
- 운영체제
- 메모리 관리, 인터럽트, I/O 디바이스와 통신, 파일 관리, 네트워크 통신 등 자원 관리 시스템
- 하드웨어를 추상화하고 API(시스템 콜)를 호출하여 관리할 수 있도록 해주는 것이 리눅스 커널
- 고, 러스트, 자바, 파이썬 등의 고급 프로그래밍 언어에서는 라이브러리 형태로 제공 (시스템 콜을 사용할 수 있도록 한 번 더 래핑한 형태)
- 메모리 관리, 인터럽트, I/O 디바이스와 통신, 파일 관리, 네트워크 통신 등 자원 관리 시스템
- strace를 통해 명령어 실행 시 호출되는 시스템 콜을 trace할 수 있다. 최종적으로 geteuid() 시스템 콜을 호출한 후 결과를 반환하고 있다.
- 사용자가 시스템 콜을 호출하기 위해 id라는 API 제공
모든 것이 파일 "everything is a file"
리눅스에서 시스템 정보, 프로세스 정보는 /proc이라는 가상 파일시스템 위치에 기록되며 명령어들을 실행했을 때 정보를 읽어오는 위치이기도 하다. 뿐만 아니라 통신을 위한 socket을 열어도 파일이 생성되어 해당 정보를 반영하고 있다.
무슨 문제가 발생했을 때 혹은 현재 상태를 확인할 때 /proc에서 상태 정보를 trace하기 유용하다.
2. 리눅스 커널
- 리눅스 아키텍처
- 하드웨어 계층
- 커널 계층
- 사용자 계층
- CPU 아키텍처
- x86
- 인텔, AMD에서 만드는 프로세서 제품군
- 데스크톱, 노트북, 서버에서 널리 사용됨
- ARM
- RISC(Reduce Instruction Set Computing)아키텍처 제품군으로 빠르게 실행할 수 있는 작은 명령어 세트와 많은 cpu 레지스터로 구성됨
- 휴대용 디바이스에서 많이 사용됨
- RISC-V(리스크 파이브(5))
- 오픈소스 기반의 RISC 기반 아키텍처 제품군으로 고성능 컴퓨팅, 연구 목적으로 사용되고 있으며 상용화는 아직임
- dmidecode 명령어
- 리눅스에서 시스템의 하드웨어 정보를 확인하는 유용한 명령어로, 시스템의 BIOS, CPU, 메모리, 캐시, 슬롯 정보 등 DMI (Desktop Management Interface) 테이블에 저장된 정보를 읽어온다
- x86
커널 구성요소
- 프로세스
- 여러 리소스 (주소 공간, 하나 이상의 스레드, 소켓 등)을 그룹으로 추상화한 것
- 커널은 /proc/self를 통해 현재 프로세스(터미널이면 bash)를 사용자에게 노출
- /proc/{pid}/status를 통해 프로세스 정보를 확인할 수 있음
- 그 외에도 maps, smaps, fd, envrion 등으로 정보 확인
- 메모리
- 물리 메모리와 가상 메모리 모두 Page 단위로 기록하며 가상 메모리는 페이지 테이블을 통해 물리 메모리에 접근하도록 한다
- 이때 페이지 테이블을 캐싱하여 TLB. (translation lookaside buffer)라는 캐시를 지원
- 리눅스의 기본 페이지는 4KB이나, 특수한 경우 Huge 페이지를 지원하여 페이지 크기를 변경하여 사용한다
- 예를 들어 데이터단위가 큰 DB 서버의 경우 메모리를 크게 할당하고, Huge 페이지 수와 크기를 설정하여 특정 메모리 부분을 DB에서 점유하여 TLB 업데이트를 줄이고 성능 향상을 기대할 수 있다. (성능 향상을 위한 최적화는 생각보다 어려움)
- 물리 메모리와 가상 메모리 모두 Page 단위로 기록하며 가상 메모리는 페이지 테이블을 통해 물리 메모리에 접근하도록 한다
- 네트워킹
- 소켓, 인터넷프로토콜, TCP, UDP 정보
- netstat -antp
- 현재 ESTABLESHED 상태인 연결 정보, rcv, snd 패킷 크기 확인
- LISTEN (서비스 포트) 확인
- SYN_SENT, .. FIN_SENT, TIME_WAIT 등의 TCP Handshake 확인
- netstat -antp
- 네트워크 인터페이스 정보
- ip a
- 네트워크 대역별 인터페이스 정보 확인
- ip a
- 소켓, 인터넷프로토콜, TCP, UDP 정보
- 파일시스템
- 저장 디바이스의 파일과 디렉터리를 관리
- ext4, xfs, btrfs, NTFS 등의 유형 파일시스템이 존재
- 가상 파일시스템인 vfs가 다양한 유형의 파일시스템을 하나의 추상화된 API로 지원하기 위해 도입되었음
- /etc/fstab을 확인하여 영구적용된 파일시스템을 확인할 수 있음
- df 명령어를 통해 현재 적용되어 있는 파일시스템을 확인할 수 있음
- 디바이스 드라이버
- 드라이버는 커널에서 실행되는 코드
- 실제 하드웨어 디바이스, /dev/pts 하위의 의사 디바이스(물리 디바이스처럼 취급되는 디바이스)를 관리
- /sys/devices 디렉토리는 Linux에서 하드웨어 장치 및 관련 정보를 관리하는 가상 파일 시스템인 sysfs.
- 시스템 내의 물리적 장치 및 가상 장치에 대한 정보를 계층적 구조로 제공
- 시스템 콜
- 커널이 노출하는 서비스 인터페이스와 사용자 영역의 엔티티 호출은 시스템 호출의 모음이라고 하며, 시스템 콜이라 부른다
- 파일 생성이나, 데이터 읽기는 명령(인터페이스)은 리눅스에 요청(사용자 영역에서 호출)하게 됨
- 명령어를 실행할 때 어떤 시스템 콜이 호출되는지 보고 싶다면 #strace ls와 같은 방식으로 확인할 수 있음
- 시스템 콜 테이블
- 커널이 노출하는 서비스 인터페이스와 사용자 영역의 엔티티 호출은 시스템 호출의 모음이라고 하며, 시스템 콜이라 부른다
Chromium OS Docs - Linux System Call Table
Linux System Call Table These are the system call numbers (NR) and their corresponding symbolic names. These vary significantly across architectures/ABIs, both in mappings and in actual name. This is a quick reference for people debugging things (e.g. secc
chromium.googlesource.com
'Study' 카테고리의 다른 글
[Linux] 모던 리눅스 교과서 4장 - 접근제어 (0) | 2024.11.24 |
---|---|
[Linux] 모던 리눅스 교과서 3장 - 스크립트 (1) | 2024.11.17 |
[Openstack] Devstack 설치 과정 알아보기 (0) | 2024.10.13 |
[Openstack] DevStack을 이용한 Openstack 설치 (1) | 2024.10.09 |
[Openstack] 오픈스택 컴포넌트 이해2 (1) | 2024.09.25 |