파일 시스템 계층 구조
리눅스 파일 시스템은 계층적 구조를 사용하여 트리 모양으로 이루어져 있다.
루트 디렉토리(/)를 최상위 디렉토리로 시작하여 그 아래에 다양한 디렉토리와 파일들이 존재한다.
대표적인 디렉토리는 다음과 같다
- /bin: 일반 사용자와 관리자 모두가 사용하는 기본 명령어가 포함된 디렉토리이다. ls, cp 등과 같은 시스템 명령어가 여기에 위치한다.
- /sbin: 시스템 관리자 권한으로 실행해야 하는 실행 파일 위치한다.
- /boot: 시스템 부팅에 필요한 파일을 포함하며, 커널과 관련된 파일들이 저장된다.
- /dev: 디바이스 드라이버가 사용하는 디바이스 파일 디렉터리. 시스템의 모든 장치 파일들이 존재한다.
- /etc: 시스템과 관련된 주요 설정 파일들이 위치하는 디렉토리로, 사용자 계정 정보, 네트워크 설정 파일 등이 저장된다.
- /home: 사용자의 홈 디렉토리로, 사용자별로 개인 파일 및 설정 파일이 저장된다.
- /lib: 시스템 실행에 필요한 라이브러리 파일들이 포함된다.
- /mnt와 /media: 외부 저장 장치를 임시로 마운트할 때 사용된다.
- /proc: 프로세스와 시스템 상태 정보가 저장된 가상 파일 시스템으로, 현재 실행 중인 프로세스 정보를 확인할 수 있다.
- /sys: 하드웨어 장치와의 상호작용 및 설정을 지원하는 가상 파일 시스템으로, 동적 장치 인식 및 관리가 가능하다.
- /tmp: 임시 파일들이 저장되는 공간으로, 시스템 재부팅 시 삭제된다.
- /usr: 사용자 프로그램과 유틸리티가 저장되며, 서브 디렉토리로 bin, lib, include 등이 있다.
- /var: 가변 데이터를 저장하는 디렉토리로, 로그 파일이 주로 저장되는 /var/log가 여기에 포함된다.
마운트
리눅스에서 마운트(Mount)는 외부 장치나 파일 시스템을 리눅스 디렉토리 구조에 연결하여 접근할 수 있도록 하는 과정이다.
마운트를 통해 USB 드라이브, 외장 하드, 다른 파티션 등의 파일 시스템을 리눅스의 특정 디렉토리 경로에 연결하여 사용자가 파일을 읽고 쓸 수 있게 된다.
리눅스의 파일 시스템은 통합된 디렉토리 구조를 사용하므로, 새 장치를 마운트하면 파일 시스템 어디서든지 접근이 가능하다.
마운트의 기본 개념
리눅스에서 마운트는 특정 장치를 디렉토리 구조의 특정 위치에 연결하여 데이터를 접근할 수 있게 한다.
리눅스에서는 장치가 연결된 경로(/dev/sda1 같은 장치 파일 경로)를 지정하고, 이를 디렉토리 경로(예: /mnt/usb)에 마운트한다. 마운트된 후에는 일반 디렉토리처럼 장치의 파일에 접근할 수 있다.
예를 들어, /dev/sdb1 장치를 /mnt/usb에 마운트하려면 다음과 같이 명령한다.
mount /dev/sdb1 /mnt/usb
리눅스의 마운트 시스템은 Windows나 다른 운영체제와 차이가 있으며, 특히 파일 시스템 접근 방식과 마운트 관리에서 여러 독특한 특징이 있다. 이를 비교해 보자.
마운트 방식의 차이점
- 리눅스와 유닉스 계열: 리눅스에서는 파일 시스템 구조가 단일 트리 구조로 구성된다. 모든 장치나 파티션은 루트 디렉토리(/) 아래에 마운트된다. 예를 들어, USB 드라이브를 /mnt/usb 같은 특정 디렉토리에 마운트하면, /mnt/usb 디렉토리를 통해 USB 드라이브에 접근할 수 있다. 이 구조는 운영체제의 모든 파일을 하나의 통일된 파일 시스템 트리 아래에서 관리할 수 있게 해준다.
- Windows: Windows에서는 드라이브 문자를 사용하여 파일 시스템을 분리하여 표시한다. 예를 들어, 기본 디스크는 C: 드라이브로, 외장 드라이브는 D:, E: 등의 드라이브 문자로 나타난다. 이처럼 파일 시스템이 드라이브 문자로 분리되어 있으며, 각 드라이브는 독립된 경로로 접근한다. Windows에서는 하나의 디렉토리 트리로 통합되지 않고, 각 드라이브가 개별적으로 존재하는 형태이다.
마운트 설정과 관리의 차이점
- 리눅스: 리눅스에서는 mount 명령어를 사용하여 장치를 특정 디렉토리에 마운트하고, 필요시 umount 명령어로 마운트를 해제한다. 또한, /etc/fstab 파일을 통해 부팅 시 자동으로 마운트할 장치를 설정할 수 있으며, 다양한 옵션을 통해 파일 시스템의 동작 방식을 세밀하게 조정할 수 있다. 리눅스는 파일 시스템의 자동 마운트, 동기화 설정, 파일 접근 권한 등 다양한 옵션을 제공하여 서버 환경에서 더욱 유연하고 세밀한 마운트 관리를 가능하게 한다.
- Windows: Windows에서는 일반적으로 USB나 외장 하드 등을 연결할 때 자동으로 드라이브 문자를 할당하여 마운트한다. 사용자에게 명시적으로 마운트를 요구하지 않으며, 외장 장치를 제거할 때도 ‘안전하게 제거’ 절차를 통해서만 해제된다. 부팅 시 자동 마운트 설정을 관리하려면 디스크 관리 도구를 통해서 하거나 레지스트리를 수정해야 하므로, 리눅스의 /etc/fstab 같은 직접적인 파일 설정 방식이 없다.
파일의 종류
- 일반 파일(regular file) : 말 그대로 일반 파일. 텍스트 파일이나 동영상 파일 등이 일반 파일에 포함
- 디렉터리(directory) : 디렉터리도 파일의 한 종류. 윈도우의 폴더와 같은 개념
- 심볼릭 링크 파일(symbolic link file) : 어떤 다른 파일을 가리키는 파일. 윈도우의 바로가기와 같은 개념
- 블록 디바이스 파일(block device file) : 블록 디바이스를 제어하기 위한 파일
- 문자 디바이스 파일(character device file) : 문자 디바이스를 제어하기 위한 파일
- 파이프 파일(pipe file) : 파이프를 나타내는 파일. 프로세스간 통신(IPC)에 사용됨
- 소켓(socket) : 소켓을 나타내는 파일. 프로세스간 통신(IPC)에 사용됨
디바이스 드라이버, 디바이스 파일(블록 및 문자 디바이스 파일)
디바이스 드라이버
디바이스 드라이버는 운영체제와 하드웨어 간의 통신을 담당하는 소프트웨어이다.
운영체제가 하드웨어 장치와 직접 통신하는 대신, 디바이스 드라이버를 통해 명령을 전달하고 결과를 받는다.
드라이버는 하드웨어의 특성을 이해하고, 운영체제와 장치 간에 필요한 데이터를 적절한 형식으로 변환하는 역할을 한다.
네트워크, 그래픽, USB 드라이버 등이 있다.
디바이스 파일
디바이스 파일은 리눅스에서 하드웨어 장치를 파일처럼 취급하여 접근할 수 있게 해주는 특수 파일이다.
리눅스 시스템에서는 모든 장치가 /dev 디렉토리에 디바이스 파일 형태로 존재하며, 이를 통해 응용 프로그램이나 사용자가 장치에 접근할 수 있다.
디바이스 드라이버와 디바이스 파일의 상호작용
- 디바이스 드라이버는 하드웨어와 운영체제 간의 중개 역할을 담당하며, 디바이스 파일은 이 드라이버와의 통신을 위해 사용자가 접근할 수 있는 인터페이스를 제공한다.
- 사용자가 디바이스 파일에 데이터를 읽거나 쓰면, 디바이스 파일이 디바이스 드라이버를 호출하고, 디바이스 드라이버는 이 명령을 해석하여 실제 하드웨어 장치로 전달한다.
- 예를 들어, 사용자가 /dev/sda에 접근하여 파일을 읽으려 하면, 블록 디바이스 드라이버가 호출되어 하드 디스크에서 해당 데이터를 읽어들인 후 결과를 반환한다.
디바이스 파일은 아래와 같이 블록 디바이스 파일과 문자 디바이스 파일로 나뉜다.
- 블록 디바이스 파일(block device file) : 블록 디바이스를 제어하기 위한 파일
- 문자 디바이스 파일(character device file) : 문자 디바이스를 제어하기 위한 파일
하드링크와 소프트 링크
하드링크와 소프트링크에 대해 알아보기 앞서서 아이노드를 알 필요가 있다.
아이노드(i-node)
아이노드(inode)는 리눅스 파일 시스템에서 각 파일이나 디렉토리의 정보를 저장하는 데이터 구조이다.
파일의 실제 데이터(내용)가 저장된 위치가 아니라, 해당 파일에 대한 메타데이터를 담고 있는 공간이라고 할 수 있다.
각 파일이나 디렉토리는 고유한 아이노드 번호를 가지며, 이 번호를 통해 파일 시스템은 파일의 메타데이터를 찾는다.
이렇게 복잡해보이는 그림을 아래와 같이 단순화 시킬 수 있다.
- 파일 이름: 사용자가 파일을 식별할 때 사용하는 이름으로, 디렉토리 구조에서 파일 이름이 저장된다. 이 파일 이름은 아이노드 번호를 참조하여 파일의 실질적인 위치를 찾는다.
- 아이노드: 파일의 메타데이터(파일 크기, 권한, 생성 시간 등)를 포함하며, 파일 내용이 저장된 데이터 블록의 위치를 가리키는 정보가 담겨 있다. 즉, 파일 이름은 아이노드를 가리키고, 아이노드는 파일 내용을 가리킨다.
- 파일 내용: 실제 파일의 데이터가 저장된 블록으로, 아이노드의 정보를 통해 접근된다.
이를 통해 리눅스 파일 시스템은 파일 이름을 통해 간접적으로 파일 내용에 접근하게 된다. 아이노드를 사용하면 하드 링크와 소프트 링크 같은 다양한 파일 참조 방식이 가능해진다.
아이노드 관련한 더 많은 내용은 아래의 글을 참고
2023.07.03 - [컴퓨터 구조 & 운영체제/운영체제] - [운영체제] 파일 시스템(File System)
하드링크와 소프트 링크
이 그림은 하드 링크(Hard Link)와 소프트 링크(Soft Link, 심볼릭 링크)가 파일 시스템에서 어떻게 동작하는지를 보여준다.
우리가 컴퓨터에서 파일을 만든다고 생각해보자. 이 파일에는 이름(Filename)이 있고, 실제 파일 내용(File Data)이 저장된다. 파일 시스템에서는 이 파일을 관리하기 위해 아이노드(inode)라는 중간 정보를 사용한다. 아이노드는 파일이 어디에 저장되어 있는지, 크기는 얼마나 되는지 등의 정보만을 담고 있다.
이제 파일을 복사하거나 링크(바로 가기)를 만들 때, 하드 링크와 소프트 링크라는 방식으로 파일을 참조할 수 있다.
하드 링크 (Hard Link) - 같은 파일로 취급
- 설명: 하드 링크는 원본 파일과 같은 아이노드(inode)를 공유한다. 즉, 원본 파일과 하드 링크는 사실상 같은 파일이다.
- 특징: 하드 링크를 통해 파일에 접근하면, 원본 파일에 접근하는 것과 동일한 효과가 있다.
- 삭제 시 특징: 원본 파일이나 하드 링크 중 하나를 삭제해도 남아있는 파일(다른 하드 링크나 원본 파일)을 통해 여전히 데이터에 접근할 수 있다.
예시
- 한 가지 파일에 서로 다른 이름을 붙여놓은 것과 같다.
- 예를 들어, 하나의 문서 파일이 있는데, 그 파일을 두 개의 다른 이름으로 저장한다고 상상해보자. 파일 이름은 다르지만 내용은 동일하고, 어느 파일을 수정해도 둘 다 바뀌는 효과가 있다.
하드링크 명령어
하드 링크를 생성하는 명령어는 ln이다.
위 사진과 같이 현재 디렉터리에는 3개의 파일이 있다.
또한 a의 아이노드 값은 20418673이다.
위와 같은 명령어로 하드링크를 만들었다.
다시 확인해보면 같은 아이노드를 가지는 b.txt를 확인할 수 있다.
소프트 링크 (Soft-Link == Symbolic Link == SymLink) - 다른 위치를 가리키는 바로 가기
- 설명: 소프트 링크는 원본 파일과 다른 아이노드를 가진다. 대신 원본 파일의 경로(위치)만을 저장해 두는 방식이다.
- 특징: 소프트 링크는 원본 파일의 위치 정보만 가지고 있으므로, 원본 파일이 삭제되거나 이동되면 소프트 링크는 깨진 링크(broken link)가 되어 데이터를 찾을 수 없다.
- 다른 파일 시스템에서도 사용 가능: 소프트 링크는 파일 시스템을 넘어, 다른 디렉토리나 장치에서도 원본 파일을 참조할 수 있다.
예시
- 소프트 링크는 우리가 흔히 사용하는 바로 가기와 유사하다.
- 예를 들어, 데스크톱에 있는 프로그램의 바로 가기를 만든다고 해보자. 실제 프로그램은 다른 폴더에 있지만, 바로 가기를 통해 쉽게 실행할 수 있다. 그러나 원본 프로그램을 삭제하면 바로 가기는 더 이상 작동하지 않는다.
소프트링크 명령어
소프트링크 생성 명령어는 ln 에서 -s 옵션을 주면 된다.
b.txt 라는 소프트링크가 a.txt를 가리키고 있다.
여기서 소프트링크의 경로를 수정하거나 원본 파일의 경로를 수정하면 소프트링크가 깨질 수 있다.
이는 하드링크와 다른점이다.
하드 링크는 원본 파일과 동일한 아이노드(inode)를 공유하기 때문에, 원본 파일의 경로나 이름이 변경되어도 하드 링크는 계속해서 파일 내용을 참조할 수 있다.
하드 링크와 원본 파일은 실제로 동일한 파일 데이터를 가리키고 있기 때문에, 하나의 파일이 삭제되거나 경로가 변경되더라도 다른 하드 링크는 영향을 받지 않는다.
'컴퓨터 구조 & 운영체제 > Linux' 카테고리의 다른 글
[Linux] 스크립트 작성 및 실행 (0) | 2024.11.07 |
---|---|
[Linux] 사용자와 그룹 (0) | 2024.11.07 |
[Linux] 리눅스 쉘 기본 명령어 (3) | 2024.11.04 |
[Linux / Ubuntu] VMware Tools 수동 설치 (0) | 2024.03.28 |
[Linux / Ubuntu] VMware Fusion 가상머신이 안켜질 때 (0) | 2024.03.28 |