링크
1. 파일 시스템의 기본 개념
파일 시스템은 파일들을 저장하고, 찾고, 관리하는 방식입니다. 파일 시스템에서 파일은 저장된 데이터의 집합입니다. 그리고 파일 경로는 그 파일이 저장된 위치를 가리키는 주소입니다.
보통 파일은 특정 경로(예: /home/user/document.txt)에 하나의 이름을 가지고 저장됩니다. 이때, 파일이 하드디스크나 SSD에 저장된 방식으로, 파일 이름과 파일 경로는 물리적인 저장 위치를 가리키는 주소와 같습니다.
2. 링크(Link)란 무엇인가?
링크는 한 파일을 여러 번 참조하는 방법입니다. 기본적으로 파일 하나는 하나의 경로를 통해 참조되지만, 링크를 사용하면 같은 파일을 다른 경로에서 참조할 수 있게 됩니다. 이 링크를 통해 파일의 내용에 접근할 수 있습니다.
파일에 대한 링크는 두 가지 종류로 나뉩니다: 하드 링크와 **심볼릭 링크(또는 심링크)**입니다.
3. 하드 링크 (Hard Link)
하드 링크란?
하드 링크는 기존 파일에 또 다른 이름을 부여하는 방법입니다. 중요한 점은, 하드 링크는 파일 자체를 가리키는 또 다른 이름입니다. 즉, 하드 링크를 만들면 파일이 복사되지 않고 기존 파일을 참조하는 또 다른 이름을 가지게 되는 것입니다.
하드 링크의 특징
- 파일 내용이 변경되지 않는다: 하드 링크는 원본 파일을 복사하지 않으며, 단지 원본 파일에 대한 또 다른 이름을 만듭니다.
- 같은 inode 번호를 공유한다: 하드 링크는 원본 파일과 동일한 inode를 참조합니다. 즉, 하드 링크와 원본 파일은 같은 파일을 가리키는 개념입니다. inode는 파일의 내용이나 메타데이터(크기, 생성 시간 등)를 저장하는 데이터 구조입니다.
- 파일 삭제가 안전하다: 원본 파일이나 하드 링크 중 하나를 삭제해도, 다른 링크에서 파일을 계속 사용할 수 있습니다. 모든 하드 링크가 삭제될 때까지 파일은 실제로 삭제되지 않습니다.
하드 링크의 사용 예시
- 여러 경로에서 동일한 파일을 관리할 때 유용합니다.
- 예를 들어, 중요한 설정 파일을 여러 위치에서 동일하게 접근하고자 할 때 하드 링크를 사용할 수 있습니다.
하드 링크 예시
# "original.txt" 파일에 대한 하드 링크 생성
ln original.txt link_to_original.txt
- original.txt와 link_to_original.txt는 같은 파일을 가리키며, 둘 중 하나를 삭제해도 다른 하나는 여전히 파일을 참조합니다.
4. 심볼릭 링크 (Symbolic Link, symlink)
심볼릭 링크란?
심볼릭 링크는 원본 파일에 대한 경로를 가리키는 파일입니다. 하드 링크가 파일의 실제 내용을 참조하는 것과 달리, 심볼릭 링크는 원본 파일의 경로를 참조하는 텍스트 파일입니다. 심볼릭 링크는 Windows에서 흔히 볼 수 있는 바로 가기와 비슷한 개념입니다.
심볼릭 링크의 특징
- 파일 경로를 참조한다: 심볼릭 링크는 원본 파일의 경로를 저장하고 있으며, 원본 파일의 위치를 가리킵니다.
- 다른 파일 시스템에서도 사용 가능: 심볼릭 링크는 서로 다른 파일 시스템 간에도 링크를 만들 수 있습니다. 반면, 하드 링크는 같은 파일 시스템 내에서만 유효합니다.
- 원본 파일이 없어지면 링크가 끊어진다: 원본 파일이 삭제되거나 이동되면, 심볼릭 링크는 더 이상 유효하지 않게 됩니다. 즉, "깨진 링크"가 될 수 있습니다.
- 디렉토리도 링크할 수 있다: 심볼릭 링크는 파일뿐만 아니라 디렉토리도 참조할 수 있습니다.
심볼릭 링크의 사용 예시
- 파일을 여러 위치에서 동일하게 사용할 필요가 있을 때 유용합니다.
- 시스템에서 특정 파일에 대한 빠른 접근을 제공하거나, 파일을 다른 위치에 가리키는 별칭을 만들 때 사용됩니다.
- 예를 들어, /usr/bin에 있는 실행 파일을 여러 디렉토리에서 동일하게 사용할 때 심볼릭 링크를 활용할 수 있습니다.
심볼릭 링크 예시
# "original.txt"에 대한 심볼릭 링크 생성
ln -s /path/to/original.txt symlink_to_original.txt
- symlink_to_original.txt는 원본 파일 original.txt를 가리키는 심볼릭 링크입니다. 원본 파일이 /path/to/original.txt에 있으면, 심볼릭 링크는 그 경로를 가리킵니다.
5. 하드 링크와 심볼릭 링크의 차이점
특성 하드 링크 심볼릭 링크
링크 대상 |
동일한 inode를 공유하는 파일 |
원본 파일의 경로를 참조하는 파일 |
파일 삭제 후 동작 |
다른 링크가 있으면 파일은 삭제되지 않음 |
원본 파일이 삭제되면 링크가 끊어짐 |
링크할 수 있는 대상 |
같은 파일 시스템 내의 파일만 링크 가능 |
다른 파일 시스템 및 디렉토리까지 링크 가능 |
링크의 용도 |
실제 파일에 대한 또 다른 이름 |
파일 경로를 가리키는 바로 가기 |
디렉토리 링크 가능 여부 |
디렉토리는 하드 링크할 수 없음 |
디렉토리도 심볼릭 링크로 연결 가능 |
6. 언제 사용하고 왜 사용하는가?
하드 링크의 사용 예시
- 중복된 데이터를 저장하지 않으면서 여러 경로에서 파일을 사용할 때 유용: 여러 위치에서 같은 파일을 참조해야 할 때 하드 링크를 사용하면, 파일이 여러 복사본 없이 여러 경로에서 참조됩니다.
- 파일이 실제로 삭제되기 전까지 안전하게 유지하려는 경우: 파일을 삭제할 때, 그 파일을 참조하는 모든 하드 링크가 삭제될 때까지 파일은 삭제되지 않으므로, 여러 경로에서 파일을 안전하게 사용하고 관리할 수 있습니다.
심볼릭 링크의 사용 예시
- 파일 또는 디렉토리의 별칭을 만들 때: 예를 들어, 자주 사용하는 파일이나 디렉토리에 대해 빠르게 접근할 수 있는 방법을 제공하고 싶을 때 심볼릭 링크를 사용합니다.
- 파일 시스템 간 링크를 만들 때: 심볼릭 링크는 다른 파일 시스템 간에 링크를 만들 수 있어, 여러 시스템에서 공통으로 사용하는 파일을 연결할 때 유용합니다.
- 파일 위치가 바뀔 경우, 링크만 수정하면 되는 경우: 원본 파일이 다른 위치로 이동하더라도, 심볼릭 링크는 그 경로만 수정하면 됩니다.
하드링크가 요즘 잘 사용되지 않는 이유
- 디렉터리 링크 제한
- 하드링크는 디렉터리에 대해 링크를 만들 수 없습니다 (일반 사용자 기준, 관리자 권한이 필요한 시스템에서는 가능합니다).
- 따라서 디렉터리 구조를 관리하는 데 하드링크를 사용할 수 없고, 소프트링크는 디렉터리에 대해서도 링크를 만들 수 있기 때문에 더 유용합니다.
- 파일 시스템에 종속적
- 하드링크는 같은 파일 시스템 내에서만 작동합니다. 서로 다른 파일 시스템에 있는 파일들 사이에서는 하드링크를 만들 수 없습니다.
- 반면, 소프트링크는 경로 기반으로 작동하므로, 서로 다른 파일 시스템 간에도 링크를 만들 수 있습니다.
- 링크 삭제 시 데이터 손실 우려
- 하드링크에서 하나의 링크를 삭제하더라도, 그 파일이 여전히 다른 링크에 의해 참조되고 있다면, 데이터가 삭제되지 않지만, 하드링크를 잘못 관리하면 데이터가 복잡하게 얽히거나 삭제될 위험이 존재할 수 있습니다.
- 소프트링크는 경로를 참조하므로, 링크가 깨지면 파일의 데이터가 삭제되지 않지만 경로가 더 명확하여 관리하기 용이합니다.
- 식별과 관리의 어려움
- 하드링크는 파일 시스템의 내부 구조에서 동일한 inode를 공유하기 때문에, 여러 하드링크가 존재하는 파일을 쉽게 구분하기 어렵습니다. 관리가 어려워집니다.
- 반면, 소프트링크는 링크 파일 자체에 경로 정보를 담고 있기 때문에, 원본 파일을 변경하거나 삭제해도 링크 자체를 쉽게 확인하고 관리할 수 있습니다.
- 데이터 관리 용이성
- 소프트링크는 원본 파일을 참조하는 경로를 저장하므로, 원본 파일의 위치를 변경하면 링크만 수정하면 되지만, 하드링크는 파일의 복제본처럼 동작하여 파일의 위치나 변경 사항을 추적하는 데 더 많은 관리가 필요합니다.
NFS && Mount
💡 NFS에서 파일을 마운트할 때, 클라이언트는 서버의 파일 시스템을 로컬 시스템처럼 사용하는 것입니다. 마운트된 파일 시스템은 서버에 실제로 저장되며, 클라이언트는 이 파일 시스템을 네트워크를 통해 원격으로 접근하는 것입니다. 이때 클라이언트에서 파일을 읽고 수정하는 작업은 서버의 파일 시스템을 수정하는 작업과 동일합니다.
따라서 클라이언트가 파일을 수정하거나 새로 만들면, 그 변경 사항은 서버의 파일 시스템에 바로 반영됩니다. 클라이언트는 단순히 서버의 파일을 "사용"하는 것이지, 파일이 실제로 어디에 저장되고 수정되는지에 대해서는 신경 쓰지 않아도 됩니다.
1. NFS(Network File System)
NFS는 네트워크 파일 시스템으로, 한 서버에 저장된 파일을 다른 컴퓨터들이 네트워크를 통해 접근할 수 있게 해주는 프로토콜입니다.
2. 마운트(Mount)
마운트는 파일 시스템을 특정 디렉토리에 연결하는 작업입니다. 좀 더 쉽게 말하면, 다른 디스크나 파일 시스템을 내 컴퓨터의 특정 폴더에 연결해서 마치 내 컴퓨터의 파일처럼 사용할 수 있게 만드는 과정입니다.
- 외장 하드 드라이브를 물리적으로 연결한 후, 운영 체제는 이 하드 드라이브를 특정 디렉토리(예: /mnt/usbdrive)에 마운트하여, 사용자가 그 디렉토리로 접근하면 하드 드라이브의 파일들을 볼 수 있게 됩니다. 물리적으로는 하드 드라이브가 연결되어 있지만, 논리적으로는 그 파일들이 /mnt/usbdrive에 존재한다고 시스템이 인식하는 것입니다.
- NFS 서버에 있는 파일 시스템을 NFS 클라이언트가 마운트할 때도 마찬가지입니다. 네트워크를 통해 물리적으로 연결되지만, 운영 체제는 이 네트워크상의 파일 시스템을 로컬 디렉토리(예: /mnt/nfs)에 마운트하여 로컬 디렉토리처럼 사용할 수 있게 합니다.
리눅스에서는 보통 /mnt나 /media와 같은 디렉토리를 통해 외부 장치나 네트워크 파일 시스템을 마운트합니다.
3. 서버와 클라이언트 관계
서버와 클라이언트는 네트워크에서 데이터를 제공하는 쪽과 사용하는 쪽을 의미합니다. 여기서 NFS를 예로 들어 설명해보겠습니다.
- NFS 서버는 파일 시스템을 공유하는 역할을 합니다. NFS 서버는 실제로 파일이 저장된 서버로, 다른 컴퓨터들이 이 파일에 접근할 수 있도록 공유합니다.
- NFS 클라이언트는 이 서버에서 공유된 파일 시스템을 사용하는 컴퓨터입니다. 클라이언트는 NFS 서버에 요청을 보내고, 서버에서 제공하는 파일을 로컬 컴퓨터에서 사용하는 것처럼 접근합니다.
예시:
- NFS 서버: A라는 서버가 home이라는 디렉토리를 다른 서버와 클라이언트에게 공유한다고 가정해 봅시다. A서버는 실제로 파일을 저장하고 있는 서버입니다.
- NFS 클라이언트: B라는 서버나 컴퓨터는 A 서버에서 공유하는 home 디렉토리를 마운트하여 그 안의 파일들을 자신의 파일 시스템처럼 사용할 수 있습니다. B 서버는 A 서버의 home 디렉토리를 마치 자기 컴퓨터의 로컬 디렉토리처럼 접근할 수 있게 됩니다.
4. 마운트의 실용적인 예
예시 1: 로컬 디스크 마운트
외장 하드 드라이브를 컴퓨터에 연결한 후, 그 디스크를 /mnt/external과 같은 디렉토리에 마운트할 수 있습니다. 그러면 /mnt/external 디렉토리 안에 외장 하드에 저장된 파일을 접근할 수 있습니다.
sudo mount /dev/sdb1 /mnt/external
위 명령은 /dev/sdb1 장치(외장 하드)를 /mnt/external 폴더에 마운트합니다. 이후 /mnt/external 디렉토리 내 파일을 사용할 수 있습니다.
예시 2: NFS 서버에서 클라이언트로 파일 시스템 마운트
- NFS 서버에서 파일 공유 설정/shared 211.183.3.0/24(rw,no_root_squash)
- rw: 읽기/쓰기 권한을 부여합니다.
- no_root_squash: 클라이언트에서 루트 권한으로 접근할 경우, NFS 서버에서도 루트 권한을 그대로 유지하도록 합니다. (기본적으로 NFS는 클라이언트의 루트 권한을 nfsnobody 사용자로 변경하는데, no_root_squash 옵션을 사용하면 이를 방지합니다.)
- 이 설정은 211.183.3.0/24 서브넷에 있는 모든 IP 주소에 대해 /shared 디렉터리를 공유하겠다는 의미입니다. 211.183.3.0/24는 211.183.3.0부터 211.183.3.255까지의 IP 주소 범위를 나타냅니다.
- mkdir /shared chmod 777 /shared vi /etc/exports # /etc/exports (NFS 서버 설정) /shared 211.183.3.0/24(rw,no_root_squash) systemctl start nfs-server systemctl status nfs-server
- NFS 클라이언트에서 파일 시스템 마운트
- 클라이언트(B)에서 서버(A)의 디렉토리를 마운트합니다.
showmount -e 211.183.3.101
sudo mount -t 211.183.3.101:/shared /remote